Как найти поддомены сайта: практические методы для пентестера

Вступление

Как найти поддомены сайта эффективно, а не просто для галочки? На первый взгляд задача кажется простой: прогнать домен через knock, закинуть результат в subfinder — и готово. На практике такой подход даёт довольно посредственный результат. В этой статье разберём, как собирать поддомены с максимальной эффективностью, а не ограничиваться поверхностным перебором.

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

Зачем искать поддомены сайта

Вопрос по сути риторический, но стоит обозначить основные причины:

  • Больше поддоменов — выше шанс найти subdomain takeover. Для фишинговых и спам-кампаний подобная находка представляет высокую ценность.
  • Больше поддоменов — больше потенциальных уязвимостей. При детальной разведке нередко находится забытый старый поддомен с минимальной посещаемостью, который годами не обновлялся и не проверялся на безопасность — именно такие точки часто оказываются наиболее уязвимыми.
  • Скрытый функционал. На поддоменах нередко разворачиваются корпоративные административные панели — разработчики рассчитывают, что такие адреса никто не найдёт, что оказывается ошибочным предположением.

Методы поиска поддоменов сайта

Ниже — наиболее эффективные и практически применимые методы поиска поддоменов. В качестве демонстрации используется домен gov.uk: государственные домены обычно дают большой массив результатов, что удобно для наглядного разбора методики, а у gov.uk к тому же есть собственная программа раскрытия уязвимостей (VDP) на HackerOne, что делает любую находку в рамках этой программы легитимной.

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

Для качественного брутфорса используется fuzzer ffuf в связке с мощным словарём от Assetnote. Команда для запуска:

ffuf -u https://fuzz.gov.uk -w словарь -H "Host: FUZZ.site.com" -mc 200,302,403,500 -o ffuf_result.json -t 280 -timeout 25 -ignore-body -http2 -rate 40

Словарь для брутфорса — 2m-subdomains.txt от Assetnote.

image 23

2. Subdomz

image 24

Subdomz — своего рода скрипт-агрегатор, объединяющий целый набор специализированных инструментов для поиска поддоменов в единый пайплайн. После завершения сканирования скрипт автоматически проверяет найденные поддомены через httpx и удаляет дубликаты — удобное решение, которое экономит время на ручную постобработку результатов. К этому инструменту ещё вернёмся дальше в статье.

3. Поиск поддоменов через favicon

Favicon — небольшая иконка сайта, которую можно увидеть в заголовке вкладки браузера при обычном сёрфинге.

как найти поддомены сайта

Особенность этой небольшой иконки в том, что у неё есть уникальное цифровое значение хэша — каждый favicon по сути уникален. Благодаря этому можно найти другие сайты, использующие точно такой же значок. Получить хэш favicon домена gov.uk можно следующей командой:

python3 -c "import mmh3,requests,codecs,sys; print(mmh3.hash(codecs.encode(requests.get(sys.argv[1]).content, 'base64')))" "https://example.com/favicon.ico"

Путь к favicon почти всегда находится в корне сайта — сайт/favicon.ico. Но иногда иконка по этому адресу отсутствует. В таком случае найти её можно через вкладку Network в DevTools при перезагрузке страницы — среди запросов будет нужный файл.

Для дальнейшей разведки по хэшу favicon используются IoT-поисковики — Shodan и ZoomEye. Стоит отметить, что метод с favicon применим не только для поиска поддоменов сайта, но и для поиска реального IP-адреса — эта техника подробно разобрана в отдельном материале.

Как favicon помогает найти поддомены

Логика метода простая: если у двух сайтов совпадает favicon, это указывает на их взаимосвязь. Например, если у blog.site.com хэш favicon равен определённому числовому значению, велика вероятность, что у admin.blog.site.com будет тот же самый хэш.

Поисковой запрос в Shodan:

http.favicon.hash:<числовое значение>

По хэшу favicon домена gov.uk удалось обнаружить порядка 60 поддоменов. Если провести аналогичный поиск по favicon конкретного поддомена (а не корневого домена), результаты будут отличаться и откроют дополнительный слой связанной инфраструктуры.

shodan

4. Гугл-доркинг для поиска поддоменов

Метод подходит далеко не для любой цели — эффективность напрямую зависит от количества страниц таргета, проиндексированных Google. Перед началом стоит проверить примерное число результатов в выдаче по домену.

Для парсинга результатов поиска удобен инструмент Extract SERP — простой букмарклет (JavaScript-код, сохранённый как закладка браузера), который собирает все ссылки с текущей страницы выдачи в отдельное окно:

javascript: var a = document.getElementsByTagName('a'), arr = '';for(var i=0; i

Чтобы «установить» инструмент, этот код добавляется в качестве URL для новой закладки браузера. При переходе по такой закладке на странице выдачи Google открывается новая вкладка со всеми собранными ссылками.

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

Основная сложность в том, что Google физически не выдаёт больше примерно 200 результатов за один запрос, независимо от того, сколько страниц проиндексировано на самом деле. Чтобы собрать более полную картину (порядка нескольких тысяч ссылок), запросы разбиваются по диапазонам дат индексации:

  • Все ссылки парсятся отдельными диапазонами дат — например, только за последние полгода.
  • Далее диапазон дробится последовательно по годам — от самого раннего года индексации до текущего, с разбивкой каждого года на полугодовые интервалы (1 января – 30 июня, 1 июля – 31 декабря, и так далее).

Общее правило: чем больше страниц было проиндексировано за всё время существования сайта, тем более узкий временной диапазон нужно брать за один проход, чтобы уложиться в лимит выдачи.

Полностью автоматизировать процесс оказалось сложно — Google достаточно агрессивно реагирует на автоматизированный доркинг и показывает капчу. Один из рабочих вариантов — скрипт на Selenium, который перебирает диапазоны дат самостоятельно, а при появлении капчи подаёт звуковой сигнал и ждёт, пока капча будет решена вручную. Решение не идеальное, но рабочее без использования платных сервисов для автоматического решения капчи.

На практике при переборе диапазонов по 4 месяца в период с 2015 по 2020 год удалось получить существенный объём результатов примерно за 15 минут работы — чем уже временной диапазон, тем чище и полнее получается выдача.

Настройка SubDomz

Установка и настройка инструмента может занять некоторое время — стоит выделить на это отдельный промежуток.

git clone https://github.com/0xPugal/SubDomz
cd SubDomz

С помощью bash check.sh можно проверить, какие из необходимых инструментов уже установлены в системе, а какие нужно доустановить вручную — инструмент считается установленным, если находится по пути /usr/bin.

Типичные ошибки и их исправление

1. Замена httpx на httpx-toolkit. В строке 320 файла SubDomz.sh нужно заменить httpx на httpx-toolkit, после чего установить пакет:

sudo apt install httpx-toolkit

Скрипт может по-прежнему отображать этот пункт как «Install Manually» — на это можно не обращать внимания.

2. Ошибка синтаксиса с символом \r. Если при запуске появляется ошибка вида SubDomz.sh: line 17: syntax error near unexpected token $'{\r'', проблема в переносах строк формата Windows. Решается конвертацией файла:

dos2unix SubDomz.sh

3. Ошибка «unexpected end of file» в строке 512. Эта ошибка связана с некорректным блоком функции VirusTotal в скрипте. Исправляется заменой этого блока на корректную версию:

VirusTotal() {
  # Ensure domain and VIRUSTOTAL_API_KEY are set
  if [ -z "$domain" ] || [ -z "$VIRUSTOTAL_API_KEY" ]; then
    echo "Domain or API Key not set."
    return 1
  fi

  if [ "$silent" == true ]; then
    curl -s "https://www.virustotal.com/vtapi/v2/domain/report?apikey=$VIRUSTOTAL_API_KEY&domain=$domain" |
      jq | egrep -v "http|Alexa domain info" |
      grep "$domain" |
      sed 's/[",]//g' |
      sed 's/^[[:space:]]*//' |
      anew subdomz-"$domain".txt
  else
    if [[ ${PARALLEL} == true ]]; then
      spinner "${BOLD}VirusTotal${NC}" &
      PID="$!"
    fi

    curl -s "https://www.virustotal.com/vtapi/v2/domain/report?apikey=$VIRUSTOTAL_API_KEY&domain=$domain" |
      jq | egrep -v "http|Alexa domain info" |
      grep "$domain" |
      sed 's/[",]//g' |
      sed 's/^[[:space:]]*//' |
      sort -u > tmp-virustotal-"$domain"

    if [[ ${PARALLEL} == true ]]; then
      kill ${PID} 2>/dev/null
    fi

    echo -e "$BOLD[*] VirusTotal$NC: $(wc -l < tmp-virustotal-"$domain")"
  fi
}

Установка зависимостей SubDomz

В репозитории присутствует файл install.sh, но на практике он работает нестабильно и не устанавливает всё необходимое корректно. Чтобы получить файлы resolvers.txt и dns.txt, проще прописать команды вручную:

wget -O best-dns-wordlist.txt https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt

(этот шаг не обязателен, если брутфорс поддоменов выполняется отдельным инструментом, как показано выше в разделе про ffuf)

git clone https://github.com/trickest/resolvers

Список резолверов рекомендуется обновлять перед каждым новым сканированием, если в репозитории появились свежие записи.

Если какой-то из инструментов не установлен, скрипт просто сообщит об этом в выводе, не прерывая работу — после успешной установки всех зависимостей SubDomz готов к использованию. Ниже разберём несколько отдельных инструментов из общего списка, которые полезно знать и уметь применять самостоятельно, даже если под рукой не окажется SubDomz.

GAU (Get All URLs)

GAU — необходимый инструмент для любого веб-пентестера независимо от уровня опыта. Он собирает ссылки сразу с нескольких источников: AlienVault Open Threat Exchange, Wayback Machine, Common Crawl и URLScan.

Показательный пример — принцип работы через Wayback Machine. Веб-архив известен практически всем, но не все знают, что из него можно извлечь полный список заархивированных ссылок для конкретного домена или поддомена. Запрос можно делать как по корневому домену site.com, так и по маске *.site.com — второй вариант становится эффективным методом одновременно для поиска поддоменов сайта и для сбора ссылок, которые затем можно передать таким инструментам, как sqlmap или Dalfox, для дальнейшего анализа. Остальные источники GAU работают по аналогичному принципу, предоставляя полный список ссылок из своих баз.

Поиск поддоменов через GitHub и GitLab

Ещё один недооценённый метод — поиск через github.com/search. Этот поисковик позволяет искать по всему открытому коду на платформе, что породило отдельное понятие — «github dorking». Чаще всего этот термин ассоциируется с поиском случайно оставленных в коде API-ключей и учётных данных, но менее известное применение — поиск упомянутых в коде поддоменов и внутренних директорий целевой компании.

Аналогичный принцип работает и для GitLab: специализированные инструменты выполняют поиск по открытым репозиториям и извлекают упоминания поддоменов из чужого кода. Для работы обоих инструментов требуются только API-ключи соответствующих платформ.

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

Дополнительные источники данных для subfinder и amass

Помимо основных провайдеров, значительно расширить охват можно за счёт дополнительных OSINT-источников, добавленных в конфигурационный файл:

Аналогичным образом стоит заполнить конфигурационный файл amass — это даёт такой же прирост охвата, что и для subfinder. То же самое в теории можно проделать и для findomain или Haktrails, но особого смысла в этом нет: эти инструменты используют ровно те же API, что уже задействованы в связке subfinder и amass.

Тестирование SubDomz на практике

Запуск инструмента после всех настроек:

bash SubDomz.sh -d gov.uk -o out.txt

В результате был собран значительный объём поддоменов домена gov.uk. Пока шла эта работа, параллельно завершил сканирование и запущенный ранее FFUF, собрав 178 поддоменов брутфорсом.

После сбора результатов имеет смысл не ограничиваться только автоматизацией — беглая ручная проверка нескольких случайных находок из общего списка нередко даёт быстрый результат. В рамках этой демонстрации проверка нескольких поддоменов вручную заняла считаные минуты и привела к обнаружению рабочей XSS-уязвимости — ещё одно подтверждение того, что государственные домены нередко содержат недостаточно протестированные и уязвимые поддомены, особенно среди тех, что не попадают в поле зрения основной команды безопасности.

xss уязвимость

Похожие записи