Разведка — фундамент эффективного пентеста

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

Дата выхода: Время прочтения статьи:
Разведка — фундамент эффективного пентеста

Подготовка к разведке

На данном этапе мы собираем первичный набор данных о компании которые позволят нам копнуть глубже и лучше понять инфраструктуру с которой работаем. Среди искомых данных нас интересуют:

  • Домены второго уровня или Apex домены (например, example.org)
  • Домены N уровня или поддомены (например, sub.example.org, fifth.level.sub.example.com)
  • Подсети (например, 192.168.0.0/24)

Для начала нам необходимы первичные данные, такие как название организации и хотя бы один домен второго уровня. На основе этих данных открывается большой объем дополнительной информации о компании, разберем отдельно каждый шаг разведки.

Данные о связанных организациях

Самым первым шагом будет простой запрос с использованием Whois:

whois metascan.ru

42ecb737-63a2-48a9-8224-2feaa3f78034.png

Или массовый сбор данных: https://github.com/melbadry9/WhoEnum

Используя такую простую команду мы получаем уже немало важных данных:

  • ИНН
  • Полное название организации
  • DNS сервера

На основе ИНН мы можем получить информацию о связанных компаниях с использованием простого поиска по ИНН или названию организации в поисковых системах. Можно обнаружить у компании приобретения в виде дочерних компаний и расширять объем данных для разведки новыми доменами второго уровня таких поглощенных организаций.

Домены второго уровня

На этом этапе наша задача собрать максимальное количество доменов второго уровня (apex доменов). Имя на руках полную информацию об организации и поглощениях, можно выполнить поиск разными способами:

  1. Reverse IP lookup
    1. https://github.com/hakluke/hakip2host
      1. cat ip-list.txt | hakip2host | grep -Eo "[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" | unfurl -u apexes | anew apex.txt
    2. Сервисы hackertarget, viewdns, ipinfo.io, domaintools, dnsdumpster и другие
    3. https://github.com/Josue87/AnalyticsRelationships
      1. cat apex.txt | analyticsrelationships
  2. По сертификатам
    1. https://github.com/glebarez/cero
      1. cat ip-list.txt | cero > .tmp/cero.txt
      2. cat .tmp/cero.txt | unfurl -u apexes | anew apex.txt
      3. cat .tmp/cero.txt | unfurl -u domains | anew subdomains-unresolved.txt
      4. cat apex.txt | cero
    2. crt.sh и другие
  3. Reverse Whois (org, email, registrant name и др.)
    1. https://github.com/MilindPurswani/whoxyrm 
      1. whoxyrm -company-name "Company Inc."
      2. whoxyrm -email "admin@company.com"
      3. whoxyrm -keyword "company.com"
    2. Сервисы Whoxy, Viewdns, DNSlytics, IntelX и другие
  4. Reverse PTR
    1. https://github.com/projectdiscovery/dnsx
      1. dnsx -retry 3 -a -aaaa -cname -ns -ptr -mx -soa -resp -silent -l subdomains.txt
  5. Дорки
    1. Поиск вида "Company © 2025" или на основе других уникальных данных о компании собранных с известных доменов второго уровня

Расширив список доменов второго уровня мы готовы переходить к следующему этапу поиска поддоменов.

Трансфер зоны

Очень важно проверять возможность трансфера зоны на DNS серверах всех доменов второго уровня которые удалось собрать. Эту проверку часто забывают делать, либо не знают о ней совсем, но делается очень просто:

  1. Узнаем DNS сервера: dig -t NS metascan.ru
  2. Проверяем возможность трансфера: 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 серверам.

Утилиты которые могут осуществлять пассивный поиск:

  1. https://github.com/OWASP/Amass
    1. amass enum -passive -timeout 180 -df apex.txt && oam_subs -df apex.txt -names | anew sub-unresolved.txt
  2. https://github.com/projectdiscovery/subfinder
    1. subfinder -all -dL apex.txt -silent | anew sub-unresolved.txt
  3. https://github.com/laramies/theHarvester
    1. python theHarvester.py -b all -d <company.com>
  4. https://github.com/Findomain/Findomain
    1. findomain --quiet -t <company.com>
  5. https://github.com/incogbyte/shosubgo
    1. shosubgo -d <company.com> -s APIKEY | anew sub-unresolved.txt
  6. https://github.com/gwen001/github-subdomains
    1. github-subdomains -d <company.com> -t $GITHUB_TOKENS -o github-sub.txt
  7. https://github.com/xnl-h4ck3r/waymore
    1. python3 waymore -i apex.txt
    2. cd "waymore/results/<apex>" && cat waymore.txt | unfurl -u domains | anew sub-unresolved.txt
  8. И многие другие.

Очень важно конфигурировать API ключи для подобных инструментов, так как очень часто регистрация на вспомогательных ресурсах свободная, а API ключ - бесплатный. При наших тестах объем данных сильно различался при сборе данных с API ключами и без.

Собрав достаточное количество доменов с помощью пассивного метода мы получаем немалый массив данных для подготовки к активному поиску.

Пермутации и активный поиск поддоменов

Перед тем, как выполнить брутфорс поддоменов, необходимо подобрать правильный словарь. В этом нам могут помочь пермутации на основе собранных данных:

  1. alterx -list subdomains.txt -enrich > perm-alterx.txt
  2. alterx -list subdomains.txt -enrich -p '{{word}}-{{year}}.{{suffix}}' -pp word=keywords.txt -pp year=2023 > perm-alterx-complex.txt
  1. gotator -sub subdomains.txt -perm $PERMUTATIONS -depth 1 -numbers 3 -mindup -adv -md -silent | head -c 1342177280 > perm-gotator.txt
  1. ripgen -d subdomains.txt -w $PERMUTATIONS | head -c 1342177280 > perm-ripgen.txt
  1. python3 main.py -t <company.com> -f subdomains.txt -o perm-regulator.txt
  1. dsieve -if subdomains.txt -f 3 -top 10 > perm-dsoeve.txt

Собрав хороший словарь остается выполнить только перебор поддоменов. Очень важно понимать как устроен этот процесс, так как словари могут достигать огромных значений (5-10 млн), поэтому нам важно выполнять перебор именно на уровне DNS A записи. Частой ошибкой бывает использование не предназначенных для этого инструментов, таких как ffuf, httpx и тому подобных, которые делают именно HTTP запрос, а не DNS.

Очень важно подготовить для этих утилит список доверенных резолверов чтобы не получить блокировку от основных:

  1. wget -q -O - https://raw.githubusercontent.com/trickest/resolvers/main/resolvers.txt > "$TOOLS/resolvers.txt"
  1. dnsvalidator -tL https://public-dns.info/nameservers.txt -threads 200 -o $RESOLVERS --silent
  2. dnsvalidator -tL https://raw.githubusercontent.com/blechschmidt/massdns/master/lists/resolvers.txt -threads 200 -o resolvers-tmp.txt --silent

Для быстрого и эффективного перебора поддоменов по большим словарям можно использовать:

  1. 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 1500000
  2. puredns 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
  1. shuffledns -d <company.com> -w $SUB -r $RESOLVERS

Поиск подсетей

Теперь мы обладаем большим объемом данных, среди которых домены второго уровня и поддомены. Почему поиск подсетей почти что в конце? Если собрать IP адреса с небольшого списка доменов, то можем упустить какие-то IP адреса входящие в более крупные сети. Имея на руках полноценный список доменов и поддоменов количество IP адресов из A записей значительно увеличивается.

Кроме этого, часто домены могут быть спрятаны за Cloudflare или располагаться на хостингах, такие IP адреса бесполезны и не помогут найти реальные подсети организации.

На основе полученных IP адресов собираем все ASN и находим их подсети:

  1. asnmap -a ASN0000 -silent
  2. asnmap -i 0.0.0.0 -org COMPANY -d domain.com -a ASN0000
  1. echo "COMPANY" | metabigor net --org -o ip-list.txt
  2. echo "ASN0000" | metabigor net --asn -o ip-list.txt
  1. spk -json -s "COMPANY"
  1. amass intel -org "COMPANY"
  1. cat networks-list.txt | mapcidr -silent | anew -q ip-list.txt
  2. echo ASN0000 | mapcidr -silent | anew -q ip-list.txt

Данные о подсетях можно найти в таких базах, как Ripe:

В качестве ключевых слов можно использовать известные IP, Email адрес администратора, сайт компании, название организации и другие данные.

Заключение

Разведка является неотъемлемой частью успешного пентеста, поэтому очень важно в деталях понимать данный процесс и использовать его для максимального расширения объема проверяемых ресурсов, ведь даже 1 забытый IP может привести к RCE и компрометации основной инфраструктуры.

Метаскан имеет встроенный модуль проведения разведки и команду опытных пентестеров которые позволят максимально увеличить покрытие защищаемого периметра и не упустить даже менее известные домены.

Кроме этого, с интеграцией которая позволяет автоматически забирать все DNS записи исключаются случаи где домен мог быть упущен если он отсутствует где либо и его название крайне необычное.

Разведка — фундамент эффективного пентеста | METASCAN