От установки до расшифровки TLS - пошаговый разбор инструмента которым пользуются все: от сетевых инженеров до исследователей безопасности. Со связкой с тем что видит твой провайдер.

Когда я впервые открыл Wireshark, я закрыл его через две минуты. Бесконечный поток строк, непонятные сокращения, сотни пакетов в секунду… Я подумал что он не для меня, а для людей с соответствующим образованием и большим терпением.

Несколько месяцев спустя я вернулся к нему. Оказалось что большинство задач решаются всего пятью фильтрами и пониманием трёх основных моментов. Всё остальное - детали которые нужны по мере необходимости. Эта статья - именно то что я тогда искал: без лишней информации и ненужных действий.

Что такое Wireshark и для чего он нужен

Wireshark - это анализатор сетевых протоколов с открытым исходным кодом. Он перехватывает пакеты данных проходящие через сетевой адаптер и показывает их содержимое в понятном виде.

Звучит просто. На практике это означает что вы можете в реальном времени видеть всё что происходит в вашей сети: к каким приложениям обращаются другие программы, какие данные передаются без шифрования, где установлены зашифрованные соединения и с какими серверами. Я запустил его в первый раз просто из любопытства. А во второй раз - чтобы узнать что именно видит мой провайдер. Мы уже писали о DPI, и Wireshark позволяет оказаться в той же точке наблюдения но уже со своей стороны - и увидеть ровно то же самое что и они.

Установка

Windows: Загрузите программу установки с официального сайта wireshark.org. Во время установки обязательно выберите Npcap - это драйвер для захвата пакетов без которого Wireshark не сможет видеть сетевой трафик. Если Npcap уже установлен отдельно - этот шаг можно пропустить. После установки запустите Wireshark от имени администратора - иначе список сетевых интерфейсов может не отображаться.

Linux (Debian/Ubuntu):

sudo apt update
sudo apt install wireshark

# Во время установки вам зададут вопрос:
# разрешить захват пакетов пользователям без прав root?
# Выберите "Yes"

# Добавьте своего пользователя в группу wireshark
sudo usermod -aG wireshark $USER

# Перезагрузите компьютер чтобы изменения вступили в силу

macOS:

brew install --cask wireshark

После установки macOS попросит разрешение на захват трафика - разрешите это в настройках безопасности системы.

Первый запуск: что видишь и что с этим делать

При открытии Wireshark показывает список сетевых интерфейсов и рядом с каждым графики активности. Активный интерфейс - тот на графике которого есть движение.

Двойной щелчок по интерфейсу запускает захват. Первое впечатление: поток строк которые невозможно прочитать. Это нормально - Wireshark показывает абсолютно всё. Следующий шаг - убрать лишнее.

Три колонки которые важны в первую очередь:

  • Time - время пакета относительно начала захвата
  • Source / Destination - откуда и куда он был отправлен
  • Info - краткое описание содержимого пакета

Фильтры: как избавиться от шума и увидеть нужное

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

Для большинства задач достаточно фильтров отображения. Их нужно вводить в строку в верхней части окна.

10 фильтров которые используются постоянно:

# Только DNS-запросы - видно какие домены запрашиваются
dns

# Только HTTP - трафик в открытом виде
http

# TLS-соединения - зашифрованный трафик
tls

# Убрать лишнее, оставить самое важное
dns or http or tls

# Трафик конкретного IP-адреса
ip.addr == 192.168.1.1

# Только входящий трафик с этого адреса
ip.src == 192.168.1.1

# Только исходящий трафик на этот адрес
ip.dst == 8.8.8.8

# Трафик на определённом порту
tcp.port == 443

# Только TLS Client Hello - видно SNI (имя домена)
tls.handshake.type == 1

# Пакеты с ошибками - для диагностики сети
tcp.analysis.flags

Читаем пакеты: HTTP, DNS, TLS

HTTP - самый простой тип данных для чтения. Трафик передаётся без шифрования. Фильтр http позволяет просматривать запросы и ответы. Если кликнуть правой кнопкой по пакету и выбрать Follow → HTTP Stream - увидишь весь обмен между браузером и сервером: заголовки, тело запроса, ответ сервера.

DNS - каждый раз при открытии сайта браузер сначала спрашивает DNS-сервер какой IP-адрес соответствует этому домену. Фильтр dns показывает все эти запросы. Они передаются без шифрования если не используется DoH - DNS over HTTPS.

TLS - зашифрованный трафик. Содержимое не видно. Но кое-что важное всё же видно: в самом начале TLS-соединения клиент отправляет пакет Client Hello. В этом пакете есть поле SNI с именем домена - и оно передаётся без шифрования.

Фильтр tls.handshake.type == 1 показывает только пакеты Client Hello. Разворачиваешь любой: Transport Layer Security → TLSv1.3 → Handshake Protocol → Extension: server_name → Server Name. Там стоит домен. Без шифрования.

Когда я впервые это увидел - было немного не по себе. Я всегда думал что HTTPS хоть как-то скрывает куда ты заходишь. Оказалось что он скрывает что ты там делаешь, но не сам факт посещения. Именно это в режиме реального времени видит провайдер.

Follow TCP Stream: очень полезная, но часто недооцениваемая функция

Кликни правой кнопкой на любом пакете, выбери Follow → TCP Stream. Wireshark соберёт все пакеты одного соединения и покажет их как единый диалог. Для HTTP - текстовая переписка браузера с сервером. Для других протоколов - бинарные данные или частично читаемый контент.

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

Расшифровка TLS через Session Key Log

Об этом мало что говорится в руководствах. Если честно - я сам наткнулся на эту возможность случайно, в комментарии на Stack Overflow, не в документации. Chrome и Firefox могут сохранять ключи шифрования сессии в файл. Если загрузить этот файл в Wireshark - он расшифрует TLS-трафик и покажет содержимое HTTPS-соединений в открытом виде.

Настройка:

# Установить переменную окружения (Linux/macOS)
export SSLKEYLOGFILE=~/ssl-keys.log

# После этого запустить браузер из того же терминала
google-chrome
# или
firefox
# Windows - в PowerShell
$env:SSLKEYLOGFILE = "C:\ssl-keys.log"
Start-Process chrome

Подключить файл в Wireshark:

Edit -> Preferences -> Protocols -> TLS ->
(Pre)-Master-Secret log filename -> указать путь к файлу

После этого весь HTTPS-трафик браузера расшифруется прямо в Wireshark. Видно содержимое запросов, ответы серверов, заголовки. Важно: это работает только на своей машине с физическим доступом. Это не атака - инструмент отладки и исследования собственного трафика.

Сохранение и работа с pcap-файлами

Захват можно сохранить: File → Save As → формат .pcap или .pcapng. Pcap-файлы можно открывать позже, передавать коллегам, анализировать офлайн. Большинство инструментов безопасности умеют читать этот формат.

Для серверов без графического интерфейса существует tcpdump - консольный аналог который записывает трафик в pcap:

# Захват трафика на интерфейсе eth0, сохранение в файл
sudo tcpdump -i eth0 -w capture.pcap

# Только DNS-трафик
sudo tcpdump -i eth0 port 53 -w dns.pcap

# Открыть pcap в Wireshark на своей машине
# и анализировать уже там

Что дальше

Wireshark - инструмент который раскрывается постепенно. После первого часа работы с ним понимаешь одно: сеть значительно менее непрозрачна чем кажется снаружи. Куча приложений передаёт данные в открытом виде. DNS-запросы видны если не настроен DoH. SNI торчит из каждого TLS-соединения.

Того что есть в этой статье достаточно для реальной работы: захватить трафик, отфильтровать нужное, залезть в конкретное соединение через Follow Stream, расшифровать собственный HTTPS если нужно разобраться что именно уходит на сервер.

Есть вещи которые выходят за рамки этого материала - анализ трафика с мобильных устройств через точку доступа, ARP-спуфинг в контролируемой среде, автоматизация через tshark. Это отдельные темы с отдельным уровнем вхождения. Дойдём до них позже.