
Herramienta Go que descubre pasivamente la IP de origen real detrás de un WAF/CDN utilizando múltiples fuentes OSINT, y luego verifica los candidatos mediante similitud HTML, huellas de certificados SSL y encabezados HTTP.
Unwaf es una herramienta escrita en Go diseñada para ayudar a identificar bypasses de WAF mediante técnicas pasivas. Automatiza el proceso de descubrir la IP de origen real detrás de un WAF/CDN combinando múltiples métodos de descubrimiento y verificando candidatos mediante comparación de similitud HTML, fingerprinting de certificados SSL y análisis de cabeceras HTTP.
Unwaf automatiza los pasos que expliqué en esta publicación de LinkedIn: Passive WAF bypassing
Versión actual: 3.0.0 — Consulta CHANGELOG.md para el historial de versiones.
curl.| Método | Tipo | Descripción |
|---|---|---|
| Registros SPF | Gratuito | Extrae IPs de los mecanismos SPF ip4:/ip6: |
| Registros MX | Gratuito | Resuelve nombres de host de servidores de correo (omite Google/Microsoft/etc.) |
| Sondeo de subdominios | Gratuito | Resuelve más de 30 subdominios comunes (mail, dev, staging, cpanel, origin, etc.) |
| Certificate Transparency | Gratuito | Consulta crt.sh para todos los subdominios, resuelve a IPs no-WAF |
| AlienVault OTX | Gratuito | Registros DNS pasivos (una API key opcional aumenta los límites de peticiones) |
| RapidDNS | Gratuito | Enumeración de subdominios mediante scraping HTML |
| HackerTarget | Gratuito | API de búsqueda de hosts (50 peticiones/día) |
| Wayback Machine | Gratuito | Extrae nombres de host de URLs archivadas mediante la API CDX |
| Detección de WAF | Gratuito | Realiza fingerprinting del proveedor de WAF mediante cabeceras HTTP |
| Hashing de favicon | Gratuito | Genera hashes MD5, SHA256 y MMH3 para búsquedas en Shodan/Censys |
| Búsqueda de hosts en Shodan | API (nivel gratuito) | Busca por CN del certificado SSL, hostname y hash de favicon (la búsqueda requiere membresía) |
| Historial de SecurityTrails | API (nivel gratuito) | Registros DNS A históricos (50 peticiones/mes gratis) |
| Historial de ViewDNS | API (nivel gratuito) | Registros DNS A históricos (250 peticiones gratis) |
| Búsqueda SSL en Censys | API (de pago) | Encuentra hosts que presentan certificados SSL coincidentes con el dominio |
| DNSDB/Farsight | API (nivel gratuito) | Registros DNS históricos mediante API NDJSON (Community Edition: 500 consultas/mes) |
| Método | Peso | Descripción |
|---|---|---|
| Similitud HTML | 60% | Comparación de texto basada en diff con la página de referencia |
| Certificado SSL | 25% | Número de serie (50%), coincidencia de CN (25%), solapamiento de SAN (25%) |
| Cabeceras HTTP | 15% | Comparación de Server, X-Powered-By y nombre de Set-Cookie |
| Código de estado | ±5-20% | Bonificación por coincidencia, penalización por discrepancia éxito/error |
go install github.com/mmarting/unwaf@latest
unwaf -h
| Flag | Flag largo | Descripción | Por defecto |
|---|---|---|---|
-d | --domain | El dominio a comprobar | (obligatorio a menos que se use -l) |
-s | --source | Archivo HTML de origen para comparar | — |
-c | --config | Ruta del archivo de configuración | $HOME/.unwaf.conf |
-t | --threshold | Porcentaje de umbral de similitud | 60 |
-w | --workers | Número de workers concurrentes | 50 |
-v | --verbose | Activar salida detallada | false |
-q | --quiet | Modo silencioso: solo muestra IPs de bypass | false |
--timeout | Timeout HTTP en segundos | 10 | |
--rate-limit | Máximo de peticiones HTTP por segundo, 0=sin límite | 0 | |
--proxy | URL del proxy (http:// o socks5://) | — | |
--scan-neighbors | Escanear vecinos /24 de las IPs de bypass confirmadas | false | |
--json | Mostrar resultados en JSON | false | |
-l | --list | Archivo con dominios a comprobar, uno por línea | — |
-o | --output | Escribir resultados en archivo | — |
--version | Mostrar versión y salir | — | |
-h | --help | Mostrar información de ayuda | — |
Comprobar un dominio (solo métodos gratuitos, no se necesitan API keys):
unwaf -d example.com
Funcionan tanto dominios sin esquema como URLs completas:
unwaf -d https://example.com/path
Comprobar con un archivo HTML guardado manualmente (útil cuando el WAF bloquea la herramienta):
unwaf -d example.com -s original.html
Bajar el umbral de similitud para capturar coincidencias parciales:
unwaf -d example.com -t 40
Aumentar la concurrencia para un escaneo más rápido:
unwaf -d example.com -w 100
Modo detallado para ver cada subdominio/IP resuelto:
unwaf -d example.com -v
Modo silencioso para automatización — muestra solo IPs, una por línea:
unwaf -q -d example.com
Salida JSON para automatización:
unwaf -d example.com --json
Modo por lotes con lista de dominios:
unwaf -l domains.txt --json -o results.json
Usar un proxy (Tor, Burp, etc.):
unwaf -d example.com --proxy socks5://127.0.0.1:9050
Escanear vecinos /24 de las IPs de bypass:
unwaf -d example.com --scan-neighbors
Limitar peticiones a 2/seg con un timeout de 5s:
unwaf -d example.com --rate-limit 2 --timeout 5
# Feed into nuclei
unwaf -q -d target.com | nuclei -l - -t waf-bypass.yaml
# Feed into httpx
unwaf -q -d target.com | httpx -silent
# Batch recon
cat domains.txt | while read d; do unwaf -q -d "$d" | sed "s/^/$d,/"; done > results.csv
# JSON + jq
unwaf -d target.com --json | jq '.bypasses[].ip'
En la primera ejecución, Unwaf crea $HOME/.unwaf.conf con esta plantilla:
# Unwaf config file — API keys for optional discovery methods
# Free methods (SPF, MX, crt.sh, subdomains, OTX, RapidDNS, HackerTarget, Wayback) work without any keys.
# ViewDNS.info — DNS history (250 free requests, no credit card required)
viewdns=""
# SecurityTrails — DNS history (https://securitytrails.com/corp/api)
securitytrails=""
# Censys — SSL certificate search (requires a PAID license)
censys_token=""
censys_org_id=""
# AlienVault OTX — passive DNS (optional, raises rate limits)
otx_api_key=""
# Shodan — host search by SSL cert, hostname, favicon hash
shodan_api_key=""
# DNSDB/Farsight — historical DNS records (Community Edition: 500 queries/month free)
dnsdb_api_key=""
Martín Martín
Distribuido bajo la Licencia GPL v3.