Главная / Блог / Wireshark для CTF: от pcap-файла до извлечения флага

16 мин.00

Wireshark для CTF: от pcap-файла до извлечения флага

Wireshark для CTF: от pcap-файла до извлечения флага

Wireshark для CTF: от pcap-файла до извлечения флага

На CyberDefenders-челлендже EscapeRoom один участник с форума описал классическую ситуацию: 40 минут прокрутки тысяч пакетов колесом мыши — ноль результата. Потом он открыл Statistics → Protocol Hierarchy, увидел, что 91% трафика — TLS, а незашифрованный HTTP составляет жалкие 0.3%, — и флаг нашёлся за три минуты в заголовке User-Agent wget-запроса. Вся разница между часом бесполезного скроллинга и решением за пять минут — не талант, а понимание, куда смотреть первым делом. Этот гайд — пошаговый алгоритм анализа pcap-файлов в Wireshark, который одинаково работает на picoCTF, CyberDefenders, HackTheBox и любой другой площадке с forensics-заданиями.

Требования к окружению

Перед первым pcap убедитесь, что рабочее место не подведёт:

  • ОС: Linux (Kali, Ubuntu 22.04+), Windows 10/11, macOS — Wireshark работает на всех трёх
  • Wireshark: версия 4.0+ (в Kali предустановлен; на остальных — wireshark.org)
  • tshark: ставится вместе с Wireshark, проверка — tshark --version
  • CyberChef: браузерная утилита, ничего ставить не надо — gchq.github.io/CyberChef
  • RAM: 4 ГБ минимум для типичных CTF-дампов (до 50 МБ); для дампов свыше 200 МБ — 8 ГБ
  • Диск: 500 МБ свободных для экспорта объектов и временных файлов

Дополнительно: NetworkMiner (netresec.com) для автоматического извлечения файлов и credentials — полезен как second opinion, но на loopback-трафике и нестандартных форматах часто бесполезен. Основная связка — Wireshark и tshark.

Место анализа pcap в forensic-цепочке

Прежде чем нырять в пакеты, стоит понимать, что вы ищете и зачем. В CTF-задании pcap-файл моделирует реальный инцидент: кто-то записал сетевой трафик, и в нём остались следы действий атакующего. Эти следы напрямую маппятся на конкретные техники MITRE ATT&CK:

Что ищем в pcap Техника ATT&CK Тактика
HTTP-запросы к C2-серверу Web Protocols (T1071.001) Command and Control
Подозрительные DNS-запросы с hex в поддоменах DNS (T1071.004) Command and Control
Base64/hex-кодированные строки в payload Standard Encoding (T1132.001) Command and Control
XOR или кастомное кодирование Non-Standard Encoding (T1132.002) Command and Control
Передача файлов наружу Exfiltration Over C2 Channel (T1041) Exfiltration
Учётные данные в открытом виде Network Sniffing (T1040) Credential Access

Зачем эта таблица: описание задания на CTF почти всегда содержит подсказку. «Утечка данных» — ищите DNS exfiltration или HTTP POST с файлами. «Скомпрометированные учётные данные» — проверяйте FTP и SMTP. «Скрытая передача» — копайте ICMP и DNS TXT-записи. Не тратьте время на слепой перебор: формулировка задания указывает на тактику, тактика — на протокол.

Разведка по дампу: первые пять минут

Открыли pcap — не начинайте читать пакеты сверху вниз. Это ловушка, в которую попадает каждый новичок. Первые пять минут — разведка: определить, куда копать, а что сразу отбросить как шум.

Protocol Hierarchy: карта протоколов в трафике

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

На что обращать внимание:

  • Незашифрованные протоколы среди массы TLS. Если 90% трафика — TLS, а HTTP занимает 0.3%, именно эти 0.3% содержат что-то интересное. Автор задания не станет прятать флаг в зашифрованном потоке, если не даёт ключ дешифрации отдельным файлом.
  • Нестандартные протоколы. Видите в иерархии IRC, Telnet, TFTP или нестандартный UDP — это почти гарантированная точка входа.
  • DNS непропорционально много. Если DNS занимает 10-15% пакетов при минимуме HTTP — вероятен сценарий DNS exfiltration (T1071.004, Command and Control).
  • ICMP с большим payload. Стандартный ping несёт 32 байта payload (Windows) или 56 байт (Linux/Unix), что даёт IP-пакеты ~60 и ~84 байта с заголовками. Если ICMP-пакеты тащат 500+ байт payload — данные прячут в ICMP (covert channel).

Protocol Hierarchy показывает только статистику, не содержимое. Это инструмент для решения «куда копать», а не для поиска флага напрямую.

Conversations и Endpoints: кто с кем общается

Statistics → Conversations → вкладка TCP, сортировка по объёму переданных байт. Мгновенно выделяются «толстые» сессии — в них передавались файлы или шло активное взаимодействие с C2.

Что искать:

  • Один внутренний IP общается с десятком внешних — нормально. Один внешний IP инициирует сотни соединений к внутренним — аномалия (сканирование или brute-force).
  • Соединения на нестандартных портах. TCP на порту 4444, 8080, 1337 — классика для reverse shell и C2 в CTF-заданиях. Фильтруйте: tcp.port == 4444.
  • Множество коротких сессий от одного IP. 50 TCP-соединений с малым объёмом данных — неудачные попытки аутентификации. 2-3 сессии с большим объёмом после серии коротких — успешный brute-force с последующей эксплуатацией.

Statistics → Endpoints дополняет картину: все уникальные IP-адреса и объём трафика для каждого. Редкие обращения к специфическим внешним IP по незащищённым протоколам — кандидаты номер один для детального изучения.

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

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

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

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

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

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

Как найти флаг в pcap: поиск по содержимому

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

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

Для регулярных выражений — оператор matches. Фильтр frame matches "CTF\\{.*\\}" найдёт любую строку, подходящую под формат флага, даже если точное содержимое неизвестно. А dns.qry.name matches "^[a-f0-9]+\\." выявит DNS-запросы с hex-строками в поддоменах — типичный признак DNS exfiltration.

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

Тут есть нюанс: contains и matches работают только с незашифрованным payload. Если трафик обёрнут в TLS и ключей дешифрации нет — фильтры по содержимому покажут мусор. Об этом — ниже.

Follow TCP Stream: разбор протоколов в Wireshark

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

Как использовать: правый клик на любом пакете интересующей сессии → Follow → TCP Stream. Внизу окна — навигация: Stream 0, Stream 1, Stream 2 и далее. На CTF начального уровня потоков обычно немного — стоит просмотреть каждый.

Типичные находки в TCP Stream:

  • FTP-сессии: команды USER и PASS лежат открытым текстом. Буквально две строки — логин и пароль. Фильтр ftp покажет всю FTP-сессию, ftp.request.command == "PASS" — только строку с паролем.
  • HTTP POST: данные форм (логин/пароль), загрузка файлов, cookies. Фильтр http.request.method == "POST" выделит только эти запросы.
  • SMTP: email-сообщения с вложениями. Тело письма видно в потоке целиком, включая Base64-кодированные attachment'ы.
  • Telnet/IRC/собственные протоколы: любой plaintext-протокол читается в Follow TCP Stream как обычный текст.

Когда в потоке встречается строка вроде Q1RGe3cxcjNzaDRya30= — это Base64. Признаки: символы A-Za-z0-9+/, длина кратна 4, часто заканчивается на = или ==. Копируйте в CyberChef, рецепт From Base64 — готово. Hex-строка 43 54 46 7b декодируется в CTF{. URL-кодированная строка CTF%7Bfl4g%7D декодируется в CTF{fl4g} — обычно кодируются только спецсимволы ({, }, пробелы), а буквы остаются как есть. Полное кодирование каждого байта (%43%54%46%7B) встречается редко (double encoding или специфичные инструменты). Распознавание кодировки занимает две секунды, если знаешь паттерны.

Follow TCP Stream показывает данные только для незашифрованных сессий. TLS-потоки — нечитаемый бинарный мусор без загруженного ключа дешифрации.

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

Один из самых частых CTF-сценариев: флаг спрятан внутри изображения, PDF, архива или ELF-бинарника, переданного по сети. Файл нужно вытащить из дампа и анализировать отдельно.

Export Objects: автоматическое извлечение

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

После сохранения файла определите его реальный тип командой file <имя_файла> в терминале. Она читает magic bytes: даже если расширение неправильное или отсутствует, file покажет реальный формат. Затем strings <имя_файла> | grep -i flag ищет текстовые строки внутри бинарных файлов — флаг или его часть часто валяются именно там.

Для изображений проверьте EXIF-метаданные (exiftool <файл>) и попробуйте стеганографические инструменты (steghide, zsteg для PNG). Это уже территория стеганографии, но на CTF категории Forensics задания часто пересекаются.

Ручное извлечение и Decode As

Когда автоматическое извлечение не работает — файл передавался по нестандартному протоколу или Wireshark не распознал формат. Решение: Follow TCP Stream → в выпадающем списке выбрать нужное направление (например, server→client для скачиваемого файла) → Show data as Raw → Save As. Вы получаете сырые байты потока, но перед magic bytes файла обычно идут протокольные заголовки (например, HTTP response headers перед PNG magic 89 50 4E 47) — их нужно обрезать hex-редактором или dd до начала magic bytes.

Отдельный случай: Wireshark не распознаёт протокол. На одном из заданий TryHackMe Wireshark CTF RTP-аудиопоток был замаскирован под неизвестный UDP. Решение: правый клик на пакете → Decode As → выбор RTP. После этого Wireshark распознал аудио и позволил его воспроизвести через Telephony → RTP → RTP Streams. Знаешь про Decode As — задача на минуту. Не знаешь — можно провозиться полчаса.

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

Как найти флаг в DNS-запросах: DNS exfiltration

DNS exfiltration — техника, при которой данные передаются через DNS-запросы, обычно закодированные в поддоменах (T1071.004, Command and Control). На CTF это один из самых коварных сценариев: трафик выглядит как обычные DNS-резолвы, но поддомены содержат hex или Base64-кодированные данные.

Признаки DNS exfiltration в pcap:

  • Длинные поддомены из hex-символов: 6374667b.646e735f.6578666.example.com
  • TXT-записи с нетипичным содержимым (обычно используются для SPF/DKIM, но атакующий прячет в них payload)
  • Один хост шлёт непропорционально много DNS-запросов к одному домену
  • Фильтр dns.qry.name matches "^[a-f0-9]+\\." выделяет подозрительные запросы (в CTF-дампах работает хорошо, но в реальном трафике даёт false positives на CDN и cache-busting поддомены — тогда комбинируйте с частотным анализом по apex-домену)

Для извлечения данных из DNS-запросов tshark работает эффективнее GUI:

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

Логика: tshark фильтрует DNS-запросы к домену exfiltration-сервера и выводит номер фрейма для сортировки, sort -n -k1 | cut -f2 гарантирует правильный порядок пакетов, sed удаляет apex-домен (точки экранированы для literal match), tr убирает точки-разделители и переносы строк, xxd -r -p декодирует из hex. Если на выходе мусор — проверьте чётность длины hex-строки перед подачей в xxd.

Если данные закодированы в Base64 вместо hex, замените xxd -r -p на base64 -d. Определить кодировку можно по набору символов: только 0-9a-f — hex; A-Za-z0-9+/= — Base64.

Но DNS exfiltration может использовать и кастомное кодирование (T1132.002, Non-Standard Encoding) — XOR, побайтовый сдвиг, собственный алфавит. Тогда автоматическое декодирование не прокатит: придётся анализировать паттерн и подбирать ключ вручную или через CyberChef.

tshark: командная строка для автоматизации анализа pcap

tshark — консольная версия Wireshark из того же дистрибутива. Преимущества: скорость на больших файлах, возможность скриптования, встраивание в пайплайны с grep/awk/sed. На CTF tshark незаменим для трёх вещей: массовое извлечение полей, поиск паттернов и автоматизация рутины.

Ключевые команды:

  • Все 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.flags.response == 0" -T fields -e dns.qry.name
  • Поиск строки во всём дампе: tshark -r dump.pcap -Y 'frame contains "flag"'
  • FTP credentials: tshark -r dump.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" -T fields -e ftp.request.arg
  • Статистика протоколов (аналог Protocol Hierarchy): tshark -r dump.pcap -q -z io,phs

Автоматизированный поиск флага по нескольким паттернам сразу:

for pattern in "flag" "CTF{" "key{" "secret" "password"; do
  echo "=== Searching: $pattern ==="
  tshark -r dump.pcap -Y "frame contains \"$pattern\"" \
    -T fields -e frame.number -e ip.src -e ip.dst 2>/dev/null
done

Скрипт перебирает типичные маркеры флага и для каждого совпадения выводит номер фрейма, IP источника и назначения. Дальше — открыть нужный фрейм в Wireshark GUI для детального изучения. Работает быстрее ручного перебора фильтров, особенно на больших дампах.

Нюанс: tshark жрёт столько же RAM, сколько и Wireshark GUI при полном разборе дампа. Чудес не бывает.

Декодирование данных: Base64, Hex, XOR через CyberChef

Найти закодированные данные — полдела. Вторая половина — декодировать. На CTF данные кодируются для обфускации (T1132.001, Standard Encoding), и CyberChef — основной инструмент для работы с ними.

Как распознать кодировку по внешнему виду:

Кодировка Признаки Пример
Base64 Символы A-Za-z0-9+/, padding = Q1RGe2ZsYWd9
Hex Только 0-9a-f, пары символов 4354467b666c61677d
URL-encoding Символы %XX %43%54%46%7B
ROT13 Латиница, но слова не читаются PGS{synt}
XOR Бинарный мусор с повторяющимся паттерном Требует ключа

CyberChef позволяет собрать цепочку рецептов: перетащите From Base64, затем ROT13, затем другие операции — результат обновляется на лету. Для многослойной обфускации (Base64 → XOR → Hex) это на порядок быстрее, чем разматывать каждый слой вручную.

Для XOR без известного ключа в CyberChef есть рецепт XOR Brute Force — перебирает однобайтовые ключи и показывает результат для каждого. Увидели в выводе читаемый текст или формат флага — ключ найден. Для многобайтовых ключей — рецепт XOR с ключом в виде hex-строки.

Типичная цепочка на CTF: из TCP Stream вытащили строку → определили кодировку визуально → применили рецепт в CyberChef → получили флаг. Меньше минуты, если навык распознавания кодировок отработан.

Ограничения Wireshark: когда инструмент не поможет

Ни один инструмент не покрывает 100% сценариев. Знание ограничений экономит время — вместо того чтобы биться головой об стену, переключаешься на другой подход.

TLS без ключей дешифрации. Если трафик зашифрован и задание не даёт pre-master secret log или серверный приватный ключ — содержимое TLS-сессий недоступно. Ключ подключается через Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename. Формат файла: строки CLIENT_RANDOM <hex> <hex>. Иногда ключ лежит отдельным файлом в архиве задания — проверяйте всё, не только pcap.

Кастомные бинарные протоколы. Если атакующий использует собственный протокол поверх TCP/UDP, Wireshark не разберёт его автоматически. В Follow TCP Stream увидите сырые байты — дальше анализ вручную или через скрипт.

Фрагментация и TCP reassembly. Иногда Wireshark некорректно собирает фрагментированные TCP-потоки. Если Follow TCP Stream показывает обрывочные данные — попробуйте Analyze → Reload as File Format/Capture и проверьте Edit → Preferences → Protocols → TCP → Reassemble TCP segments.

Объём дампа. Файлы свыше 500 МБ загружаются медленно и съедают 2-4 ГБ RAM. Для таких дампов предварительная фильтрация через tshark обязательна.

Чеклист: алгоритм анализа pcap для CTF

Алгоритм, который закрывает 90% forensics-заданий с pcap:

  1. Прочитать условие задания. Определить, какая тактика ATT&CK подразумевается: exfiltration, credential theft, C2, file transfer.
  2. Открыть pcap в Wireshark. Statistics → Protocol Hierarchy. Определить соотношение зашифрованного и открытого трафика. Записать нестандартные протоколы.
  3. Statistics → Conversations → TCP. Отсортировать по объёму. Выделить аномальные сессии: нестандартные порты, большой объём, множество коротких соединений от одного IP.
  4. Применить frame contains "flag" (или формат флага из условия). Нашлось — открыть фрейм, вытащить флаг. Задание решено.
  5. Если шаг 4 не сработал — фильтровать по незашифрованным протоколам: http, ftp, dns, smtp, telnet. Просмотреть каждый.
  6. Follow TCP Stream для подозрительных сессий. Искать credentials, закодированные строки, переданные файлы.
  7. File → Export Objects → HTTP/SMB/TFTP. Извлечь файлы. Проверить file <filename> и strings <filename> | grep -i flag.
  8. Проверить DNS на exfiltration: dns.qry.name matches "^[a-f0-9]+\\.". Если есть — извлечь через tshark и декодировать.
  9. Проверить ICMP: icmp && frame.len > 100. Если размер кадра значительно превышает типичный ping (98 байт Ethernet-кадра = 14 Ethernet + 20 IP + 8 ICMP + 56 байт payload для Linux; 74 байта для Windows с 32 байтами payload) — данные могут быть в ICMP data. Фильтр data.len может не сработать в зависимости от версии Wireshark и dissector'а.
  10. Если есть TLS и в задании есть дополнительные файлы — проверить наличие ключа дешифрации. Загрузить через Preferences → TLS.
  11. Все найденные закодированные строки — в CyberChef. Попробовать Base64, Hex, ROT13, XOR Brute Force.

Чеклист работает последовательно: каждый шаг отсекает класс задач. Дошли до шага 11 и флаг не найден — перечитайте условие задания: возможно, ответ не флаг в привычном формате, а конкретное значение (IP-адрес, имя файла, User-Agent, timestamp).

На CTF-площадках категории Forensics/Network часто приходится комбинировать Wireshark с другими инструментами. Сетевой анализ — только первый шаг. Извлечённый из pcap файл может потребовать реверс-инженерии, стеганографического анализа или криптографического взлома. Wireshark для CTF — точка входа в цепочку, не финальный инструмент.

По опыту: большинство CTF-заданий начального и среднего уровня с pcap решаются за шаги 1-7. DNS exfiltration и ICMP covert channels — уровень medium-hard. TLS-дешифрация с предоставленными ключами — стандартный hard. Кастомные протоколы и многослойная обфускация — верхний уровень, где Wireshark — лишь один инструмент в арсенале.

Главная проблема новичков — не сложность задач, а отсутствие системы. Человек открывает pcap с тысячей пакетов и начинает скроллить сверху вниз, читая каждый фрейм. Через полчаса — усталость, фрустрация и ноль результата. А задача решалась одним фильтром frame contains "flag" за десять секунд. Чеклист выше — это и есть система: держите его на бумажке рядом с монитором, и скорость решения forensics-заданий вырастет в разы.

Вторая типичная ошибка — игнорирование tshark. GUI Wireshark удобен для визуального анализа одной-двух сессий, но для системного прочёсывания дампа с сотнями потоков консольный tshark с пайплайнами grep/awk объективно быстрее. Привычка писать однострочники в терминале экономит часы на соревнованиях, где время — ключевой ресурс.

И третий момент, который редко обсуждают: CyberChef. Многие новички пытаются декодировать Base64 и hex в голове или через онлайн-конвертеры по одному слою за раз. CyberChef с цепочкой рецептов разматывает многослойную обфускацию за одно перетаскивание блоков. Если вы ещё не добавили его в закладки — сделайте это до следующего CTF. Связка Wireshark + tshark + CyberChef покрывает подавляющее большинство задач forensics-категории, и освоить её можно за один вечер с любым учебным pcap-файлом. А если хочется не просто читать, а пройти базу ИБ системно — от сетевого анализа до основ пентеста — на codeby.school есть трек IB Basics, который выстраивает эти навыки последовательно, без прыжков через пропасти в знаниях.

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

Поделиться

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

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

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