
Go-Tool, das passiv die echte Origin-IP hinter einem WAF/CDN mithilfe mehrerer OSINT-Quellen entdeckt und Kandidaten anschließend über HTML-Ähnlichkeit, SSL-Zertifikat-Fingerabdrücke und HTTP-Header verifiziert.
Unwaf ist ein Go-Tool, das dabei hilft, WAF-Bypässe mithilfe passiver Techniken zu identifizieren. Es automatisiert den Prozess der Entdeckung der echten Origin-IP hinter einer WAF/CDN, indem es mehrere Entdeckungsmethoden kombiniert und Kandidaten durch HTML-Ähnlichkeitsvergleich, SSL-Zertifikat-Fingerprinting und HTTP-Header-Analyse verifiziert.
Unwaf automatisiert die Schritte, die ich in diesem LinkedIn-Beitrag erklärt habe: Passive WAF bypassing
Aktuelle Version: 3.0.0 — Siehe CHANGELOG.md für die Versionshistorie.
curl-Verifizierungsbefehlen.go install github.com/mmarting/unwaf@latest
unwaf -h
Eine Domain prüfen (nur kostenlose Methoden, keine API-Schlüssel erforderlich):
unwaf -d example.com
Sowohl reine Domains als auch vollständige URLs funktionieren:
unwaf -d https://example.com/path
Mit einer manuell gespeicherten HTML-Datei prüfen (nützlich, wenn die WAF das Tool blockiert):
unwaf -d example.com -s original.html
Den Ähnlichkeitsschwellenwert senken, um Teilübereinstimmungen zu erfassen:
unwaf -d example.com -t 40
Die Parallelität für schnelleres Scannen erhöhen:
unwaf -d example.com -w 100
Ausführlicher Modus, um jede aufgelöste Subdomain/IP zu sehen:
unwaf -d example.com -v
Silent-Modus für Automatisierung — gibt nur IPs aus, eine pro Zeile:
unwaf -q -d example.com
JSON-Ausgabe für Automatisierung:
unwaf -d example.com --json
Batch-Modus mit Domain-Liste:
unwaf -l domains.txt --json -o results.json
Einen Proxy verwenden (Tor, Burp, usw.):
unwaf -d example.com --proxy socks5://127.0.0.1:9050
/24-Nachbarn von Bypass-IPs scannen:
unwaf -d example.com --scan-neighbors
Anfragen auf 2/Sek. mit 5s Timeout begrenzen:
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'
Beim ersten Ausführen erstellt Unwaf $HOME/.unwaf.conf mit dieser Vorlage:
# 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
Verteilt unter der GPL v3 License.
| Methode | Typ | Beschreibung |
|---|
| SPF-Einträge | Kostenlos | Extrahiert IPs aus ip4:/ip6:-SPF-Mechanismen |
| MX-Einträge | Kostenlos | Löst Mailserver-Hostnamen auf (überspringt Google/Microsoft/usw.) |
| Subdomain-Probing | Kostenlos | Löst 30+ gängige Subdomains auf (mail, dev, staging, cpanel, origin, usw.) |
| Certificate Transparency | Kostenlos | Fragt crt.sh nach allen Subdomains ab, löst sie zu Nicht-WAF-IPs auf |
| AlienVault OTX | Kostenlos | Passive DNS-Einträge (optionaler API-Schlüssel erhöht Rate-Limits) |
| RapidDNS | Kostenlos | Subdomain-Enumeration via HTML-Scraping |
| HackerTarget | Kostenlos | Host-Such-API (50 Anfragen/Tag) |
| Wayback Machine | Kostenlos | Extrahiert Hostnamen aus archivierten URLs via CDX-API |
| WAF-Erkennung | Kostenlos | Fingerprintet den WAF-Anbieter über HTTP-Header |
| Favicon-Hashing | Kostenlos | Generiert MD5-, SHA256- und MMH3-Hashes für Shodan/Censys-Suche |
| Shodan-Host-Suche | API (kostenlose Stufe) | Sucht nach SSL-Zertifikat-CN, Hostname und Favicon-Hash (Suche erfordert Mitgliedschaft) |
| SecurityTrails-Historie | API (kostenlose Stufe) | Historische DNS-A-Einträge (50 Anfragen/Monat kostenlos) |
| ViewDNS-Historie | API (kostenlose Stufe) | Historische DNS-A-Einträge (250 kostenlose Anfragen) |
| Censys-SSL-Suche | API (kostenpflichtig) | Findet Hosts, die SSL-Zertifikate präsentieren, die zur Domain passen |
| DNSDB/Farsight | API (kostenlose Stufe) | Historische DNS-Einträge via NDJSON-API (Community Edition: 500 Abfragen/Monat) |
| Methode | Gewichtung | Beschreibung |
|---|
| HTML-Ähnlichkeit | 60% | Diff-basierter Textvergleich mit der Referenzseite |
| SSL-Zertifikat | 25% | Seriennummer (50%), CN-Übereinstimmung (25%), SAN-Überlappung (25%) |
| HTTP-Header | 15% | Vergleich von Server, X-Powered-By und Set-Cookie-Namen |
| Statuscode | ±5-20% | Bonus bei Übereinstimmung, Abzug bei Erfolgs-/Fehler-Nichtübereinstimmung |
| Flag | Long Flag | Beschreibung | Standard |
|---|
-d | --domain | Die zu prüfende Domain | (erforderlich, außer bei -l) |
-s | --source | Quell-HTML-Datei zum Vergleich | — |
-c | --config | Pfad zur Konfigurationsdatei | $HOME/.unwaf.conf |
-t | --threshold | Ähnlichkeitsschwellenwert in Prozent | 60 |
-w | --workers | Anzahl gleichzeitiger Worker | 50 |
-v | --verbose | Ausführliche Ausgabe aktivieren | false |
-q | --quiet | Silent-Modus: nur Bypass-IPs ausgeben | false |
--timeout | HTTP-Timeout in Sekunden | 10 | |
--rate-limit | Max. HTTP-Anfragen pro Sekunde, 0=unbegrenzt | 0 | |
--proxy | Proxy-URL (http:// oder socks5://) | — | |
--scan-neighbors | /24-Nachbarn bestätigter Bypass-IPs scannen | false | |
--json | Ergebnisse als JSON ausgeben | false | |
-l | --list | Datei mit zu prüfenden Domains, eine pro Zeile | — |
-o | --output | Ergebnisse in Datei schreiben | — |
--version | Version ausgeben und beenden | — | |
-h | --help | Hilfeinformationen anzeigen | — |