Saltar al contenido
Lectura9 minPreview

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.git

Para descubrir contenido web, las listas viven en Discovery/Web-Content. Vale la pena conocer tres:

ListaPara qué sirve
common.txtRápida, unas 4700 rutas muy habituales. Buen primer barrido
directory-list-2.3-medium.txtGrande, unas 220000 entradas. Barrido a fondo
raft-medium-directories.txtDirectorios 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 LISTA

Las banderas que usará casi siempre:

BanderaQué haceEjemplo
-uLa URL objetivo, con FUZZ en el punto a probar-u http://localhost:8000/FUZZ
-wLa lista de palabras-w common.txt
-eExtensiones a probar en cada palabra-e .php,.bak,.txt
-tHilos en paralelo (velocidad)-t 40
-recursionEntra en las carpetas encontradas y sigue fuzzeando-recursion
-oGuarda 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,.zip

Leer 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í.