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

Если немного погрузится в устройство веб-приложений, мы узнаем, что веб-приложение содержит много разных сущностей, которые зачастую имеют свои домены и субдомены. Сущности - это, к примеру, всевозможные бэкенды, S3 для картинок, API, видеопотоки и так далее.

В этом туториале я показываю, как можно узнать все-все домены сайта и приложений. Зачем? Ну надо.

Будем рассматривать два примера:

  • Простой сайт, который содержит основной домен и субдомен для бэкенда. Найти все домены у таких сайтов легко.

  • Сложное веб-приложение с кучей всего внутри - YouTube. У таких сайтов это сложнее и поиск лучше автоматизировать.

Несколько вещей, которые нужно знать, перед тем как вы пойдете искать домены:

  1. Чтоб получить все домены, нужно пошариться по сайту. Чем больше функционала у сайта, тем больше придётся тыкаться. В это время, инструмент, собирающий домены, должен быть активен.

  2. Почти все сайты набиты аналитикой. У многих, помимо аналитики, вы увидите рекламные сервисы. Чтобы получить "чистые" домены сайта, необходимо получив список, отбросить аналитику и прочий "мусор". Исключения могут составлять API сторонних сервисов, которые проверяют ваше местоположение.

  3. Не забывайте про DNS кэш в вашей системе и браузере. Если вы не видите домены, возможно, DNS-записи закэшированы. В браузере при поиске доменов лучше использовать "Режим инкогнито". А на уровне системы кэш чистится через консоль.

Пара примеров:

Windows

ipconfig /flushdns

Ubuntu

sudo resolvectl flush-caches
  1. Убедитесь, что у браузера выключен DoH. Иначе в случае анализа интерфейса, о DNS-запросах вы ничего не узнаете.

DevTools: Браузеры на десктопных ОС

Браузеры есть везде. Для выяснения по каким доменам ходит ваш браузер к веб-приложению этого инструмента во многих случаях будет достаточно.

Минус этого метода в том, что видим трафик только сайтов, которые используем через браузеры. Домены у отдельных приложений не узнать. В остальных методах можно анализировать трафик у любых приложений.

Вручную

Делаем по шагам:

  • Открываем пустую вкладку

  • Вызываем DevTools: либо F12, либо Ctrl+Shift+I

  • Вкладка Network

  • Переходите на необходимый сайт, и в столбце Domain появляются все домены, к которым обращается браузер

Скриншоты из Google Chrome. В Firefox почти всё идентично.

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

А вот открывая сложный сервис

Становится как-то не по себе от количества запросов и горы доменов.

Автоматизируем

Будем запускать код, который возьмёт все полученные домены, выкинет повторы и отдаст нам массив.

Продолжая с места, где остановились в ручном режиме.
Переходим на вкладку Console и вставляем скрипт:

window.domains = [...new Set(performance.getEntriesByType('resource').map(r => (new URL(r.name)).hostname))];
console.log(domains);

Здесь используется window для универсальности, потому что он легко переопределяется в FireFox, в отличие от let. Этот скрипт на один раз, поэтому для упрощения допускаю глобальную переменную.

Первый раз выскочит warning:

Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below and hit Enter to allow pasting.

Пишем allow pasting и снова вставляем скрипт.

Получаем массив. Тыкаем на него правой кнопкой и Copy object. Получаем:

[
    "googleads.g.doubleclick.net",
    "yt3.ggpht.com",
    "static.doubleclick.net",
    "rr1---sn-gvnuxaxjvh-c35z.googlevideo.com",
    "www.youtube.com",
    "accounts.youtube.com",
    "play.google.com",
    "www.gstatic.com",
    "studio.youtube.com"
]

Пройдёмся по этому списку и постараемся понять, какие из этих доменов относятся к самому YouTube, а какие вторичны и не нужны:

  • googleads.g.doubleclick.net и static.doubleclick.net - Рекламные ресурсы, откидываем.

  • yt3.ggpht.com - Картинки, относится к сервису, нужен.

  • *.googlevideo.com - Отсюда получаем видеопоток, нужно.

  • www.youtube.com - Основной домен, нужен.

  • accounts.youtube.com и studio.youtube.com - субдомены основного домена, использующиеся для ЛК. Нужны.

  • play.google.com - субдомен, связанный с экосистемой Android, скорее не нужен.

  • www.gstatic.com - сервис, который отдаёт скрипты, CSS, шрифты и прочее. Тут нужно ли надо выяснять уже "наживую".

Скрипту далеко до идеала. На больших ресурсах вы не всегда получите массив со всеми доменами. Например, в случае с YouTube в массиве отсутствовал https://fonts.gstatic.com. Так что если вам чего-то не хватило, всё-таки придётся просматривать вкладку Network глазами.

Если есть идеи улучшения этого скрипта - Welcome.

Видеоинструкция

Android

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

Для анализа доменов на андроиде будем использовать PCAPdroid:

Google Play

F-Droid

GitHub

У него есть платные фичи, но для нашей задачи бесплатной версии хватит за глаза. Приложение работает как VPN, пропуская весь трафик через себя. Для выбора приложений использует встроенный в Android механизм Per-app VPN.

Чтобы отсеять сразу всё лишнее, лучше выбирать определённые приложения. И PCAPdroid будет показывать только трафик от этого приложения. Если нужен сайт - выбираете браузер.

Порядок действий:

  • Выбрать приложение

  • Нажать большую кнопку Ready

  • Перейти на вкладку Connection

  • Вернуться в приложение/браузер и протыкать интересующие действия

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

Если доменов много:

  • Три точки справа - Save to file

  • Обратно в Status - кнопка ⬛ для завершения сбора доменов.

  • Файл каким-нибудь образом передаём на компьютер. Советую LocalSend.

  • Забираем из CSV все домены, сортируем, убираем повторы

Здесь уже работаем с дампом, который я собрал с приложения YouTube.

Обработка файла в Linux/Mac Shell

awk -F ',' '{print $10}' PCAPdroid_$DATE.csv | sort -u

Обработка файла в Windows PowerShell

Import-Csv -Path "PCAPdroid_$DATE.csv" | Select-Object -ExpandProperty Info | Sort-Object | Get-Unique
Видеоинструкция

iOS

Самое подходящее, что я нашёл - приложение Network Sniffer.

App Store

Сниффинг начинается после нажатия неприметной кнопки Start сверху. После этого во вкладке Record появляется лог этой сессии.

У iOS нет функции Per-app VPN, как в Android, поэтому тут придётся копаться в куче левых запросов. Но на главном экране в настройках HTTP/HTTPS CAPTURE можно настроить домены для Ignore list. Там уже содержатся ресурсы Apple.

Порядок действий:

  • При запуске приложения проверить, что HTTP/HTTPS CAPTURE включено

  • Нажать кнопку Start

  • Открыть и пошарится по нужному приложению

  • Нажать кнопку Stop, чтоб не прилетело новых, и вручную смотрите домены в Record

Можно нажать на кнопку ? и получите чисто список доменов с автоматической сортировкой по алфавиту.

Ещё есть функция экспорта в HAR файл, но это платная опция.

Все собранные логи можно сбросить: Settings - General - Reset Data.

Если знаете варианты лучше и удобней, пожалуйста, расскажите.

Видеоинструкция

Windows

Возвращаемся к настольным системам. Помимо DevTools, есть более классический вариант перехвата трафика на интерфейсах. Из утилит от самого Microsoft есть Microsoft Network Monitor. Приложение больше не обновляется, но при этом работает даже в Windows 11.

Порядок работы с ним:

  • Кнопка New Capture, затем Start

  • Открыть необходимое приложение и протыкать

  • В поле Display Filter просто написать dns и кнопка Apply

  • Можно остановить кнопками Pause/Stop.

  • В Description после Query for будут запрашиваемые домены

Для "посмотреть глазами куда ходит приложение" пару раз нормально. Также можно использовать с тем же результатом Wireshark.

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

Открываем PowerShell с админскими правами, thsark находится в C:\Program Files\Wireshark\tshark.exe. Можно использовать его прямо так

 & 'C:\Program Files\Wireshark\tshark.exe' --version

Но всё-таки закинем его в PATH, чтоб вызывать командой tshark.

[System.Environment]::SetEnvironmentVariable("PATH", $env:PATH + "C:\Program Files\Wireshark", [System.EnvironmentVariableTarget]::Machine)

Чтоб PATH начал работать, проще всего открыть ещё одно окно PowerShell уже без админских прав.

Теперь нужно понять, какой интерфейс слушать

tshark -D

Выбираем интерфейс, который используется как основной. Если подключено по витой паре - Ethernet, Wi-Fi - Wi-Fi. Если оба, то обычно трафик ходит через Ethernet.

Команда, показывающая только DNS-запросы на интерфейсе Ethernet под номером 9

tshark -f "src port 53" -n -T fields -e dns.qry.name -i 9

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

Перенаправление вывода в файл при -f у меня не заработало в PowerShell. И, соответственно, дальнейшая сортировка без этого не получится. Если кто-то разберется - напишите. А так можно просто скопировать в файл и отсортировать его по примеру выше.

Ещё есть варианты для Windows:

  1. Pktmon - встроенный сниффер трафика начиная с Windows 10, этакий виндовый tcpdump, только со своей атмосферой.

  2. Mitmproxy работает как прокси и не собирает трафик c интерфейса. Но всё равно может быть полезен.

Видеоинструкция

Linux/MacOS

Тут всё просто. Лучше всего для этой задачи подходит tshark. Есть почти во всех репозиториях Linux-систем.
Для MacOS установите wireshark через homebrew, tshark установится как его зависимость.

Страница установки: https://tshark.dev/setup/install

Вывод всех запрашиваемых доменов в real-time

sudo tshark -f "src port 53" -n -T fields -e dns.qry.name

Если нужно собрать домены, которые идут через определённый интерфейс

sudo tshark -f "src port 53" -n -T fields -e dns.qry.name -i wg0

Для записи в файл всё стандартно

sudo tshark -f "src port 53" -n -T fields -e dns.qry.name > domains

При этом ещё выводится число, означающее сколько доменов записалось в файл.

Обрабатываем файл для более удобного просмотра

sort -u domains
Видеоинструкция

Wireshark

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

Порядок действий:

  • Запускайте WireShark с правами админа/из-под sudo.

  • Необходимо выбрать интерфейс, с которого будете захватывать трафик. Обычно так и называются "Ethernet" и "Wi-Fi".

  • Нажимайте на кнопку плавника, шаритесь по нужному ресурсу или запускаете определённую программу

  • В фильтр просто пишите dns и увидите все DNS-запросы

Пример с wireshark есть в видео про Windows.

Устройство без какого-либо доступа внутрь

Что делать, если нужно узнать, куда ходит ваш умный холодильник? Всё, что мы о нём знаем - это его IP-адрес в локальной сети. Этого хватит, если у вас есть подходящий роутер.

Рассматриваем на примере OpenWrt.

Здесь нет tshark, поэтому придётся довольствоваться старым добрым tcpdump.

opkg update && opkg install tcpdump

Выданные IP-адреса хранятся в файле /tmp/dhcp.leases.
IP-адрес нашего холодильника, к примеру, 192.168.50.63. У меня под этим адресом управляемая лампочка с Wi-Fi.

Запускаем tcpdump

tcpdump -i br-lan host 192.168.50.63 and port 53

Интерфейс br-lan объединяет в себе все устройства локальной сети. Сниффая его можно получить запросы как от проводных, так и беспроводных клиентов.

Выключите-включите устройство и tcpdump покажет все его DNS-запросы

Это сработает, если устройство не использует шифрование DNS. Например, с моим относительно новым воздухоочистителем такое не сработало. А с лампочкой, которой уже 7 лет, как видите, сработало. Поэтому, если не видно DNS-запросы, нужно собирать полный dump трафика с устройства, и уже с помощью Wireshark смотреть заголовки пакетов, которые укажут, к какому домену идёт приложение.

В RouterOS эту задачу можно выполнить с помощью torch

/tool torch interface=bridge-local src-address=192.168.50.199 port=53

Здесь перечислены самые простые и удобные варианты поиска доменов, по моему мнению. Но, конечно, есть и другие инструменты и способы.

Лично я из всего перечисленного использую tshark и PCAPdroid для полного сбора доменов. Если нужно быстренько что-то глянуть или уточнить - DevTools.

Мой ТГ-канал по этой тематике.

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


  1. anonymousmaharaj
    06.08.2024 11:56

    Спасибо. Полезно. Из платного на макоси есть Little Snitch. Довольно удобная штука.


  1. leonP4
    06.08.2024 11:56
    +1

    Я бы добавь в статью что для некоторых сайтов(доступ к которым полностью закрыт) потребуется первое посещение пустить через vpn, так как добавление одного главного домена в большинстве случаев не даст эффекта, а во вкладке сеть будет только 1-2 записи которые вы и так знали. Поэтому первичный анализ лучше начинать не из своей сети.