
Go-инструмент, который пассивно обнаруживает реальный origin IP за WAF/CDN, используя несколько OSINT-источников, а затем проверяет кандидатов через сходство HTML, отпечатки SSL-сертификатов и HTTP-заголовки.
Unwaf — это инструмент на Go, предназначенный для выявления обходов WAF с использованием пассивных техник. Он автоматизирует процесс поиска реального исходного IP-адреса за WAF/CDN, комбинируя несколько методов обнаружения и проверяя кандидатов путём сравнения схожести HTML, фингерпринтинга SSL-сертификатов и анализа HTTP-заголовков.
Unwaf автоматизирует шаги, которые я описал в этом посте в LinkedIn: Passive WAF bypassing
Текущая версия: 3.0.0 — см. CHANGELOG.md для истории версий.
curl.go install github.com/mmarting/unwaf@latest
unwaf -h
Проверить домен (только бесплатные методы, API-ключи не нужны):
unwaf -d example.com
Работают как голые домены, так и полные URL:
unwaf -d https://example.com/path
Проверка с вручную сохранённым HTML-файлом (полезно, когда WAF блокирует инструмент):
unwaf -d example.com -s original.html
Понизить порог схожести для отлова частичных совпадений:
unwaf -d example.com -t 40
Увеличить параллелизм для более быстрого сканирования:
unwaf -d example.com -w 100
Подробный режим для просмотра каждого разрешённого поддомена/IP:
unwaf -d example.com -v
Тихий режим для автоматизации — выводит только IP-адреса, по одному в строке:
unwaf -q -d example.com
Вывод JSON для автоматизации:
unwaf -d example.com --json
Пакетный режим со списком доменов:
unwaf -l domains.txt --json -o results.json
Использовать прокси (Tor, Burp и т.д.):
unwaf -d example.com --proxy socks5://127.0.0.1:9050
Сканировать соседей /24 IP-адресов обхода:
unwaf -d example.com --scan-neighbors
Ограничить запросы до 2/сек с таймаутом 5с:
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'
При первом запуске Unwaf создаёт $HOME/.unwaf.conf со следующим шаблоном:
# 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
Распространяется под лицензией GPL v3.
| Метод | Тип | Описание |
|---|
| SPF-записи | Бесплатно | Извлекает IP-адреса из механизмов SPF ip4:/ip6: |
| MX-записи | Бесплатно | Разрешает имена хостов почтовых серверов (пропускает Google/Microsoft/и т.д.) |
| Проверка поддоменов | Бесплатно | Разрешает 30+ распространённых поддоменов (mail, dev, staging, cpanel, origin и т.д.) |
| Certificate Transparency | Бесплатно | Запрашивает crt.sh для всех поддоменов, разрешает в IP-адреса, не относящиеся к WAF |
| AlienVault OTX | Бесплатно | Пассивные DNS-записи (опциональный API-ключ повышает лимиты запросов) |
| RapidDNS | Бесплатно | Перечисление поддоменов через парсинг HTML |
| HackerTarget | Бесплатно | API поиска хостов (50 запросов/день) |
| Wayback Machine | Бесплатно | Извлекает имена хостов из архивных URL через CDX API |
| Обнаружение WAF | Бесплатно | Определяет вендора WAF через HTTP-заголовки |
| Хеширование favicon | Бесплатно | Генерирует хеши MD5, SHA256 и MMH3 для поиска в Shodan/Censys |
| Поиск хостов Shodan | API (бесплатный тариф) | Поиск по CN SSL-сертификата, имени хоста и хешу favicon (поиск требует членства) |
| История SecurityTrails | API (бесплатный тариф) | Исторические DNS A-записи (50 запросов/месяц бесплатно) |
| История ViewDNS | API (бесплатный тариф) | Исторические DNS A-записи (250 бесплатных запросов) |
| Поиск SSL Censys | API (платно) | Находит хосты, предъявляющие SSL-сертификаты, соответствующие домену |
| DNSDB/Farsight | API (бесплатный тариф) | Исторические DNS-записи через NDJSON API (Community Edition: 500 запросов/месяц) |
| Метод | Вес | Описание |
|---|
| Схожесть HTML | 60% | Сравнение текста на основе diff с эталонной страницей |
| SSL-сертификат | 25% | Серийный номер (50%), совпадение CN (25%), пересечение SAN (25%) |
| HTTP-заголовки | 15% | Сравнение Server, X-Powered-By и имён Set-Cookie |
| Код статуса | ±5-20% | Бонус за совпадение, штраф за несовпадение success/error |
| Флаг | Длинный флаг | Описание | По умолчанию |
|---|
-d | --domain | Домен для проверки | (обязательно, если не указан -l) |
-s | --source | Исходный HTML-файл для сравнения | — |
-c | --config | Путь к файлу конфигурации | $HOME/.unwaf.conf |
-t | --threshold | Порог схожести в процентах | 60 |
-w | --workers | Количество параллельных воркеров | 50 |
-v | --verbose | Включить подробный вывод | false |
-q | --quiet | Тихий режим: вывод только IP-адресов обхода | false |
--timeout | Таймаут HTTP в секундах | 10 | |
--rate-limit | Макс. HTTP-запросов в секунду, 0=без ограничений | 0 | |
--proxy | URL прокси (http:// или socks5://) | — | |
--scan-neighbors | Сканировать соседей /24 подтверждённых IP-адресов обхода | false | |
--json | Выводить результаты в формате JSON | false | |
-l | --list | Файл со списком доменов для проверки, по одному в строке | — |
-o | --output | Записать результаты в файл | — |
--version | Вывести версию и выйти | — | |
-h | --help | Показать справку | — |