Сгенерировано нейросетью DALL-E
Сгенерировано нейросетью DALL-E

Привет, Хабр!

Типичная проблема: компании часто сами не подозревают, какие ресурсы у них могут «торчать наружу». А раз их может нарыть потенциальный злоумышленник — это проблема. На пентестах внешнего периметра не всегда сразу доступен полный скоуп IP-адресов, доменов и поддоменов. В таких случаях нам, пентестерам, приходится recon-ить все ресурсы компании. Ну и конечно же, чем больше скоуп, тем больше Attack Surface, тем больше потенциальных файндингов, в итоге — больше вероятность пробива периметра.

Под катом разберемся, что с этим делать.

Разбираться будем на примере нашей компании — «Инфосистемы Джет». Наш основной домен — jet.su. Задача — найти как можно больше IP-адресов, доменов и поддоменов, которые принадлежат компании. Мы начнем с поиска IP-адресов, продолжим поиском других доменов 2-го уровня и закончим поддоменами.

Подход, который мы опишем ниже, можно использовать и при багхантинге, если в скоуп входят все поддомены.

Поиск IP-адресов

Если организация не маленькая, то, скорее всего, у нее есть автономная система (AS).

Автономная система (Autonomous System, AS) представляет собой группу IP‑адресов, которая управляется одним или несколькими сетевыми операторами и обеспечивает маршрутизацию трафика в интернете по протоколу BGP.

Данные обо всех AS хранятся в базе данных региональных интернет-реестров (Regional Internet Registry — RIR), в нашем случае — RIPE.

RIPE — один из пяти региональных интернет-реестров. Зона ответственности RIPE — это Европа, Центральная Азия и Ближний Восток.

Через Whois мы можем обратиться к RIPE за подробностями и, например, узнать, в какой AS находится IP-адрес. Для начала посмотрим, какая A-запись (IP-адрес) у домена jet.su:

❯ nslookup jet.su 
Server:     172.20.10.1 
Address:    172.20.10.1#53  

Non-authoritative answer: 
Name:   jet.su 
Address: 193.203.101.194

Затем проверим, кому принадлежит IP-адрес 193.203.101.194:

❯ whois 193.203.101.194 
... 
org-name:       CJSC Jet Infosystems 
country:        RU 
org-type:       OTHER 
address:        Russia 127015 Moscow 
address:        Bolshaya Novodmitrovskaya 14, Bldg. 1 
... 
route:          193.203.101.0/24 
origin:         AS29258 
descr:          JETINFO-NET 
mnt-by:         AS2578-MNT 
created:        2022-01-18T13:34:17Z 
last-modified:  2022-01-18T13:34:17Z 
source:         RIPE # Filtered 
...

Юридический адрес и имя организации совпадают с реальными данными, значит, IP действительно принадлежит компании, а не Интернет/CDN/облачному провайдеру или хостеру. Значит, мы можем использовать информацию об ASN из поля origin, которой принадлежит IP-адрес, чтобы выяснить диапазон подсетей, которыми владеет компания.

Для этого можно использовать один из ресурсов, которые предоставляют информацию об ASN, например, https://bgp.he.net/, и поискать там нашу ASN — AS29258.

Результат поиска ASN AS29258 на bgp.he.net
Результат поиска ASN AS29258 на bgp.he.net

Отлично! Мы получили список подсетей, которые принадлежат компании. Но пентестеры очень ленивые люди, которые редко хотят выходить из дома из терминала, поэтому коллеги из ProjectDiscovery запилили инструмент asnmap для таких целей:

❯ asnmap -asn AS29258 -silent 
193.203.100.0/23

Так, у нас есть подсеть, которая принадлежит организации — 193.203.100.0/23. Теперь перейдем к поиску доменов и поддоменов.

Поиск доменов

Процесс поиска разделим на два типа — горизонтальный и вертикальный:

  • Горизонтальный поиск — ищем домены 2-го уровня и/или выше, которые не являются поддоменами основного домена компании. В нашем случае — jet.su, jetinfosystems.com и т. д.

  • Вертикальный поиск — поиск поддоменов у доменов, найденных на этапе горизонтального поиска.

Вертикальный и горизонтальный поиск доменов
Вертикальный и горизонтальный поиск доменов

Сначала сосредоточимся на горизонтальном поиске.

После получения диапазона IP-адресов первое, что можно и нужно сделать — запросить PTR-записи для этого диапазона.

PTR (Pointer) запись — это тип DNS-записи, который используется для связи IP-адреса с его доменным именем. Не путать с A-записью, где доменное имя связывают с IP-адресом.

Reverse DNS

PTR-запись можно запросить стандартными утилитами Linux типа nslookup, dig, но для массового сканирования есть более удобные инструменты — dnsrecon, dnsx и прочие. Я пользуюсь dnsx.

Натравим dnsx на найденную подсеть:

echo "193.203.100.0/23" | dnsx -ptr -resp -o reverse_dns.txt 
Результат работы dnsx
Результат работы dnsx

Среди поддоменов основного домена jet.su мы видим другие домены, например, jet.msk.su. Отфильтруем вывод, чтобы получить все результаты, кроме jet.su поддоменов:

cat reverse_dns.txt | grep -v jet.su
Фильтр результатов reverse dns
Фильтр результатов reverse dns

Далее сделаем фильтр для того, чтобы удалить поддомены и получить только основные домены:

cat reverse_dns.txt | grep -v jet.su | awk -F ' ' '{print $3}' | sed 's/\[//' | sed 's/\]//' | cut -d '.' -f2- | sort | uniq
Получение основных доменов из результатов reverse dns
Получение основных доменов из результатов reverse dns

Неплохой результат — четыре новых домена, которые связаны с инфраструктурой компании.

Далее будем использовать TLS для поиска информации о доменах и поддоменах компании в TLS-сертификатах.

TLS сертификаты — SAN и CN поля

TLS-сертификат обычно выписывается на конкретное доменное имя или wildcard на все поддомены. Разумеется, в сертификате хранится информация, на какой домен он выписан. Вот пример для https://jet.su:

Поле CN в TLS-сертификате
Поле CN в TLS-сертификате

В поле CN мы видим домен, на который выписан сертификат.

CN (subject Сommon Names) — первоначальное поле, используемое для указания доменного имени, для которого выдан сертификат.

Существует еще одно поле, где указываются домены, — SAN.

Поле SAN в TLS-сертификате
Поле SAN в TLS-сертификате

SAN (Subject Alternative Names) — расширение, которое позволяет указывать дополнительные доменные имена, для которых сертификат также действителен.

Зная диапазон айпишников, можно узнать, на каких из них открыт 443-й порт (и другие, на которых может быть потенциально TLS — 8443, 10443...), затем зайти на каждый из них и глянуть, на какие домены выписаны сертификаты. Но не делать же это вручную — тут опять нас выручают ребята из ProjectDiscovery инструментом tlsx.

Пробежимся tlsx-ом по нашей подсети и соберем информацию из полей SAN и CN:

echo "193.203.100.0/23" | tlsx -p 443,3443,8443,9443,10443 -cn -san -o tlsx_result.txt
Результат работы tlsx
Результат работы tlsx

 Отфильтруем результат для отображения только уникальных доменов:

cat tlsx_result.txt | grep -v jet.su | awk -F ' ' '{print $2}' | sed 's/\[//' | sed 's/\]//' | cut -d '.' -f2- | sort | uniq
Фильтр результатов tlsx
Фильтр результатов tlsx

Вручную можем убрать поддомены jet.msk.su — таким образом, TLS Probing дал нам два домена компании.

Неплохо, но хотелось бы побольше.

Reverse Whois

Один из самых полезных источников для горизонтального поиска доменов — Reverse Whois. Это как Whois только reverse, но только для поиска по полям из Whois. Изначально Whois позволяет нам получить информацию о поле org — по IP-адресу или доменному имени. Возможность обратного поиска — по org (или другому полю) — по умолчанию отсутствует.

Рассмотрим пример. В Whois есть информация об организации, на которую зарегистрирован домен — Joint Stock Company «Jet Infosystems»:

❯ whois jet.su 
% TCI Whois Service. Terms of use: 
% https://tcinet.ru/documents/whois_ru_rf.pdf (in Russian) 
% https://tcinet.ru/documents/whois_su.pdf (in Russian)  

domain:        JET.SU 
nserver:       relay2.jet.su. 193.203.100.130 
nserver:       relay3.jet.su. 2.58.70.121 
nserver:       relay5.jet.su. 79.171.174.21 
nserver:       relay7.jet.su. 51.250.17.123 
nserver:       relay.jet.su. 193.203.100.131 
state:         REGISTERED, DELEGATED 
org:           Joint Stock Company "Jet Infosystems" 
phone:         +74954117601 fax:           +74954117602 
e-mail:        postmaster@jet.su registrar:     RUCENTER-SU 
created:       2003-06-26T20:00:00Z 
paid-till:     2024-06-26T21:00:00Z 
free-date:     2024-07-30 
source:        TCI

Нам интересны все домены в базе данных Whois, у которых поле org соответствует Joint Stock Company «Jet Infosystems».

Если реализовывать подобный сервис самостоятельно, то нам нужно как-то получить все домены во всех зонах .com, .ru и т. д. (некоторые доменные регистраторы предоставляют возможность скачать все зарегистрированные домены в определенных зонах, например, вот домены зоны .ru), затем получить по каждому информацию из Whois... Ну вы уже поняли, что заниматься этим вручную мы не будем.

Существуют различные сервисы, которые предоставляют возможность поиска по Whois. Воспользуемся https://www.whoisxmlapi.com/ (у них бесплатная АПИха на 500 запросов в месяц, а результатов выдает больше, чем полностью бесплатные аналоги) и простым скриптом на 200 строк с GitHub https://github.com/Sybil-Scan/revwhoix:

revwhoix -k "Joint Stock Company \"Jet Infosystems\""
Выгрузка результатов из whoisxmlapi
Выгрузка результатов из whoisxmlapi

Отличные результаты — 17 доменов 2-го уровня, у которых в Whois-записи поле org соответствует Joint Stock Company «Jet Infosystems». Объединим результаты с предыдущими этапами:

cat tlsx_uniq.txt reverse_dns_uniq.txt reverse_whois_results.txt | sort | uniq
Результаты горизонтального поиска поддоменов
Результаты горизонтального поиска поддоменов

Итого 21 домен. Едем дальше!

Поиск поддоменов

Мы уже поговорили про Reverse DNS и TLS-сертификаты для горизонтального поиска. Но эти же источники можно использовать и для вертикального.

Что будет дальше:

  • Поиск по базе данных выданных TLS-сертификатов (crt.sh)

  • Различные сервисы поиска поддоменов

  • Брутфорс поддоменов

Certificate Search (crt.sh)

Принцип похож на Reverse Whois, только поиск идет по полям в сертификатах. Вот что выдает crt.sh по запросу jet.su:

Результат поиска в crt.sh по запросу jet.su
Результат поиска в crt.sh по запросу jet.su

Множество инструментов под капотом используют данные из crt.sh. Я пользуюсь одним из таких — subfinder (да-да, опять и снова ProjectDiscovery).

Сервисы для поиска поддоменов

Помимо crt.sh, существует множество сервисов, которые своими силами собирают информацию о поддоменах (Security Trails, BinaryEdge, Chaos...) или в которых может быть информация о поддоменах (GitHub, Web Archive, VirusTotal). Некоторые из них полностью бесплатные, некоторые предоставляют ограниченный доступ к API.

Subfinder, помимо crt.sh, собрал в себе следующие бесплатные сервисы:

  • alienvault

  • anubis

  • commoncrawl

  • digitorus

  • dnsdumpster

  • hackertarget

  • rapiddns

  • sitedossier

  • waybackarchive

Помимо сервисов по умолчанию, в своем subfinder'е я пользуюсь следующим набором API:

  • binaryedge

  • chaos

  • fullhunt

  • github

  • intelx

  • securitytrails

  • shodan

  • whoisxmlapi

Вышеперечисленные сервисы частично бесплатны — у каждого есть демодоступ на ограниченное количество запросов к API.

Вот результаты по запуску subfinder на запрос jet.su:

subfinder -d jet.su -all -stats
Результат работы subfinder
Результат работы subfinder

Полубесплатный securitytrails стабильно выдает больше всего данных по поддоменам, так что хайли рекоммендед!

Bruteforce and Permutations

Следующим шагом в реконе поддоменов я бручу домены третьего уровня по этому словарю (4-й бручу, если скоуп очень маленький). Словарь довольно большой — около 10 млн строк, но брут проходит относительно быстро (~1 ч.). Для брута я использую инструмент puredns:

puredns bruteforce /usr/share/wordlists/best-dns-wordlist.txt jet.su -w subdomains_jet.su.txt

Puredns требует, чтобы ему явно указали DNS-сервера к которым будут идти запросы в файле resolvers.txt в папке запуска puredns (или через флаг -r). Я использую этот список. Так же нужно иметь ввиду, что puredns довольно мощный инструмент, который в режиме брутфорса с 10 миллионным словарем с большой вероятностью положит ваш домашний Wi-Fi роутер, так что рекомендую его запускать с VPS-ки.

После этого этапа всё готово для финала — составления словаря с помощью перестановок уже найденных поддоменов.

Перестановки из найденных поддоменов — способ создания словаря для более «умного» брутфорса. Принцип следующий: на основе заданного списка поддоменов с использованием различных мутаций генерируются другие потенциальные кандидаты. Я использую alterx от ProjectDiscovery для создания перестановок.

На примере ниже представлен принцип действия alterx:

❯ cat test.txt
example.com
test.example.com
❯ cat test.txt | alterx

   ___   ____          _  __
  / _ | / / /____ ____| |/_/
 / __ |/ / __/ -_) __/>  < 
/_/ |_/_/\__/\__/_/ /_/|_|                  

        projectdiscovery.io

[INF] Current alterx version v0.0.3 (outdated)
testwww2.example.com
plugins-test.example.com
storage-test.example.com
test.local.example.com
test.access.example.com
testengineering.example.com
builds.example.com
test-private.example.com
test2018.example.com
login.example.com
mssql.example.com
...
...
test-promotion.example.com
test.www1.example.com
testlab.example.com
test.dev.example.com
[INF] Generated 691 permutations in 0.0039s

Alterx нам сгенерировал из двух примеров example.com и test.example.com 691 вариант, которые вполне могут быть доменами 3-го и 4-го уровня в организации.

Для нашей цели нам нужно собрать поддомены subfinder-ом и брутфорсом для каждого домена, найденного на этапе горизонтального поиска, затем создать из них перестановки. Продемонстрируем это на главном домене jet.su:

cat subdomains_jet.su.txt | alterx | dnsx -o alterx_resolved_jet.su.txt
Результат работы alterx
Результат работы alterx

В итоге alterx нашел 151 поддомен. Но не все из них будут нам полезны — например, абсолютно любые поддомены iva.jet.su будут резолвиться, т. к. DNS так настроен.

Кстати, puredns умеет детектить wildcard поддомены, что значительно упрощает последующий фильтр. Достаточно запустить puredns с параметром resolve и скормить ему сгенерированный alterx-ом wordlist:

puredns resolve alterx_jet.su.txt
Puredns детектит wildcard поддомены
Puredns детектит wildcard поддомены

Нам в первую очередь интересно, что нового обнаружил alterx. Для этого я сравню полученный результат с уже ранее обнаруженными поддоменами. Для подобных сравнений результатов я использую anew:

cat alterx_resolved_jet.su.txt | grep -v iva.jet.su | anew -d subdomains_resolved_jet.su.txt
Сравнение результатов alterx и subfinder
Сравнение результатов alterx и subfinder

В выводе alterx мы видим домены, которые раньше не встречались, например, jas-test.jet.su. То есть alterx из найденного ранее домена jas.jet.su сгенерировал jas-test.jet.su.

Таким образом, создание словаря путем перестановок уже найденных поддоменов дает нам более «персонализированный» словарь, что потом может позволить найти интересные сервисы в процессе пентеста или багхантинга.

Заключение

Так мы с вами прошлись по воркфлоу поиска ассетов на периметре. Конечно, в каждом пункте есть нюансы, например, организация может арендовать некоторые ресурсы (хостинг, облака), и они не будут входить в ее AS, при этом будет сетевая связность с основной инфраструктурой компании. Тогда нужно искать присутствие следов компании в том или ином хостинге/клауде, но это тема отдельной статьи.

Существуют еще другие источники поддоменов, например: мобильные приложения, поиск по хэшам favicon'ов, HTTP-заголовки (CSP), краулинг обнаруженных веб-ресурсов. В этой статье мы рассмотрели самые базовые и те, которые дают наибольший результат.

Итого — методология выглядит так:

  1. Сбор IP-адреса заказчика:

    • RIPE, ASN (whois, asnmap).

  2. Горизонтальный поиск доменов:

    • Reverse Whois (whoisxmlapi, revwhoix);

    • Reverse DNS (dnsx);

    • Scrapping TLS Certificates (tlsx).

  1. Вертикальный поиск доменов:

    • Reverse DNS (dnsx);

    • Scrapping TLS Certificates (tlsx);

    • crt.sh и другие сервисы (subfinder);

    • bruteforce поддоменов (puredns);

    • перестановки из найденных доменов (alterx);

    • резолв найденных доменов (dnsx).

Дальше на список должен посмотреть стейкхолдер, чтобы добавить или убрать ресурсы при необходимости.

Возможно, кто-то подходит к задаче recon'а ассетов на периметре по-другому. Делитесь кейсами в комментариях, будет интересно почитать :)


Александр Стариков

Консультант по информационной безопасности, «Инфосистемы Джет»

Комментарии (5)


  1. c4n
    03.04.2024 12:53
    +1

    А если не хочется возиться с кучей ресурсов и утилит, то все тоже самое за 5 минут можно сделать в Discovery в Нетласе. Я пользуюсь иногда. Вот видяшка про тулзу: https://www.youtube.com/watch?v=eBwo3tbxEUc


    1. alexxsstar Автор
      03.04.2024 12:53
      +3

      Не исследовал возможности Netlas, на первый взгляд выглядит как минимум красиво :)

      Если в Netlas можно зарядить API различных сервисов, reverse whois, а так же делегировать на него еще брутфорс поддоменов, в чем я сомневаюсь, то было бы круто

      В противном случае, Netlas может что-то упустить, что крайне не хотелось бы


      1. c4n
        03.04.2024 12:53
        +1

        Да, брута поддоменов там нет, но доменов весьма много и реверс-вхуиз тоже присутствует. Так что Yet Another OSINT Tool :)


  1. anzay911
    03.04.2024 12:53

    Поиск по имени компании может привести куда-нибудь в Бразилию или Китай.


    1. alexxsstar Автор
      03.04.2024 12:53

      Может быть

      А еще может быть такое, что DNS записи на найденном поддомене криво настроены и A-запись указывает на IP, который вообще не входит в инфраструктуру Заказчика)

      Поэтому, после рекона нужно отдать находки Заказчику на аппрув

      Если такой возможности нет (багбаунти), то включаем голову и анализируем результаты, сопоставляем другие поля whois (помимо org) с доменом, в котором точно уверены, не ломаем то, что может не принадлежать Заказчику