En este artículo, vamos a aprender cómo podemos utilizar ffuf, que significa “Fuzz Faster U Fool“, que es una interesante herramienta de fuzzing web de código abierto. Desde su lanzamiento, mucha gente ha gravitado hacia ffuf, particularmente en el escenario de las recompensas por errores (bug bounty). Así que, vamos a sumergirnos en este proceso de aprendizaje.
Tabla de Contenido
Qué es ffuf
FFUF es un rápido fuzzer web escrito en Go. Es un método profesional de línea de comandos para el fuzzing web en un servidor web y el crédito va para el autor (@joohoi).
Pero, ¿qué es fuzzing, fuzzer, o fuzz?
El fuzzing es una técnica de prueba de software que consiste en proporcionar datos no válidos, inesperados o aleatorios como entradas a un programa informático. A continuación, se controla el programa para detectar excepciones, como bloqueos o fallos en las aserciones de código incorporadas, o para encontrar posibles fugas de memoria.
Instalación de ffuf
Este programa de línea de comandos se ejecuta en el Terminal de Linux o en el Símbolo del sistema de Windows. La actualización desde el código fuente no es más difícil que la compilación desde el código fuente, con la excepción de la inclusión de la flag -u
. (funciona tanto para la instalación como para la actualización)
go get -u github.com/ffuf/ffuf
https://github.com/ffuf/ffuf
Debido a que estamos usando Parrot OS, encontraremos ffuf en los repositorios de apt, permitiéndonos instalar ejecutando el simple comando.
apt install ffuf
También puedes descargar un binario precompilado de la página de lanzamientos, descomprímelo y ejecútalo.
https://github.com/ffuf/ffuf/releases/latest
Después de instalar esta herramienta, para obtener sus parámetros y opciones de trabajo todo lo que necesitamos es utilizar el parámetro -h
para la opción de ayuda.
ffuf -h
Tener un buen conjunto de diccionarios es importante para todo el personal de seguridad, y hay una colección llamada SecLists que tiene casi lo que necesitas. Está disponible en GitHub, pero también podemos instalarlo localmente en nuestra máquina.
sudo apt install seclists
https://github.com/danielmiessler/SecLists
Opciones de entrada
Son parámetros que nos ayudan a proporcionar los datos necesarios para el fuzzing web sobre una URL con la ayuda de una lista de palabras.
Ataque simple
Para el ataque por defecto, necesitamos utilizar los parámetros -u
para la URL de destino y -w
para cargar una lista de palabras como se muestra en la imagen.
ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt
Después de ejecutar el comando, vamos a centrarnos en los resultados.
- En primer lugar, observamos que se ejecuta por defecto el método HTTP GET.
- Lo siguiente es el estado del código de respuesta , todo lo que necesitamos es especificar el archivo de extensión junto con el parámetro [-e]. Para obtener estos resultados sólo tenemos que seguir el comando.
ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -e .php
Opciones de coincidencia
Si queremos que ffuf muestre sólo aquellos datos que son importantes en nuestro fuzzing web. Entonces nos ayudará a mostrar sólo los datos coincidentes según el parámetro. Ejemplo: Código HTTP, Líneas, Palabras, Tamaño y Expresiones Regulares.
Coincidir con Código HTTP
Para entender este parámetro tenemos que considerar un ataque sencillo en el que podemos ver qué códigos HTTP aparecen en nuestros resultados.
ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt
Podemos ver claramente que muestra algún código HTTP 302 junto con el código HTTP 200.
Si sólo necesitamos resultados exitosos como el código HTTP 200, sólo tenemos que usar el parámetro
-mc
junto con nuestro código HTTP específico. Para utilizar este parámetro sólo tienes que seguir el comando.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -mc 200
Coincidir líneas
Al igual que el código de coincidencia que discutimos anteriormente, podemos utilizar el parámetro
-ml
para obtener el resultado para una línea específica en un archivo.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -ml 8
Coincidir palabras
Al igual que la función de coincidencia de las funcionalidades anteriores, el programa puede proporcionarnos un resultado con un recuento de palabras específico. Para obtener este resultado necesitamos utilizar el parámetro
-mw
junto con el recuento de palabras específico que queremos.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -mw 5
Coincidir con tamaño
De manera similar, el programa puede proporcionarnos un resultado con el tamaño del archivo. Podemos utilizar el parámetro [-ms] junto con el recuento de tamaño específico que queremos obtener.
ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -ms 2929
Coincidir expresiones regulares
Es la última de todas las funciones de coincidencia disponibles en esta herramienta. Vamos a buscar LFI comparando la cadena/string con el patrón seguido “root:x” para el diccionario dado.
Estamos usando una URL que puede lograr esta funcionalidad y usando el parámetro
-mr
definimos la cadena coincidente “root:x”.Esta es nuestra lista especial de palabras.
cat diccionario.txt /etc/passwd /etc/shadow /etc/aliases /etc/anacrontab /etc/apache2/apache2.conf /etc/at.allow /etc/at.deny /etc/bashrc /etc/bootptab /etc/chrootUsers /etc/chttp.conf /etc/cron.allow /etc/cron.deny /etc/crontab
Utilizando esta lista de palabras, ejecuta el siguiente comando para utilizar el parámetro
-mr
en un escenario de ataque.ffuf -u http://testphp.vulnweb.com/showimage.php?file=FUZZ -w diccionario.txt -mr "root:x"
Luego de esperar un poco, obtendremos un HTTP 200 para /etc/passwd de la lista de palabras dada.
Opciones de filtro
Las opciones de Filtro son absolutamente opuestas a las opciones de Coincidencia. Podemos utilizar estas opciones para eliminar lo no deseado de nuestro fuzzing web. Ejemplo: Código HTTP, Líneas, Palabras, Tamaño, Expresiones Regulares.
Filtro de código HTTP
El parámetro
-fc
necesita el código de estado HTTP específico que queremos eliminar del resultado.ffuf -u http://testphp.vulnweb.com/dvwa/FUZZ -w diccionario.txt -fc 302
Filtrar Líneas
El parámetro
-fl
tiene la capacidad de eliminar una longitud específica de nuestro resultado para filtrar nuestro ataque.ffuf -u http://testphp.vulnweb.com/dvwa/FUZZ -w diccionario.txt -fl 26
Filtrar tamaño
El parámetro
-fs
tiene la capacidad de filtrar el tamaño especificado por nosotros durante el comando del ataque.ffuf -u http://testphp.vulnweb.com/dvwa/FUZZ -w diccionario.txt -fs 2929
Filtrar palabras
El parámetro
-fw
tiene la capacidad de filtrar el recuento de palabras de los resultados que queremos eliminar.ffuf -u http://testphp.vulnweb.com/dvwa/FUZZ -w diccionario.txt -fw 83
Filtrar Expresión Regular
El parámetro
-fr
podemos eliminar una expresión regular específica, aquí tratamos de excluir el archivo log del resultado de salida.ffuf -u http://testphp.vulnweb.com/dvwa/FUZZ -w diccionario.txt -fr "log"
Opciones generales
Estos son los parámetros generales de esta herramienta, que giran en torno a su funcionamiento general en el fuzzing web.
Calibración automática personalizada
Sabemos que el poder de un ordenador o máquina para calibrarse automáticamente se conoce como autocalibración. La calibración es el proceso de proporcionar a un instrumento de medida la información que necesita para entender el contexto en el que se va a utilizar. Al recopilar datos, la calibración de un ordenador garantiza su precisión.
Podemos personalizar esta función según nuestra necesidad con la ayuda del parámetro
-acc
. El cual no puede ser utilizado sin el parámetro-ac
para su personalización.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -acc -ac -fl 26 -ac -fs 2929 -ac -fw 54
El color
A veces la separación del color crea una atención extra a todos los detalles que se obtienen en los resultados. Este parámetro
-c
ayuda a crear la separación de colores.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -c
Tiempo máximo para la tarea
Si deseas realizar un fuzz durante un tiempo limitado, puedes elegir el parámetro [-maxtime]. Ejecuta el comando para proporcionar un tramo de tiempo.
ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -maxtime 5
Tiempo máximo para el trabajo
Con la ayuda del parámetro
-maxtime-job
, podemos poner un límite de tiempo para un trabajo en particular. Al utilizar este comando, estamos tratando de limitar el tiempo por trabajo de la ejecución de la solicitud.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -maxtime-job 2
Retraso
Si creamos un retraso particular en cada petición ofrecida por el ataque, éste tiene una oportunidad de obtener mejores resultados. El parámetro
-p
nos ayuda a conseguir el retraso en esas peticiones.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -p 1
Tasa de solicitud
Podemos crear una tasa de solicitud independiente para cada uno de nuestros ataques con la ayuda del parámetro
-rate
. A través de este parámetro, creamos nuestra solicitud por segundo según nuestro ataque deseado.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario.txt -rate 200
Funciones de error
Hay tres parámetros que soportan la función Error. El primer parámetro es
-se
, que es un spurious error. Indica si la siguiente petición es genuina o no. El segundo parámetro es-sf
, detendrá nuestro ataque cuando más del 95% de las peticiones se produzcan como error. El tercer y último parámetro es-sa
, que es una combinación de ambos parámetros de error.En nuestro escenario, estamos usando el parámetro
-se
donde se detendrá nuestro ataque cuando nuestra solicitud no sea real.ffuf -u http://testphp.vulnweb.com/FUZZ -w diccionario1.txt:W1 -w diccionario2.txt:W2 -se
Modo detallado
Como todos sabemos, el modo verbose/detallado es una característica utilizada en muchos sistemas operativos de ordenadores y lenguajes de programación que proporciona información extra sobre lo que el ordenador está haciendo y qué controladores y aplicaciones está cargando en la inicialización. En programación, produce una salida precisa para propósitos de depuración. Existe un parámetro llamado
-v
para ffuf.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -v
Hilos
El parámetro
-t
se utiliza para acelerar o ralentizar un proceso. Por defecto, está establecido en 40. Si queremos acelerar el proceso, debemos aumentar su número, y viceversa para ralentizarlo.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -t 1000
Opciones de salida
Guardamos el rendimiento de nuestros ataques con el fin de mantener un registro, mejorar la legibilidad y las posibles referencias. Usamos el parámetro
-o
para guardar nuestra salida, pero necesitamos (conjuntamente) especificar su formato con el parámetro-of
.Formato de salida en HTML
Usamos el parámetro
-of
y este define un formato HTML. Usando el siguiente comando, podemos crear nuestro informe en .html.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -o file.html -of html
Ahora, después de la finalización de este ataque, tenemos que comprobar nuestro archivo de salida está a la altura o no. Como podemos ver, nuestro archivo se crea con éxito.
Formato de salida en CSV
Del mismo modo, sólo tenemos utilizar el formato
csv
junto con el parámetro-of
. Donde los valores separados por comas, son almacenados en un formato tabular.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -o file.csv -of csv
Ahora, después de la finalización de este ataque, tenemos que comprobar nuestro archivo de salida está a la altura o no. Como podemos ver, nuestro archivo se crea con éxito.
Todos los formatos de salida
Del mismo modo, si queremos todos los formatos de salida a la vez sólo hay que utilizar el parámetro
-of all
. Como json, ejson, html, md, csv, ecsv. Ejecuta este comando para generar todos los informes a la vez.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -o output/file -of all
Ahora, después de la finalización de este ataque, podemos comprobar nuevamente la salida:
Opciones HTTP
Los resultados se mueven alrededor de las opciones HTTP. A veces se requieren ciertos detalles para ejecutar el fuzzing web como la solicitud HTTP, Cookie, encabezado HTTP, etc.
Tiempo de espera
El tiempo de espera actúa como un tiempo límite para el evento de ejecución. El parámetro
-timeout
ayuda a establecer esta característica con facilidad.ffuf -u http://testphp.vulnweb.com/FUZZ/ -w diccionario.txt -timeout 2
Encabezado de host
Si queremos realizar el fuzzing en un subdominio, podemos utilizar el parámetro
-H
junto con una lista de palabras del nombre de dominio como se indica a continuación en el comando.ffuf -u https://google.com -w diccionario.txt -mc 200 -H "HOST: FUZZ.google.com"
Recursión
La recursión es el mecanismo de repetir objetos de forma autosimilar, como todos sabemos. Si un programa requiere que se acceda a una función dentro de otra función, esto se conoce como una llamada recursiva de la función. Usando el parámetro
-recursion
, podemos lograr esta funcionalidad en nuestros ataques.ffuf -u "http://testphp.vulnweb.com/FUZZ/" -w diccionario.txt -recursion
Ataque con Cookie
A veces el fuzzing web no muestra el resultado en el sitio autenticado sin autenticación. Hay un parámetro
-b
a través del cual podemos lograr el objetivo proporcionando una cookie de sesión.ffuf -u http://192.168.1.12/dvwa/FUZZ/ -w diccionario.txt -b "PHPSESSID:"7aaaa6d88edcf7cd2ea4e3853ebb8bde""
Conclusión
FFUF es a menudo comparado con herramientas como dirb o dirbuster, lo cual, aunque es preciso hasta cierto punto, no es una analogía razonable. Aunque FFUF puede ser usado para forzar archivos, su verdadera fuerza radica en su simplicidad, y una mejor herramienta comparativa para FFUF sería algo como Burp Suite Intruder o Turbo Intruder.
Este artículo está inspirado en la publicación original de Shubham Sharma, un apasionado de la investigación en ciberseguridad. Contacta con él en LinkedIn y Twitter.