Descubrir directorios y archivos ocultos
Descubrir directorios y archivos es el uso más común de ffuf. Antes de probar inyecciones o fallos de lógica, conviene saber qué superficie tiene la aplicación: qué rutas existen, qué paneles hay, qué archivos quedaron expuestos. Esta lección le enseña a montar ese mapa con una lista de palabras.
Las listas de palabras: SecLists
Una lista de palabras es un archivo de texto con un nombre por línea. La herramienta es tan buena como la lista que le dé. El estándar de la industria es SecLists, una colección gratuita con listas para rutas, usuarios, contraseñas, parámetros y mucho más.
# Debian y Ubuntu la empaquetan
sudo apt install seclists
# o clonar el repositorio oficial
git clone https://github.com/danielmiessler/SecLists.gitPara descubrir contenido web, las listas viven en Discovery/Web-Content. Vale la pena conocer tres:
| Lista | Para qué sirve |
|---|---|
common.txt | Rápida, unas 4700 rutas muy habituales. Buen primer barrido |
directory-list-2.3-medium.txt | Grande, unas 220000 entradas. Barrido a fondo |
raft-medium-directories.txt | Directorios ordenados por frecuencia real observada |
El comando básico
Con la lista elegida, el descubrimiento se reduce a poner FUZZ donde iría la ruta.
ffuf -u URL/FUZZ -w LISTALas banderas que usará casi siempre:
| Bandera | Qué hace | Ejemplo |
|---|---|---|
-u | La URL objetivo, con FUZZ en el punto a probar | -u http://localhost:8000/FUZZ |
-w | La lista de palabras | -w common.txt |
-e | Extensiones a probar en cada palabra | -e .php,.bak,.txt |
-t | Hilos en paralelo (velocidad) | -t 40 |
-recursion | Entra en las carpetas encontradas y sigue fuzzeando | -recursion |
-o | Guarda la salida en un archivo | -o salida.json |
Un barrido típico de un sitio local, probando también algunas extensiones de archivo:
ffuf -u http://localhost:8000/FUZZ \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-e .php,.bak,.txt,.zipLeer la salida
ffuf imprime una línea por cada respuesta que coincide con su criterio. Por defecto muestra varios códigos de estado que suelen indicar que algo existe.
________________________________________________
:: Method : GET
:: URL : http://localhost:8000/FUZZ
:: Wordlist : FUZZ: common.txt
:: Extensions : .php .bak .txt .zip
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
admin [Status: 200, Size: 1256, Words: 89, Lines: 42]
login [Status: 200, Size: 842, Words: 60, Lines: 30]
backup.zip [Status: 200, Size: 20480, Words: 1, Lines: 1]
images [Status: 301, Size: 0, Words: 1, Lines: 1]
.htaccess [Status: 403, Size: 277, Words: 20, Lines: 10]
:: Progress: [23635/23635] :: 980 req/sec :: Duration: [0:00:24] :: Errors: 0 ::Cada hallazgo trae cuatro datos que valen oro: el código de estado (200 existe y responde, 301 redirige a una carpeta, 403 existe pero está prohibido, 401 pide autenticación), el tamaño de la respuesta en bytes (Size), el número de palabras (Words) y de líneas (Lines). Esos tres últimos los usará en la próxima lección para separar lo real del ruido.
Fíjese en el 403 de .htaccess: aunque esté prohibido, el solo hecho de que exista le confirma que hay un servidor Apache detrás. Y un backup.zip de 20 KB con código 200 es justo el tipo de archivo olvidado que no debería estar ahí.