Henry Isakoff 🥕 Tunkeutumistestaus

| Tunkeutumistestaus | 12 min

Fuzz Faster U Fool!

Tässä raportissa tutustutaan fussaukseen.

Yhteenvetona ffuf täältä ja täältä.

- Ffuf on työkalu, jolla etsitään verkkosivustojen piilotettuja hakemistoja ja tiedostoja
- Toimii korvaamalla pyyntöjen osia (esim. URL-polku) sanakirjatiedoston sanoilla
- Kustomoitavissa: voi määrittää HTTP-metodin, headerit, viestin sisällön ja suodattaa tuloksia
- Go kielellä nimenomaan tehty nopeutensa vuoksi
- Tukee monimuuttujatestausta, rekursiivista fuzzing-toimintoa ja tulostaa tulokset helppolukuisessa muodossa
- Voi käyttää erilaisia suodattimia tulosten rajaamiseen (koko, sanat, statuskoodi, jne.)
- Mahdollistaa sanakirjojen lukemisen eri lähteistä (tiedosto, stdin, komentorivi)
- Tarjoaa automatisointimahdollisuuksia esim. integroitavaksi muihin työkaluihin

Eli käytetään tähän Joona Hoikkalan kehittämää ffuf-työkalua. Lisäksi asennetaan listoja ja crawlausta varten katana. Katanaan ei päästy tässä.

Asennetaan myös maaleiksi fuffme dockeriin palveluksi sekä Teron dirtfuzt-0 & dirtfuzt-1.

Kertauksena: ajan ulkoisella palvelimella (toinen tietokone) Unraidia ja sen järjestelmässä virtualisoiden, nyt tälle kurssille asennettua, Kalia (DNS kali.koti). Asiakkaana pyöritän omaa läppäriä Mac OS (ARM) järjestelmässä. Voin monet paketit ajaa suoraan homebrewillä omalta raudalta.

Brew

Tässä tapauksessa voin asentaa ulkoiseen Kaliin maaliprosessin dockeriin ja pyörittää muita ohjelmia omalta läppäriltä raudan päällä.

Yritän välttää turhaa ulkoisia RFB pohjaisia framebuffereita, koska käyttökokemuksena se kokonaisuus on aina turhauttava uuteen ympäristöön ilman lisäasennuksia. Työkaluilla on iso merkitys ja ne työkalut mitä on kiva käyttää tekee työstä aina joutuisampaa.

Eli

Homebrew ja dockerpalvelu.

Aloitetaan päivittämällä Mac OS homebrew paketit ja asentamalla fuff. Jos olet ensimmäistä kertaa homebrewin kanssa tekemisissä niin asennus ja dokumentaatio täällä.

brew update
brew install ffuf

//Asennuksen voi tarkastaa esim
ffuf -help

Brew

Tämän jälkeen Kalin puolella aloitetaan dockerin ja gitin asennuksella. Molempia tarvitaan fuffme asennukseen. Toki GIT on aivan varmasti jo Kalin pohjalla, mutta ei haittaa varmistaa.

sudo apt-get update
sudo apt-get install docker.io git

docker

Meidän pitää antaa vielä käyttäjällemme dockeriin oikeudet, käyttäen syntaksia ’adduser’. Tämän komennon jälkeen exitillä ulos istunnosta ja uudestaan sisään. Täten ladataan ryhmät uudelleen ja näin voidaan minimoida sudon käyttö dockerissa.

sudo adduser henry docker
exit

Nyt voimme kloonataan gitillä ffufme:n repon sisään käyttöjärjestelmään, siirtyä kloonauksen kansion sisään, ja rakentaa gitin docker kuva, syntaksi -t merkitsee, että kansiosta rakennettava docker-kuva merkataan nimellä ’ffufme’.

git clone https://github.com/adamtlangley/ffufme
cd ffufme
docker build -t ffufme .

Viimeisenä käynnistämme docker-kuvan syntaksilla -p: porteista 80 (sisään) ja 80 (ulos). Tässä huomaa, että jos esimerkiksi apache2 palvelin on päällä niin portti 80 on jo käytössä. Tälloin voi siirtyä esimerkiksi porttiin 81 muuttamalla portit 80:81. Syntaksi -d viittaa ettei kontin tarvitse pyöriä päällä nykyisessä istunnossa, vaan se ajetaan istunnon ulkopuolella.

Myös huomaa, että HTTP protokolla suojaamattomana käyttää porttia 80 niin jos portti on vaihdettu 81 niin yhteysosoite on ’sivu-tai-ip:81’

docker run -d -p 80:80 ffufme

//tämän jälkeen voi tarkastaa että kontti aktiivisena
docker ps

docker

Nyt koneen portissa 80 meillä on palvelu on aktiivisena. Eli voin verkon sisällä mennä osoitteeseen ’kali.koti’ joka johtaa fuffme testiympäristöön kalin sisällä.

testiympäristö ja ffuf

Vielä toinen (ja kolmas) testiympäristö! Sitten mennään.

Asennetaan myös toinen testiympäristö dirtfuzt-0 (ja samalla ajatuksella dirtfuzt-1). Teron testiympäristö on suoraan haettavana wgetillä (ohjeet suora kopio hänen sivuilta)

`wget https://terokarvinen.com/2023/fuzz-urls-find-hidden-directories/dirfuzt-0`
`chmod u+x dirfuzt-0`
`./dirfuzt-0`
`http://127.0.0.2:8000`

Ikävästi Teron skripti laittaa ’localhostin’ eri lokaaliin .2. Eli nopeasti mac os kautta suora yhteys ei toimi. Kysyn ollama malliltani Gemma3 suositusta.

Mikä linux ohjelma antaa minun yhdistää paikallisen koneen kaksi datavirtaa 127.0
... .0.1 ja 127.0.0.2:8000 yhdeksi virraksi ulospäin prosessille?

**GEMMA3:27b**
Linuxissa on useita ohjelmia, joilla voit yhdistää kaksi datavirtaa yhdeksi.

Yleisimmät ja sopivimmat tähän tarkoitukseen ovat:

...
**3. `socat`:**

*   `socat` on erittäin monipuolinen työkalu, joka on suunniteltu datavirtojen
yhdistämiseen ja uudelleenohjaukseen. Se on tehokkaampi ja joustavampi kuin
`nc` tai `ncat`.
*   **Esimerkki:**
    ```bash
    socat 'FD:0,FD:1' 'TCP-LISTEN:8000,fork' &
    cat virta1 > /dev/fd/0
    cat virta2 > /dev/fd/1
    nc 127.0.0.1 8000 | prosessi
    ```
    Tämä komento luo kaksi tiedostokuvausta (0 ja 1), joihin virrat
kirjoitetaan.  `socat` yhdistää nämä kaksi virtaa ja ohjaa ne TCP-porttiin
8000.  `prosessi` lukee yhdistetyn virran.
...

Vaihtoehtoja annetaan kyllä enemmänkin, mutta socat näyttää ainakin pikaisesti lupaavalta ja yksinkertaiselta. Löytyy myös pohjalta nyt.

Silmäilen socatin dokumentaation ja saan luotua

sudo socat TCP-LISTEN:8080,reuseaddr,fork TCP:127.0.0.2:8000

Eli yhdistetään ulospäin 8080:8000 sisään osoitteeseen 127.0.0.2. Fork - socat pitää yhteyden yllä vaikka ohjattava prosessi sammuisi. reuseaddr - ylläpitää socat prosessia vaikka portti vaihtuisi. Ymmärtääkseni ylimääräisiä tähän komentoon, mutta halusin saada vain yksinkertaisesti yhteyden päälle. Eli lisäsin debuggausta varten jos prosessi täytyy käynnistellä uudestaan välissä tjms. Socat pitää olla omassa istunnossa päällä erikseen kuuntelemassa.

Mutta! Tekemään tehtäviä! Tämä viimeisin oli vähän turha reititys, koska olisin voinut vain myös fussata lokaalisti kalista tähän, ’muttakun TYÖKALUT!’ Ja lisäksi tässä opetellaan myös verkkoprotokollaa.

Eli nyt verkon sisällä koti.kali:8080 johtaa sivustoon.

Päällä!

Tehtävät testiympäristöissä

Aloitetaan dirtfuzt-0:sta

Meidän täytyy löytää Teron sivustolta ’Admin page’ ja versio-kontrolliin liittyvä sivusto. Kokeilen ihan huvikseni vain ensimmäisenä curlilla git kansiota roottiin ja siellähän sellainen. Varmaan on osa ratkaisua, mutta tehdään ffufin kautta.

Antaa kontekstia siihen mitä yritetään etsiä.

curl -I http://kali.koti:8080/.git/

HTTP/1.1 200 OK
Date: Sat, 12 Apr 2025 11:54:40 GMT
Content-Length: 132
Content-Type: text/html; charset=utf-8

Tero linkittänyt Daniel Miesslerin common listauksen niin käytetään sitä meidänkin wordlistissä.

curl -s https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/common.txt > common.txt

Käytetään tätä nyt fussaukseen.

ffuf -w common.txt -u http://kali.koti:8080/FUZZ

Ensimmäisenä tulee jokainen hakusana ja status, mutta tästä voidaan valmiiksi nähdä, että 132kb tiedostot voidaan rajata ulos -fs 132 attribuutilla.

ffuf -w common.txt -u http://kali.koti:8080/FUZZ -fs 132

Tästä vastauskokonaisuus on huomattavasti järkevämpi ja voimme huometa kaksi suoraa vastausta

render/https://www.google.com [Status: 301, Size: 64, Words: 3, Lines: 3, Duration: 46ms]

On mielenkiintoinen tarttumapinta tulevaisuudelle, mutta

admin                   [Status: 200, Size: 160, Words: 10, Lines: 11, Duration: 55ms]

Kokeilen siis

$ curl http://kali.koti:8080/admin
<!doctype html>
<html>
	<head>
		<title>You found it!</title>
	</head>
	<body>
		<h1>You found it!</h1>
		<p>See you at TeroKarvinen.com !</p>
	</body>
</html>

Eli admin sivusto ainakin löydetty tehtävänannosta.

Versiokontrollille pyydän gemmalta uuden lyhyemmän listan.

>>> luo minulle versiointiin liittyvä lyhyt sanalista fussaukseen fflufin kanssa kun
... ... yritän etsiä versio-kontrollia demosivustolta pelkkä listaus jota käytän ffuf
... in kanssa riittä.
version
ver
rev
revision
build
release
v
v1
v2
v3
v4
v5
latest
beta
alpha
dev
debug
test
old
backup
archive
.git
.svn
.hg
git
SVN
changelog
readme
release_notes
version.txt
config.php
robots.txt
wp-config.php
.env
/version
/changelog
/readme
/config.php
/robots.txt
/wp-config.php
/.env
/backup
/archive

Luon tämän ’versiosanoja.txt’ tiedostoon ja ajan ffufilla. Jälleen huomaan, että täytyy lisätä ajon jälkeen -fs 132

ffuf -w versiosanoja.txt:FUZZ -u http://kali.koti:8080/FUZZ -fs 132

Saan mukavan listan erinäisiä mahdollisia haavoittuvuuksia.

Löytyi!

/dirfuzt-1

Tehdään samat liikkeet kuin /dirfuzt-0 mutta lähdetään suoraan fussaamaan tätä avaamatta enempää.

Ensimmäinen kokonaisuus tuo paljon 154kb tiedostoja listaan joten otetaan nämä pois.

ffuf -w common.txt -u http://kali.koti:8080/FUZZ -fs 154

Löytyi! Löytyi!

Löydän suoraan .git kokonaisuuden. Myös render/google ja Wordpress admin kansio ovat tähän hyviä kohteita.

curl http://kali.koti:8080/.git/

Löytyi!

Fuffme ja pienet tehtävät.

Siirrytään siis kali.koti pääpalvelimelle jossa siis ffufme päällä.

Basic Content Discovery

Käytän samaa common.txt tiedostoa tähän

ffuf -w common.txt -u http://kali.koti/cd/basic/FUZZ

Löydän class ja development.log tiedostot.

Content Discovery With Recursion

ffuf -w common.txt -recursion -u http://kali.koti/cd/recursion/FUZZ

Löydän ’/admin’, ’/admin/users’ ja ’/admin/users/96’ kansiot

Varmistan vielä

$ curl http://kali.koti/cd/recursion/admin/users/96
You Found The File!

Löytyi!

File extensions tehtävässä

ffuf -w common.txt -e .log -u http://kali.koti/cd/ext/logs/FUZZ

Löydän users.log tiedoston.

404 tiedostoissa huomaan taas ensimmäisen listan tuottavan paljon vastauksia jotka 669 eli ajan

ffuf -w common.txt -u FUZZ -fs 669

Tuottaa secret tiedoston joka curlin kautta ’Controller does not exist’.

Param Mining

ffuf -w parameters.txt -u http://kali.koti/cd/param/data?FUZZ=1

Tuottaa debug tiedoston joka

$ curl http://kali.koti/cd/param/data?debug
Required Parameter Found

Rate limit

Lisäämällä lähetyslimitin saan oracle tiedoston

ffuf -w common.txt -t 5 -p 0.1 -u http://ffuf.test/cd/rate/FUZZ -mc 200,429

Saan oracle tiedoston joka curlilla You Found The File!

Pipes

Vaikka on ylimääräisenä. Teen silti. Huomaan heti että meidän ei tarvitse käyttää ulkoista skripti-tiedostoa vaan voimme loopata bash scriptin osaksi.

Pyydän poikkeuksellisesti qwen2.5lta tätä, koska tämä on huomattavasti parempi luomaan syntakseja ja lyhyitä skriptejä. Ymmärrän suoraan, että pitää jokainen vastaus loopata.

$ ollama run qwen2.5:32b
>>> #!/bin/bash
...
... while read i
... do
...   if [ "$1" == "md5" ]; then
...     echo -n $i | md5sum | awk '{ print $1 }'
...   elif [ "$1" == "b64" ]; then
...     echo -n $i | base64
...   else
...     echo $i
...   fi
>>> Can you change this into be part of this seq 1 1000 | hashit b64 | ffuf -w - -u http://kali.koti/cd/pipes/user2?id=FUZZ without need external script. Loop bash script

Certainly! You can achieve the desired functionality by embedding the logic
directly into a pipeline, avoiding the need for an external script. Here's how
you could integrate it:

seq 1 1000 | while read i; do echo -n $i | base64; done | ffuf -w - -u
http://kali.koti/cd/pipes/user2?id=FUZZ

Eli tässä jokainen vastaus loopataan base64 läpi kunnes rivit valmiita ffuf tuloksesta. Joskus näissä tapauksissa bash skripti täytyy itse ajaa osiin ja kokeilla, mutta tässä tapauksessa Qwen teki oikein ja ensimmäisellä yrittämällä toimi. Kokemuksesta tämä juuri qwenin vahvuus.

Vastaus

base64 vastaus ’User ID found’

Samalla ajatuksella teen ’md5’ skriptauksen

seq 1 1000 | while read i; do echo -n $i | md5sum-f1; done | ffuf -w - -u http://kali.koti/cd/pipes/user3?id=FUZZ

Tuottaa vastauksen ’4daa3db355ef2b0e64b472968cb70f0d’ ja ’User ID found’

Viimeistä subdomain testiä en voi tehdä, koska olen verkottanut sivun eri tavalla. Ymmärrän kokonaisuuden pointin ja oikeassa fussauksessa tätä verkostointia ei tarvitsisi ajatella.

Loppusanat

Fussaus ja ffuf on oiva työkalu haistelemaan nettisivun sisältöä.

Tätä raporttia varten opettelin myös paljon Katanan käyttöä, mutta siitä nyt ei jäänyt jälkeä. Kokonaisuus kuitenkin oiva tapa laajentaa etsintäparametrejä.

Lähteet

https://terokarvinen.com/tunkeutumistestaus/ https://github.com/ffuf/ffuf/blob/master/README.md https://terokarvinen.com/2023/fuzz-urls-find-hidden-directories/

https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/common.txt

https://github.com/BuildHackSecure/ffufme

Tehtävien analysoinnissa ja parin skriptin luonnissa käytetty apuna Gemma3:27b ja qwen2.5:27b tekoälymalleja omassa lokaalissa koneessa. Ollama toiminut suorana kääntäjänä.

http://ollama.com/ https://ollama.com/library/qwen2.5:32b https://ollama.com/library/gemma3:27b

Marked toimii md muuntimena sivulla. https://github.com/markedjs/marked

Sivuston kuvat optimoitu https://optimage.app

Käytetty aika Raportointi ja työkalujen opettelu 5h Tehtävät alle 1h