Главная / Блог / Анализ трафика в Wireshark для CTF: от PCAP до флага

13 мин.00

Анализ трафика в Wireshark для CTF: от PCAP до флага

Анализ трафика в Wireshark для CTF: от PCAP до флага

Последний PCAP, который я разбирал на CTF, содержал 23 000 пакетов и 94% зашифрованного TLS-трафика. Флаг лежал в единственном FTP-пакете — команда PASS с паролем в открытом виде. От открытия файла до сабмита прошло четыре минуты: три на разведку через Protocol Hierarchy и одна на фильтр ftp. Разница между «прокрутил 23 000 строк» и «решил за четыре минуты» — не талант, а воспроизводимый алгоритм. Его и разберём: от первого касания PCAP-файла до извлечения флага через HTTP, FTP, DNS и нестандартные каналы. Каждый шаг — с конкретными фильтрами и командами, которые работают на любом задании network forensics CTF.

Первый подход к PCAP: strings и Protocol Hierarchy

Парадокс CTF-форензики: самый грубый приём часто оказывается самым быстрым. Прежде чем вообще открывать Wireshark, попробуйте два трюка из командной строки. Подробнее — в нашем руководстве по создание ctf заданий.

Первый — strings capture.pcap | grep -i flag. Утилита strings вытаскивает все читаемые последовательности символов из бинарного файла, grep фильтрует по формату флага. На CTF начального уровня это решает треть заданий за десять секунд. Грубо, некрасиво — но работает, потому что авторы задания часто оставляют флаг в plaintext-потоке. Стесняться тут нечего.

Второй — binwalk -e capture.pcap. Утилита сканирует файл побайтово, находит сигнатуры известных форматов (PNG, ZIP, PDF, ELF) и извлекает их в папку _capture.pcap.extracted/. Это техника File Carving (D3-FC по классификации MITRE D3FEND), и она особенно полезна, когда файл передан по raw TCP без прикладного протокола или когда внутри картинки спрятан ZIP-архив — такая матрёшка встречается на CTF среднего уровня регулярно.

Если ни strings, ни binwalk не дали результата — открываем Wireshark и начинаем методичную разведку.

Protocol Hierarchy — карта сетевого дампа

Statistics → Protocol Hierarchy — первое окно после загрузки PCAP. Оно показывает процентное распределение протоколов по количеству пакетов и объёму данных. Это не анализ — это навигация. Вы определяете, куда тратить время, а что отсечь как фоновый шум.

На что обращать внимание при анализе трафика в Wireshark для CTF:

  • HTTP > 0% — незашифрованный веб-трафик, самый частый источник флагов на начальном уровне
  • FTP > 0% — credentials в открытом виде, передача файлов без шифрования. Моделирует технику File Transfer Protocols (T1071.002, Command and Control по MITRE ATT&CK)
  • DNS с аномально высоким процентом (15–30% вместо обычных 2–5%) — вероятный DNS exfiltration
  • ICMP с нетипичным объёмом данных — ICMP tunneling, данные закодированы в payload пинг-запросов
  • Telnet, SMTP — plaintext-протоколы, часто содержат credentials
  • Нестандартные порты TCP (4444, 1337, 8888) — потенциальные C2-каналы

В типичном задании 90–99% трафика — TLS, ARP, фоновый DNS. Полезная информация сконцентрирована в оставшихся процентах. Protocol Hierarchy позволяет найти их за секунды.

Conversations и Endpoints

Statistics → Conversations показывает все пары взаимодействующих хостов. Вкладка TCP, отсортированная по объёму переданных байтов, мгновенно выделяет аномальные сессии. Один внешний IP с сотнями входящих соединений — подозрительно (возможный brute-force). Но разница в объёме данных между сессиями — ещё полезнее: если 52 SSH-сессии передали по 500 байт, а две — по 50 КБ, начинайте с тех двух.

Таблица решений после разведки

Что показал Protocol Hierarchy Куда копать Стартовый фильтр
HTTP > 0% Export Objects, Follow Stream http
FTP > 0% Credentials, file transfers ftp или ftp-data
DNS аномально высокий DNS exfiltration dns.qry.type == 16
ICMP с большим payload ICMP tunneling icmp && data.len > 64
Telnet / SMTP Plaintext credentials telnet или smtp
Нестандартный TCP-порт C2 или custom protocol tcp.port == <номер>
Всё зашифровано (TLS) SNI-анализ, поиск ключей tls.handshake.type == 1

Это не writeup конкретного задания — это универсальный алгоритм для любого PCAP-файла в категории network forensics CTF.

Фильтры Wireshark для анализа трафика в CTF

Display-фильтры вводятся в строку в верхней части окна Wireshark и применяются по Enter. Без них разбор дампа трафика Wireshark с тысячами пакетов превращается в лотерею.

Базовые фильтры и комбинирование

Фильтры, которые стоит знать наизусть: http — весь HTTP-трафик, dns — DNS-запросы и ответы, ftp — FTP-команды (для содержимого файлов — ftp-data), smtp — электронная почта, tcp.port == 4444 — трафик на конкретном порту, ip.addr == 10.0.2.15 — пакеты от/к конкретному IP, http.request.method == "POST" — только POST-запросы (формы, загрузки, credentials).

Комбинирование: && — логическое И, || — ИЛИ, ! — отрицание. Фильтр http && ip.src == 10.0.2.15 покажет HTTP-трафик от конкретного хоста. А !(arp or icmp or dns or stp) уберёт фоновый шум — но не применяйте его на автомате, иногда флаг спрятан именно в DNS или ICMP.

Для TCP-аномалий полезны: tcp.flags.reset == 1 (RST-пакеты, признак сброшенных соединений), tcp.flags == 0x012 (SYN/ACK — ответы на попытки подключения), tcp.analysis.flags && !tcp.analysis.window_update (ретрансмиссии и дубликаты ACK).

Поиск флагов по содержимому

Когда формат флага известен (например, CTF{...} или flag{...}), поиск по содержимому пакетов — самый короткий путь:

  • frame contains "flag" — ищет строку во всём фрейме, включая payload и заголовки
  • http contains "CTF{" — поиск только в HTTP-пакетах
  • tcp contains "password" — пароли в TCP-потоке
  • dns.qry.name contains "suspicious" — подстроки в DNS-запросах

Для регулярных выражений — оператор matches: фильтр dns.qry.name matches "^[a-f0-9]{8,}\\." выявит DNS-запросы с hex-строками в поддоменах — типичный признак DNS exfiltration. А http.request.uri matches ".*\\.php" покажет все запросы к PHP-скриптам.

Если формат флага неизвестен — идём перебором: frame contains "flag", затем frame contains "key", frame contains "secret", frame contains "pass". Стоит также проверять Base64-кодировку начала флага: если CTF{ в Base64 — это Q1RGew==, ищите frame contains "Q1RG".

Важное ограничение: фильтры contains и matches работают только с незашифрованным трафиком. На TLS-сессиях без ключа дешифрации они бесполезны — содержимое зашифровано, тут без вариантов.

Follow TCP Stream Wireshark: восстановление сессий

Правый клик на любом пакете → Follow → TCP Stream. Wireshark собирает все пакеты одной TCP-сессии в единый читаемый поток. Красный текст — данные от клиента, синий — от сервера. Это ключевой приём анализа сетевого трафика Wireshark для реконструкции диалогов.

В нижней части окна — навигация между потоками: Stream 0, Stream 1, Stream 2. На CTF с небольшим количеством потоков стоит просмотреть каждый последовательно. При десятках потоков — сначала отфильтруйте нужный протокол, потом откройте Follow Stream уже на отфильтрованном пакете.

Что искать в TCP Stream на CTF:

  • HTTP-заголовки — нестандартные значения User-Agent (например, wget или кастомная строка C2-агента), Authorization: Basic с Base64-строкой, кастомные заголовки с закодированными данными. В терминах MITRE ATT&CK такие сценарии моделируют технику Web Protocols (T1071.001, Command and Control)
  • FTP-сессии — пары USER/PASS в открытом виде, команды RETR и STOR
  • Plaintext-протоколы — Telnet-сессии, SMTP AUTH LOGIN, IRC-чаты
  • Закодированные строки — Base64, hex, URL-encoding внутри потока. CyberChef (gchq.github.io/CyberChef) — незаменимая штука для каскадного декодирования

Для бинарных данных переключите формат отображения в нижней части окна с ASCII на Raw и сохраните через Save As. Это критически важно: сохранение бинарного файла в ASCII-режиме повредит данные. Я на этом однажды потерял минут десять, пока не понял, почему PNG не открывается.

Восстановление файлов из PCAP

Экспорт объектов Wireshark — штатный механизм извлечения файлов: File → Export Objects → HTTP показывает все файлы, переданные по HTTP. Аналогичные меню доступны для SMB (File → Export Objects → SMB), TFTP и email-вложений (IMF).

Алгоритм после экспорта: 1. Определить реальный тип — file <имя_файла> читает magic bytes и показывает формат даже при неправильном расширении 2. Проверить на флаг — strings <имя_файла> | grep -i flag 3. Посчитать хеш — md5sum <имя_файла> или sha256sum <имя_файла> (на некоторых CTF хеш файла и есть ответ) 4. Если файл — архив, распаковать и повторить шаги 1–3 для содержимого

Export Objects работает только для полностью захваченных передач. При обрезанном PCAP файл будет повреждён — тогда пробуйте Follow TCP Stream → Save As → Raw для ручной реконструкции.

Когда Export Objects не справляется (файл передан по нестандартному протоколу или зашит в payload), используйте binwalk -e capture.pcap — carving файлов из трафика по сигнатурам. В Kali Linux стоит из коробки и работает с сотнями форматов.

На CTF среднего уровня авторы прячут файлы внутри других файлов (PNG с вшитым ZIP-архивом). После binwalk проверяйте вложенные контейнеры: binwalk -e extracted_image.png может найти второй слой. Та самая матрёшка.

DNS Exfiltration и нестандартные каналы

DNS exfiltration — техника, при которой данные кодируются в DNS-запросах и передаются через поддомены. Запрос к 666c61677b.evil.com — это hex-строка flag{ в имени поддомена. На CTF среднего и высокого уровня DNS exfiltration встречается регулярно, и это не абстрактное упражнение — реальные APT-группировки используют тот же вектор для утечки данных.

Распознавание паттерна

Признаки в Protocol Hierarchy: аномально высокий процент DNS-трафика, длинные поддомены с hex- или Base64-символами, запросы типа TXT к нестандартным доменам, множество уникальных поддоменов одного домена. Фильтр dns.qry.name matches "^[a-f0-9]{8,}\\." выделит запросы с hex-данными.

Извлечение через tshark

Кликать по DNS-запросам в GUI — занятие для терпеливых. Тут tshark выигрывает:

tshark -r capture.pcap -Y "dns.qry.name contains evil.com" \
  -T fields -e dns.qry.name | \
  awk -F. '{print $1}' | \
  xxd -r -p

Пайплайн извлекает имена DNS-запросов к подозрительному домену, вырезает поддомен (первый элемент до точки) и декодирует hex в ASCII. Если данные закодированы в Base64, замените xxd -r -p на base64 -d. На выходе — исходные данные, часто содержащие флаг или путь к нему. Три секунды вместо пятнадцати минут кликанья.

ICMP tunneling

Стандартный ICMP echo request содержит 32–56 байт данных. Если data.len значительно больше — это подозрительно. Фильтр icmp && data.len > 64 выделит аномальные пакеты. Данные в payload могут содержать текст флага в ASCII или hex.

Follow TCP Stream на ICMP не работает (это не TCP). Для извлечения данных: выделите ICMP-пакет, в нижней панели Wireshark найдите раздел Data, скопируйте hex-значения и декодируйте через xxd -r -p или CyberChef.

Packet comments

Малоизвестный приём: фильтр pkt_comment показывает пакеты с прикреплёнными комментариями. Авторы CTF иногда прячут подсказки или части флага именно в Wireshark-комментариях. Проверка занимает секунду — грех не попробовать.

Credential Hunting: поиск флагов в учётных данных

Отдельный класс CTF-заданий — поиск учётных данных в PCAP. Он моделирует технику Credentials In Files (T1552.001, Credential Access по MITRE ATT&CK). Контекст: по данным CrowdStrike Global Threat Report 2025, 75% вторжений в 2024 году использовали действительные учётные данные. Понимание того, как credentials утекают через сеть — практический навык, а не академическое упражнение.

FTP

Фильтр ftp показывает управляющий канал: команды USER, PASS, RETR, STOR, LIST. Credentials передаются без шифрования — в чём мать родила.

Алгоритм: применить ftp → найти пары USER/PASS → проверить RETR/STOR (какие файлы передавались) → переключиться на ftp-data → правый клик → Follow → TCP Stream → Save As → Raw.

FTP использует отдельные порты для данных: порт 20 в активном режиме, случайный порт > 1024 в пассивном. Wireshark обычно связывает каналы автоматически, но при нестандартной конфигурации может не распознать ftp-data. Решение: Decode As на соответствующем порту.

HTTP Basic Auth и POST-формы

Заголовок Authorization: Basic dXNlcjpwYXNz содержит Base64-encoded credentials. Декодирование: echo "dXNlcjpwYXNz" | base64 -duser:pass. Фильтр http.authorization покажет все пакеты с этим заголовком.

Фильтр http.request.method == "POST" выявит отправку форм: Follow TCP Stream на POST-пакете покажет пары username=admin&password=secret в теле запроса. Красивый фантик (HTTP), а внутри — пароль открытым текстом.

SMTP AUTH

Фильтр smtp → ищите AUTH LOGIN или AUTH PLAIN. Две строки после AUTH LOGIN — логин и пароль в Base64. На CTF credentials из SMTP иногда сами являются флагом, иногда — ключом к следующему этапу.

tshark: автоматизация разбора дампа трафика

GUI Wireshark удобен для разведки. Но когда вы поняли, куда копать, скорость определяется CLI-пайплайнами.

Все HTTP-запросы с группировкой по User-Agent — выявление нестандартных клиентов:

tshark -r capture.pcap -Y http.request \
  -T fields -e http.host -e http.request.uri -e http.user_agent | \
  sort | uniq -c | sort -rn

Аномальный User-Agent (wget, curl, кастомная строка C2-агента) мгновенно выделяется среди десятков браузерных запросов. В задании EscapeRoom на CyberDefenders именно User-Agent со значением wget указал на инструмент атакующего — техника Web Protocols (T1071.001).

Ещё несколько однострочников, которые экономят минуты:

  • Уникальные DNS-запросы: tshark -r capture.pcap -Y dns.qry.name -T fields -e dns.qry.name | sort -u
  • FTP credentials: tshark -r capture.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" -T fields -e ftp.request.command -e ftp.request.arg
  • Экспорт HTTP-объектов из CLI: tshark -r capture.pcap --export-objects http,./exported/
  • Аналог Protocol Hierarchy: tshark -r capture.pcap -q -z io,phs
  • Поиск строки с hex-контекстом: tshark -r capture.pcap -Y 'frame contains "flag"' -x

Пайплайн tshark ... | sort | uniq -c | sort -rn — универсальная обвязка: группирует, считает и сортирует по частоте. Применяйте к любому полю: http.host, dns.qry.name, ip.dst — аномалии всплывают мгновенно.

Дешифровка пакетов: работа с TLS-трафиком

На большинстве CTF зашифрованный TLS — фоновый шум, который нужно отфильтровать. Но в заданиях продвинутого уровня авторы предоставляют ключи, и тогда TLS превращается в читаемый HTTP.

Приватный ключ сервера (RSA)

Если задание содержит файл .pem или .key: Edit → Preferences → Protocols → TLS → RSA keys list → Add. Укажите IP сервера, порт (обычно 443), протокол (http) и путь к ключу. После применения стандартные фильтры http начнут работать на расшифрованном трафике.

Ограничение: метод работает только с RSA key exchange. Серверы с ECDHE (Ephemeral Diffie-Hellman) не поддаются дешифровке одним приватным ключом — сессионные ключи не выводятся из серверного ключа. В CTF-заданиях тип key exchange обычно оговорён, но если не оговорён — проверяйте tls.handshake.ciphersuite в ClientHello.

В tshark: tshark -r capture.pcap -o "tls.keys_list:127.0.0.1,443,http,/path/to/key.pem" — и дальше стандартные фильтры.

SSLKEYLOGFILE

Если задание предоставляет файл с pre-master secrets (формат CLIENT_RANDOM <hex> <hex>): Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename → путь к файлу. Этот метод работает с любым key exchange, включая ECDHE, потому что содержит готовые сессионные ключи. По сути — карт-бланш на весь TLS-трафик в дампе.

Когда ключей нет

Без ключей содержимое TLS-сессий недоступно. Но метаданные остаются: фильтр tls.handshake.extensions_server_name покажет SNI (Server Name Indication) — домен, к которому подключался клиент. Фильтр tls.handshake.type == 1 выведет все ClientHello с версиями TLS, поддерживаемыми шифронаборами и SNI. На CTF иногда достаточно знать домен обращения, чтобы ответить на вопрос — не всегда нужно видеть содержимое.

Предусловия и ограничения

Техника Версия Wireshark ОС Ограничение
Export Objects HTTP Любая Любая Только полностью захваченные передачи
TLS-дешифровка (RSA key) 2.0+ Любая Только RSA key exchange
TLS-дешифровка (SSLKEYLOGFILE) 2.0+ Любая Нужен файл с pre-master secrets
binwalk -e N/A (CLI) Linux, macOS На Windows нужен WSL2
tshark --export-objects 2.4+ Любая Аналогичен GUI Export Objects
Фильтр pkt_comment 1.8+ Любая Только pcapng-формат

Последний пункт — частый источник путаницы. Комментарии к пакетам поддерживаются только форматом .pcapng, но не классическим .pcap. Если фильтр pkt_comment ничего не показывает — проверьте формат файла через file capture.pcap.


Вот что я наблюдаю раз за разом на CTF: команды, которые быстро решают network forensics, не используют Wireshark «красивее» — они используют его меньше. Protocol Hierarchy и Conversations в GUI → тут же переключение на tshark для извлечения данных. Один пайплайн tshark -T fields | awk | xxd вытаскивает DNS exfiltration за три секунды, пока кто-то рядом кликает по каждому DNS-пакету вручную.

Ещё одна проблема: большинство учат Wireshark по writeup'ам конкретных заданий и запоминают частные решения. «В том таске флаг был в User-Agent» — бесполезное знание на следующем CTF. «Protocol Hierarchy → аномальный протокол → фильтр → Follow Stream / Export Objects» — универсальный алгоритм, который работает на любом PCAP. Таблица решений из начала статьи — это он, записанный на бумаге.

И третье: не стесняйтесь начинать с strings | grep. Половина CTF-сообщества считает это «нечестным» или «слишком простым». На соревнованиях побеждает тот, кто находит флаг первым, а не тот, кто красивее пишет фильтры. Сначала грубая проверка — потом методичный анализ. Если хочешь не просто решать отдельные таски, а выстроить прогрессию от сетевого анализа до полной цепочки эксплуатации — на WAPT эту связку проходят в модулях с лабами на каждый вектор.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «forensics».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...

Читайте также

Реверс-инжиниринг в Ghidra для начинающих: шаг за шагом

15 мин.

3

Реверс-инжиниринг в Ghidra для начинающих: шаг за шагом

Пошаговый разбор бинарника в Ghidra: от file и strings до CTF-флага. Навигация, декомпилятор, stripped-бинарники, XOR-паттерны и ошибки новичков.

10 СЕНТЯБРЬ, 2026

Buffer overflow с нуля: перезапись адреса возврата

8 мин.

5

Buffer overflow с нуля: перезапись адреса возврата

Разбираем переполнение стека на конкретном бинарнике: компилируем без защит, находим смещение до адреса возврата в GDB и перезаписываем EIP. Эксплойт на Python.

10 СЕНТЯБРЬ, 2026

Path Traversal и LFI уязвимости: гайд для CTF

14 мин.

8

Path Traversal и LFI уязвимости: гайд для CTF

Пошаговый разбор path traversal и LFI: обход фильтров, PHP wrappers, цепочки LFI to RCE, log poisoning — с пейлоадами и командами для CTF

9 СЕНТЯБРЬ, 2026