
На последних пяти CTF-соревнованиях, где я играл в forensics-категории, pcap-задания составляли больше половины тасков. Формула каждого одинаковая: скачиваешь файл, открываешь в Wireshark, видишь тысячи пакетов — и ни одной подсказки, где спрятан флаг. Новичок тратит полчаса на бессистемное листание. Опытный игрок находит ответ за пять минут — не потому что знает Wireshark лучше, а потому что работает по алгоритму: что открыть первым, какой фильтр набрать, куда смотреть в hex dump. Дальше — тот самый алгоритм, собранный из десятков решённых тасков.
Самая частая ошибка на forensics CTF заданиях — сразу фильтровать пакеты по протоколу или IP. Без общей картины вы не знаете, что фильтровать. Первые действия после открытия pcap задают направление всего разбора.
Требования к окружению: - Wireshark 4.x или 3.x (активно поддерживается, open-source, стабильная ветка обновляется регулярно) - tshark — входит в дистрибутив Wireshark, отдельная установка не нужна - ОС: Windows 10+, Linux (в Kali стоит по умолчанию), macOS - RAM: 4 ГБ минимум для pcap до 50 МБ, 8 ГБ рекомендуется для крупных дампов - Опционально: NetworkMiner (альтернатива для автоматического извлечения файлов и учётных данных, бесплатная версия на netresec.com)
Первое окно, которое открываем: Statistics → Protocol Hierarchy. Оно показывает процентное распределение протоколов в дампе по объёму данных и количеству пакетов. В CTF организаторы обычно прячут флаг в нешифрованном трафике — HTTP, FTP, DNS, SMTP, Telnet. Если 95% трафика составляет TLS, а 0.3% — HTTP, именно эти 0.3% и есть ваша цель.
На что обращать внимание:
В реальных расследованиях это соответствует задаче NIST CSF DE.AE-01 — построение базовой картины трафика и выявление отклонений. В CTF базовую картину вы строите именно здесь, и она задаёт весь дальнейший Wireshark pcap разбор.
Второе окно: Statistics → Conversations → вкладка TCP (или IPv4). Сортируем по количеству переданных байтов. Нужно ответить на два вопроса: какие пары хостов обменялись наибольшим объёмом данных и есть ли соединения на нестандартных портах (не 80, 443, 53).
Если в pcap один внутренний IP (10.0.x.x или 192.168.x.x) обращается к нескольким внешним — это машина «жертвы». Трафик от неё к подозрительным адресам на нестандартных портах — первый кандидат для глубокого анализа сетевых пакетов. Практический приём: выделяете интересующую conversation и жмёте «Follow Stream» прямо из этого окна — не надо руками искать нужные пакеты.
Фильтры Wireshark — основной рабочий инструмент для pcap forensics. В CTF важна скорость: нужно сузить тысячи пакетов до десятков релевантных за минимальное время.
Набор, который покрывает 80% задач:
http — весь HTTP-трафик (GET, POST, ответы)dns — все DNS-запросы и ответыftp || ftp-data — FTP-сессии с передаваемыми файламиtcp.port == 4444 — трафик на конкретный порт (4444 — частый порт reverse shell)ip.addr == 192.168.1.100 — весь трафик конкретного хостаhttp.request.method == "POST" — только POST-запросы (формы логина, отправка данных)dns.qry.name contains "flag" — DNS-запросы, содержащие слово «flag»Комбинации через логические операторы: http && ip.src == 10.0.2.15 покажет HTTP-запросы от конкретного хоста. Оператор ! для исключения фонового шума: !arp && !dns && !mdns уберёт служебный трафик и оставит то, что стоит изучать.
Когда формат флага известен (а на CTF он обычно объявлен — CTF{, flag{, FLAG_), поиск по содержимому пакета решает задачу за секунды:
frame contains "flag{" — ищет строку в любом месте пакета, включая payloadhttp contains "password" — поиск паролей в HTTPtcp contains "CTF" — поиск формата флага в TCP-сегментахДля регулярных выражений — оператор matches: фильтр http.request.uri matches ".*\.(php|asp)" найдёт обращения к серверным скриптам. А frame matches "(?i)secret" выполнит регистронезависимый поиск слова «secret» по всему дампу.
Ограничение: contains и matches работают только по нешифрованному payload. Против TLS фильтр по содержимому бесполезен без предварительной расшифровки — об этом отдельный раздел ниже.
Follow TCP Stream (правый клик на пакете → Follow → TCP Stream) — техника, которая в одиночку решает больше CTF-задач, чем все остальные приёмы вместе взятые. Она реконструирует полный диалог между двумя хостами в хронологическом порядке: запросы клиента одним цветом, ответы сервера — другим. Вместо десятков разрозненных пакетов вы видите цельную сессию.
Флаг в CTF часто спрятан в учётных данных, переданных по незашифрованным протоколам. Это моделирует реальную технику Network Sniffing (T1040, credential-access) по MITRE ATT&CK.
FTP — фильтр ftp покажет команды USER и PASS открытым текстом. В Follow Stream видна полная сессия: логин, пароль, содержимое каталогов (LIST), скачивание файлов (RETR). Если присутствует ftp-data, флагом может быть содержимое переданного файла — его можно вытянуть через Follow Stream → Show data as: Raw → Save as.
HTTP Basic Auth — заголовок Authorization: Basic <base64> декодируется Wireshark автоматически, значение видно прямо в дереве пакетов. POST-данные форм логина (username=admin&password=s3cretfl4g) тоже отображаются в чистом виде.
SMTP — почтовые сессии на порту 25 передают всё открытым текстом: отправитель, получатель, тело письма, вложения в base64. Follow Stream на SMTP-соединении часто раскрывает флаг прямо в теле сообщения.
Telnet — каждый символ летит отдельным пакетом, но Follow Stream собирает их в читаемую последовательность команд. Ищите введённые пользователем данные.
Трафик на нестандартном порту иногда отображается как «TCP» или «Data» без разбора структуры. Wireshark привязывает диссекторы к стандартным портам, и если HTTP работает на порту 1337 — автоматическое распознавание не срабатывает.
Решение: правый клик → Decode As → выбрать нужный протокол для этого порта. После этого Wireshark переанализирует все пакеты с правильным диссектором. Я на одном CTF потерял минут двадцать, пялясь в сырые hex-данные на порту 8888, пока не догадался сделать Decode As → HTTP. Там лежал флаг прямо в GET-параметре.
Приём работает и для аудиопотоков: если в pcap спрятано голосовое сообщение, трафик может идти по UDP на нестандартном порту. После Decode As → RTP появляется возможность перейти в Telephony → RTP → RTP Streams → Analyze → Play для воспроизведения записи. Согласно walkthrough THM Wireshark CTF, именно так решаются задачи с аудиофлагами, где RTP-поток замаскирован под обычный UDP.
Ограничение Decode As: если протокол действительно кастомный (не стандартный HTTP/FTP/RTP), диссектор не поможет. Тогда остаётся ручной разбор payload в hex dump.
Флаг может быть не строкой в пакете, а файлом, переданным по сети: изображением, PDF, архивом, скриптом.
File → Export Objects → HTTP (или SMB, TFTP, FTP-DATA). Wireshark покажет список всех файлов, переданных через выбранный протокол. Сохраняем подозрительные объекты и проверяем каждый.
Типичные находки при анализе pcap файлов на CTF:
strings <файл> | grep -i flag на наличие текста, спрятанного в метаданных или после маркера конца изображения. binwalk покажет встроенные архивыcat и ищите флаг в открытом виде или в закодированной формеЕсли Export Objects недоступен (файл передавался по нестандартному протоколу), используем Follow TCP Stream → Show data as: Raw → Save as. Получаем бинарный поток, из которого вырезаем файл, ориентируясь на magic bytes: FF D8 FF для JPEG, 50 4B 03 04 для ZIP, 89 50 4E 47 для PNG.
NetworkMiner — альтернатива Wireshark для массового извлечения артефактов. Инструмент автоматически реконструирует файлы, изображения и учётные данные из pcap без ручной работы. Ограничение: NetworkMiner не работает с трафиком, захваченным на loopback-интерфейсе, и хуже справляется с нестандартными протоколами. Для типовых CTF-задач с HTTP/FTP — рабочий вариант, когда нужно сэкономить время.
Задачи повышенной сложности прячут данные в скрытых каналах — протоколах, которые на первый взгляд не несут полезной нагрузки. В реальном мире это техника Steganography (T1001.002, command-and-control) по MITRE ATT&CK, и CTF-организаторы активно её моделируют.
DNS — самый популярный скрытый канал и в CTF, и в боевых атаках. Данные кодируются двумя основными способами.
Через поддомены: запрос вида ZmxhZ3t0ZXN0fQ.evil.com содержит base64-кодированный текст прямо в имени хоста. В Wireshark фильтр dns.qry.name.len > 30 отсечёт нормальные запросы и покажет аномально длинные имена. Каждый запрос несёт фрагмент данных — собрав все поддомены по порядку и декодировав, получаете флаг.
Через TXT-записи: ответы DNS-сервера с типом TXT содержат произвольный текст. Фильтр dns.txt покажет все такие ответы. Флаг может лежать прямо в TXT-поле или быть закодирован в hex/base64.
Для массового извлечения данных из DNS exfiltration GUI неудобен — десятки или сотни запросов быстрее обработать через tshark и скрипт.
Стандартный ICMP echo request содержит padding-данные — обычно повторяющийся паттерн или нули. В CTF payload заменяется полезными данными: по одному символу флага на пакет или целыми фрагментами в base64.
Обнаружение: фильтр icmp → смотрим hex dump трафика в нижней панели Wireshark. Если в поле Data видите ASCII-символы вместо стандартного abcdefgh... или 00 00 00... — это данные. Обращайте внимание на ICMP type 8 (echo request) — именно в запросах обычно прячут payload.
Аналогичный принцип применим к любому протоколу с необязательными полями: нестандартные HTTP-заголовки (X-Secret-Data: ...), TCP options, даже IPv4 options. Организаторы используют любое поле, которое не влияет на доставку пакета, но способно нести данные. В терминах MITRE ATT&CK это Standard Encoding (T1132.001) — кодирование данных через base64, hex или ROT13 для передачи через легитимные протоколы.
В CTF с TLS-трафиком организаторы всегда дают средство для расшифровки — иначе задача нерешаема. Ключ может быть:
Pre-Master Secret log — файл с записями формата CLIENT_RANDOM <hex> <hex>. Часто спрятан в другом потоке того же дампа: в email-вложении, FTP-передаче или даже в DNS TXT-записи. В Wireshark: Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename.
Приватный RSA-ключ сервера — PEM-файл. Работает только если сессия не использует Perfect Forward Secrecy (ECDHE/DHE). Подключается через Protocols → TLS → RSA keys list.
После подключения ключа Wireshark расшифрует сессии автоматически — появятся HTTP-запросы внутри бывшего TLS-потока. Дальше стандартный анализ: Follow HTTP Stream, Export Objects. Согласно разбору из THM Wireshark CTF, в одной из задач ключ CLIENT_RANDOM был отправлен по email в том же pcap — нужно было сначала найти его в SMTP-сессии, сохранить в файл и подключить к TLS-диссектору. Красивая матрёшка.
Ограничение: TLS 1.3 с ECDHE не расшифровывается приватным RSA-ключом — нужен именно session-level pre-master secret. Без ключа доступны только метаданные: SNI (имя сервера в ClientHello), размеры пакетов, тайминги. Иногда SNI содержит подсказку или часть ответа.
tshark — консольная версия Wireshark для автоматизации. Когда pcap содержит десятки тысяч пакетов, GUI начинает тормозить, а tshark в терминале отрабатывает за секунды. Набор однострочников, которые я запускаю первыми на каждом forensics-таске:
# Поиск строки "flag" во всём дампе (с выводом hex)
tshark -r capture.pcap -Y 'frame contains "flag"' -x
# Извлечь уникальные DNS-запросы (имена доменов)
tshark -r capture.pcap -Y "dns.qry.name" -T fields -e dns.qry.name | sort -u
# HTTP-запросы с хостом и URI
tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri
# Payload ICMP echo request в hex
tshark -r capture.pcap -Y "icmp.type==8" -T fields -e data.data
Результат второй команды — список всех запрошенных доменов. Если среди них ZmxhZ3t...evil.com — вы нашли DNS exfiltration. Четвёртая команда выводит hex из ICMP-запросов, который конвертируется в текст через xxd -r -p или однострочник на Python.
tshark позволяет экспортировать произвольные поля в CSV для обработки скриптом: добавьте -E header=y -E separator=, к любой команде с -T fields. Полученную таблицу можно скормить pandas или даже Excel.
Ограничение: визуальные аномалии (всплески на I/O Graph, нетипичная структура пакетов) проще заметить глазами в GUI Wireshark. tshark — инструмент массового извлечения, GUI — инструмент точечного глубокого анализа. На CTF нужны оба.
Пошаговый алгоритм, который работает на большинстве forensics CTF заданий:
Protocol Hierarchy — Statistics → Protocol Hierarchy. Определить незашифрованные протоколы. Записать проценты HTTP, DNS, FTP, SMTP, ICMP, нестандартных протоколов.
Conversations — Statistics → Conversations → TCP. Найти пары с наибольшим объёмом данных и соединения на нестандартных портах.
Поиск по формату флага — frame contains "flag{" (подставить формат конкретного CTF). Нашли — задача решена, переходите дальше.
HTTP-анализ — фильтр http, просмотр POST-запросов на предмет credentials и данных форм. Export Objects → HTTP для извлечения файлов.
FTP / Telnet / SMTP — Follow TCP Stream на каждый поток. Ищите логины, пароли, тела писем, передаваемые файлы.
DNS-проверка — фильтр dns, поиск аномально длинных имён (dns.qry.name.len > 30), TXT-записей, нетипичных поддоменов. При подозрении на exfiltration — массовое извлечение через tshark.
ICMP-проверка — фильтр icmp, просмотр payload в hex. Нестандартное содержимое — извлечь и декодировать.
Decode As — для трафика на нестандартных портах пробовать HTTP, FTP, RTP и другие протоколы. Проверить Telephony → RTP Streams после декодирования UDP как RTP.
TLS-расшифровка — если доминирует TLS, искать ключ в незашифрованных потоках (email, FTP, DNS). Подключить через Preferences → Protocols → TLS.
Стеганография в файлах — извлечённые изображения проверить через strings, exiftool, binwalk. Архивы — попробовать пароли из других потоков.
Этот чеклист покрывает подавляющее большинство CTF-задач с pcap. Оставшаяся часть — экзотика: кастомные протоколы, многоуровневое кодирование (ROT13 внутри base64 внутри hex — как в разборе THM Wireshark CTF, где для решения нужно было реверсить Python-скрипт с тремя слоями шифрования). Для таких задач база остаётся той же — сначала общая картина, потом точечный анализ — но добавляется скриптовая обработка.
Каждый пункт чеклиста моделирует реальную технику из MITRE ATT&CK: HTTP-передача credentials — Exfiltration Over Unencrypted Non-C2 Protocol (T1048.003). DNS tunneling — DNS (T1071.004). FTP-передача файлов — File Transfer Protocols (T1071.002). Web Protocols (T1071.001) — для HTTP-based C2. Знание этих паттернов ускоряет поиск: вы понимаете, что искать, потому что понимаете, как атакующие действуют.
Среди тех, кто регулярно решает forensics-задачи, я замечаю один разрыв: навыки Wireshark растут, а понимание контекста атаки — нет. Можно идеально фильтровать трафик, вытаскивать файлы из pcap и декодировать base64 за секунды. Но если не понимаешь, зачем атакующий использовал DNS-туннель вместо прямого HTTP-канала, задачи решаются механически, а не через анализ инцидента. CTF-организаторы это видят и усложняют не кодирование, а сценарии: всё чаще pcap моделирует полную цепочку компрометации — от фишингового письма в SMTP-сессии до lateral movement через SMB и exfiltration данных через DNS. Кто видит цепочку целиком, решает быстрее того, кто ищет строку flag grep'ом по hex dump. Именно этот навык — мыслить атакующими цепочками, а не отдельными фильтрами — отделяет CTF-игрока, набирающего очки, от специалиста, способного разобрать реальный инцидент. И тут forensics-навыки конвертируются напрямую: тот же tshark, те же Protocol Hierarchy и Follow Stream, только вместо искусственного флага — реальный IoC в продакшн-трафике. Если хочешь не просто writeup, а пройти полную атаку от разведки до exfiltration самому — на WAPT есть лабы именно с этим вектором и ментор в чате при затыке.
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...