Статья Управление поверхностью атаки: как инвентаризировать внешние активы и находить забытые точки входа

Распечатанный отчёт о разведке на кремовой бумаге с красными пометками от руки, обводящими забытые субдомены. Рядом планшет с радарной диаграммой активов в мягком дневном свете.


На последнем внешнем пентесте для финтех-компании скоуп содержал 12 доменов. После passive recon я насчитал 47 поддоменов, о которых заказчик не подозревал - среди них staging-API без аутентификации, забытый Jenkins с дефолтными кредами и три dev-окружения с включённым debug-режимом. Два из этих активов давали прямой initial access без единого эксплойта.

Проблема не в нехватке сканеров. Проблема в том, что заказчик не знал, что именно нужно сканировать. Управление поверхностью атаки (ASM) закрывает разрыв между "мы думаем, что у нас 12 доменов" и реальным цифровым следом организации.

Место recon в цепочке атаки: зачем пентестеру ASM-подход​

[Применимо: внешний пентест, black box и grey box]

Recon - первая фаза kill chain. Большинство пентестеров проходят её на автомате: запустили nmap по выданному скоупу и побежали к эксплуатации. ASM-подход меняет логику - вместо сканирования того, что дал заказчик, вы самостоятельно строите карту внешних активов и только потом решаете, куда бить.

В терминах MITRE ATT&CK это фаза Reconnaissance:
  • Gather Victim Network Information (T1590) - сбор данных о доменах (T1590.001 Domain Properties), IP-адресах (T1590.005 IP Addresses) и сетевой инфраструктуре цели
  • Search Open Technical Databases (T1596) - работа с Shodan, Censys, Certificate Transparency логами
  • Search Open Websites/Domains (T1593) - анализ публичных источников, GitHub-репозиториев, DNS-записей
  • Active Scanning (T1595) - сканирование IP-блоков (T1595.001) и поиск уязвимостей (T1595.002)
Recon не заканчивается списком IP. Полноценная внешняя инвентаризация активов выстраивает цепочку: обнаружение актива -> fingerprinting технологий -> оценка уязвимостей -> приоритизация по критичности. Только после этого начинается initial access. Без полной карты вы атакуете 30% поверхности и пишете в отчёте "критических уязвимостей не обнаружено", пока забытый Tomcat на поддомене dev3.company.tld слушает мир с CVE двухлетней давности.

По данным CyCognito, типичная организация не знает о существенной части своих внешних активов - shadow IT, забытая инфраструктура после миграций, dev-окружения, которые "временно" выставили наружу. Эти забытые точки входа чаще всего и эксплуатируются при реальных атаках. OWASP (A05:2021 - Security Misconfiguration) подтверждает: некорректные конфигурации и забытые дефолты - в числе самых распространённых рисков веб-приложений.

Требования к окружению​

Перед тем как переходить к командам:
  • ОС: Linux (Kali 2024+, Parrot, Ubuntu 22.04+). На macOS работает, но masscan и ряд зависимостей собираются проще под GNU/Linux
  • RAM: минимум 4 ГБ для passive recon. Для Amass в active-режиме с большим скоупом - 8 ГБ, он прожорлив
  • Go: версия 1.21+ - Subfinder, httpx, nuclei, Amass написаны на Go
  • Python: 3.10+ - BBOT, скрипты обогащения
  • Сеть: интернет-доступ обязателен. Passive recon работает через API провайдеров, active discovery - напрямую к целям
  • API-ключи (рекомендуется): Shodan, Censys, VirusTotal, SecurityTrails, GitHub. Без них passive-инструменты выдают 20–30% от возможного результата. Бесплатных тарифов обычно хватает для единичного assessment
Установка стека ProjectDiscovery через менеджер pdtm:
Bash:
go install github.com/projectdiscovery/pdtm/cmd/pdtm@latest
pdtm -install-all
# Ставит subfinder, httpx, nuclei, dnsx, naabu и другие
# Обновление: pdtm -update-all
Если нужен BBOT - pipx install bbot (Python 3.10+, примерно 200 МБ на диске).

Passive recon: обнаружение внешних активов без единого пакета к цели​

1.webp

Passive reconnaissance - сбор данных о цифровом следе организации без прямого взаимодействия с инфраструктурой. Никаких пакетов к целевым хостам, никаких алертов в IDS. Источники: DNS-записи, Certificate Transparency логи, WHOIS, поисковые движки, Shodan/Censys.

Subdomain enumeration​

Ядро passive recon - обнаружение поддоменов. Это главный источник shadow IT и забытых активов. Два инструмента, которые я запускаю на каждом проекте:

Subfinder (ProjectDiscovery, активно поддерживается, 10k+ звёзд на GitHub) агрегирует данные из 40+ источников - CT-логи, DNS-дампы, поисковые движки. Быстрый, но без API-ключей выдаёт огрызки. Запуск: subfinder -d target.com -all -o subs.txt. Флаг -all включает все источники, включая медленные.

Amass (OWASP, активно поддерживается) в passive-режиме собирает данные из ещё большего пула источников и строит граф связей между активами. Запуск: amass enum -passive -d target.com -o amass_subs.txt. В passive-режиме безопасен для black box assessments - ни один пакет не уходит к цели.

После сбора - объединение и дедупликация: cat subs.txt amass_subs.txt | sort -u > all_subs.txt.

На реальных проектах разница между "только Subfinder" и "Subfinder + Amass" - 15–30% дополнительных поддоменов. Amass находит связи через ASN и WHOIS, которые Subfinder пропускает. Ради этого стоит подождать лишние пять минут.

Certificate Transparency и Shodan

CT-логи - отдельный мощный источник. Каждый SSL/TLS-сертификат, выпущенный публичным CA, попадает в CT-лог. Через crt.sh находятся поддомены, которые не светятся в DNS:
Bash:
curl -s "https://crt.sh/?q=%.target.com&output=json" | jq -r '.[].name_value' | sort -u
Здесь часто всплывают internal-[I], staging-[/I], dev-* домены, на которые забыли повесить ограничения.

Для обнаружения внешних активов по IP и сервисов без DNS-привязки: shodan search "ssl.cert.subject.cn:target.com" покажет все хосты, где в сертификате фигурирует домен организации, включая IP, которые не резолвятся через DNS. Censys даёт аналогичные возможности: censys search "services.tls.certificates.leaf.names: target.com".

На одном из проектов именно Shodan-запрос выявил три IP с устаревшим VPN-шлюзом, который заказчик вывел из эксплуатации два года назад. DNS-запись удалена, но сервис продолжал слушать порт 443 с просроченным сертификатом и известными уязвимостями. Заказчик удивился - "мы же его выключили". Ну, не совсем.

Active discovery: расширяем карту поверхности атаки​

2.webp

[Применимо: внешний пентест. Для внутреннего пентеста - другая методология]

После passive recon на руках список поддоменов и IP. Следующий шаг - определить, что из этого живое и что на нём крутится. Здесь начинается прямое взаимодействие с целью - IDS может зафиксировать активность.

Проверка живых хостов и fingerprinting​

httpx (ProjectDiscovery, активно поддерживается) проверяет HTTP/HTTPS-ответы, собирает заголовки, статус-коды, технологии:
Bash:
cat all_subs.txt | httpx -sc -title -tech-detect -o live.txt
# -sc: статус-код, -title: заголовок страницы
# -tech-detect: fingerprinting (Wappalyzer-движок)
# Пример вывода:
# staging-api.target.com [200] [Swagger UI] [nginx,express]
# dev3.target.com [403] [Forbidden] [Apache/2.4.29]
# old-cms.target.com [200] [WordPress] [PHP,WordPress 4.9]
WordPress 4.x, Apache 2.4.29, Tomcat 8.x в выводе - маркеры устаревших и потенциально уязвимых компонентов (A06:2021 - Vulnerable and Outdated Components по OWASP). Видишь такое - радуешься.

Для полноты картины после HTTP-проверки стоит просканировать порты на обнаруженных IP. naabu (ProjectDiscovery) быстрее nmap для массового сканирования: cat live_ips.txt | naabu -top-ports 1000 -o ports.txt. Для углублённого fingerprinting конкретного хоста - nmap -sV -sC -p- target_ip, но это медленно и шумно.

BBOT - unified recon framework​

Если не хочется собирать pipeline из отдельных утилит руками - BBOT (Black Lantern Security, активно поддерживается, 5k+ звёзд на GitHub) объединяет subdomain enumeration, port scanning, web crawling, vulnerability scanning и cloud enumeration в один workflow:
Bash:
bbot -t target.com -f subdomain-enum web-basic -o /output/
BBOT автоматически выстраивает граф зависимостей между модулями и передаёт данные по цепочке. Удобен для автоматизации, но менее гибок в тонкой настройке, чем ручной pipeline. Когда нужно быстро получить общую картину - отличный выбор. Когда нужно выжать максимум из конкретного вектора - лучше собирать руками.

Обогащение и приоритизация: от списка хостов к вектору initial access​

Список из 200 живых поддоменов бесполезен без приоритизации. Задача - быстро определить, какие находки дают реальный вектор атаки.

Автоматическая проверка уязвимостей​

nuclei (ProjectDiscovery, активно поддерживается, 20k+ звёзд на GitHub) - сканер на базе YAML-шаблонов. Массовая проверка найденных хостов на известные уязвимости, мисконфигурации и дефолтные учётные данные:
Bash:
nuclei -l live.txt -t cves/ -t misconfigurations/ -t default-logins/ -severity critical,high -o findings.txt
Шаблоны обновляются community ежедневно, покрытие - тысячи CVE и мисконфигураций.

На практике nuclei - первое, что запускаешь после httpx. Он находит exposed .git/config, открытые панели администрирования, debug-эндпоинты, устаревшие компоненты. В одном из недавних проектов nuclei обнаружил exposed .env файл с учётными данными от production-базы на забытом staging-поддомене. Вот тебе и "у нас всё защищено".

Ручная приоритизация находок​

Автоматика не заменяет голову. После nuclei я прохожу по выводу httpx и ищу паттерны, характерные для забытых точек входа:
  • Swagger UI / API-документация без аутентификации - прямой путь к тестированию API (Broken Access Control, A01:2021 по OWASP)
  • Панели администрирования (Jenkins, Grafana, phpMyAdmin) - проверка дефолтных кредов и CVE
  • Dev/staging-окружения - часто зеркалят production с ослабленными controls
  • Устаревшие CMS (WordPress 4.x, Joomla 3.x) - готовые эксплойты в публичном доступе
  • Exposed storage - S3-бакеты, Azure Blob с публичным доступом
Приоритет простой: всё, что даёт credentials или прямое выполнение кода, идёт первым. Информационные утечки (server headers, version disclosure) - в конец отчёта.

ASM-инструменты: trade-off таблица​

ИнструментТипПлюсыОграниченияКогда использовать
SubfinderPassive subdomain enumБыстрый, 40+ источников, мало false positivesТолько поддомены, нет port scan / vuln checkКаждый внешний пентест, первый шаг
Amass (passive)Passive enum + графГлубокий ASN/WHOIS-анализ, граф связейМедленнее Subfinder, жрёт RAMКрупные скоупы, холдинги
httpxHTTP probingБыстрый, tech detection, pipeline-friendlyТолько HTTP/HTTPS, не видит другие протоколыПосле subdomain enumeration
nucleiVuln scanning8000+ шаблонов, community-drivenШумный, триггерит WAF/IDSМассовая проверка обнаруженных хостов
BBOTUnified reconВсё-в-одном, автоматический графМенее гибкий, сложнее debugАвтоматизация, регулярные сканирования
Shodan/CensysPassive host discoveryХосты без DNS, исторические данныеДанные могут быть устаревшими (часы-дни)Поиск "потерянных" IP, IoT, legacy
Censys ASMEASM-платформа (коммерч.)Continuous monitoring, attribution, alertingСтоимость, vendor lock-inContinuous мониторинг

Когда бесплатных ASM-инструментов недостаточно​

Бесплатный стек (Subfinder + Amass + httpx + nuclei) покрывает 90% задач разового внешнего пентеста. Коммерческие EASM-решения (Censys ASM, Cortex Xpanse от Palo Alto, Microsoft Defender EASM) оправданы в других сценариях:
  • Continuous monitoring - отслеживание изменений не раз в полгода, а ежедневно. По данным Palo Alto Networks, инфраструктура организации меняется постоянно: разработчики разворачивают новые сервисы, облачные команды создают регионы, партнёры меняют инфраструктуру
  • Attribution сложных инфраструктур - холдинги с десятками дочерних компаний, M&A-сценарии, где ручная корреляция ASN и WHOIS занимает дни
  • Интеграция с SIEM/SOAR - автоматическое создание тикетов при обнаружении новых exposed-активов
  • Third-party risk - оценка поверхности атаки подрядчиков и партнёров
Microsoft Defender EASM, согласно документации Microsoft, позволяет создавать discovery groups с сидами (домены, IP-блоки, ASN, email-контакты, WHOIS-организации) и запускать рекурсивное обнаружение с настраиваемой периодичностью. Для пентестера на проекте - overhead. Для организации, которая строит инвентаризацию IT-активов как процесс - необходимость.

Ограничения: когда ASM-подход не работает​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Внутренние активы. Весь описанный workflow применим только к внешней поверхности атаки. Для internal ASM нужны другие подходы: BloodHound для AD, внутренние сканеры сети, CMDB-корреляция. Это отдельная тема с собственной методологией.

Пентестерам, которые привыкли ограничивать recon запуском nmap по выданному списку IP, ASM-подход кажется избыточным. До первого проекта, где забытый staging-сервер оказывается единственным путём к domain admin.

На моей практике в 7 из 10 внешних assessments самые критичные находки приходили не из скоупа заказчика, а из активов, обнаруженных на этапе разведки. Речь не о zero-day и сложных цепочках - банальные дефолтные креды на забытом Jenkins, открытый .git на staging, незакрытый debug-эндпоинт.

Большинство пентест-отчётов, которые я читал у коллег, страдают одной болезнью: выводы строятся на скоупе заказчика, а не на реальной поверхности атаки. Пока пентестер принимает скоуп как истину - он работает с чужой моделью угроз, а не со своей. Настоящий recon начинается с вопроса "что вообще торчит наружу?", а не "что мне дали проверить?". Ответ на этот вопрос почти всегда неприятный для заказчика - shadow IT обнаружение вскрывает то, о чём внутренние команды предпочитали не знать.

Попробуйте прогнать свой текущий проект через полный pipeline из этой статьи - Subfinder + Amass + httpx + nuclei. Сравните результат со скоупом от заказчика. Разница вас удивит.
 
Последнее редактирование модератором:
Мы в соцсетях:

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

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab