
Последний PCAP, который я разбирал на CTF, содержал 23 000 пакетов и 94% зашифрованного TLS-трафика. Флаг лежал в единственном FTP-пакете — команда PASS с паролем в открытом виде. От открытия файла до сабмита прошло четыре минуты: три на разведку через Protocol Hierarchy и одна на фильтр ftp. Разница между «прокрутил 23 000 строк» и «решил за четыре минуты» — не талант, а воспроизводимый алгоритм. Его и разберём: от первого касания PCAP-файла до извлечения флага через HTTP, FTP, DNS и нестандартные каналы. Каждый шаг — с конкретными фильтрами и командами, которые работают на любом задании network forensics CTF.
Парадокс 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 и начинаем методичную разведку.
Statistics → Protocol Hierarchy — первое окно после загрузки PCAP. Оно показывает процентное распределение протоколов по количеству пакетов и объёму данных. Это не анализ — это навигация. Вы определяете, куда тратить время, а что отсечь как фоновый шум.
На что обращать внимание при анализе трафика в Wireshark для CTF:
В типичном задании 90–99% трафика — TLS, ARP, фоновый DNS. Полезная информация сконцентрирована в оставшихся процентах. Protocol Hierarchy позволяет найти их за секунды.
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.
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 собирает все пакеты одной TCP-сессии в единый читаемый поток. Красный текст — данные от клиента, синий — от сервера. Это ключевой приём анализа сетевого трафика Wireshark для реконструкции диалогов.
В нижней части окна — навигация между потоками: Stream 0, Stream 1, Stream 2. На CTF с небольшим количеством потоков стоит просмотреть каждый последовательно. При десятках потоков — сначала отфильтруйте нужный протокол, потом откройте Follow Stream уже на отфильтрованном пакете.
Что искать в TCP Stream на CTF:
User-Agent (например, wget или кастомная строка C2-агента), Authorization: Basic с Base64-строкой, кастомные заголовки с закодированными данными. В терминах MITRE ATT&CK такие сценарии моделируют технику Web Protocols (T1071.001, Command and Control)USER/PASS в открытом виде, команды RETR и STORAUTH LOGIN, IRC-чатыДля бинарных данных переключите формат отображения в нижней части окна с ASCII на Raw и сохраните через Save As. Это критически важно: сохранение бинарного файла в ASCII-режиме повредит данные. Я на этом однажды потерял минут десять, пока не понял, почему PNG не открывается.
Экспорт объектов 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-запросах и передаются через поддомены. Запрос к 666c61677b.evil.com — это hex-строка flag{ в имени поддомена. На CTF среднего и высокого уровня DNS exfiltration встречается регулярно, и это не абстрактное упражнение — реальные APT-группировки используют тот же вектор для утечки данных.
Признаки в Protocol Hierarchy: аномально высокий процент DNS-трафика, длинные поддомены с hex- или Base64-символами, запросы типа TXT к нестандартным доменам, множество уникальных поддоменов одного домена. Фильтр dns.qry.name matches "^[a-f0-9]{8,}\\." выделит запросы с hex-данными.
Кликать по 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 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.
Малоизвестный приём: фильтр pkt_comment показывает пакеты с прикреплёнными комментариями. Авторы CTF иногда прячут подсказки или части флага именно в Wireshark-комментариях. Проверка занимает секунду — грех не попробовать.
Отдельный класс CTF-заданий — поиск учётных данных в PCAP. Он моделирует технику Credentials In Files (T1552.001, Credential Access по MITRE ATT&CK). Контекст: по данным CrowdStrike Global Threat Report 2025, 75% вторжений в 2024 году использовали действительные учётные данные. Понимание того, как credentials утекают через сеть — практический навык, а не академическое упражнение.
Фильтр 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 на соответствующем порту.
Заголовок Authorization: Basic dXNlcjpwYXNz содержит Base64-encoded credentials. Декодирование: echo "dXNlcjpwYXNz" | base64 -d → user:pass. Фильтр http.authorization покажет все пакеты с этим заголовком.
Фильтр http.request.method == "POST" выявит отправку форм: Follow TCP Stream на POST-пакете покажет пары username=admin&password=secret в теле запроса. Красивый фантик (HTTP), а внутри — пароль открытым текстом.
Фильтр smtp → ищите AUTH LOGIN или AUTH PLAIN. Две строки после AUTH LOGIN — логин и пароль в Base64. На CTF credentials из SMTP иногда сами являются флагом, иногда — ключом к следующему этапу.
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).
Ещё несколько однострочников, которые экономят минуты:
tshark -r capture.pcap -Y dns.qry.name -T fields -e dns.qry.name | sort -utshark -r capture.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" -T fields -e ftp.request.command -e ftp.request.argtshark -r capture.pcap --export-objects http,./exported/tshark -r capture.pcap -q -z io,phstshark -r capture.pcap -Y 'frame contains "flag"' -xПайплайн tshark ... | sort | uniq -c | sort -rn — универсальная обвязка: группирует, считает и сортирует по частоте. Применяйте к любому полю: http.host, dns.qry.name, ip.dst — аномалии всплывают мгновенно.
На большинстве CTF зашифрованный TLS — фоновый шум, который нужно отфильтровать. Но в заданиях продвинутого уровня авторы предоставляют ключи, и тогда TLS превращается в читаемый HTTP.
Если задание содержит файл .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" — и дальше стандартные фильтры.
Если задание предоставляет файл с 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 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...