ffuf (Fuzz Faster U Fool) es una herramienta de fuzzing web de código abierto escrita en Go que descubre contenido oculto en aplicaciones web (directorios, archivos, subdominios y parámetros) sustituyendo la palabra clave FUZZ en una URL o cabecera HTTP por cada línea de una lista de palabras.
¿Qué es ffuf y para qué sirve en un pentest web?
Durante un test de intrusión web, una de las primeras fases es la enumeración de contenido oculto: rutas de administración no enlazadas, archivos de configuración expuestos, subdominios que no aparecen en DNS público o parámetros GET/POST que la aplicación acepta pero no documenta. ffuf automatiza esa tarea enviando miles de peticiones HTTP por segundo y filtrando las respuestas según códigos de estado, tamaño o palabras clave.
Su flexibilidad (fuzzing de URL, cabeceras, cuerpo POST, modo recursivo, múltiples wordlists simultáneas) lo ha convertido en la herramienta de referencia en entornos como HackTheBox o TryHackMe y en competiciones CTF.
«ffuf is a fest and simple web fuzzer written in Go, designed to fuzz web applications and discover hidden content.»
— Repositorio oficial ffuf en GitHub (github.com/ffuf/ffuf)
Instalación de ffuf
En Kali Linux (recomendado)
En Kali Linux, ffuf viene disponible en los repositorios oficiales. Basta con:
sudo apt update && sudo apt install ffuf -y
Comprueba la versión instalada:
ffuf -V
Desde el código fuente con Go
Si prefieres la versión más reciente o trabajas en otra distribución con Go instalado:
go install github.com/ffuf/ffuf/v2@latest
El binario quedará en ~/go/bin/ffuf. Añade ese directorio a tu $PATH si no lo tienes ya:
export PATH=$PATH:~/go/bin
Binario precompilado
En la página de releases del repositorio oficial puedes descargar el binario para Linux, macOS o Windows sin necesidad de compilar.
Uso básico: fuzzing de directorios y archivos
La sintaxis mínima requiere dos parámetros: la URL con el marcador FUZZ y la wordlist:
ffuf -u https://lab.ejemplo.com/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt
Por defecto ffuf muestra todos los resultados que no sean 404. Para afinar la salida usa los filtros (ver tabla más abajo). Un ejemplo práctico filtrando solo respuestas 200 y 301:
ffuf -u https://lab.ejemplo.com/FUZZ
-w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
-mc 200,301
-t 50
La opción -t 50 fija 50 hilos concurrentes. Ajústala según el ancho de banda disponible y el servidor objetivo (ver sección de buenas prácticas).
Fuzzing de subdominios (vhost fuzzing)
Para descubrir subdominios válidos, coloca FUZZ en el subdominio de la URL. También es habitual hacerlo mediante la cabecera Host cuando el servidor usa virtual hosting:
# Opción 1 — FUZZ en la URL
ffuf -u https://FUZZ.lab.ejemplo.com
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
# Opción 2 — cabecera Host (vhost fuzzing)
ffuf -u https://lab.ejemplo.com
-H "Host: FUZZ.lab.ejemplo.com"
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
-fs 1234
En el vhost fuzzing es habitual que todas las respuestas tengan el mismo tamaño (la página de error genérica). Usa -fs <tamaño> para filtrar por ese tamaño y quedarte solo con los subdominios que devuelven contenido distinto.
Fuzzing de parámetros GET
Descubrir parámetros ocultos ayuda a encontrar vulnerabilidades como IDOR o LFI:
ffuf -u "https://lab.ejemplo.com/api/user?FUZZ=1"
-w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
-mc 200
-fs 0
Para fuzzing de valores de un parámetro conocido (por ejemplo, buscando LFI):
ffuf -u "https://lab.ejemplo.com/page?file=FUZZ"
-w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt
-mc 200
-fw 10
-fw 10 filtra respuestas con exactamente 10 palabras (el mensaje de error habitual).
Fuzzing POST (cuerpo de la petición)
ffuf -u https://lab.ejemplo.com/login
-X POST
-d "username=admin&password=FUZZ"
-H "Content-Type: application/x-www-form-urlencoded"
-w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-1000.txt
-fc 302
Modo recursivo
Con -recursion ffuf sigue explorando en profundidad los directorios que descubre:
ffuf -u https://lab.ejemplo.com/FUZZ
-w /usr/share/seclists/Discovery/Web-Content/common.txt
-recursion
-recursion-depth 3
-mc 200,301,302
Ten cuidado: la recursión multiplica el número de peticiones de forma exponencial. Úsala con listas cortas o en entornos de laboratorio.
Filtros y opciones más usados
| Opción | Qué hace |
|---|---|
-w <wordlist> |
Especifica la wordlist (o -w wl1:FUZZ1 -w wl2:FUZZ2 para múltiples) |
-u <URL> con FUZZ |
Define la URL objetivo; FUZZ marca la posición a sustituir |
-mc <códigos> |
Muestra solo respuestas con esos códigos HTTP (ej. 200,301,302) |
-fc <códigos> |
Filtra (oculta) respuestas con esos códigos HTTP (ej. -fc 404) |
-fs <bytes> |
Filtra respuestas cuyo tamaño en bytes coincida con el valor dado |
-fw <palabras> |
Filtra respuestas con ese número exacto de palabras |
-fl <líneas> |
Filtra respuestas con ese número exacto de líneas |
-ac |
Calibración automática: ffuf aprende el patrón de respuestas falsas y las filtra solo |
-recursion |
Activa el modo recursivo para explorar subdirectorios descubiertos |
-t <n> |
Número de hilos concurrentes (por defecto 40) |
-rate <n> |
Limita las peticiones por segundo |
-o <archivo> |
Guarda los resultados en un archivo (-of json, html, csv…) |
-x <proxy> |
Envía el tráfico a través de un proxy (ej. Burp Suite en http://127.0.0.1:8080) |
Wordlists: SecLists es tu mejor aliada
La calidad del resultado depende casi tanto de la wordlist como de la herramienta. El repositorio SecLists (Daniel Miessler) es el estándar de facto y viene preinstalado en Kali en /usr/share/seclists/. Las más usadas con ffuf:
Discovery/Web-Content/common.txt— directorios y archivos comunes (~4 700 entradas, rápida)Discovery/Web-Content/directory-list-2.3-medium.txt— más exhaustiva (~220 000 entradas)Discovery/Web-Content/raft-medium-words.txt— buena relación velocidad/coberturaDiscovery/DNS/subdomains-top1million-5000.txt— subdominios más comunesDiscovery/Web-Content/burp-parameter-names.txt— nombres de parámetros webFuzzing/LFI/LFI-Jhaddix.txt— payloads de LFI
Si no tienes SecLists instalado:
sudo apt install seclists -y
Ejemplo práctico en laboratorio
Aviso previo: los siguientes comandos se ejecutan exclusivamente sobre sistemas propios o entornos de práctica autorizados como HackTheBox, TryHackMe o DVWA en local. Ejecutar fuzzing contra sistemas de terceros sin permiso explícito es ilegal.
Escenario: máquina de práctica HackTheBox con IP 10.10.10.200 ejecutando un servidor web en el puerto 80. Queremos descubrir directorios ocultos y, a partir de uno encontrado, ir en profundidad.
Paso 1 — reconocimiento rápido con calibración automática:
ffuf -u http://10.10.10.200/FUZZ
-w /usr/share/seclists/Discovery/Web-Content/common.txt
-ac
-t 40
-o resultados.json -of json
La opción -ac evita que tengas que adivinar el tamaño de la respuesta de error. ffuf analiza las primeras respuestas automáticamente.
Paso 2 — supongamos que descubrimos /admin; exploración recursiva:
ffuf -u http://10.10.10.200/admin/FUZZ
-w /usr/share/seclists/Discovery/Web-Content/raft-medium-words.txt
-mc 200,301,302,403
-t 30
Paso 3 — integración con Burp Suite para inspección manual:
ffuf -u http://10.10.10.200/FUZZ
-w /usr/share/seclists/Discovery/Web-Content/common.txt
-x http://127.0.0.1:8080
-mc 200
Todo el tráfico pasa por Burp, donde puedes analizar cabeceras y cuerpos de respuesta. Aprende a integrar ambas herramientas en nuestra guía completa de Burp Suite.
ffuf vs Gobuster vs dirb: ¿cuál elegir?
Las tres herramientas resuelven el mismo problema pero con distintos matices:
- dirb — la más antigua; lenta, sin soporte de multihilo real, útil solo para reconocimientos básicos o cuando el entorno es muy restrictivo.
- Gobuster — rápido, escrito en Go, buena opción para fuzzing de directorios y DNS. Menos flexible que ffuf: no permite múltiples wordlists simultáneas ni fuzzing de cabeceras.
- ffuf — el más flexible y rápido. Permite colocar
FUZZen cualquier parte de la petición (URL, cabeceras, cuerpo POST), usar múltiples marcadores (FUZZ,FUZZ2…) con distintas listas, modo recursivo, calibración automática y exportación de resultados. Es la opción preferida para pentests web completos.
Para profundizar en las técnicas de enumeración y fuzzing en contexto, consulta nuestro curso de hacking web y la guía completa de hacking web.
Buenas prácticas y errores comunes
Buenas prácticas
- Define siempre el scope. Fuzzing fuera del scope acordado puede causar interrupciones de servicio y responsabilidad legal.
- Controla la velocidad. Usa
-ratepara limitar peticiones por segundo en servidores de producción o con IDS/WAF. Un servidor saturado es una denegación de servicio involuntaria. - Empieza con listas pequeñas.
common.txtprimero; pasa a listas más grandes solo si el objetivo lo justifica. - Guarda los resultados. Usa
-o <archivo> -of jsonpara conservar evidencias del pentest. - Integra con Burp Suite. El proxy te permite inspeccionar respuestas interesantes en detalle sin repetir el fuzzing.
Errores comunes
- No filtrar y perder señal en el ruido. Sin
-fc,-fso-ac, la salida puede ser inmanejable. Empieza siempre con-aco examina manualmente las primeras respuestas para saber qué filtrar. - Usar demasiados hilos (
-t). Valores muy altos (>100) pueden saturar el servidor objetivo o hacer que tu IP quede bloqueada por el WAF. - Olvidar la barra final en rutas.
/adminy/admin/pueden devolver respuestas distintas. Prueba ambas variantes o usa la opción-e /. - Wordlist en codificación incorrecta. Asegúrate de que la wordlist está en UTF-8 sin BOM; algunos caracteres especiales pueden causar comportamientos inesperados.
- No verificar manualmente los positivos. ffuf indica candidatos, pero la confirmación final debe hacerse a mano (navegador, curl o Burp) para descartar falsos positivos.
Vídeo recomendado
Si prefieres aprender ffuf en formato vídeo, este tutorial en español cubre fuzzing de directorios, subdominios y parámetros con ejemplos prácticos:
Aviso ético y legal
El uso de ffuf o cualquier herramienta de fuzzing contra sistemas que no sean de tu propiedad o para los que no tengas autorización escrita explícita es un delito. En España, el artículo 197 bis del Código Penal tipifica el acceso no autorizado a sistemas informáticos con penas de hasta dos años de prisión, independientemente de que se cause o no daño. En el ámbito de la Unión Europea, la Directiva 2013/40/UE armoniza estas sanciones en todos los estados miembros.
Practica siempre en entornos autorizados: laboratorios propios (DVWA, VulnHub, máquinas Docker), plataformas de práctica legal como HackTheBox o TryHackMe, o dentro del scope definido en un contrato de pentest firmado. Si eres profesional, documenta siempre la autorización antes de iniciar cualquier prueba.
Preguntas frecuentes
¿ffuf solo sirve para directorios?
No. Aunque la enumeración de directorios es su uso más conocido, ffuf puede fuzzing de cualquier parte de una petición HTTP: subdominios (via cabecera Host), parámetros GET y POST, cabeceras personalizadas, partes del path, extensiones de archivos y valores de cookies. Es una herramienta de propósito general para descubrimiento de contenido web.
¿Cuál es la diferencia entre -mc y -fc?
-mc (match code) actúa como lista blanca: solo muestra respuestas cuyos códigos HTTP estén en la lista. -fc (filter code) actúa como lista negra: oculta respuestas con esos códigos. En la práctica, -fc 404 es el filtro más común para esconder páginas no encontradas, mientras que -mc 200,301 es útil cuando sabes exactamente qué buscas.
¿Qué hace la opción -ac exactamente?
La calibración automática (-ac) envía al inicio varias peticiones con cadenas aleatorias que con toda probabilidad no existirán en el servidor. Analiza el patrón de esas respuestas (tamaño, número de palabras, líneas) y configura automáticamente los filtros -fs, -fw y -fl para ignorar respuestas similares. Es el modo más cómodo para empezar cuando no conoces el comportamiento del servidor objetivo.
¿Puedo usar ffuf junto con Burp Suite?
Sí. Con la opción -x http://127.0.0.1:8080 todo el tráfico de ffuf pasa por el proxy de Burp Suite. Esto te permite inspeccionar respuestas interesantes en el historial de Burp, repetir peticiones con el Repeater o lanzar ataques adicionales con el Intruder. Es una combinación muy habitual en auditorías web profesionales. Aprende más en nuestra guía de Burp Suite.
¿Cuántos hilos (-t) es razonable usar?
El valor por defecto es 40, que es adecuado para la mayoría de entornos de laboratorio. En plataformas como HackTheBox, valores entre 20 y 50 funcionan bien sin saturar el servidor. En entornos de producción (un pentest real), conviene empezar con 10-20 hilos y escalar progresivamente, monitorizando la tasa de error. Valores superiores a 100 pueden activar protecciones del WAF o provocar inestabilidad en el servidor.
¿Dónde puedo practicar fuzzing de forma legal?
Las mejores opciones son: plataformas en línea como HackTheBox, TryHackMe o PentesterLab; máquinas vulnerables locales como DVWA (Damn Vulnerable Web Application) o las VMs de VulnHub; o laboratorios Docker con aplicaciones intencionalmente vulnerables como Juice Shop (OWASP). Si quieres aprender de forma estructurada, nuestro curso de hacking web te guía paso a paso con entornos de práctica incluidos.
