
В учебном PCAP для network forensics CTF — 1.77 МБ трафика, из которого 93% составляет зашифрованный TLS. На разбор этого дампа одна команда потратила 40 минут, соседняя — уложилась в 9. Разница не в знании Wireshark, а в алгоритме: статистика → фильтрация → реконструкция потока → извлечение артефакта → декодирование. Я видел, как люди с отличным пониманием TCP/IP бесцельно скроллят пакеты, пока кто-то рядом за минуту вытаскивает флаг одним фильтром. Ниже — пошаговый разбор трёх протоколов, в которых чаще всего прячут флаги на forensics CTF: HTTP, FTP и DNS, с конкретными фильтрами, командами tshark и готовым чеклистом.
Открыв PCAP в Wireshark, не скроллите список пакетов. Первые действия — сбор статистики, и именно они задают направление анализа.
Protocol Hierarchy (Statistics → Protocol Hierarchy) показывает распределение протоколов по объёму и количеству пакетов. В типичном CTF-дампе 90%+ приходится на TLS/HTTPS — это шум. Ценность в том, что НЕ зашифровано: HTTP, FTP, DNS, SMTP, Telnet. В одном forensics-задании Protocol Hierarchy показала 88.4% TCP, внутри которого 91.1% байт — TLS, и всего 0.3% HTTP. Именно в этих 0.3% лежали критичные артефакты. Незашифрованный протокол посреди массы зашифрованного — первая точка входа.
Conversations (Statistics → Conversations, вкладка TCP) — таблица всех сессий между парами IP-адресов с объёмом переданных данных. Сортируйте по колонке Bytes: аномально большие сессии могут содержать файлы, аномально малые — управляющие команды. Одиночное соединение на нестандартный порт (4444, 1337, 8080) среди десятков подключений к 443 — красный флаг. В том же дампе центральной фигурой оказался хост 10.0.2.15, инициировавший соединения с внешними адресами, среди которых выделялась HTTP-сессия на порт 80 при доминирующем HTTPS.
Endpoints (Statistics → Endpoints) выводит список уникальных адресов. В CTF-дампе обычно 3–5 хостов: жертва, атакующий, DNS-резолвер, иногда C2-сервер. Если адресов больше 20 — задание содержит шумовой трафик для маскировки, и без нормальной фильтрации вы утонете.
I/O Graphs (Statistics → I/O Graphs) визуализирует интенсивность трафика на временной шкале. Всплеск активности на конкретном отрезке указывает на момент атаки или передачи данных. Сужайте диапазон фильтром вроде frame.time_relative >= 30 && frame.time_relative <= 45, чтобы изолировать интересующий период.
Формат файла. Wireshark работает с .pcap и .pcapng. Второй поддерживает комментарии и расширенные метаданные — иногда задачники прячут подсказки прямо в комментариях к пакетам. Проверяйте через Edit → Packet Comment при просмотре пакетов. Мелочь, но на CTF за такое дают очки.
Требования к окружению. Wireshark 3.x или новее, минимум 4 ГБ RAM для PCAP до 100 МБ, 8 ГБ для дампов 500+ МБ. На Linux дополнительно нужны tshark, strings, base64, file, exiftool — стандартный набор для постобработки артефактов. NetworkMiner (через mono на Linux, нативно на Windows) полезен для автоматического извлечения файлов и учётных данных из PCAP.
Display filters — основной инструмент навигации по дампу. Без фильтров анализ pcap файлов на 50+ тысяч пакетов превращается в лотерею.
Протокольные фильтры — самый грубый первый шаг. Введите имя протокола в строку фильтрации: http, dns, ftp, ftp-data, smtp, telnet, icmp. Начинайте с протокола, который выглядел аномально на этапе разведки.
Полевые фильтры сужают результат до конкретных событий:
| Фильтр | Что находит | Когда применять |
|---|---|---|
http.request.method == "POST" |
Формы логина, загрузка файлов | HTTP credential hunting |
http.response.code == 200 |
Успешные ответы сервера | Поиск переданного контента |
dns.qry.type == 16 |
TXT-записи DNS | Поиск DNS-эксфильтрации |
ftp.request.command == "PASS" |
FTP-пароли | Credential hunting |
ftp.request.command == "RETR" |
Скачиваемые файлы FTP | Поиск переданных артефактов |
tcp.port == 4444 |
Reverse shell | Поиск бэкдоров |
ip.addr == 10.0.2.15 |
Трафик конкретного хоста | Изоляция подозрительного узла |
frame.len > 1000 |
Крупные пакеты | Файлы в потоке |
Комбинации через && и || позволяют строить точные запросы: фильтр http.request.method == "POST" && ip.src == 10.0.2.15 покажет POST-запросы только от конкретного хоста. Оператор matches поддерживает регулярные выражения: http.request.uri matches ".*\.(php|asp|jsp)" найдёт обращения к серверным скриптам — полезно при поиске веб-шеллов.
Типичная ошибка новичков — путать display filters с capture filters. Capture filters (BPF-синтаксис: host 10.0.2.15, port 80) применяются при записи трафика. При работе с готовым PCAP используются только display filters. Вставите BPF-синтаксис в display filter — строка подсветится красным, и вы потеряете минуту, гадая почему.
Фильтры содержимого ищут строки прямо внутри данных пакетов:
tcp contains "CTF{" — прямой поиск формата флагаframe contains "flag" — по всему фрейму любого протоколаhttp contains "password" — пароли в HTTP-трафикеdns.qry.name contains "base64" — подозрительные DNS-именаНачинайте каждое задание с frame contains "flag" или tcp contains "CTF{". В простых заданиях флаг передаётся открытым текстом, и фильтр выдаёт его за секунду. На соревновании PacketSafari участники находили флаг через анализ SYN-пакетов с фильтром tcp.flags.syn == 1 and tcp.flags.ack == 0 и последующим Follow TCP Stream — флаг лежал в теле четвёртого TCP-потока. Если прямой поиск не дал результата — переходите к протокольному анализу.
Если Protocol Hierarchy показал хоть долю процента незашифрованного HTTP — начинайте с него. HTTP-трафик в CTF содержит артефакты чаще остальных незашифрованных протоколов.
Фильтр http.request выводит список всех HTTP-запросов с методом, URI и хостом.
POST-данные. Кликните по пакету с методом POST и разверните секцию «HTML Form URL Encoded» в панели деталей — пары name=value отображаются в открытом виде. Если сайт работал по HTTP без TLS, логин и пароль видны без всякого декодирования. Просто в чистом виде.
Export Objects. File → Export Objects → HTTP — самый быстрый способ вытащить все переданные файлы разом. Wireshark покажет таблицу с именами, типами контента и размерами. Сохраняйте всё, потом проверяйте каждый файл через file имя_файла и strings имя_файла | grep -i "flag\|ctf". В разборах CTF-заданий участники извлекали архив maybeconfidential.zip через Export Objects, а внутри обнаруживали DOCX-файл (который тоже ZIP-контейнер) с флагом в word/document.xml. Матрёшка — любимый приём задачников, и каждый извлечённый файл стоит разворачивать до конца.
User-Agent. Нестандартные строки мгновенно выдают инструмент атакующего. Фильтр http.user_agent contains "sqlmap" или http.user_agent contains "nikto" изолирует запросы от сканеров. Обнаружение специфичных User-Agent указывает на инструмент (sqlmap, nikto), что типично для этапа разведки или начального доступа (Reconnaissance/Initial Access). Такие запросы — маркер: рядом с ними ищите эксфильтрованные данные.
Cookie. Фильтр http.cookie contains "session" показывает пакеты с сессионными куками. В заданиях на session hijacking флаг может быть спрятан в значении cookie или кастомного HTTP-заголовка.
Нестандартные заголовки. Задачники иногда прячут флаг в заголовке вроде X-Flag или X-Secret. Проверяйте заголовки ответов через Follow TCP Stream — в нём видны все заголовки без исключения.
Ограничения. Анализ HTTP бесполезен для HTTPS/TLS-трафика без ключей. Расшифровка TLS в Wireshark возможна при наличии pre-master secret log (файл SSLKEYLOGFILE) или приватного ключа сервера при RSA-шифронаборе. В CTF-задании TLS-ключ иногда поставляется отдельным файлом — загрузите его через Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename. Если ключа нет, а весь трафик зашифрован — ищите в других протоколах: DNS и ICMP остаются открытыми даже при полном TLS.
FTP передаёт всё без шифрования: логины, пароли, содержимое файлов. В CTF-дампах FTP фигурирует как незашифрованный протокол передачи файлов и учётных данных — всё в чём мать родила.
Фильтр ftp покажет управляющий канал (порт 21) с командами и ответами сервера. Правый клик по любому FTP-пакету → Follow → TCP Stream даёт полный диалог:
USER admin / PASS s3cretP@ss — учётные данные открытым текстомRETR secret.txt — скачивание файла (клиент запрашивает у сервера)STOR backdoor.php — загрузка файла на сервер (клиент отправляет)CWD /home/user/hidden/ — смена каталогаLIST — листинг файлов в директорииПароль из FTP-сессии сам по себе может оказаться флагом. Если нет — смотрите, какие файлы передавались через RETR и STOR, и вытаскивайте их из канала данных.
Для быстрого извлечения учётных данных через терминал:
tshark -r dump.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" \
-T fields -e ftp.request.command -e ftp.request.arg
Результат — список логинов и паролей без необходимости открывать GUI.
FTP использует раздельные каналы: управляющий (порт 21) и канал данных (порт 20 в активном режиме или случайный высокий порт в пассивном). Файлы передаются по каналу данных, и достать их можно двумя способами.
Через Wireshark. Фильтр ftp-data покажет только пакеты с содержимым файлов. Правый клик → Follow → TCP Stream, переключите формат на Raw и нажмите «Save as...» — получите файл без протокольных заголовков. Определите тип через file имя_файла: может оказаться PNG, ZIP, PDF, ELF-бинарник или текст с флагом.
Через NetworkMiner. Откройте тот же PCAP — инструмент автоматически разложит файлы, изображения и учётные данные по вкладкам Files, Images, Credentials. Экономит минуты ручного разбора. NetworkMiner особенно удобен, когда в PCAP несколько FTP-сессий с разными файлами: каждый файл будет выделен отдельно с именем и размером.
Ограничения. FTP-анализ не работает для FTPS (FTP over TLS) и SFTP (SSH File Transfer) — оба протокола шифруют данные. Если FTP-сессия записана с потерей пакетов, Follow TCP Stream покажет повреждённый поток. Тогда экспортируйте raw-данные из ftp-data и попробуйте carving через foremost или binwalk — они восстанавливают файлы по магическим байтам (JPEG начинается с FF D8 FF, PNG — с 89 50 4E 47, ZIP — с 50 4B 03 04).
DNS-трафик присутствует в каждом PCAP-дампе. В CTF forensics DNS используется двояко: для обычного резолвинга имён и как скрытый канал передачи данных. Если DNS служит каналом управления (команды + ответы), это техника DNS (T1071.004, тактика Command and Control), а вывод данных через этот же канал — Exfiltration Over C2 Channel (T1041, тактика Exfiltration). Если DNS используется только для вывода данных отдельно от основного C2-канала — Exfiltration Over Unencrypted/Obfuscated Non-C2 Protocol (T1048.003, тактика Exfiltration).
Фильтр dns покажет все запросы и ответы. Ищите домены с длинными поддоменами, hex-строками или base64-подобным содержимым — главные маркеры.
TXT-записи. Фильтр dns.qry.type == 16 выделяет запросы TXT-записей. В легитимном трафике TXT встречается редко (SPF, DKIM, верификация доменов). Массовые TXT-запросы к одному домену — почти гарантированный DNS-туннель. В репозитории SigmaHQ есть правило net_dns_susp_b64_queries.yml, которое детектирует DNS-запросы с base64-паттернами — тот же принцип применяйте при ручном анализе в Wireshark.
Детекция по длине. Нормальный DNS-запрос содержит домен до 50–60 символов. Запросы длиной 100+ символов с поддоменами вида aGVsbG8gd29ybGQ=.evil.com — данные, закодированные в base64 и передаваемые через DNS. По MITRE ATT&CK при отсутствии основного C2-канала это T1048.003, тактика Exfiltration.
Подозрительные домены. Если в дампе 500 запросов к google.com и 3 запроса к x7kf2.xyz — начинайте с редких. Домен атакующего всегда белая ворона в общей массе. Отдельно отмечайте DGA-подобные домены (случайные последовательности символов): dns.qry.name contains ".xyz" или dns.qry.name matches "[a-z0-9]{15,}\..*" сужает выборку до подозрительных.
Когда подозрительные DNS-запросы найдены, нужно извлечь и декодировать данные. GUI Wireshark тут неудобен — переходите к tshark.
tshark -r evidence.pcap -Y "dns.qry.name contains evil.com" \
-T fields -e dns.qry.name | \
awk -F'.' '{for(i=1;i<NF-1;i++) printf "%s", $i; print ""}' | \
tr -d '\n' | base64 -d
# NB: работает для доменов с одной TLD-меткой (evil.com); для evil.co.uk нужна корректировка NF-2
Команда извлекает все DNS-запросы к evil.com, забирает все метки поддоменов до домена верхнего уровня (где закодированы данные), склеивает строки и декодирует base64. Если payload помещается в одну метку на запрос, достаточно '{print $1}'. На выходе — текст или бинарные данные с флагом.
Если данные закодированы hex, а не base64 — замените base64 -d на xxd -r -p. Для нестандартных кодировок загрузите извлечённые строки в CyberChef: операции From Base64, From Hex, XOR с перебором ключей, Magic (автоопределение кодировки) покрывают большинство CTF-сценариев. CyberChef особенно хорош при многоуровневом кодировании: drag-and-drop цепочка операций позволяет экспериментировать быстрее, чем через терминал.
Ответы DNS тоже содержат данные. Не ограничивайтесь запросами — ответы на TXT-запросы могут содержать base64-строки с флагом. Фильтр dns.txt в Wireshark покажет содержимое TXT-записей в ответах.
Follow TCP Stream (правый клик по пакету → Follow → TCP Stream) реконструирует полный диалог между двумя хостами в рамках одного TCP-соединения. Запросы клиента — красным, ответы сервера — синим.
Plaintext-протоколы раскрываются полностью. Telnet покажет bash-историю с командами атакующего — каждое нажатие клавиши. SMTP раскроет содержимое писем с вложениями и аутентификацию в открытом виде. Если SMTP используется как канал управления вредоносным ПО, это техника Mail Protocols (T1071.003, тактика Command and Control). IRC — чат с управляющими командами. На CTF через Follow TCP Stream восстанавливали bash_history из telnet-сессий reverse shell на порту 6200, находя закодированные строки с флагом.
Навигация между потоками. Счётчик «Stream N of M» и стрелки позволяют листать потоки последовательно. Флаг нередко лежит не в первом потоке — начинайте с потоков аномального размера (Conversations подсказывает, какие именно).
Бинарные данные. Если поток содержит файл, переключите формат на Raw и сохраните через «Save as...». Затем file extracted_data определит тип, а strings extracted_data | grep -i "flag\|ctf\|key" покажет наличие флага в текстовом виде.
Скрытые данные в нетипичных протоколах. Задачники используют ICMP payload для стеганографии: полезная нагрузка ping-пакетов содержит закодированные данные вместо стандартных паттернов. Фильтр icmp с последующим просмотром hex-данных в панели деталей выявляет такие аномалии. Если в ICMP-пакетах payload нестандартный (не повторяющийся паттерн abcdef...), извлеките hex-данные и пропустите через CyberChef.
Ограничение. Follow TCP Stream работает только для полностью захваченных сессий. Если PCAP записан с ограничением snaplen (размер захватываемой части каждого пакета), реконструкция будет неполной — части данных окажутся обрезанными.
На CTF время ограничено. tshark решает типовые задачи одной командой из терминала, а на PCAP размером 200+ МБ работает в разы быстрее GUI.
# Все HTTP-хосты и URI
tshark -r dump.pcap -Y http.request -T fields -e http.host -e http.request.uri
# DNS-запросы длиннее 60 символов (подозрение на туннель)
tshark -r dump.pcap -Y dns.qry.name -T fields -e dns.qry.name | \
awk '{if(length($0)>60) print length($0), $0}' | sort -rn | head -20
# Прямой поиск формата флага в пакетах
tshark -r dump.pcap -Y 'frame contains "CTF{"'
# FTP-логины и пароли
tshark -r dump.pcap -Y "ftp.request.command==USER||ftp.request.command==PASS" \
-T fields -e ftp.request.command -e ftp.request.arg
Каждая команда выполняется за секунды. Результаты перенаправляются в grep, sort, uniq -c для постобработки. Можно обернуть все команды в bash-скрипт, который принимает имя PCAP-файла и последовательно выполняет все проверки, выводя результаты в один отчёт. На реальных CTF я так экономил по 5–10 минут на задание.
Последовательность действий для каждого forensics-задания с PCAP:
frame contains "flag" и tcp contains "CTF{" — прямой поиск. В простых заданиях флаг лежит в открытом виде.http.request → POST-данные, URI, User-Agent. File → Export Objects → HTTP — извлечь все файлы.ftp → Follow TCP Stream на управляющем канале (порт 21) — логины, пароли, имена файлов. ftp-data → Raw-экспорт переданных файлов.dns → аномально длинные запросы и TXT-записи (dns.qry.type == 16). Извлечь поддомены через tshark, декодировать base64 или hex.file, strings | grep flag, binwalk, exiftool. Архивы распаковать и проверить каждый вложенный файл.Этот чеклист покрывает подавляющее большинство forensics-заданий начального и среднего уровня. На продвинутых CTF встречаются задания с шифрованным трафиком и приложенными ключами, стеганографией в тайминге пакетов или кастомными бинарными протоколами — там алгоритм отличается, но первые четыре шага остаются неизменными.
Большинство команд на CTF проигрывают forensics не из-за сложности заданий, а из-за отсутствия алгоритма. Я наблюдал, как участники с хорошим пониманием протоколов тратили 30 минут на бесцельное листание пакетов, а потом за 3 минуты решали задание после подсказки «начни со Statistics → Protocol Hierarchy». Люди ныряют в детали до того, как получили общую картину.
Отдельная история — DNS-эксфильтрация. Задания этого типа считаются «сложными», хотя технически они проще HTTP-forensics. В HTTP нужно разбирать заголовки, куки, POST-body, вложенные архивы — десяток мест, где может лежать флаг. В DNS-эксфильтрации паттерн один: длинный поддомен → base64 → decode → флаг. Разобравшись один раз с tshark-пайплайном, эти задания решаются за пару минут. Настоящая сложность начинается, когда данные спрятаны в ICMP payload, в TCP Urgent Pointer или в тайминге между пакетами — стандартный чеклист там не спасает, нужно думать нестандартно. И именно тут становится ясно, насколько полезно набить руку на типовых заданиях, прежде чем лезть в продвинутые. WAPT для тех, кому writeup'ов мало — нужны лабы с прогрессом и ментором.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «forensics».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...