Разведка — фундамент эффективного пентеста
Без разведки полноценный поиск и обнаружение уязвимостей были бы невозможны. Около 80% успеха в выявлении уязвимостей кроются в хорошо проведенной разведке. Несмотря на большое количество доступных инструментов для сбора поддоменов, подсетей и других данных об инфраструктуре, процесс разведки содержит в себе много нюансов, особенностей и особых техник позволяющих обнаружить чуть больше ресурсов чем другие.

Подготовка к разведке
На данном этапе мы собираем первичный набор данных о компании которые позволят нам копнуть глубже и лучше понять инфраструктуру с которой работаем. Среди искомых данных нас интересуют:
- Домены второго уровня или Apex домены (например, example.org)
- Домены N уровня или поддомены (например, sub.example.org, fifth.level.sub.example.com)
- Подсети (например, 192.168.0.0/24)
Для начала нам необходимы первичные данные, такие как название организации и хотя бы один домен второго уровня. На основе этих данных открывается большой объем дополнительной информации о компании, разберем отдельно каждый шаг разведки.
Данные о связанных организациях
Самым первым шагом будет простой запрос с использованием Whois:
whois metascan.ru

Или массовый сбор данных: https://github.com/melbadry9/WhoEnum
Используя такую простую команду мы получаем уже немало важных данных:
- ИНН
- Полное название организации
- DNS сервера
На основе ИНН мы можем получить информацию о связанных компаниях с использованием простого поиска по ИНН или названию организации в поисковых системах. Можно обнаружить у компании приобретения в виде дочерних компаний и расширять объем данных для разведки новыми доменами второго уровня таких поглощенных организаций.
Домены второго уровня
На этом этапе наша задача собрать максимальное количество доменов второго уровня (apex доменов). Имя на руках полную информацию об организации и поглощениях, можно выполнить поиск разными способами:
- Reverse IP lookup
- https://github.com/hakluke/hakip2host
cat ip-list.txt | hakip2host | grep -Eo "[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" | unfurl -u apexes | anew apex.txt
- Сервисы hackertarget, viewdns, ipinfo.io, domaintools, dnsdumpster и другие
- https://github.com/Josue87/AnalyticsRelationships
cat apex.txt | analyticsrelationships
- https://github.com/hakluke/hakip2host
- По сертификатам
- https://github.com/glebarez/cero
cat ip-list.txt | cero > .tmp/cero.txtcat .tmp/cero.txt | unfurl -u apexes | anew apex.txtcat .tmp/cero.txt | unfurl -u domains | anew subdomains-unresolved.txtcat apex.txt | cero
- crt.sh и другие
- https://github.com/glebarez/cero
- Reverse Whois (org, email, registrant name и др.)
- https://github.com/MilindPurswani/whoxyrm
whoxyrm -company-name "Company Inc."whoxyrm -email "admin@company.com"whoxyrm -keyword "company.com"
- Сервисы Whoxy, Viewdns, DNSlytics, IntelX и другие
- https://github.com/MilindPurswani/whoxyrm
- Reverse PTR
- https://github.com/projectdiscovery/dnsx
dnsx -retry 3 -a -aaaa -cname -ns -ptr -mx -soa -resp -silent -l subdomains.txt
- https://github.com/projectdiscovery/dnsx
- Дорки
- Поиск вида "Company © 2025" или на основе других уникальных данных о компании собранных с известных доменов второго уровня
Расширив список доменов второго уровня мы готовы переходить к следующему этапу поиска поддоменов.
Трансфер зоны
Очень важно проверять возможность трансфера зоны на DNS серверах всех доменов второго уровня которые удалось собрать. Эту проверку часто забывают делать, либо не знают о ней совсем, но делается очень просто:
- Узнаем DNS сервера:
dig -t NS metascan.ru - Проверяем возможность трансфера:
dig axfr domain.com @ns.domain.com
Если трансфер допускается, это является мисконфигурацией при которой атакующий может получить полный список всех DNS записей.
Скрипт для быстрой проверки группы доменов на возможность трансфера:
for ns in $(dig +short ns "$domain"); do dig axfr "$domain" @"$ns" >> zonetransfer.txt; done
if [ -s "subdomains/zonetransfer.txt" ]; then
if ! grep -q "Transfer failed" zonetransfer.txt ; then notification "Zone transfer found on ${domain}!" info; fi
fiПассивный поиск поддоменов
Сбор поддоменов можно осуществлять на основе данных из пассивных источников, таких как Censys, Shodan, crt.sh и других, так и активным методом с перебором существующих поддоменов через обращения к DNS серверам.
Утилиты которые могут осуществлять пассивный поиск:
- https://github.com/OWASP/Amass
amass enum -passive -timeout 180 -df apex.txt && oam_subs -df apex.txt -names | anew sub-unresolved.txt
- https://github.com/projectdiscovery/subfinder
subfinder -all -dL apex.txt -silent | anew sub-unresolved.txt
- https://github.com/laramies/theHarvester
python theHarvester.py -b all -d <company.com>
- https://github.com/Findomain/Findomain
findomain --quiet -t <company.com>
- https://github.com/incogbyte/shosubgo
shosubgo -d <company.com> -s APIKEY | anew sub-unresolved.txt
- https://github.com/gwen001/github-subdomains
github-subdomains -d <company.com> -t $GITHUB_TOKENS -o github-sub.txt
- https://github.com/xnl-h4ck3r/waymore
python3 waymore -i apex.txtcd "waymore/results/<apex>" && cat waymore.txt | unfurl -u domains | anew sub-unresolved.txt
- И многие другие.
Очень важно конфигурировать API ключи для подобных инструментов, так как очень часто регистрация на вспомогательных ресурсах свободная, а API ключ - бесплатный. При наших тестах объем данных сильно различался при сборе данных с API ключами и без.
Собрав достаточное количество доменов с помощью пассивного метода мы получаем немалый массив данных для подготовки к активному поиску.
Пермутации и активный поиск поддоменов
Перед тем, как выполнить брутфорс поддоменов, необходимо подобрать правильный словарь. В этом нам могут помочь пермутации на основе собранных данных:
alterx -list subdomains.txt -enrich > perm-alterx.txtalterx -list subdomains.txt -enrich -p '{{word}}-{{year}}.{{suffix}}' -pp word=keywords.txt -pp year=2023 > perm-alterx-complex.txt
gotator -sub subdomains.txt -perm $PERMUTATIONS -depth 1 -numbers 3 -mindup -adv -md -silent | head -c 1342177280 > perm-gotator.txt
ripgen -d subdomains.txt -w $PERMUTATIONS | head -c 1342177280 > perm-ripgen.txt
python3 main.py -t <company.com> -f subdomains.txt -o perm-regulator.txt
dsieve -if subdomains.txt -f 3 -top 10 > perm-dsoeve.txt
Собрав хороший словарь остается выполнить только перебор поддоменов. Очень важно понимать как устроен этот процесс, так как словари могут достигать огромных значений (5-10 млн), поэтому нам важно выполнять перебор именно на уровне DNS A записи. Частой ошибкой бывает использование не предназначенных для этого инструментов, таких как ffuf, httpx и тому подобных, которые делают именно HTTP запрос, а не DNS.
Очень важно подготовить для этих утилит список доверенных резолверов чтобы не получить блокировку от основных:
wget -q -O - https://raw.githubusercontent.com/trickest/resolvers/main/resolvers.txt > "$TOOLS/resolvers.txt"
dnsvalidator -tLhttps://public-dns.info/nameservers.txt-threads 200 -o $RESOLVERS --silentdnsvalidator -tL https://raw.githubusercontent.com/blechschmidt/massdns/master/lists/resolvers.txt -threads 200 -o resolvers-tmp.txt --silent
Для быстрого и эффективного перебора поддоменов по большим словарям можно использовать:
puredns bruteforce $SUB_BIG <company.com> -w sub-brute.txt -r $RESOLVERS --resolvers-trusted $RESOLVERS_TRUSTED -l 5000 --rate-limit-trusted 400 --wildcard-tests 30 --wildcard-batch 1500000puredns resolve sub-unresolved.txt -w subdomains-resolved.txt -r $RESOLVERS --resolvers-trusted $RESOLVERS_TRUSTED -l 5000 --rate-limit-trusted 400 --wildcard-tests 30 --wildcard-batch 1500000
shuffledns -d <company.com> -w $SUB -r $RESOLVERS
Поиск подсетей
Теперь мы обладаем большим объемом данных, среди которых домены второго уровня и поддомены. Почему поиск подсетей почти что в конце? Если собрать IP адреса с небольшого списка доменов, то можем упустить какие-то IP адреса входящие в более крупные сети. Имея на руках полноценный список доменов и поддоменов количество IP адресов из A записей значительно увеличивается.
Кроме этого, часто домены могут быть спрятаны за Cloudflare или располагаться на хостингах, такие IP адреса бесполезны и не помогут найти реальные подсети организации.
На основе полученных IP адресов собираем все ASN и находим их подсети:
asnmap -a ASN0000 -silentasnmap -i 0.0.0.0 -org COMPANY -d domain.com -a ASN0000
echo "COMPANY" | metabigor net --org -o ip-list.txtecho "ASN0000" | metabigor net --asn -o ip-list.txt
spk -json -s "COMPANY"
amass intel -org "COMPANY"
cat networks-list.txt | mapcidr -silent | anew -q ip-list.txtecho ASN0000 | mapcidr -silent | anew -q ip-list.txt
- https://github.com/pirxthepilot/wtfis
- https://github.com/yassineaboukir/Asnlookup
- Shodan Favicon:
http.favicon.hash:123456789 hostname:"company"
Данные о подсетях можно найти в таких базах, как Ripe:
В качестве ключевых слов можно использовать известные IP, Email адрес администратора, сайт компании, название организации и другие данные.
Заключение
Разведка является неотъемлемой частью успешного пентеста, поэтому очень важно в деталях понимать данный процесс и использовать его для максимального расширения объема проверяемых ресурсов, ведь даже 1 забытый IP может привести к RCE и компрометации основной инфраструктуры.
Метаскан имеет встроенный модуль проведения разведки и команду опытных пентестеров которые позволят максимально увеличить покрытие защищаемого периметра и не упустить даже менее известные домены.
Кроме этого, с интеграцией которая позволяет автоматически забирать все DNS записи исключаются случаи где домен мог быть упущен если он отсутствует где либо и его название крайне необычное.