Fuzzing avanzado con ffuf
Si queremos utilizar la herramienta de forma un poco mas avanzada, podremos decirle que nos utilice 2
diccionarios en vez de uno y que nos lo identifique con un nombre en concreto de la siguiente forma:
ffuf -u http://192.168.5.211:8080/W1/W2 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:W1 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:W2
Aqui lo que estamos haciendo es que el primer diccionario se va a llamar W1
y el segundo W2
para poderlos identificar y que sepa la herramienta las zonas donde inyectarlo, que en este caso seria /W1/W2
.
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.5.211:8080/W1/W2
:: Wordlist : W1: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
:: Wordlist : W2: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
[Status: 403, Size: 290, Words: 21, Lines: 11, Duration: 4ms]
* W1: cgi-bin
* W2:
[Status: 403, Size: 288, Words: 21, Lines: 11, Duration: 0ms]
* W1: icons
* W2:
[Status: 200, Size: 5153, Words: 259, Lines: 38, Duration: 10ms]
* W1: images
* W2:
[Status: 200, Size: 2311, Words: 136, Lines: 23, Duration: 2ms]
* W1: documents
* W2:
[Status: 200, Size: 944, Words: 65, Lines: 17, Duration: 1ms]
* W1: apps
* W2:
[Status: 200, Size: 3160, Words: 539, Lines: 125, Duration: 1ms]
* W1: admin
* W2:
[Status: 200, Size: 940, Words: 65, Lines: 17, Duration: 1ms]
* W1: db
* W2:
[Status: 200, Size: 1555, Words: 102, Lines: 20, Duration: 8ms]
* W1: js
* W2:
[Status: 200, Size: 2592, Words: 164, Lines: 25, Duration: 6ms]
* W1: fonts
* W2:
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 546ms]
* W1:
* W2:
[Status: 200, Size: 3363, Words: 204, Lines: 28, Duration: 2ms]
* W1: soap
* W2:
[Status: 200, Size: 1366, Words: 88, Lines: 19, Duration: 12ms]
* W1: passwords
* W2:
[Status: 200, Size: 1437, Words: 79, Lines: 19, Duration: 17ms]
* W1: stylesheets
* W2:
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 12ms]
* W1: W2
* W2:
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 16ms]
* W1:
* W2:
[Status: 403, Size: 295, Words: 21, Lines: 11, Duration: 58ms]
* W1: cgi-bin
* W2: index
[Status: 301, Size: 321, Words: 20, Lines: 10, Duration: 1ms]
* W1:
* W2: images
[Status: 403, Size: 296, Words: 21, Lines: 11, Duration: 3ms]
* W1: cgi-bin
* W2: images
[Status: 301, Size: 321, Words: 20, Lines: 10, Duration: 8ms]
* W1:
* W2: images
[Status: 403, Size: 298, Words: 21, Lines: 11, Duration: 0ms]
* W1: cgi-bin
* W2: download
[WARN] Caught keyboard interrupt (Ctrl-C)
Y veremos que nos esta utilizando los 2
diccionarios en las posiciones que le pusimos a la herramienta.
Fuzzing sobre los campos de login de un request_post.txt
Si por ejemplo capturamos el intento de inicio de sesion de una pagina con BurpSuite
nos mostrara la peticion que se ha realizado, esta peticion la guardaremos en un archivo llamado request_post
el cual le pasaremos a la herramienta fuff
, lo que vamos hacer es que sustituya los campos en este caso de login
para que me haga fuzzing
de ese campo.
Primero abrimos BurpSuite
, nos vamos a Proxy
-> Open Browser
.
Esto nos abrira el navegador de BurpSuite
por lo que estara en mitad de la comunicacion entre la estructura de Cliente-Servidor
, buscamos la siguiente URL
para meternos en la pagina del puerto 8080
.
URL = http://192.168.5.211:8080/
Una vez que estemos dentro veremos el login
el cual meteremos las credenciales que queramos y antes de enviarlo en BurpSuite
le daremos a Intercept on
para que empiece a interceptar. ahora si le daremos a enviar y nos capturara la peticion, viendo lo siguiente:
request_post
POST /login.php HTTP/1.1
Host: 192.168.5.211:8080
Content-Length: 57
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Origin: http://192.168.5.211:8080
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.5.211:8080/login.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=aed4glvn1pnbt4r19s957dpos1
Connection: keep-alive
login=santiago&password=1234&security_level=0&form=submit
Entonces cuando lo hayamos volcado la peticion a un archivo llamado request_post
dandole al boton click derecho
-> Copy to file
, podremos hacer lo siguiente.
Si queremos hacer fuzzing
en el nombre de usuario, podremos cambiar la palabra santiago
del apartado login
por la palabra FUZZ
para que reemplace esa palabra por las del diccionario.
request_post
POST /login.php HTTP/1.1
Host: 192.168.5.211:8080
Content-Length: 57
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Origin: http://192.168.5.211:8080
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.5.211:8080/login.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=aed4glvn1pnbt4r19s957dpos1
Connection: keep-alive
login=FUZZ&password=1234&security_level=0&form=submit
Una vez teniendo todo esto estara listo para darselo a la herramienta ffuf
y que realice la busqueda.
ffuf -request request_post -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
Y con esto ya estaria reemplazando la palabra FUZZ
por cada una del diccionario, podremos probar a poner el usuario real dentro del diccionario para que se vea que funciona de la siguiente forma:
sudo echo "santiago" >> /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
Con esto ya podremos comprobar que nos daria resultado el login
.
Herramienta Radamsa con ffuf, denegacion de servicio
Ahora lo que vamos a ver es combinar una herramienta que genera palabras con caracteres muy raros los cuales si se insertan en un programa que no este sanitizado puede este llegar a petar con radamsa
, pero a parte de esto lo vamos a combinar con la herramienta ffuf
.
URL = Radamsa GitLab
Vamos a tener que instalar la herramienta, por lo que haremos lo siguiente:
sudo apt-get install gcc make git wget
git clone https://gitlab.com/akihe/radamsa.git && cd radamsa && make && sudo make install
Y con esto ya tendriamos el binario
instalado de radamsa
y totalmente funcional, ahora vamos hacer lo siguiente con el mismo.
cd /home/kali/radamsa/bin
echo "test" | radamsa
Lo que va a generar esto es una cadena de caracteres los cuales la mayoria de aplicaciones que no esten correctamente sanitizadas van hacer que peten:
Info:
tert
❯ echo "test" | radamsa
te���st
❯ echo "test" | radamsa
te'xcalc%d\n%p%n\u0\r\n%nst
❯ echo "test" | radamsa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatest
❯ echo "test" | radamsa
❯ echo "test" | radamsa
test
❯ echo "test" | radamsa
uett
❯ echo "test" | radamsa
te3t
❯ echo "test" | radamsa
���t�est% ❯ echo "test" | radamsa
t
est
❯ echo "test" | radamsa
testt
❯ echo "test" | radamsa
\r$1aaaa%d%$`\229$+\x0d$PATHtst
❯ echo "test" | radamsa
test
❯ echo "test" | radamsa
s
testtet
Esto tambien se puede utilizar desde un texto:
echo "test" > text.txt
radamsa text.txt
Ahora en la herramienta ffuf
haremos lo siguiente:
ffuf -request ~/request_post --input-cmd 'radamsa text.txt' -input-num 1000
Con el -input-num
especificamos el numero de peticiones que queremos que haga, ya que por defecto esta a 100
.
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : POST
:: URL : https://192.168.5.211:8080/login.php
:: Header : Accept-Encoding: gzip, deflate, br
:: Header : Cookie: PHPSESSID=aed4glvn1pnbt4r19s957dpos1
:: Header : Cache-Control: max-age=0
:: Header : Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
:: Header : Origin: http://192.168.5.211:8080
:: Header : Content-Type: application/x-www-form-urlencoded
:: Header : Upgrade-Insecure-Requests: 1
:: Header : User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36
:: Header : Referer: http://192.168.5.211:8080/login.php
:: Header : Connection: keep-alive
:: Header : Host: 192.168.5.211:8080
:: Header : Accept-Language: en-US,en;q=0.9
:: Data : login=FUZZ&password=1234&security_level=0&form=submit
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
:: Progress: [1000/1000] :: Job [1/1] :: 149 req/sec :: Duration: [0:00:06] :: Errors: 1000 ::
En este caso esta bien la pagina web del campo, pero si en algun momento nos diera un status code
de 404
o de 500
, etc... Podremos ver que el campo no esta bien sanitizado y podremos aprovechar eso, pero en este caso nos estan dando codigos normales de 200
.
Last updated