Tutorial de ffuf en español: fuzzing de directorios, subdominios/vhosts y parámetros GET/POST, cómo filtrar ruido con -fc/-fs y calibrar con -mc/-ac, wordlists de SecLists y cuándo usar gobuster o dirsearch como alternativas.
Gorka El Bochi
Fundador de BBLABS
Respuesta rápida: ffuf (Fuzz Faster U Fool) es un fuzzer web escrito en Go, rapidísimo, que descubre contenido oculto sustituyendo la palabra
FUZZpor cada línea de una wordlist. Sirve para encontrar directorios, ficheros, subdominios (vhosts) y parámetros. La clave no es lanzarlo, sino filtrar el ruido con-fc,-fso auto-calibración.
En recon web, gran parte de lo interesante no está enlazado: paneles de admin, endpoints de API viejos, ficheros de backup, entornos de staging. El fuzzing consiste en probar miles de rutas y parámetros para descubrir lo que no ves a simple vista. ffuf lo hace muy rápido y con un sistema de filtros excelente.
El concepto central es la palabra clave FUZZ: la pones donde quieres que ffuf itere y él sustituye por cada entrada de la wordlist. Encaja de forma natural en un flujo de recon más amplio, después de haber enumerado dominios y subdominios.
¿Por qué ffuf y no un navegador o un crawler? Porque el crawler solo sigue enlaces que existen en el HTML, y lo interesante en bug bounty suele ser justo lo que no está enlazado. El fuzzing prueba a ciegas rutas y parámetros plausibles y descubre esa superficie invisible. Es una de las primeras técnicas que te dan hallazgos reales, y ffuf la hace tan rápida que puedes lanzarla en cada objetivo sin que sea un cuello de botella.
El uso más habitual: descubrir rutas. Pones FUZZ en el path:
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u https://target.com/FUZZ
ffuf lanza una petición por cada palabra y te muestra el código de estado, tamaño, palabras y líneas de cada respuesta. Para buscar extensiones concretas, usa -e:
ffuf -w wordlist.txt -u https://target.com/FUZZ -e .php,.bak,.old,.zip,.txt
Esto prueba ruta, ruta.php, ruta.bak, etc. Los .bak, .old y .zip esconden a menudo código fuente o backups jugosos.
Un fuzzing en crudo devuelve cientos de respuestas basura (páginas 404 que responden 200, redirecciones, plantillas de error). Aprender a filtrar es lo que separa el ruido de los hallazgos:
-mc (match code): muestra solo estos códigos. Ej. -mc 200,301,302,401,403.-fc (filter code): oculta estos códigos. Ej. -fc 404.-fs (filter size): oculta respuestas de este tamaño en bytes. Perfecto cuando el 404 personalizado siempre pesa lo mismo.-fw / -fl: filtra por número de palabras o de líneas.-ac (auto-calibration): ffuf lanza unas cuantas peticiones falsas al principio, aprende cómo se ve una respuesta "vacía" y filtra automáticamente. El botón fácil cuando no sabes qué filtrar.Un ejemplo realista, filtrando el 404 personalizado que siempre mide 1234 bytes:
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
-u https://target.com/FUZZ \
-fs 1234 -mc all -t 60
Con -t controlas los hilos (por defecto 40). No te pases: martillear un servidor pequeño con 200 hilos es una forma rápida de tirarlo o de que te baneen.
El vhost fuzzing busca hosts virtuales que responden en la misma IP pero solo si mandas la cabecera Host correcta (no aparecen por DNS). Pones FUZZ en la cabecera:
ffuf -w subdominios.txt \
-u https://target.com \
-H "Host: FUZZ.target.com" \
-fs 0
Como todos los vhosts inválidos suelen devolver la misma página por defecto, filtra por su tamaño con -fs (o usa -ac). Los vhosts que respondan distinto son candidatos a entornos internos o de staging. Esto complementa la enumeración pasiva de subdominios que cubro en técnicas de recon avanzadas.
ffuf también descubre parámetros ocultos, esos que la app procesa pero no documenta y que a menudo esconden IDOR o debug flags.
Parámetro GET (nombre del parámetro):
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u "https://target.com/api?FUZZ=test" \
-fs 42
Valores POST (por ejemplo, fuerza bruta de un ID en un cuerpo de formulario):
ffuf -w ids.txt \
-u https://target.com/api/user \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "id=FUZZ" \
-mc 200
Puedes tener varias wordlists a la vez con nombres de keyword propios (-w users.txt:USER -w pass.txt:PASS) y usar USER y PASS en la misma petición. Con -mode clusterbomb o pitchfork controlas cómo se combinan: clusterbomb prueba todas las combinaciones (ideal para fuerza bruta de credenciales), pitchfork empareja línea con línea.
ffuf te muestra por cada hallazgo: la palabra, el código de estado, el tamaño (Size), las palabras (Words) y las líneas (Lines). Aprender a leerlos evita perseguir falsos positivos:
-fs/-fw salvan el día: filtras por el tamaño constante de esa página de error./admin que redirige a /login te confirma que existe un panel.La disciplina mental es: ¿qué se desvía del comportamiento base del objetivo? Eso es lo que merece una mirada manual.
Cuando descubres un directorio interesante (/api/, /admin/), quieres fuzzear dentro de él sin relanzar a mano. La recursión lo automatiza:
ffuf -w wordlist.txt -u https://target.com/FUZZ \
-recursion -recursion-depth 2 -mc 200,301,403
ffuf entra en cada directorio encontrado y sigue fuzzeando hasta la profundidad indicada. Úsalo con cabeza: la recursión multiplica el número de peticiones muy rápido.
Para casos finos, el matching por regex es más potente que por código o tamaño:
-mr (match regex): muestra respuestas cuyo cuerpo cumple una expresión, ej. -mr "admin|dashboard|token".-fr (filter regex): oculta las que cumplen un patrón de error conocido.Y sobre el ritmo, la parte ética: no martillees al objetivo. Controla el volumen con -rate (peticiones por segundo) y -p (delay aleatorio entre peticiones):
ffuf -w wordlist.txt -u https://target.com/FUZZ -rate 50 -p 0.1
Un fuzzing agresivo puede tumbar un servidor pequeño o hacer que te baneen del programa. En objetivos delicados, baja el rate y avisa si el programa lo pide.
El fuzzing es tan bueno como tu wordlist. La referencia es SecLists. Algunas que uso a diario:
Discovery/Web-Content/raft-medium-directories.txt y raft-medium-files.txt — equilibrio señal/tamaño.Discovery/Web-Content/common.txt — rápida para una primera pasada.Discovery/DNS/subdomains-top1million-5000.txt — subdominios/vhosts.Discovery/Web-Content/burp-parameter-names.txt — nombres de parámetros.Guarda los resultados con -o salida.json -of json para procesarlos luego o encadenarlos con otras herramientas.
ffuf no vive aislado: es una pieza dentro del flujo de recon. Un patrón muy productivo es fuzzear muchos hosts a la vez. Con la keyword en el propio dominio, iteras sobre una lista de subdominios vivos que salió de tu enumeración:
ffuf -w hosts-vivos.txt:HOST -w rutas.txt:RUTA \
-u https://HOST/RUTA -mc 200,301,403 -o hallazgos.json -of json
Así, un directorio /backup/ que solo existe en un subdominio olvidado aparece sin que lo busques a mano host por host. El JSON de salida se puede filtrar con jq, alimentar a Nuclei o mandar a tus notas.
La disciplina que marca la diferencia: no vuelques el output y te olvides. Revisa a mano cada 200/403 interesante en Burp, porque el hallazgo de verdad casi nunca es "existe la ruta", sino lo que hay dentro de ella. El fuzzing te lleva a la puerta; abrirla es trabajo manual.
No hay una única herramienta correcta; conviene conocer las alternativas:
En la práctica, muchos hunters usan los tres según la situación. ffuf es el que más da de sí cuando el escenario se sale de lo estándar.
¿Qué wordlist uso si no sé por dónde empezar?
Para directorios, raft-medium-directories.txt de SecLists es un equilibrio excelente entre cobertura y tiempo. Para una primera pasada rápida, common.txt. Ajusta según lo que veas.
Todos mis resultados salen con el mismo tamaño, ¿qué hago?
Es el 404 personalizado del objetivo respondiendo 200. Fíltralo con -fs <ese tamaño> o usa -ac para que ffuf calibre solo. Es el paso que más frustra a los principiantes y el que más resultados desbloquea.
¿ffuf hace fuzzing de subdominios reales (DNS)?
El vhost fuzzing de ffuf descubre hosts virtuales por la cabecera Host, que no aparecen por DNS. Para enumeración de subdominios vía DNS/fuentes públicas, subfinder o amass son mejores; ffuf complementa encontrando los vhosts "ocultos" en la misma IP.
¿Es legal hacer fuzzing?
Solo con permiso. Genera mucho tráfico y toca rutas que el dueño no expone a propósito. Hazlo en tus labs o dentro del scope de un programa que lo autorice.
-t con cabeza y -p (delay) si el objetivo es sensible.-x http://127.0.0.1:8080 para revisar a mano los hallazgos interesantes.Para practicar el flujo completo —descubrir superficie, entender qué has encontrado y explotarlo— entrena con labs que replican reportes reales y sigue una ruta ordenada. El fuzzing con ffuf es una de las primeras habilidades que te dan resultados: cuanto antes lo domines, antes empiezas a encontrar cosas que otros no ven.
hunters entrenando
labs de reportes reales
completaciones
en bounties practicados
Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras
Todo lo que necesitas para montar un entorno profesional de bug bounty: desde la elección del sistema operativo hasta la automatización de reconocimiento.
Lleva tu fase de reconocimiento al siguiente nivel con técnicas avanzadas de enumeración de subdominios, análisis de archivos JavaScript, GitHub dorking y automatización.
Tutorial de Burp Suite en español desde cero: qué es, instalación y configuración del proxy (127.0.0.1:8080 + certificado CA), Proxy/Intercept, Repeater, Intruder, Decoder, extensiones útiles, Community vs Pro y un flujo real de caza.