
Последние два года я собираю pcap-задания для CTF и на каждом разборе наблюдаю одну картину: участники открывают файл и листают пакеты сверху вниз. На дампе в 50 тысяч пакетов это занимает полчаса и даёт ноль результата. А ведь Statistics → Protocol Hierarchy за десять секунд покажет, что 90% трафика — TLS, а флаг спрятан в оставшихся двух-трёх процентах открытого HTTP или DNS. Вся разница между нулём баллов и решённым таском — в порядке действий. Ниже — пошаговый алгоритм анализа pcap-файла в Wireshark, который работает на PicoCTF, CyberDefenders, HackTheBox и любой другой площадке.
Прежде чем разбирать pcap — убедитесь, что рабочее место собрано.
Минимальный набор:
sudo apt install wireshark.file определяет тип извлечённого файла по magic bytes (даже если расширение врёт), strings вытаскивает текстовые строки из бинарей, grep фильтрует результат.Опционально:
RAM: для файлов до 100 МБ хватит 4 ГБ. Для дампов 500 МБ+ нужно 8–16 ГБ — Wireshark грузит pcap целиком в память. На машине с 4 ГБ переходите на tshark, он работает в потоковом режиме.
Открыли файл — не трогайте список пакетов. Первые пять минут отдайте разведке. Цель: понять, какие протоколы использовались, кто с кем общался и где искать аномалии.
Меню Statistics → Protocol Hierarchy показывает процентное распределение протоколов по количеству пакетов и объёму данных. Это первое, что нужно открыть — оно определяет, куда тратить время, а что отнести к фоновому шуму.
На что смотреть:
Decode As.Statistics → Conversations (вкладка TCP, сортировка по bytes) показывает все пары взаимодействующих хостов. Второй шаг разведки.
Что искать:
Statistics → Endpoints дополняет картину: по объёму трафика сразу выделяется «центральный» хост, вокруг которого строится сценарий задания.
Ещё полезная штука: Statistics → I/O Graphs визуализирует интенсивность трафика на временной шкале. Всплеск активности в конкретный момент — часто точка начала атаки или передачи данных. На CTF это помогает сузить временное окно для ручного анализа.
Ограничение: Protocol Hierarchy и Conversations показывают только статистику, не содержимое пакетов. Это инструмент для ответа «куда копать», а не для поиска флага напрямую. После разведки — переходим к фильтрации.
Display-фильтры — основной инструмент навигации по дампу при анализе сетевого трафика CTF. Без них разбор pcap с тысячами пакетов превращается в лотерею. Фильтры вводятся в строку в верхней части окна и применяются по 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-трафик от конкретного хоста. Комбинация tcp.flags.syn == 1 && tcp.flags.ack == 0 отфильтрует только инициирующие SYN-пакеты — удобно, чтобы увидеть все попытки установления соединений и быстро найти интересный поток. В разборе see-through.pcapng четвёртый SYN-пакет привёл к потоку с флагом.
Когда формат флага известен (например, CTF{...} или flag{...}), поиск по содержимому — самый быстрый путь:
frame contains "flag" — ищет строку во всём фрейме, включая payload и заголовкиhttp contains "CTF{" — ищет только в HTTP-пакетахtcp contains "password" — пароли в TCP-потокеdns.qry.name contains "suspicious" — подстрока в DNS-запросахДля регулярных выражений — оператор matches: фильтр http.request.uri matches ".*\\.php" покажет все запросы к PHP-скриптам, а dns.qry.name matches "^[a-f0-9]{10,}\\." выявит DNS-запросы с длинными hex-строками в поддоменах — типичный признак DNS exfiltration.
Если формат флага неизвестен — перебирайте: frame contains "flag", затем frame contains "key", frame contains "secret", frame contains "pass". На CTF начального уровня флаг в открытом виде — примерно в половине заданий.
Ограничение: фильтры по содержимому работают только с незашифрованным трафиком. Если HTTP обёрнут в TLS, frame contains покажет нечитаемый мусор. Нужен ключ дешифрации — об этом ниже.
Follow TCP Stream — штука, без которой на CTF делать нечего. Она собирает все пакеты одной TCP-сессии в единый читаемый поток: красный текст — данные от клиента, синий — от сервера.
Правый клик на любом пакете интересующей сессии → Follow → TCP Stream. Внизу окна кнопки навигации: Stream 0, Stream 1, Stream 2 и далее. На CTF начального-среднего уровня потоков обычно немного — стоит просмотреть каждый.
Типичные находки в TCP Stream:
USER и PASS лежат в plain text. В терминах MITRE ATT&CK — Network Sniffing (T1040, Credential Access): перехват учётных данных из незашифрованного трафика. По оценке IBM X-Force (2025), ежедневно в дарквебе появляется свыше 6 000 новых учётных записей — и сниффинг незашифрованных протоколов вроде FTP тут один из источников.Про UDP — момент, который новички стабильно пропускают. Follow → UDP Stream — обязательный шаг. Авторы CTF этим пользуются: флаг или аудиоданные передаются по UDP на нестандартных портах. В разборе THM Wireshark CTF RTP-аудиопоток был замаскирован под неизвестный UDP-протокол на порту 1313. Решение: правый клик на пакете → Decode As → выбор протокола RTP — после чего Telephony → RTP → RTP Streams позволил проиграть аудио и услышать флаг.
Decode As вообще стоит держать в голове как спасательный круг: если Wireshark не распознаёт протокол на нестандартном порту — попробуйте принудительно назначить HTTP, FTP, RTP или другой ожидаемый протокол. Без этого приёма часть данных останется невидимой.
Увидели в потоке строку вроде Q1RGe3cxcjNzaDRya30=? Base64. Копируете в CyberChef, рецепт From Base64 — результат: CTF{w1r3sh4rk}.
Основные кодировки на CTF:
| Кодировка | Признаки | Пример |
|---|---|---|
| Base64 | Символы A-Z, a-z, 0-9, +, /, завершается = или == |
Q1RGe30= → CTF{} |
| Hex | Символы 0-9, a-f, пары через пробел или без |
43 54 46 7b → CTF{ |
| ROT13 | Визуально — обычный текст, но нечитаемый | PGS{synt} → CTF{flag} |
| URL-encoding | Символы %XX |
%43%54%46 → CTF |
Авторы CTF любят комбинировать кодировки: Base64 поверх ROT13 поверх Caesar с шифтом 3. CyberChef решает это элегантно — перетащите операции последовательно в цепочку рецептов, результат обновится автоматически.
Пример из THM Wireshark CTF. В первом задании Follow TCP Stream показывает Python-скрипт с тройной кодировкой (ROT13, Base64, Caesar cipher с шифтом 3). Переменная cnt в коде установлена в ? — замените на 50. Чтобы получить флаг, нужно реверсировать функции кодирования: b64encode заменить на b64decode, в Caesar-функции поменять шифт с 3 на -3, ROT13 оставить как есть (он симметричен). Без понимания порядка операций задание выглядит нерешаемым — с CyberChef и пониманием структуры скрипта решается за пять минут.
Один из самых частых CTF-сценариев: флаг спрятан внутри изображения, PDF, архива или исполняемого файла, переданного по сети. По ATT&CK это пересечение Data from Local System (T1005) и Exfiltration Over C2 Channel (T1041) — атакующий собрал данные и передал по сети, а нам нужно их восстановить.
Путь File → Export Objects → HTTP открывает список всех файлов, переданных по HTTP: изображения, скрипты, документы, бинарники. Аналогичные меню доступны для SMB, TFTP и email-вложений (IMF).
Алгоритм после извлечения:
file <filename>. Команда читает magic bytes — даже если расширение неправильное или отсутствует, реальный тип будет определён. В разборе EscapeRoom через Export Objects → HTTP были извлечены три файла — два ELF-бинарника и shell-скрипт, опознанных именно по magic bytes.strings <filename> | grep -i flag. Часто флаг валяется внутри бинарного файла как обычная строка.exiftool и стеганографию через steghide (для JPEG) или zsteg (для PNG). Пароль для стеганографии может быть найден в другом потоке того же pcap.Когда Export Objects не работает. Если файл передан по нестандартному протоколу или фрагментирован нетипично — используйте Follow TCP Stream, переключите отображение на Raw, сохраните поток в файл и обрежьте заголовки протокола вручную. Метод грубый, но на CTF иногда единственный рабочий.
DNS exfiltration — техника, при которой данные кодируются в поддоменах DNS-запросов. Вместо обычного google.com запрос выглядит как 4354467b646e735f.evil.com, где hex-строка в поддомене — закодированный payload. По MITRE ATT&CK это DNS C2-канал (T1071.004) с эксфильтрацией через него (T1041), либо — если DNS используется как отдельный канал вывода — Exfiltration Over Alternative Protocol (T1048). Авторы CTF эксплуатируют этот вектор постоянно: DNS-трафик редко блокируется и почти никогда не шифруется в учебных сценариях.
Признаки DNS exfiltration в pcap:
Фильтры для обнаружения:
dns.qry.name matches "^[a-f0-9]{10,}\\." — DNS-запросы с длинными hex-строками в поддоменахdns.qry.type == 16 — только TXT-записиdns.flags.response == 0 — только запросы, без ответовПосле обнаружения подозрительных DNS-запросов нужно извлечь поддомены и склеить. Тут tshark эффективнее GUI:
tshark -r evidence.pcap -Y "dns.qry.name contains evil.com" \
-T fields -e frame.number -e dns.qry.name | \
sort -n | cut -f2 | awk -F. '{print $1}' | tr -d '\n'
# NB: sort -n по frame.number обязателен — без него порядок фрагментов
# может нарушиться из-за ретрансляций. Работает, только если payload
# помещается в первую метку поддомена.
# Для многометочных схем: awk -F. '{for(i=1;i<NF-1;i++) printf $i}'
Команда извлекает все DNS-запросы к домену, вырезает первый поддомен из каждого и склеивает результат. Полученную строку — в CyberChef: From Hex или From Base64 в зависимости от кодировки.
Предусловия: техника обнаружения работает, только если DNS-трафик не зашифрован (нет DoH/DoT). На CTF — почти всегда так. В реальных инцидентах DNS over HTTPS сделает этот подход бесполезным — потребуется перехват на уровне DNS-резолвера.
Если 90% трафика — TLS, а флаг передан по HTTPS — без ключа дешифрации не обойтись. На CTF авторы иногда дают ключ отдельным файлом.
Два формата ключей:
CLIENT_RANDOM <hex> <hex>. Подключается через Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename. Работает с любым типом key exchange.Edit → Preferences → Protocols → TLS → RSA keys list. Работает только с RSA key exchange — не с ECDHE. Это важный момент.После загрузки ключа Wireshark расшифровывает TLS-сессии автоматически. В Protocol Hierarchy появляются HTTP/2 или HTTP/1.1 внутри бывшего TLS — дальше стандартный разбор через фильтры и Follow Stream.
Где искать ключ в задании:
.key или .log в архиве с pcapОграничение: если использовался Ephemeral Diffie-Hellman (DHE/ECDHE) без pre-master secret log — серверный RSA-ключ бесполезен. Perfect Forward Secrecy делает ретроспективную расшифровку невозможной без логов сессии. На CTF это редкость, но в реальной сетевой криминалистике — стандартная головная боль.
GUI Wireshark удобен для ручного разбора, но на больших дампах и при серийном решении задач tshark экономит десятки минут. Набор команд ниже покрывает 90% типовых сценариев network forensics CTF:
# HTTP-запросы с хостом и URI
tshark -r file.pcap -Y http.request -T fields -e http.host -e http.request.uri
# DNS-запросы (уникальные имена)
tshark -r file.pcap -Y dns.qry.name -T fields -e dns.qry.name | sort -u
# Поиск строки во всём дампе
tshark -r file.pcap -Y 'frame contains "flag"' -V
# FTP credentials
tshark -r file.pcap -Y "ftp.request.command==USER || ftp.request.command==PASS" \
-T fields -e ftp.request.arg
# Статистика протоколов (аналог Protocol Hierarchy)
tshark -r file.pcap -q -z io,phs
Каждая из этих команд заменяет несколько кликов в GUI и легко вставляется в bash-скрипт для пакетной обработки.
Когда tshark незаменим:
Универсальный порядок действий, который покрывает абсолютное большинство заданий по поиску флага в pcap:
frame contains "flag", frame contains "CTF{", frame contains "key". На простых заданиях этого хватает.http, dns, ftp, smtp — проверить каждый незашифрованный протокол.file + strings | grep -i flag.Если после всех десяти шагов флаг не найден — возвращайтесь к Protocol Hierarchy и ищите протоколы, которые пропустили. На сложных CTF авторы используют Obfuscated Files or Information (T1027, Defense Evasion) и прячут данные в нестандартных местах: ICMP payload, TCP options, HTTP-заголовки с кастомными именами (X-Secret-Data), Cookie с Base64-значением. Отдельное внимание — пакетам с аномальным размером: если средний DNS-ответ 100 байт, а один — 1500, его стоит вскрыть первым.
Из опыта составления задач: половина участников застревает не на декодировании, а на этапе «куда смотреть». Protocol Hierarchy и Conversations — не просто полезные фичи Wireshark. Это разница между решённым заданием и пустым сабмитом. На отборочных я видел, как команды тратили 40 минут на прокрутку пакетов вручную, хотя три клика в меню Statistics показали бы, что весь интересный трафик сосредоточен в дюжине HTTP-пакетов.
Вторая типичная проблема — игнорирование UDP. На каждом третьем CTF, где я участвовал или готовил задания, флаг или его часть лежит в UDP-payload. Участники проверяют TCP, смотрят HTTP, разбирают DNS — и забывают, что Follow UDP Stream существует. Для RTP-потоков, замаскированных под «неизвестный протокол», без Decode As их вообще не увидеть.
Третий момент — tshark. GUI создаёт ложное чувство контроля: вот пакетики, вот фильтр, вот результат. На реальных соревнованиях, где дампы по 300–500 МБ и на решение отводится час, консольный tshark с правильными однострочниками работает в разы быстрее. Отработайте команды из этой статьи до автоматизма — на следующем CTF скажете спасибо. Если хочешь не просто читать writeup, а отрабатывать такие цепочки от pcap до эксплуатации — на WAPT эти техники разбирают в модулях с лабами.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «forensics».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...