the_open_door
café
ESEN
← Volver al índice

Web Content Discovery (Directory Fuzzing)

Arsenal completo de comandos en la cheatsheet

Un servidor web solo enseña lo que alguien decidió enlazar. El panel de administración, el backup.zip que quedó olvidado, el .git/ desplegado por error o el db.php de pruebas siguen ahí y siguen respondiendo, pero no hay ningún enlace que lleve a ellos. No estar enlazado no es no existir, y por eso, después de mirar la portada, el paso obligado es preguntar por rutas a ciegas: se lanzan miles de peticiones con nombres de un diccionario y se observa cuáles responden distinto de las que no existen.

# gobuster: rápido, con extensiones acordes a la tecnología detectada
gobuster dir -u http://10.10.10.10 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \
  -x php,txt,bak,zip -t 50

# dirsearch: parecido, filtrando los códigos que no aportan
dirsearch -u http://10.10.10.10 -e php,html -x 403,404

# ffuf / wfuzz: la palabra FUZZ marca dónde va el diccionario, así que sirven
# para rutas, parámetros, cabeceras o campos de un POST
ffuf -u http://10.10.10.10/FUZZ -w raft-medium-directories.txt -fs 4242
wfuzz -u 'http://10.10.10.10/index.php?FUZZ=id' -w burp-parameter-names.txt --hh=275

Qué hace cada flag (y por qué).

Leer la salida. El código de estado dice más que "encontrado o no": un 200 es contenido servido; un 301/302 suele ser un directorio que redirige a su versión con / final, o un recurso protegido que te manda al login; un 401/403 es un hallazgo igual de valioso, porque significa existe pero no me dejan, y eso marca dónde merece la pena insistir (credenciales por defecto, bypass de la restricción, otra ruta que llegue al mismo sitio).

Por qué importa. Casi toda cadena que empieza en web pasa por aquí: el panel de login que da las credenciales, el directorio de subidas donde luego cae la webshell, el .git/ que filtra el código fuente o el fichero de configuración con la contraseña de la base de datos aparecen en este paso y no en otro. Cuando un objetivo web "no tiene vector", lo habitual no es que no lo tenga, sino que el diccionario o las extensiones no eran los adecuados.

Cómo detectarlo. El fuzzing es de lo más visible en el log de acceso: cientos o miles de peticiones desde una misma IP en pocos segundos, la mayoría 404 (o del tamaño de la página de "no encontrado"), recorriendo nombres de diccionario que ningún usuario teclearía. El User-Agent de gobuster/ffuf/dirsearch y las peticiones a rutas sensibles (/.git/, .bak, /admin) lo confirman; un WAF o un rate-limit por origen lo alerta y frena. Un pico de 403/401 también delata que se están probando rutas protegidas.

Defensa. Desactivar el listado de directorios, devolver un 404 consistente (mismo código y mismo tamaño para todo lo que no existe, para que no haya nada que filtrar), no dejar copias de seguridad ni repositorios dentro del docroot, y proteger los paneles con autenticación y no con una ruta poco adivinable.

HerramientasgobusterdirsearchwfuzzffufferoxbusterNiktowafw00fdirbJoomScanEyeWitnessAquatoneFinalReconOWASP ZAP

Máquinas donde se aplica