Guía Completa de Comandos de ffuf: Potencia tu Fuzzing Web
Durante las pruebas basadas en aplicativos web, la enumeración y el fuzzing es una de las técnicas esenciales para descubrir puntos débiles en aplicaciones. Una de las herramientas más potentes y versátiles para realizar este tipo de tareas es ffuf
(Fuzz Faster U Fool). Esta guía completa te ayudara a tener una visión más detallada de los comandos de ffuf
, acompañados de explicaciones contextuales para que puedas aprovechar al máximo sus capacidades.
¿Qué es ffuf?
ffuf
es una herramienta escrita en Go para realizar fuzzing web de manera rápida y flexible. Permite realizar pruebas exhaustivas de enumeración de directorios, archivos, subdominios, vhosts, parámetros HTTP y mucho más. Su capacidad para manejar múltiples wordlists y su rendimiento optimizado lo convierten en una de las herramientas preferidas en el mundo de las pruebas de seguridad.
Tabla de Contenidos
- Uso Básico
- Wordlists Múltiples
- Subdominios y VHosts
- Parámetros HTTP
- Encabezados (Headers)
- Límites de Tasa (Rate Limits)
- Filtros (Filters)
- Matchers
- Opciones de Salida (Output Options)
- Proxy
- Límites de Tiempo (Time Limits)
- Otras Opciones Útiles
- Recursos Adicionales
Uso Básico
Fuzz de Archivos/Rutas
El fuzzing de archivos o rutas es una de las funcionalidades más comunes de ffuf
. Permite descubrir directorios o archivos ocultos en un servidor web al reemplazar la palabra clave FUZZ
con cada entrada de una wordlist.
Comando:
|
|
Descripción:
-w wordlist.txt
: Especifica la wordlist a utilizar.-u https://host.name/FUZZ
: Define la URL objetivo dondeFUZZ
será reemplazado por cada palabra de la wordlist.
Fuzz de Extensiones de Archivos
Este comando es útil cuando necesitamos descubrir archivos con diferentes extensiones, como .php
, .html
, .js
, etc.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con las extensiones proporcionadas en la wordlist para buscar archivos comoindex.php
,index.html
,etc.
Nombres de Archivos
Permite realizar fuzzing en nombres de archivos específicos con una extensión determinada, útil para encontrar scripts vulnerables o páginas administrativas.
Comando:
|
|
Descripción:
- Busca archivos PHP en el directorio
/blog/
cuyos nombres están en la wordlist.
Usar la Salida de un Comando como Wordlist
Aprovechar la salida de comandos del sistema como una fuente dinámica de entradas para el fuzzing.
Comando:
|
|
Descripción:
-c
: Ejecuta el comando en un shell comó bandera para habilitar la salida colorizada.-w <(seq 1 1000)
: Utiliza la salida del comandoseq 1 1000
como wordlist, generando números del 1 al 1000.-u https://host.name/api/users/FUZZ
: Busca endpoints de usuarios con IDs numéricos.
Fuzzing Recursivo
Permite realizar fuzzing de forma recursiva aplicando múltiples niveles de profundidad, descubriendo rutas ocultas en estructuras de directorios complejas.
Comando:
|
|
Descripción:
-recursion
: Habilita el modo de fuzzing recursivo.-recursion-depth 3
: Define la profundidad máxima de recursión.- Descubre rutas ocultas hasta tres niveles de profundidad.
Establecer Cookies
Podemos enviar cookies personalizadas con cada solicitud, lo que puede ser útil para acceder a áreas protegidas o mantener sesiones.
Comando:
|
|
Descripción:
-b "NAME1=VALUE1; NAME2=VALUE2"
: Define las cookies a enviar con cada solicitud.
Wordlists Múltiples
Modo Clusterbomb
El modo clusterbomb
intenta todas las combinaciones posibles de valores desde múltiples wordlists. Es ideal para escenarios donde se necesitas combinar diferentes parámetros, como usuarios y contraseñas.
Probar Diferentes Usuarios y Contraseñas
Este comando es útil para realizar ataques de fuerza bruta en formularios de inicio de sesión, combinando usuarios y contraseñas de dos wordlists diferentes.
Comando:
|
|
Descripción:
-w users.txt:USER
: Define la wordlist de usuarios para el marcadorUSER
.-w passwords.txt:PASS
: Define la wordlist de contraseñas para el marcadorPASS
.--mode clusterbomb
: Activa el modo clusterbomb para combinar usuarios y contraseñas.
Fuzzing de Múltiples Partes de una Solicitud JSON
Permite fuzzear múltiples campos dentro de una estructura JSON, ideal para realizar pruebas en APIs que aceptan datos complejos.
Comando:
|
|
Descripción:
-w usernames.txt:U
: Wordlist para nombres de usuario.-w passwords.txt:P
: Wordlist para contraseñas.-X POST
: Define el método HTTP como POST.-d '{"username":"U","password":"P"}'
: Define el cuerpo de la solicitud JSON, reemplazandoU
yP
.-H 'Content-Type: application/json'
: Establece el encabezadoContent-Type
.
Fuzzear Directorios y Nombres de Archivos Simultáneamente
Podemos combinar la enumeración de directorios y archivos para descubrir rutas completas y archivos específicos en una estructura de directorios.
Comando:
|
|
Descripción:
-w dirs.txt:DIR
: Wordlist para directorios.-w files.txt:FILE
: Wordlist para archivos.- Reemplaza
DIR
yFILE
simultáneamente para construir rutas completas.
Modo Pitchfork
El modo pitchfork
envía combinaciones sincronizadas de valores de diferentes wordlists, tomando una entrada de cada wordlist en cada iteración.
Probar Combinaciones Sincronizadas de Usuarios y Contraseñas
Comando:
|
|
Descripción:
- Similar al modo
clusterbomb
, pero en lugar de todas las combinaciones posibles, toma una entrada de cada wordlist en paralelo.
Subdominios y VHosts
Subdominios
El fuzzing de subdominios, ffuf
también nos ayuda a descubrir subdominios ocultos que podrían estar expuestos y vulnerables.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con cada entrada de la wordlist para descubrir subdominios comoadmin.host.name
,dev.host.name
, etc.
VHosts
Fuzzear VHosts (Virtual Hosts) nos permite identificar configuraciones de servidores que pueden servir contenido diferente o estar expuestos a diferentes vulnerabilidades.
Comando:
|
|
Descripción:
-H 'Host: FUZZ.host.name'
: Define el encabezadoHost
con cada entrada de la wordlist para descubrir VHosts comoapi.host.name
,mail.host.name
, etc.
Parámetros HTTP
Nombres de Parámetros - GET
Fuzzear nombres de parámetros en solicitudes GET puede revelar parámetros ocultos o sensibles.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con nombres de parámetros comouser
,id
,token
, etc., para descubrir cómo el servidor maneja estos parámetros.
Nombres de Parámetros - POST
Similar al fuzzing de parámetros GET, pero en solicitudes POST, donde los parámetros se envían en el cuerpo de la solicitud.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con nombres de parámetros en el cuerpo de la solicitud POST para poder identificar cómo el servidor procesa diferentes parámetros.
Valores de Parámetros - POST
Fuzzear valores específicos de parámetros puede ayudar a descubrir vulnerabilidades como inyecciones SQL, XSS, entre otras.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con diferentes IDs para probar cómo el servidor maneja distintos valores.
Fuzzing de Datos JSON en Solicitudes POST
Permite fuzzear valores dentro de estructuras JSON, ideal para pruebas de APIs que utilizan JSON para la comunicación.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con diferentes contraseñas para probar la autenticación de la API.
Encabezados (Headers)
Cambiar User-Agent
Podemos establecer un User-Agent
personalizado en las solicitudes, útil para simular diferentes navegadores o dispositivos.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
y establece unUser-Agent
específico para cada solicitud.
Establecer el Encabezado Content-Type
Define el tipo de contenido que se está enviando, esencial para solicitudes POST o PUT que envían datos estructurados.
Comando:
|
|
Descripción:
- Establece el encabezado
Content-Type
aapplication/json
para enviar datos en formato JSON.
Establecer el Encabezado Authorization
Incluye un token de autorización en las solicitudes, necesario para acceder a recursos protegidos.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
y establece el encabezadoAuthorization
con un token Bearer.
Valor de Token Bearer
Fuzzear tokens Bearer para probar la validez y seguridad de los mecanismos de autenticación.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con diferentes tokens para evaluar la autenticidad y permisos.
Valor de un Encabezado Personalizado
Permite fuzzear valores de encabezados HTTP personalizados, útil para descubrir configuraciones específicas del servidor.
Comando:
|
|
Descripción:
- Reemplaza
FUZZ
con diferentes direcciones IP para probar la manipulación de encabezados proxy.
Límites de Tasa (Rate Limits)
Controlar la tasa de solicitudes que enviamos durante el fuzzing, es crucial para evitar ser bloqueado por el servidor objetivo y para manejar eficientemente los recursos.
Limitar la Tasa a 50 Solicitudes por Segundo
Controlar la velocidad de las solicitudes para evitar sobrecargar el servidor o activar mecanismos de bloqueo.
Comando:
|
|
Descripción:
-rate 50
: Limita la tasa de solicitudes a 50 por segundo.
Establecer Número de Hilos
Definir la cantidad de hilos concurrentes para las solicitudes, afectando el rendimiento y la velocidad del fuzzing.
Comando:
|
|
Descripción:
-t 5
: Utiliza 5 hilos concurrentes para enviar las solicitudes.
Delays (Retrasos)
Introduce retrasos entre las solicitudes para manejar mejor el flujo de tráfico y reducir la carga en el servidor.
Comando:
|
|
Descripción:
-t 2
: Usa 2 hilos concurrentes.-p 1
: Introduce un retraso de 1 segundo entre las solicitudes.
Filtros (Filters)
Los filtros nos permiten excluir respuestas no deseadas basándose en diferentes criterios, optimizando los resultados del fuzzing.
Filtrar Códigos HTTP 301 y 302
Excluye respuestas que redirigen, enfocándose en respuestas finales.
Comando:
|
|
Descripción:
-fc 301,302
: Filtra y excluye respuestas con códigos de estado 301 y 302.
Filtrar por Tamaño de Respuesta
Excluye respuestas que no coinciden con un tamaño específico, lo que nos puede ayudar a identificar contenido único.
Comando:
|
|
Descripción:
-fs 2003
: Filtra respuestas que tienen exactamente 2003 bytes.
Filtrar por Número de Líneas
Excluye respuestas basadas en el número de líneas, útil para filtrar contenido genérico.
Comando:
|
|
Descripción:
-fl 5
: Filtra respuestas que tienen exactamente 5 líneas.
Filtrar por Conteo de Palabras
Excluye respuestas que no tengan un número específico de palabras, nos ayuda a identificar respuestas únicas o sensibles.
Comando:
|
|
Descripción:
-fw 10
: Filtra respuestas que tienen exactamente 10 palabras.
Calibrar Opciones de Filtrado Automáticamente
Permite a ffuf
ajustar automáticamente las opciones de filtrado basándose en las respuestas recibidas, optimizando el proceso de fuzzing.
Comando:
|
|
Descripción:
-ac
: Habilita la calibración automática de filtros para mejorar la precisión de los resultados.
Matchers
Los matchers son unas reglas o parámetros que definen cómo ffuf
interpreta y filtra las respuestas basándose en diferentes criterios.
Coincidir Código de Estado
Filtra resultados que coincidan con un código de estado HTTP específico, facilitando la identificación de respuestas exitosas.
Comando:
|
|
Descripción:
-mc 200
: Muestra solo las respuestas con código de estado 200.
Coincidir Tamaño de Respuesta
Filtra resultados basados en el tamaño exacto de la respuesta, útil para identificar respuestas únicas.
Comando:
|
|
Descripción:
-ms 1000
: Muestra solo las respuestas que tienen exactamente 1000 bytes.
Coincidencia de un Rango de Tamaños de Respuesta
Filtra respuestas dentro de un rango específico de tamaños, ofreciendo mayor flexibilidad.
Comando:
|
|
Descripción:
-ms 900-1100
: Muestra solo las respuestas que tienen entre 900 y 1100 bytes.
Coincidencia por Conteo de Palabras
Filtra resultados basados en el conteo de palabras en la respuesta, ayudando a identificar contenido relevante.
Comando:
|
|
Descripción:
-mw 50
: Muestra solo las respuestas que tienen exactamente 50 palabras.
Coincidencia por Número de Líneas de Respuesta
Filtra resultados basados en el número de líneas de la respuesta, útil para identificar respuestas únicas o relevantes.
Comando:
|
|
Descripción:
-ml 10
: Muestra solo las respuestas que tienen exactamente 10 líneas.
Regex Matching
Permite filtrar respuestas que coincidan con una expresión regular específica, ofreciendonos una forma poderosa para identificar patrones en las respuestas.
Comando:
|
|
Descripción:
-mr "success|welcome"
: Muestra solo las respuestas que contienen las palabras “success” o “welcome”.
Opciones de Salida (Output Options)
Guardar y exportar los resultados del fuzzing es esencial para análisis posteriores y documentación.
Guardar Resultados en JSON
Exportar los resultados en formato JSON, facilitando su integración con otras herramientas para su análisis.
Comando:
|
|
Descripción:
-o results.json
: Define el archivo de salida.-of json
: Especifica el formato de salida como JSON.
Guardar Resultados en CSV
Exportar los resultados en formato CSV, ideal para análisis en hojas de cálculo o bases de datos.
Comando:
|
|
Descripción:
-o results.csv
: Define el archivo de salida.-of csv
: Especifica el formato de salida como CSV.
Guardar Salida en Todos los Formatos Soportados
Permite guardar los resultados en todos los formatos disponibles simultáneamente, facilitando múltiples tipos de análisis.
Comando:
|
|
Descripción:
-o results
: Define el prefijo del archivo de salida.-of all
: Guarda los resultados en todos los formatos soportados.
Proxy
El uso de proxies es fundamental que nos permite monitorear y manipular el tráfico HTTP durante las pruebas de fuzzing.
Proxy HTTP
Redirige las solicitudes a través de un proxy HTTP, útil para inspeccionar el tráfico con herramientas como Burp Suite, Caido y OWASP ZAP.
Comando:
|
|
Descripción:
-x http://127.0.0.1:8080
: Define la URL del proxy HTTP.
Proxy SOCKS
Utilizar un proxy SOCKS para una mayor flexibilidad y compatibilidad con diferentes tipos de tráfico.
Comando:
|
|
Descripción:
-x socks5://127.0.0.1:1080
: Define la URL del proxy SOCKS.
Proxy de Reproducción (Replay Proxy)
Reproducir las solicitudes a través de un proxy, permitiendo la inspección y modificación de las mismas en tiempo real.
Comando:
|
|
Descripción:
-replay-proxy http://127.0.0.1:8080
: Define la URL del proxy de reproducción.
Límites de Tiempo (Time Limits)
Controlar el tiempo de ejecución de tus pruebas es esencial para gestionar recursos y evitar bloqueos prolongados.
Establecer un Límite de Tiempo Máximo
Define el tiempo máximo permitido para la ejecución completa del escaneo, evitando que ffuf
se ejecute indefinidamente.
Comando:
|
|
Descripción:
-maxtime 60
: Establece un límite de tiempo de 60 segundos para toda la ejecución.
Límite de Tiempo por Trabajo
Definir un límite de tiempo específico para cada trabajo individual, asegurando que ninguna solicitud individual consuma demasiado tiempo.
Comando:
|
|
Descripción:
-maxtime-job 60
: Establece un límite de tiempo de 60 segundos para cada solicitud individual.
Otras Opciones Útiles
Podemos usar Ffuf en otro tipo de usos que combinan múltiples opciones para maximizar la eficacia de nuestras pruebas de de fuzzing.
Fuzzing con Métodos HTTP Personalizados
Además de los métodos HTTP estándar como GET y POST, ffuf
permite utilizar métodos personalizados para interactuar con aplicaciones que dependen de otros métodos HTTP, como PUT, DELETE o PATCH.
Comando:
|
|
Descripción:
-X PUT
: Establece el método HTTP a PUT.-d '{"data":"test"}'
: Define el cuerpo de la solicitud con datos JSON.-H "Content-Type: application/json"
: Establece el encabezadoContent-Type
.-mc 201
: Filtra respuestas con el código de estado 201 (Created).-o put_fuzz.json -of json
: Guarda los resultados en formato JSON.
Uso Práctico
Este comando es útil para probar endpoints que aceptan métodos HTTP menos comunes, como la creación de recursos a través de solicitudes PUT.
Autenticación de Proxy
Al trabajar a través de un proxy que requiere autenticación, es esencial proporcionar las credenciales correctas para que ffuf
pueda realizar las solicitudes adecuadamente.
Comando:
|
|
Descripción:
-x http://username:[email protected]:8080
: Define el proxy HTTP con credenciales.-w wordlist.txt -u https://host.name/FUZZ
: Configura la wordlist y la URL objetivo.-o proxy_auth_fuzz.json -of json
: Guarda los resultados en formato JSON.
Uso Práctico
Ideal para entornos corporativos donde el tráfico debe pasar a través de proxies autenticados, permitiendo realizar fuzzing sin interrupciones.
Fuzzing Adaptativo con Límites de Tasa Dinámicos
Implementa un fuzzing adaptativo que ajusta dinámicamente los límites de tasa basándose en la respuesta del servidor, evitando sobrecargas y posibles bloqueos.
Comando:
|
|
Descripción:
-rate 100
: Comienza con 100 solicitudes por segundo.-rate-min 10
: No reduce la tasa por debajo de 10 solicitudes por segundo.-ac
: Habilita la calibración automática.-o adaptive_fuzz.json -of json
: Guarda los resultados en formato JSON.
Uso Práctico
Ideal para entornos donde la estabilidad del servidor es crítica y deseas minimizar la posibilidad de ser bloqueado mientras realizas pruebas intensivas.
Recursión Condicional Basada en Matchers
Realiza fuzzing recursivo únicamente cuando se cumplen ciertas condiciones definidas por los matchers, optimizando el proceso y enfocándose en áreas relevantes.
Comando:
|
|
Descripción:
-recursion -recursion-depth 2
: Habilita la recursión hasta dos niveles de profundidad.-mc 200,403
: Solo realiza recursión si la respuesta tiene códigos de estado 200 o 403.-ms 1500
: Filtra respuestas con un tamaño de 1500 bytes.-o conditional_recursion.json -of json
: Guarda los resultados en formato JSON.
Uso Práctico
Permite enfocarse en rutas que devuelven respuestas exitosas o específicas, evitando profundizar en áreas irrelevantes o protegidas, optimizando así el tiempo y recursos.
Combinación de Hilos y Matchers Específicos
Optimizar el rendimiento de ffuf
combinando un número específico de hilos con matchers diseñados para filtrar respuestas relevantes, asegurando una ejecución eficiente y focalizada.
Comando:
|
|
Descripción:
-t 50
: Utiliza 50 hilos concurrentes para maximizar la velocidad.-mc 200,302
: Filtra respuestas con códigos de estado 200 y 302.-mr "Dashboard|Admin"
: Filtra respuestas que contienen las palabras “Dashboard” o “Admin”.-o optimized_fuzz.json -of json
: Guarda los resultados en formato JSON.
Uso Práctico
Este comando es ideal para entornos donde se necesita una exploración rápida y focalizada, como identificar paneles administrativos o dashboards que responden con códigos de estado específicos.
Tips Adicionales para Maximizar nuestro Uso de ffuf
-
Personaliza tus Wordlists: Aunque las wordlists predefinidas son útiles, crear wordlists personalizadas basadas en el contexto de la aplicación objetivo puede aumentar significativamente la efectividad del fuzzing.
-
Combina con Otras Herramientas: Utiliza
ffuf
en conjunto con herramientas como Burp Suite, Caido OWASP ZAP, o Nmap para obtener una visión más completa de la seguridad de tu aplicación. -
Automatiza tus Pruebas: Integra
ffuf
en tus pipelines de CI/CD para realizar pruebas automáticas durante el desarrollo. -
Monitorea el Rendimiento: La herramienta nos permite controlar los parámetros de tasa y hilos según el rendimiento del servidor objetivo y tus recursos locales para optimizar el tiempo de escaneo sin sobrecargar el sistema.
-
Analiza los Resultados: Utiliza las opciones de salida en formatos como JSON o CSV para analizar los resultados de manera más eficiente y detectar patrones o anomalías rápidamente.
Con estos consejos y la guía completa de comandos, estás listo para llevar tus pruebas de fuzzing al siguiente nivel con ffuf
. ¡Feliz fuzzing!
Recursos Adicionales
Para profundizar en el uso de ffuf
y explorar otras opciones, te recomiendo consultar los siguientes recursos: