Главная / Блог / Wireshark CTF pcap анализ: от фильтров до флага

14 мин.00

Wireshark CTF pcap анализ: от фильтров до флага

Wireshark CTF pcap анализ: от фильтров до флага

На региональном CTF задание категории network forensics стоило 300 очков и заняло у соседней команды два часа. Дамп на 15 тысяч пакетов, 94% — зашифрованный TLS. Ребята листали пакеты вручную, пытались расшифровать SSL без ключей, ковыряли Hex Dump каждого фрейма. Мы открыли тот же дамп, зашли в Statistics → Protocol Hierarchy, увидели 0.4% HTTP среди шифрованного шума, вбили http contains "flag" — ответ сервера отдал флаг в Set-Cookie заголовке. Четыре минуты от открытия файла до сабмита.

Разница не в таланте. Разница в алгоритме работы с pcap. Этот алгоритм и разберём: от первого открытия дампа до извлечения флага из HTTP, FTP, DNS и даже зашифрованного TLS.

Первые пять минут: разбор pcap файлов в Wireshark

Самая частая ошибка на CTF — открыть pcap и начать читать пакеты сверху вниз. В дампе на 10–20 тысяч пакетов это гарантированная потеря времени. Первые пять минут — разведка: понять, куда копать, а что отсечь как фоновый шум. Подробнее — в нашем руководстве по создание ctf заданий.

Protocol Hierarchy и Conversations

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

На что смотреть:

  • HTTP — даже 0.3% HTTP-трафика среди TLS могут содержать всё нужное. Незашифрованные протоколы — первая цель. В разборе задания EscapeRoom на CyberDefenders именно 0.3% HTTP содержали User-Agent со значением wget, который и выдал инструмент атакующего (разбор на InfoSec Writeups).
  • DNS — высокий процент DNS-пакетов (больше 10–15%) при малом количестве уникальных доменов — звоночек: возможная DNS exfiltration.
  • FTP — credentials и файлы открытым текстом. Если есть в дампе — проверять первым делом.
  • Нестандартные протоколы — telnet, IRC, SMTP, пакеты которые Wireshark показывает как «Data» на нетипичных портах. Вот тут обычно и прячут интересное.

Statistics → Conversations (вкладка TCP, сортировка по bytes) показывает все пары взаимодействующих хостов. «Толстые» сессии с большим объёмом данных — кандидаты на передачу файлов. Множество коротких сессий от одного IP к порту 22 — SSH brute-force. Одна успешная сессия среди десятков неудачных сразу бросается в глаза по объёму ответных данных: в том же EscapeRoom этот приём позволил отличить 52 неудачные SSH-попытки от двух успешных — без просмотра каждой сессии вручную.

Statistics → Endpoints дополняет картину: один внутренний IP, общающийся с десятком внешних — нормально. Один внешний IP, инициирующий сотни соединений — аномалия, стоит копнуть.

Decision tree после разведки:

Что показывает Protocol Hierarchy Что делать
HTTP / FTP / SMTP / Telnet Начинать с незашифрованных протоколов
Только TLS / SSH Искать pre-master secret в файлах задания или переключиться на DNS / ICMP
Необычно много DNS Проверять поддомены на hex / Base64 (DNS exfiltration)
Неизвестные протоколы на нестандартных портах Decode As или Follow TCP Stream для ручного анализа

Фильтры Wireshark для CTF: базовые и продвинутые

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

Display filters Wireshark: примеры для каждого протокола

Фильтры, которые стоит знать наизусть:

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

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

Поиск флагов в pcap через содержимое пакетов

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

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

Отдельная история — frame matches "flag". В отличие от contains, этот фильтр нечувствителен к регистру. В разборе picoCTF PcapPoisoning на brootware.github.io frame matches находил строку FLAG, Flag или flag одним запросом — не надо перебирать варианты вручную.

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

Если формат флага неизвестен — последовательная серия запросов: frame contains "flag", затем frame contains "key", frame contains "secret", frame contains "pass". На CTF начального уровня флаг в открытом виде встречается примерно в половине заданий. Не надо усложнять, пока не проверены простые варианты.

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

Follow TCP Stream Wireshark: читаем сессии целиком

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

В нижней части окна Follow TCP Stream — навигация между потоками: Stream 0, Stream 1, Stream 2 и далее. На CTF с небольшим количеством потоков (до 20–30) стоит прокликать каждый последовательно, переключая номер. Занимает пару минут и часто приводит к флагу быстрее, чем сложные фильтры. Я так делаю почти всегда — тупо перебираю потоки, пока не зацеплю глазом что-то подозрительное.

Типичные находки при Follow TCP Stream на CTF-заданиях:

  • Флаг в открытом тексте — если данные шли по HTTP, Telnet, IRC
  • Base64-строки — заголовок Authorization: Basic с Base64-кодированными credentials. Декодируется через echo "строка" | base64 -d
  • FTP-логины — команды USER / PASS открытым текстом
  • Скрипты и код — в разборе THM Wireshark CTF (cyber-99.co.uk) через Follow Stream обнаружился Python-скрипт с ROT13, Base64 и Caesar-шифрованием. Чтобы получить флаг, пришлось скопировать код, реверсировать функции кодирования (заменить b64encode на b64decode, сдвиг Caesar с +3 на -3) и запустить скрипт
  • HTTP-заголовки — нестандартный User-Agent (wget или curl) указывает на автоматизированную загрузку, что в терминах MITRE ATT&CK моделирует технику Web Protocols (T1071.001, Command and Control)

Форматы вывода в Follow Stream: ASCII (для текстовых протоколов), Hex Dump (для бинарных данных), Raw (для сохранения на диск). Переключаются в выпадающем меню «Show data as». Для сохранения бинарного файла из потока — выбирайте именно Raw и жмите Save As. ASCII повредит бинарные данные — проверено на собственных нервах.

Извлечение файлов из pcap через Export Objects

File → Export Objects → HTTP открывает список всех файлов, переданных по HTTP за время захвата: изображения, скрипты, документы, бинарники. Аналогичные меню доступны для SMB, TFTP и email-вложений (IMF). По сути — автоматическое восстановление переданных файлов из сетевого трафика (File Carving, D3-FC по классификации MITRE D3FEND).

Анализ извлечённых файлов и ручная реконструкция

Сохранили файлы через Export Objects — дальше работа в терминале:

  1. file имя_файла определяет реальный тип по magic bytes, даже если расширение неправильное или отсутствует. На CTF авторы часто намеренно убирают или подменяют расширения — классический трюк.
  2. strings имя_файла | grep -i flag ищет текстовые строки в бинарном файле. Флаг может быть зашит в метаданных изображения, в строках исполняемого файла, в комментариях PDF.
  3. md5sum имя_файла вычисляет хеш. В некоторых CTF-заданиях хеш вредоноса и есть ответ.

В разборе EscapeRoom через Export Objects извлекли три файла: два ELF-бинарника и Bash-скрипт (разбор на InfoSec Writeups). Тип каждого определился через file, а MD5-хеш основного вредоноса стал ответом на один из вопросов задания.

Export Objects работает только для полностью захваченных передач. Если pcap содержит лишь часть сессии (обрезанный захват), файл окажется повреждён. Тогда — Follow TCP Stream → Save As с форматом Raw. Ручная реконструкция не гарантирует результат, но на CTF дампы обычно содержат полные сессии.

Для SMB-передач Wireshark распознаёт файлы автоматически — Export Objects → SMB. С TFTP аналогично. Если Wireshark не распознаёт протокол на нестандартном порту — правый клик на пакете → Decode As → выбор протокола вручную.

Credential hunting: FTP, HTTP Basic и анализ сетевого трафика

FTP передаёт учётные данные без шифрования — вечная мишень для CTF-заданий по сетевому форензику. В терминах MITRE ATT&CK это Credentials In Files (T1552.001, Credential Access) и File Transfer Protocols (T1071.002, Command and Control).

Пошаговый алгоритм анализа FTP в pcap:

  1. Фильтр ftp показывает управляющий канал: команды USER, PASS, RETR (скачивание), STOR (загрузка), LIST (листинг каталога). Пара USER / PASS — потенциальный флаг или его часть.
  2. Отмечаем команды RETR и STOR — они указывают, какие файлы передавались.
  3. Фильтр ftp-data показывает отдельный канал с содержимым файлов.
  4. На любом ftp-data пакете → Follow → TCP Stream → получаем полное содержимое файла. Для бинарных данных — Save As → Raw.

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

HTTP Basic Authentication тоже идёт открытым текстом — Base64 это кодирование, не шифрование. Фильтр http.authbasic покажет все пакеты с Basic-аутентификацией. Строку вида admin:password123 из заголовка Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM= декодируем одной командой:

echo "YWRtaW46cGFzc3dvcmQxMjM=" | base64 -d

SMTP-аутентификация (smtp.auth) работает аналогично. Команды AUTH LOGIN или AUTH PLAIN содержат Base64-кодированные логин и пароль — декодируются тем же способом.

DNS exfiltration: скрытые каналы в сетевом форензике CTF

DNS exfiltration — один из самых частых приёмов на CTF среднего и продвинутого уровня. Суть: данные кодируются и передаются как поддомены в DNS-запросах. Вместо легитимного www.example.com улетает запрос вида 666c61677b746573747d.evil.com, где hex-строка в поддомене — закодированный флаг.

Признаки DNS exfiltration в дампе:

  • Необычно длинные имена запрашиваемых доменов
  • Hex или Base64-строки вместо читаемых поддоменов
  • Множество запросов к одному базовому домену
  • TXT-записи с нетипичным содержимым (TXT используются как обратный канал)

Фильтры Wireshark для обнаружения:

  • dns.qry.name.len > 30 — DNS-запросы с длинными именами
  • dns.qry.type == 16 — запросы TXT-записей
  • dns.qry.name matches "^[a-f0-9]{8,}\\." — hex-строки в поддоменах
  • dns.qry.name contains "evil.com" — фильтр по конкретному домену, если базовый домен уже определён через Conversations

Обнаружили подозрительные DNS-запросы — дальше извлечение и декодирование. Вручную через Wireshark это мучительно: открывать каждый пакет, копировать поддомен, склеивать. Тут tshark экономит десятки минут.

TLS в CTF: дешифрация трафика с pre-master secret

Большая часть современного сетевого трафика зашифрована TLS. Без ключей содержимое этих пакетов — чёрный ящик. Но на CTF ключи иногда дают намеренно — в виде файла pre-master secret log или приватного ключа сервера.

Как использовать pre-master secret в Wireshark:

  1. В файлах задания ищите документ с расширением .log, .pms, .keys или текстовый файл со строками, начинающимися с CLIENT_RANDOM.
  2. В Wireshark: Edit → Preferences → Protocols → TLS (в старых версиях — SSL).
  3. В поле (Pre)-Master-Secret log filename указываете путь к файлу с ключами.
  4. Wireshark автоматически дешифрует все TLS-сессии, для которых есть совпадающие записи.

После дешифрации зашифрованный трафик превращается в обычный HTTP/HTTP2 — дальше стандартные фильтры, Export Objects, Follow Stream. Магия.

В разборе THM Wireshark CTF на cyber-99.co.uk pre-master secret обнаружился в email-сообщении, переданном на порту 25 (SMTP). Строка CLIENT_RANDOM была скопирована в текстовый файл и загружена в настройки TLS. После этого стал доступен HTTPS-трафик на порту 443 — в нём оказался файл с ещё одним артефактом. Без этого шага содержимое оставалось полностью непрозрачным. Вот такая матрёшка: ключ к TLS лежал в SMTP, а сам SMTP шёл открытым текстом.

Decode As: нестандартные порты и протоколы

Иногда протокол работает на нестандартном порту — HTTP на 8080, FTP на 2121, RTP на 1313. Wireshark не распознаёт его автоматически и показывает пакеты как «TCP» или «Data».

Решение: правый клик на пакете → Decode As → выбор нужного протокола из списка. В том же THM Wireshark CTF UDP-поток на порту 1313 после Decode As → RTP превратился в аудиопоток. Его воспроизвели через Telephony → RTP → RTP Streams → Analyze → Play и получили ответ на вопрос задания. Без Decode As этот трафик выглядел как набор бессмысленных UDP-пакетов — а там голос диктовал флаг.

tshark: автоматизация анализа сетевого трафика Wireshark

tshark — консольная версия Wireshark из того же дистрибутива. Те же фильтры, те же парсеры протоколов, но без GUI. На CTF незаменим, когда нужно обработать большой дамп, вытащить конкретные поля из тысяч пакетов или работать с несколькими pcap одновременно.

Команды, которые стоит держать под рукой:

  • Все HTTP-запросы с хостом и URI: tshark -r dump.pcap -Y "http.request" -T fields -e http.host -e http.request.uri
  • Уникальные DNS-запросы: tshark -r dump.pcap -Y "dns.qry.name" -T fields -e dns.qry.name | sort -u
  • Поиск строки во всём дампе с hex-контекстом: tshark -r dump.pcap -Y 'frame contains "flag"' -x
  • FTP credentials: tshark -r dump.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" -T fields -e ftp.request.arg
  • Protocol Hierarchy в CLI: tshark -r dump.pcap -z io,phs -q

Пайплайн декодирования DNS exfiltration

Когда DNS-запросы содержат hex-кодированные данные в поддоменах (например, 48656c6c6f.evil.com), tshark позволяет собрать и декодировать их одной цепочкой:

tshark -r dump.pcap -Y "dns.qry.name contains evil.com" \
  -T fields -e dns.qry.name | \
  sed 's/\.evil\.com//' | \
  tr -d '\n' | \
  xxd -r -p

Пайплайн извлекает имена запрашиваемых доменов, отрезает базовый домен, склеивает hex-фрагменты и декодирует через xxd -r -p. Если данные в Base64 вместо hex — замените последнюю команду на base64 -d.

Работа с несколькими pcap файлами

На CTF с несколькими дампами (как задание SHA2017 Abuse Mail с тремя pcap-файлами, описанное на Хабре) tshark позволяет обработать все разом:

for f in *.pcap; do
  echo "=== $f ==="
  tshark -r "$f" -Y 'frame contains "flag"' \
    -T fields -e frame.number -e data.text
done

Скрипт перебирает все pcap в директории и ищет строку «flag» в каждом. Вывод показывает имя файла, номер пакета и текстовое содержимое. Быстрее, чем открывать каждый файл в GUI и гонять фильтры вручную.

Чек-лист: пошаговый анализ pcap для CTF

Чтобы не терять время на соревновании — маршрут, который работает на большинстве заданий network forensics:

Шаг Действие Фильтр / меню
1 Protocol Hierarchy — оценить протоколы Statistics → Protocol Hierarchy
2 Conversations — найти аномальные сессии Statistics → Conversations (TCP, по bytes)
3 Быстрый поиск флага в открытом виде frame contains "flag" или frame matches "flag"
4 Извлечь все HTTP-файлы File → Export Objects → HTTP
5 Просмотреть TCP-потоки незашифрованных протоколов Follow → TCP Stream (перебор потоков)
6 Проверить FTP credentials ftp — USER / PASS
7 DNS exfiltration — hex/Base64 в поддоменах dns.qry.name.len > 30
8 TLS — искать pre-master secret в задании Edit → Preferences → Protocols → TLS
9 Нестандартные порты Decode As
10 Автоматизация для больших дампов tshark с фильтрами и пайплайнами

На каждом шаге — если нашли флаг, остановиться. Не нужно проходить все десять пунктов, если ответ получен на третьем.

80% заданий network forensics CTF начального и среднего уровня решаются тремя инструментами: frame contains, Follow TCP Stream и Export Objects. Остальные 20% — DNS exfiltration, TLS-дешифрация, Decode As на нестандартных портах. Проблема не в сложности инструментов, а в отсутствии систематического подхода. Когда алгоритм разбора pcap файлов в Wireshark доведён до автоматизма, время решения зависит только от изобретательности автора таска, а не от навыка работы с интерфейсом.

Среди новичков живёт идея, что каждый CTF-челлендж уникален и требует «творческого озарения». На деле паттерны повторяются: флаг в HTTP-заголовке, credentials в FTP, hex-данные в DNS-поддоменах, закодированная строка в Export Objects. После десятка решённых заданий одиннадцатое закрывается за минуты — потому что рука уже сама тянется к Protocol Hierarchy, а не к полосе прокрутки. Тот же принцип работает и в реальном DFIR: сетевой форензик строится не на интуиции, а на методичном прохождении чек-листа. Разница между CTF и продакшн-инцидентом — масштаб дампа и количество ложных срабатываний, но базовый workflow идентичен. Если хочешь не просто writeup прочитать, а пройти всю атаку от первичного доступа до эксфильтрации — на WAPT каждый такой вектор разбирается в лабе с ментором в чате при затыке.

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

Поделиться

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

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

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

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

OSINT с нуля: флаги CTF через username и EXIF

15 мин.

3

OSINT с нуля: флаги CTF через username и EXIF

Три вектора OSINT для CTF — username, email, метаданные фото. Sherlock, exiftool, holehe: конкретные команды, цепочка действий и ловушки организаторов.

14 НОЯБРЬ, 2026

Regex и grep для поиска флагов CTF в дампах

11 мин.

5

Regex и grep для поиска флагов CTF в дампах

Пошаговые grep-команды и regex-паттерны для извлечения CTF-флагов из дампов: PCRE, Base64-декодирование, оптимизация на файлах 2+ ГБ, ripgrep и конвейеры

14 НОЯБРЬ, 2026

GTFOBins повышение привилегий Linux: практика

13 мин.

3

GTFOBins повышение привилегий Linux: практика

Пошаговый чейн повышения привилегий через GTFOBins: sudo -l, SUID, capabilities. Готовые one-liner'ы для 9 бинарников, связка с LinPEAS, обход ограничений sudo.

13 НОЯБРЬ, 2026