git clone <https://github.com/ffuf/ffuf>
cd ffuf
go get
go build
Raccolta di dizionari utili durante le fasi di scoperta e penetrazione dei servizi (git clone):
Attacco a dizionario su nomi di pagine Web:
ffuf -w /path/to/SecLists/Discovery/Web-Content/raft-medium-files.txt:FUZZ
-u <http://127.0.0.1:7777/FUZZ>
-fc 403
Attacco a dizionario su nomi di directory:
ffuf -w /path/to/SecLists/Discovery/Web-Content/raft-medium-directories.txt:FUZZ
-u <http://127.0.0.1:7777/FUZZ>
-fc 403
Uguale a prima ma con dizionario contenente nomi di directory.
Dizionario più grande:
ffuf -w /path/to/SecLists/Discovery/Web-Content/raft-large-files.txt:FUZZ
-u <http://127.0.0.1:7777/commandexec/FUZZ>
-fc 403
Trova la seguente nuova funzionalità: http://127.0.0.1:7777/commandexec/example1.php
Si crea un dizionario personalizzato d.txt per tentare di scoprire funzionalità simili. Per ogni riga si scrive example1.php, example2.php, …, example9.php.
ffuf -w /path/to/d.txt:FUZZ
-u <http://127.0.0.1:7777/commandexec/FUZZ>
-fc 403
Una volta individuata una funzionalità, si ricercano possibili parametri validi. Esistono due strategie
Si richiede l’URL senza passare alcun parametro nella speranza che il messaggio di errore evidenzi il parametro mancante
Si utilizza il client HTTP da linea di comando curl:
curl <http://127.0.0.1:7777/commandexec/example1.php>
Si scopre dal messaggio di errore che viene richiesto un parametro ip.
Si effettua il fuzzing sul nome del parametro
ffuf -w /path/to/SecLists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ
-u <http://127.0.0.1:7777/commandexec/example1.php?FUZZ=value>
-fc 403
Il valore del parametro è irrilevante.
La maggior parte dei risultati ha dimensione 1534 byte. A tale dimensioni si ipotizza possa corrispondere un messaggio di errore tipo “parametro ip mancante”. Si omettono tali risultati:
ffuf -w /path/to/SecLists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ
-u <http://127.0.0.1:7777/commandexec/example1.php?FUZZ=value>
-fs 1534
Per trovare un distinguisher tra input validi e invalidi del parametro ip, si costruisce un dizionario ip.txt con una serie di input validi e invalidi. Si esegue il fuzzing con tale dizionario:
ffuf -w /path/to/ip.txt:FUZZ -u <http://127.0.0.1:7777/commandexec/example1.php?ip=FUZZ>
Il codice di stato è sempre 200 → Non si può usare come distinguisher.
Le dimensioni delle risposte HTTP variano → Candidato distinguisher.
Si produce un istogramma delle dimensioni delle risposte HTTP (script plot-sizes1.py) e si verifica l’effettiva separazione.
Verificando l’output si nota che un input valido genera un div HTML grigio con l’output prodotto, in caso di input invalido invece si ha un div HTML grigio vuoto. → Distinguisher.
Lo stesso processo è applicabile alla ricerca di un distinguisher per input leciti e illeciti. Si costruisce un dizionario payload.txt, con una serie di input leciti e illeciti.