На пентесте финтех-площадки в прошлом квартале subfinder за 40 секунд вытащил 312 субдоменов в passive-режиме. Amass с настроенными API-ключами добавил 180 уникальных записей. DNS brute-force через dnsx с wordlist-ом assetnote принёс ещё 47 хостов, которых не было ни в одном публичном источнике - среди них staging-окружение с открытым Jenkins без аутентификации. Три инструмента, одна цепочка, critical finding за первые два часа recon-фазы. Ниже - методология DNS-разведки, которая выдаёт такие результаты стабильно, с разбором ограничений и операционного контекста на каждом шаге.
Место DNS-разведки в цепочке атаки
Subdomain enumeration - первый практический шаг после определения scope на внешнем пентесте или в bug bounty. По MITRE ATT&CK пассивный сбор субдоменов - это DNS/Passive DNS (T1596.001, Reconnaissance), активный brute-force - Wordlist Scanning (T1595.003, Reconnaissance). Обе техники работают на этапе reconnaissance, но от них зависит качество всего, что последует.[Применимо: внешний пентест, bug bounty, black box]
Полная цепочка: subdomain enumeration -> DNS-резолвинг -> HTTP-пробинг -> fingerprinting технологий -> сканирование портов (T1046, Network Service Discovery) -> поиск уязвимостей -> initial access. Пропустили первое звено - работаете только с видимой верхушкой инфраструктуры. Забытые staging-серверы, dev-окружения, внутренние API и admin-панели остаются за кадром.
Для заказчика логика простая: одна забытая staging-площадка с дефолтными credentials - и путь от passive DNS reconnaissance до initial access занимает часы, не дни. Атакующие - от APT-групп до bug bounty хантеров - начинают с маппинга внешней поверхности атаки (T1590.001, Domain Properties), потому что чем шире карта, тем больше точек входа. Кейс с Panama Papers, который разбирает Outpost24, - именно про это: обнаруженный через enumeration блог на WordPress с уязвимым плагином стал точкой входа во внутреннюю сеть.
Passive DNS reconnaissance: subfinder и amass
Пассивная OSINT DNS-разведка не генерирует трафика к целевой инфраструктуре. Это критично в двух сценариях: ранняя фаза bug bounty разведки, когда нежелательно триггерить WAF до начала тестирования, и задачи, где скрытность - явное требование scope.
Subfinder: скорость и нулевой шум
Subfinder от ProjectDiscovery (активно поддерживается, Go, 10k+ звёзд на GitHub) - чистый passive enumeration инструмент. Он не отправляет ни одного запроса к целевому домену. Вместо этого опрашивает десятки публичных источников: Certificate Transparency логи (crt.sh, certspotter), passive DNS базы (VirusTotal, SecurityTrails, Censys), поисковые движки и WHOIS-агрегаторы (T1596.002, Reconnaissance).Базовый запуск:
subfinder -d target.com -o subs.txt - результат за 30-60 секунд. По данным ProjectDiscovery, subfinder находит 500+ субдоменов за 30 секунд на крупных scope. Но для серьёзного покрытия без API-ключей никуда. Настраиваем $HOME/.config/subfinder/provider-config.yaml - бесплатные ключи от Censys, SecurityTrails, VirusTotal и Shodan увеличивают выдачу в 2-3 раза. Флаг -all задействует все сконфигурированные источники: subfinder -d target.com -all -oJ domains.json - JSON-формат сохраняет информацию об источнике каждого субдомена, что пригодится при анализе.Ограничение: subfinder видит только то, что уже попало в публичные базы. Свежесозданный субдомен, не проиндексированный ни одним агрегатором, останется невидимым. Passive enumeration - необходимый, но недостаточный этап attack surface discovery.
Amass: глубина пассивного сбора
OWASP Amass (поддерживается в рамках проекта OWASP, предустановлен в Kali Linux) работает в гибридном режиме. Для чистой passive DNS reconnaissance:amass enum --passive -d target.com -o amass_results.txt. Amass агрегирует данные из большего числа источников, включая DNS-записи (NS, MX, TXT), SSL-сертификаты, WHOIS и веб-архивы. Тайм-аут задаётся через -timeout: amass enum --passive -d target.com -timeout 12 -v.Критический нюанс, который большинство русскоязычных гайдов обходят стороной: встроенный DNS-резолвер amass медленный. 0xpatrik в описании своего workflow прямо об этом пишет - amass стоит использовать для сбора данных из пассивных источников, а DNS-резолвинг отдавать специализированным инструментам - dnsx или massdns. Разделение задач ускоряет пайплайн в разы.
Почему два passive-инструмента, а не один? На реальных scope subfinder и amass дают пересечение примерно 60-70%. Остальное - уникальные находки каждого. По тестированию с Reddit (2021), amass обнаружил 489 валидных субдоменов против 280 у Sublist3r на одном домене - разница почти двукратная. Subfinder работает быстрее, amass копает глубже. Экономия пяти минут на запуск второго инструмента не стоит пропущенного критичного субдомена.
Управление стеком инструментов. Для установки и обновления инструментов ProjectDiscovery (subfinder, dnsx, httpx, nuclei) есть менеджер
pdtm: pdtm -install-all ставит всё одной командой, pdtm -update-all обновляет. Проще и надёжнее отдельных go install для каждого инструмента.Active DNS enumeration: dnsx и DNS-брутфорс
Active enumeration - прямое взаимодействие с DNS-инфраструктурой цели. Сюда входит DNS brute-force и зонный трансфер (AXFR-запрос -
dig @ns.target.com target.com AXFR - в 2025 году срабатывает крайне редко, но проверить стоит: стоимость проверки - одна команда, потенциальный результат - полная карта DNS-зоны).Требования к окружению
Перед запуском active enumeration:- ОС: GNU/Linux (Kali, Ubuntu 22.04+) или macOS; Windows - через WSL2
- RAM: от 4 ГБ для средних scope, 8 ГБ при brute-force по wordlist 2M+ записей
- Сеть: стабильный канал от 10 Мбит/с для массовых DNS-запросов
- Go 1.21+: для установки инструментов (
go install github.com/projectdiscovery/dnsx/cmd/dnsx@latestили через pdtm) - Резолверы: curated-список надёжных публичных DNS-серверов (подробнее ниже)
- Разрешение: явное подтверждение scope на active reconnaissance - brute-force генерирует тысячи запросов, это заметно
Wordlist-ы и генерация пермутаций
DNS brute-force - Wordlist Scanning (T1595.003) в чистом виде. Результат прямо пропорционален качеству словаря.Три рабочих варианта по убыванию охвата: wordlist от assetnote (best-dns-wordlist.txt, ~9 миллионов записей) - максимальное покрытие, но и максимальное время; jhaddix all.txt (~2 миллиона) - баланс; SecLists dns-Jhaddix.txt - компактный вариант для быстрого прогона. На практике эффективен двухэтапный подход: компактный wordlist (SecLists, ~100k записей) для результата за минуты, полный assetnote - в фоне на ночь.
Отдельная техника - генерация пермутаций по уже найденным субдоменам. dnsgen и altdns берут существующие имена и создают вариации: из
api.target.com генерируются api-dev.target.com, api-staging.target.com, api2.target.com, api-test.target.com. По наблюдениям 0xpatrik, пермутации приносят дополнительные 5-15% уникальных находок, но резко увеличивают время. Поэтому пермутации стоит запускать только по уже подтверждённым (резолвнутым) субдоменам, а не по сырому списку - объём генерации меньше, точность выше.dnsx: DNS-резолвинг, брутфорс, фильтрация
dnsx от ProjectDiscovery (активно поддерживается, Go) - рабочая лошадка для DNS-брутфорса и валидации. Три основных режима: резолвинг готового списка субдоменов, brute-force по wordlist с указанием целевого домена, фильтрация wildcard-ответов.Для brute-force:
dnsx -d target.com -w wordlist.txt -resp -a -aaaa -cname -o resolved.txt. Команда выполняет DNS-запросы типов A, AAAA, CNAME и сохраняет только реально резолвящиеся записи. Для резолвинга уже собранного списка: cat all_subs.txt | dnsx -silent -a -resp -o resolved.txt.Качество резолверов - тема, которую большинство гайдов по DNS-разведке тихо обходят. Публичные серверы (8.8.8.8, 1.1.1.1) при массовых запросах отвечают rate limit, возвращая ложные NXDOMAIN. Результат - валидные субдомены помечаются как несуществующие. Решение - curated-список открытых резолверов. Проект dnsvalidator генерирует актуальный набор, а готовый вариант от trickest (resolvers-trusted.txt) содержит проверенные серверы. Передаются через
-r resolvers.txt. Ротация снижает нагрузку на каждый резолвер и уменьшает число ложных отказов.Wildcard-ловушка. Если
*.target.com резолвится в один IP, любой запрос к несуществующему субдомену вернёт положительный ответ - brute-force выдаст тысячи ложных результатов. dnsx фильтрует базовые wildcard-ответы, но для сложных конфигураций надёжнее puredns - обёртка над massdns с продвинутой wildcard-детекцией.Валидация: от субдоменов к живым хостам
Здесь кроется ошибка, которая отличает хаотичный recon от методичного. Типичный антипаттерн: отправить сырой список субдоменов сразу в httpx для HTTP-пробинга. Субдомен может быть валидным DNS-именем с A-записью, но хостить не HTTP-сервис, а SSH, SMTP, WinRM или SMB. httpx такие хосты пропустит - а на них могут работать уязвимые сервисы, которые нельзя выкидывать из scope.
Правильная последовательность:
- Собрать субдомены (passive + active)
- DNS-резолвинг через dnsx или puredns - какие субдомены вообще существуют
- Сканирование портов по резолвнутым IP - найти все сервисы, не только HTTP
- HTTP-пробинг через httpx - отдельно для веб-приложений
cat resolved.txt | httpx -status-code -title -tech-detect -o live.txt. httpx проверяет HTTP/HTTPS-ответы и собирает метаданные: статус-код, title страницы, используемые технологии. Это вход для fingerprinting и поиска уязвимостей.Обнаружение subdomain takeover
Побочный, но ценный результат DNS-разведки - выявление dangling DNS-записей. Еслиstaging.target.com имеет CNAME, указывающий на ресурс в AWS S3, Azure Blob, GitHub Pages или Heroku, который больше не существует, - это кандидат на subdomain takeover. Атакующий регистрирует этот ресурс на себя и получает контроль над субдоменом. dnsx с флагом -cname показывает CNAME-записи, а верификацию dangling выполняют subjack или nuclei с шаблонами из категории takeovers. Для организаций это один из самых простых для эксплуатации и при этом часто встречающихся векторов на внешней поверхности атаки.Полный пайплайн маппинга внешней поверхности атаки
Весь workflow для attack surface discovery собирается в одну цепочку:
Bash:
#!/bin/bash
DOMAIN=$1; OUTDIR="./recon/$DOMAIN"; mkdir -p $OUTDIR
# Passive: два источника
subfinder -d $DOMAIN -all -o $OUTDIR/subfinder.txt
amass enum --passive -d $DOMAIN -o $OUTDIR/amass.txt
# Merge + deduplicate
cat $OUTDIR/subfinder.txt $OUTDIR/amass.txt | sort -u > $OUTDIR/all.txt
# Active brute-force с wildcard-фильтрацией
puredns bruteforce wordlist.txt $DOMAIN -r resolvers.txt -w $OUTDIR/brute.txt
# Resolve + HTTP probe
cat $OUTDIR/all.txt $OUTDIR/brute.txt | sort -u | \
dnsx -silent -a -resp -o $OUTDIR/resolved.txt
cat $OUTDIR/resolved.txt | httpx -silent -sc -title -td -o $OUTDIR/live.txt
notify (ProjectDiscovery) в Telegram или Slack. Именно на свежих субдоменах чаще всего обнаруживаются misconfigurations: разработчик поднял сервис и не успел закрыть дефолтные credentials. Rapid7 публично предоставляет датасет Forward DNS, который можно использовать как дополнительный пассивный источник - через AWS Athena или локальный парсинг (jq по gzip-архиву).Сравнение subdomain enumeration инструментов
| Инструмент | Тип | Скорость | Шум для цели | Wildcard-фильтрация | Когда использовать | Когда НЕ использовать |
|---|---|---|---|---|---|---|
| subfinder | Passive | 30-60 сек | Нулевой | Нет | Быстрый первый сбор без взаимодействия | Нужен active brute-force |
| amass (passive) | Passive | 2-5 мин | Нулевой | Нет | Максимальный пассивный охват | Критична скорость |
| amass (active) | Hybrid | 10+ мин | Высокий | Частичная | Полный маппинг с резолвингом | Стелс-сценарии, ограниченный scope |
| dnsx | Active | Высокая | Средний | Базовая | Резолвинг списков и точечный brute-force | Wildcard-домены без пост-фильтрации |
| puredns | Active | Высокая | Средний | Продвинутая | Массовый brute-force, wildcard-фильтрация | Простые scope без wildcard |
| massdns | Active | Максимальная | Высокий | Нет | Сырой массовый резолвинг (backend для puredns) | Без обёртки - много мусора и false positives |
Когда subfinder недостаточно и нужен amass: scope с десятками доменов и сложной инфраструктурой. Amass лучше коррелирует данные через ASN, WHOIS и IP Addresses (T1590.005), выстраивая связи между активами. Для одиночного домена в bug bounty subfinder быстрее и проще.
Когда dnsx недостаточно и нужен puredns: brute-force доменов с wildcard-конфигурацией. puredns решает задачу через massdns + wildcard detection. Если wildcard не настроен - dnsx достаточен для DNS-брутфорса и резолвинга.
Ограничения: когда subdomain enumeration инструменты бессильны
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Internal-only субдомены. Субдомены, резолвящиеся только через внутренние DNS-серверы организации, невидимы при внешнем пентесте. External attack surface management не покрывает internal DNS. Для внутреннего пентеста нужны другие подходы: zone transfer с внутренних NS, Active Directory integrated DNS enumeration, LLMNR/NBT-NS poisoning.
Большинство материалов по subdomain enumeration инструментам сводятся к перечислению: вот subfinder, вот amass, вот dnsx - запускай и жди. На практике 80% результата определяются двумя параметрами, о которых почти не говорят: качество wordlist и качество резолверов. Я видел десятки отчётов, где пентестер запускал amass с дефолтными настройками, получал 200 субдоменов и шёл к fingerprinting - а параллельный прогон с настроенными API-ключами и нормальным wordlist давал полторы тысячи. Разница не в инструменте, а в конфигурации.
Второе - subdomain enumeration не разовая задача. Attack surface живёт и меняется. Новый staging поднимается, забытый dev не гасится, разработчик создаёт
temp.api.target.com и не удаляет. Организации, которые не мониторят субдомены на постоянной основе, узнают о таких артефактах только из отчёта хантера. Или не узнают вообще.И ещё один неудобный момент: переход сообщества на ProjectDiscovery-стек создаёт слепое пятно. Все используют одни источники, одни wordlist-ы, одни шаблоны nuclei. Кто хочет находить то, что не находят остальные - собирает кастомные wordlist-ы из JavaScript-файлов цели, мониторит CT-логи через certstream в реальном времени, генерирует пермутации через dnsgen по уже найденным именам. Стандартный recon-пайплайн - это пол, а не потолок.
Последнее редактирование модератором: