Если смотреть со стороны обычного пользователя, всё что нужно знать о доменах - это основной домен сайта. Ввели его в адресную строку, сайт открылся, всё здорово. Ну как открылся. Далеко не всегда сейчас сайты открываются.
Если немного погрузится в устройство веб-приложений, мы узнаем, что веб-приложение содержит много разных сущностей, которые зачастую имеют свои домены и субдомены. Сущности - это, к примеру, всевозможные бэкенды, S3 для картинок, API, видеопотоки и так далее.
В этом туториале я показываю, как можно узнать все-все домены сайта и приложений. Зачем? Ну надо.
Будем рассматривать два примера:
Простой сайт, который содержит основной домен и субдомен для бэкенда. Найти все домены у таких сайтов легко.
Сложное веб-приложение с кучей всего внутри - YouTube. У таких сайтов это сложнее и поиск лучше автоматизировать.
Несколько вещей, которые нужно знать, перед тем как вы пойдете искать домены:
Чтоб получить все домены, нужно пошариться по сайту. Чем больше функционала у сайта, тем больше придётся тыкаться. В это время, инструмент, собирающий домены, должен быть активен.
Почти все сайты набиты аналитикой. У многих, помимо аналитики, вы увидите рекламные сервисы. Чтобы получить "чистые" домены сайта, необходимо получив список, отбросить аналитику и прочий "мусор". Исключения могут составлять API сторонних сервисов, которые проверяют ваше местоположение.
Не забывайте про DNS кэш в вашей системе и браузере. Если вы не видите домены, возможно, DNS-записи закэшированы. В браузере при поиске доменов лучше использовать "Режим инкогнито". А на уровне системы кэш чистится через консоль.
Пара примеров:
Windows
ipconfig /flushdns
Ubuntu
sudo resolvectl flush-caches
Убедитесь, что у браузера выключен 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:
У него есть платные фичи, но для нашей задачи бесплатной версии хватит за глаза. Приложение работает как 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.
Сниффинг начинается после нажатия неприметной кнопки 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:
Pktmon - встроенный сниффер трафика начиная с Windows 10, этакий виндовый tcpdump, только со своей атмосферой.
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.
Мой ТГ-канал по этой тематике.