Статья Subdomain enumeration инструменты: полный маппинг внешней поверхности атаки через amass, subfinder и dnsx

Кремовый лист с диаграммой перечисления поддоменов лежит на светлом столе. Рядом — перьевая ручка и латунное пресс-папье, мягкий дневной свет подчёркивает фактуру бумаги.


На пентесте финтех-площадки в прошлом квартале 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

1781860087641.webp

Пассивная 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-брутфорс​

1781860136418.webp

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-детекцией.

Валидация: от субдоменов к живым хостам​

1781860191384.webp

Здесь кроется ошибка, которая отличает хаотичный recon от методичного. Типичный антипаттерн: отправить сырой список субдоменов сразу в httpx для HTTP-пробинга. Субдомен может быть валидным DNS-именем с A-записью, но хостить не HTTP-сервис, а SSH, SMTP, WinRM или SMB. httpx такие хосты пропустит - а на них могут работать уязвимые сервисы, которые нельзя выкидывать из scope.

Правильная последовательность:
  1. Собрать субдомены (passive + active)
  2. DNS-резолвинг через dnsx или puredns - какие субдомены вообще существуют
  3. Сканирование портов по резолвнутым IP - найти все сервисы, не только HTTP
  4. HTTP-пробинг через httpx - отдельно для веб-приложений
Для HTTP-пробинга: 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
Для непрерывного мониторинга (bug bounty с ongoing scope, External Attack Surface Management) скрипт запускается по cron с diff между текущим и предыдущим результатом. Новые субдомены -> уведомление через notify (ProjectDiscovery) в Telegram или Slack. Именно на свежих субдоменах чаще всего обнаруживаются misconfigurations: разработчик поднял сервис и не успел закрыть дефолтные credentials. Rapid7 публично предоставляет датасет Forward DNS, который можно использовать как дополнительный пассивный источник - через AWS Athena или локальный парсинг (jq по gzip-архиву).

Сравнение subdomain enumeration инструментов​

ИнструментТипСкоростьШум для целиWildcard-фильтрацияКогда использоватьКогда НЕ использовать
subfinderPassive30-60 секНулевойНетБыстрый первый сбор без взаимодействияНужен active brute-force
amass (passive)Passive2-5 минНулевойНетМаксимальный пассивный охватКритична скорость
amass (active)Hybrid10+ минВысокийЧастичнаяПолный маппинг с резолвингомСтелс-сценарии, ограниченный scope
dnsxActiveВысокаяСреднийБазоваяРезолвинг списков и точечный brute-forceWildcard-домены без пост-фильтрации
purednsActiveВысокаяСреднийПродвинутаяМассовый brute-force, wildcard-фильтрацияПростые scope без wildcard
massdnsActiveМаксимальнаяВысокийНетСырой массовый резолвинг (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-пайплайн - это пол, а не потолок.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab