Поиск поддоменов: инструменты и методы
Поиск поддоменов: инструменты и методы
Поддомены — это «входные двери» в инфраструктуру организации. Часто основные сервисы располагаются на поддоменах типа www.example.com, mail.example.com, vpn.example.com, а забытые поддомены (test.example.com, dev.example.com) могут быть уязвимы или раскрывать внутреннюю структуру. Поиск поддоменов — ключевой этап технического OSINT, позволяющий обнаружить скрытые активы, не связанные напрямую с основным доменом. Данная статья посвящена методам и инструментам пассивного поиска поддоменов.
Почему поддомены важны для разведки?
Классификация методов поиска поддоменов
Этап 1: Поиск через сертификаты (Certificate Transparency Logs)
Современные SSL/TLS сертификаты публикуются в публичные логи Certificate Transparency (CT). Каждый выданный сертификат (включая те, что для поддоменов) появляется в этих логах. Это наиболее надежный пассивный источник поддоменов.
- Веб-интерфейс:
https://crt.sh/?q=%25.example.com(где%25— это URL-кодированный символ%, означающий "любые символы перед .example.com"). - API:
https://crt.sh/?q=.example.com&output=json
import requests
import json
def get_subdomains_from_crt(domain):
url = f"https://crt.sh/?q=%25.{domain}&output=json"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
subdomains = set()
for entry in data:
name = entry.get('name_value', '')
if name.endswith(f'.{domain}') or name == domain:
subdomains.add(name)
return sorted(subdomains)
else:
return []
subs = get_subdomains_from_crt('example.com')
print(subs)crt.sh возвращает много дублей, мёртвые сертификаты, включает домены, принадлежащие другим организациям (если сертификат содержит несколько имен). Требуется пост-обработка.
Этап 2: Поиск через DNS-историю
Исторические DNS-записи содержат поддомены, которые уже могли быть удалены, но все еще могут указывать на активные IP.
- SecurityTrails — позволяет искать поддомены по домену и видеть историю.
- DNSdumpster — отображает все поддомены, найденные из разных источников.
- ViewDNS.info (Reverse IP lookup) — показывает домены на одном IP, что может косвенно выявить поддомены.
curl -H "APIKEY: YOUR_KEY" https://api.securitytrails.com/v1/domain/example.com/subdomains
Этап 3: Активный DNS-брутфорс (словарный перебор)
Перебор возможных имен поддоменов с использованием словаря (или генерация на основе правил). Это активный метод, так как генерирует множество DNS-запросов к резолверам цели или к публичным DNS.
Плюсы: находит поддомены, которые не попали в сертификаты или историю.
Минусы: шумный, может быть расценен как атака, требует хорошего словаря.
- Sublist3r — комбинирует пассивные источники + брутфорс.
- Amass — мощный фреймворк (пассивный + активный).
- dnsrecon — включает брутфорс и AXFR.
- dnsenum — классика.
- Gobuster с модулем dns.
Пример использования Sublist3r:
sublist3r -d example.com -o subdomains.txt
amass enum -passive -d example.com -o subdomains.txt
amass enum -active -d example.com -brute -w wordlist.txt
- SecLists/Discovery/DNS/
subdomains-top1million-5000.txt— популярный. commonspeak2-wordlists.- Собственные списки, сформированные из известных поддоменов (например, www, mail, remote, vpn, dev, test, staging, api, admin, portal, blog, shop, support, ftp, ns1, mx1).
Этап 4: Поиск через поисковые системы
Использование операторов поиска для нахождения страниц, индексированных на поддоменах.
site:*.example.com site:example.com -www
Особенности: находит только проиндексированные поисковиком поддомены; часто дает неполный результат.
Этап 5: Поиск через ASN и IP-диапазоны
Если известен ASN (автономная система) цели или диапазон IP-адресов, можно выполнить обратный поиск PTR-записей для всех IP в диапазоне.
- Определить ASN цели (через
whoisIP или BGP.he.net). - Получить список IP-диапазонов этого ASN (из базы RIPE/ARIN).
- Выполнить массовый reverse DNS-запрос (но осторожно, чтобы не перегружать сеть). Инструменты:
dnsrecon -r,massdns, собственные скрипты.
Пассивный вариант: использовать сервис Censys (ранее — Project Sonar), который публикует данные reverse DNS сканирований.
Этап 6: Поиск в репозиториях кода (GitHub, GitLab)
В коде, конфигурационных файлах, документации часто встречаются поддомены.
*.example.com extension:conf "example.com" path:config
- GitHub Code Search (веб).
- TruffleHog (поиск секретов, может найти и поддомены).
- GitRob / GitGrab — поиск по организациям.
Этап 7: Комплексные фреймворки для поддоменов
Для полного покрытия использовать комбинацию: Amass (пассивный режим) + Subfinder + crt.sh + SecurityTrails (если есть ключ).
Этап 8: Обработка и фильтрация результатов
Список поддоменов обычно содержит:
- Дубликаты.
- Поддомены, не относящиеся к цели (например, из общих сертификатов).
- Некорректные записи (звездочки, wildcards).
def clean_subdomains(raw_list, target_domain):
cleaned = set()
for sub in raw_list:
sub = sub.strip().lower().rstrip('.')
if sub.endswith(target_domain) and sub != target_domain:
# Убрать wildcard (*)
if sub.startswith('*.'):
sub = sub[2:]
cleaned.add(sub)
return sorted(cleaned)Валидация: для каждого поддомена выполнить DNS-запрос (A или AAAA), чтобы убедиться, что он резолвится в IP.
Этап 9: Визуализация и анализ поддоменов
После сбора поддоменов полезно:
- Сгруппировать их по IP-адресам (один IP — несколько поддоменов).
- Выявить общие подсети.
- Обнаружить поддомены, указывающие на облачные сервисы (AWS, Azure, GCP).
- Построить граф связей.
- Aquatone — создает скриншоты поддоменов, отображает сгруппированные по IP.
- EyeWitness — аналогично.
- Gephi — для графа связей.
Практический пример: поиск поддоменов example.org
- crt.sh → найдено 45 поддоменов, включая
admin.example.org,dev-api.example.org,test.example.org. - Subfinder → добавил
mail.example.org,remote.example.org,vpn.example.org. - Amass (пассивный) → нашел
grafana.internal.example.org,jenkins.example.org. - DNSdumpster → подтвердил большинство и добавил
ftp.example.org. - Проверка через DNS:
dev-api.example.orgразрешается в203.0.113.89,jenkins.example.org— в198.51.100.22. - Анализ IP: оба IP принадлежат одному хостинг-провайдеру, но разным подсетям.
jenkins.example.orgимеет открытый порт 8080 (Jenkins), что является потенциально критичным. - Вывод: обнаружен Jenkins-сервер, доступный из интернета, который можно проверить на наличие уязвимостей.
Автоматизация сбора поддоменов (Python-скрипт-агрегатор)
import subprocess
import requests
def get_subdomains(domain):
subs = set()
# crt.sh
url = f"https://crt.sh/?q=%25.{domain}&output=json"
resp = requests.get(url)
if resp.status_code == 200:
for entry in resp.json():
name = entry.get('name_value', '')
if name.endswith(domain):
subs.add(name)
# Subfinder (запуск внешней команды)
result = subprocess.run(['subfinder', '-d', domain, '-silent'], capture_output=True, text=True)
for line in result.stdout.split():
subs.add(line.strip())
return sorted(subs)
domains = get_subdomains('example.com')
for d in domains:
print(d)Пассивный поиск (crt.sh, SecurityTrails, DNS-история) легален и безопасен.
Активный брутфорс может генерировать тысячи запросов к DNS-серверам цели, что может быть расценено как атака или нарушение условий хостинга.
Использование публичных резолверов (8.8.8.8) для брутфорса предпочтительнее, чем запросы напрямую к NS цели, но все равно генерирует сетевой трафик.
Поиск поддоменов — многоэтапный процесс, требующий комбинации пассивных источников (crt.sh, SecurityTrails, DNS-история) и аккуратного активного брутфорса. Самые мощные инструменты — Amass и Subfinder. Полученный список поддоменов необходимо очистить, провалидировать и проанализировать (выявить IP, открытые порты, технологии). Это позволит составить полную карту внешней инфраструктуры организации.