Привет, Хабр!
Типичная проблема: компании часто сами не подозревают, какие ресурсы у них могут «торчать наружу». А раз их может нарыть потенциальный злоумышленник — это проблема. На пентестах внешнего периметра не всегда сразу доступен полный скоуп 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.
Отлично! Мы получили список подсетей, которые принадлежат компании. Но пентестеры очень ленивые люди, которые редко хотят выходить из дома из терминала, поэтому коллеги из 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
Среди поддоменов основного домена jet.su мы видим другие домены, например, jet.msk.su. Отфильтруем вывод, чтобы получить все результаты, кроме jet.su поддоменов:
cat reverse_dns.txt | grep -v jet.su
Далее сделаем фильтр для того, чтобы удалить поддомены и получить только основные домены:
cat reverse_dns.txt | grep -v jet.su | awk -F ' ' '{print $3}' | sed 's/\[//' | sed 's/\]//' | cut -d '.' -f2- | sort | uniq
Неплохой результат — четыре новых домена, которые связаны с инфраструктурой компании.
Далее будем использовать TLS для поиска информации о доменах и поддоменах компании в TLS-сертификатах.
TLS сертификаты — SAN и CN поля
TLS-сертификат обычно выписывается на конкретное доменное имя или wildcard на все поддомены. Разумеется, в сертификате хранится информация, на какой домен он выписан. Вот пример для https://jet.su:
В поле CN мы видим домен, на который выписан сертификат.
CN (subject Сommon Names) — первоначальное поле, используемое для указания доменного имени, для которого выдан сертификат.
Существует еще одно поле, где указываются домены, — SAN.
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
Отфильтруем результат для отображения только уникальных доменов:
cat tlsx_result.txt | grep -v jet.su | awk -F ' ' '{print $2}' | sed 's/\[//' | sed 's/\]//' | cut -d '.' -f2- | sort | uniq
Вручную можем убрать поддомены 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\""
Отличные результаты — 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. Я пользуюсь одним из таких — 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
Полубесплатный 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 нашел 151 поддомен. Но не все из них будут нам полезны — например, абсолютно любые поддомены iva.jet.su будут резолвиться, т. к. DNS так настроен.
Кстати, puredns умеет детектить wildcard поддомены, что значительно упрощает последующий фильтр. Достаточно запустить puredns с параметром resolve и скормить ему сгенерированный alterx-ом wordlist:
puredns resolve alterx_jet.su.txt
Нам в первую очередь интересно, что нового обнаружил alterx. Для этого я сравню полученный результат с уже ранее обнаруженными поддоменами. Для подобных сравнений результатов я использую anew:
cat alterx_resolved_jet.su.txt | grep -v iva.jet.su | anew -d subdomains_resolved_jet.su.txt
В выводе alterx мы видим домены, которые раньше не встречались, например, jas-test.jet.su. То есть alterx из найденного ранее домена jas.jet.su сгенерировал jas-test.jet.su.
Таким образом, создание словаря путем перестановок уже найденных поддоменов дает нам более «персонализированный» словарь, что потом может позволить найти интересные сервисы в процессе пентеста или багхантинга.
Заключение
Так мы с вами прошлись по воркфлоу поиска ассетов на периметре. Конечно, в каждом пункте есть нюансы, например, организация может арендовать некоторые ресурсы (хостинг, облака), и они не будут входить в ее AS, при этом будет сетевая связность с основной инфраструктурой компании. Тогда нужно искать присутствие следов компании в том или ином хостинге/клауде, но это тема отдельной статьи.
Существуют еще другие источники поддоменов, например: мобильные приложения, поиск по хэшам favicon'ов, HTTP-заголовки (CSP), краулинг обнаруженных веб-ресурсов. В этой статье мы рассмотрели самые базовые и те, которые дают наибольший результат.
Итого — методология выглядит так:
-
Сбор IP-адреса заказчика:
RIPE, ASN (whois, asnmap).
-
Горизонтальный поиск доменов:
Reverse Whois (whoisxmlapi, revwhoix);
Reverse DNS (dnsx);
Scrapping TLS Certificates (tlsx).
-
Вертикальный поиск доменов:
Reverse DNS (dnsx);
Scrapping TLS Certificates (tlsx);
crt.sh и другие сервисы (subfinder);
bruteforce поддоменов (puredns);
перестановки из найденных доменов (alterx);
резолв найденных доменов (dnsx).
Дальше на список должен посмотреть стейкхолдер, чтобы добавить или убрать ресурсы при необходимости.
Возможно, кто-то подходит к задаче recon'а ассетов на периметре по-другому. Делитесь кейсами в комментариях, будет интересно почитать :)
Александр Стариков
Консультант по информационной безопасности, «Инфосистемы Джет»
Комментарии (5)
anzay911
03.04.2024 12:53Поиск по имени компании может привести куда-нибудь в Бразилию или Китай.
alexxsstar Автор
03.04.2024 12:53Может быть
А еще может быть такое, что DNS записи на найденном поддомене криво настроены и A-запись указывает на IP, который вообще не входит в инфраструктуру Заказчика)
Поэтому, после рекона нужно отдать находки Заказчику на аппрув
Если такой возможности нет (багбаунти), то включаем голову и анализируем результаты, сопоставляем другие поля whois (помимо org) с доменом, в котором точно уверены, не ломаем то, что может не принадлежать Заказчику
c4n
А если не хочется возиться с кучей ресурсов и утилит, то все тоже самое за 5 минут можно сделать в Discovery в Нетласе. Я пользуюсь иногда. Вот видяшка про тулзу: https://www.youtube.com/watch?v=eBwo3tbxEUc
alexxsstar Автор
Не исследовал возможности Netlas, на первый взгляд выглядит как минимум красиво :)
Если в Netlas можно зарядить API различных сервисов, reverse whois, а так же делегировать на него еще брутфорс поддоменов, в чем я сомневаюсь, то было бы круто
В противном случае, Netlas может что-то упустить, что крайне не хотелось бы
c4n
Да, брута поддоменов там нет, но доменов весьма много и реверс-вхуиз тоже присутствует. Так что Yet Another OSINT Tool :)