
На KnightCTF 2024 категория networking включала 18 задач, построенных на одном pcap-файле. Пять из них — от определения IP атакующего до номера порта reverse shell — решались фильтрами tshark без единого запуска графического интерфейса. Пока соседний стол двадцать минут кликал по меню Statistics → Protocol Hierarchy в Wireshark, три флага уже ушли в скорборд.
Сетевой анализ CTF — не про «экспертизу в Wireshark». Это про пять команд в терминале, понимание того, как выглядят HTTP, FTP и DNS в сыром виде, и привычку начинать с strings | grep, а не с GUI.
Требования к окружению перед началом работы:
sudo apt install tshark), coreutils (strings, grep, base64 — есть в любом Linux)tshark — командная версия Wireshark. Умеет всё то же самое: фильтрация, follow stream, экспорт объектов, дешифровка TLS. Wireshark активно поддерживается, стабильные релизы выходят ежеквартально, tshark обновляется вместе с ним. Установка: sudo apt install tshark на Debian/Ubuntu, в Kali предустановлен.
strings и grep — стандартные утилиты Unix. strings вытаскивает читаемые последовательности символов из бинарного файла. grep ищет по паттерну. Связка strings capture.pcap | grep -i "flag{" — первое действие в любой network-задаче. Занимает секунду.
base64 — декодер Base64 из командной строки. В CTF-задачах данные кодируют в Base64 повсеместно: заголовки HTTP Authorization, поддомены DNS-запросов, тело FTP-передач. echo "dGVzdA==" | base64 -d выдаёт test. Для начала хватит за глаза.
binwalk — извлекает вложенные файлы из бинарных данных, включая pcap. binwalk -e capture.pcap достанет картинки, архивы, документы, которые передавались по сети.
Для нестандартных задач с кастомными протоколами пригодится scapy — Python-библиотека для низкоуровневого разбора пакетов (репозиторий на GitHub, 10k+ звёзд, активная поддержка). Но для первых двадцати network-тасков хватит tshark.
Когда CLI-подход не работает: pcap-файлы от 500 МБ с десятками тысяч потоков — навигация в GUI удобнее. Сложный визуальный анализ временных диаграмм и ретрансмиссий тоже проще в графике. Но в CTF файлы обычно компактные, и CLI быстрее.
Получил pcap — не торопись открывать в GUI. Три действия за первую минуту дают больше, чем десять минут кликанья по интерфейсу.
strings capture.pcap | grep -i "flag{" — подставь формат флага из условия задачи. Организаторы CTF всегда сообщают формат заранее: KCTF{...}, flag{...}, ctfa{...}. По материалам github.com/welchbj/ctf, в части задач флаг лежит в открытом виде прямо в трафике — одна команда экономит минуты. На KnightCTF формат был KCTF{...}, на CTF Academy — ctfa{...}.
Ограничение: strings не найдёт флаг, если он закодирован (Base64, hex, XOR) или передан по зашифрованному каналу (HTTPS без предоставленного ключа). Но начинать всегда стоит с простого.
Узнай, какие протоколы есть в файле — от этого зависит, куда копать дальше:
tshark -r capture.pcap -q -z io,phs
На выходе — дерево протоколов с процентным распределением. Видишь 95% TCP/HTTP и 0.3% FTP — FTP твой первый кандидат. Несколько пакетов DNS среди сплошного HTTP — проверь DNS-запросы на аномалии. По руководству по CTF forensics на hacklido.com, Protocol Hierarchy помогает быстро обнаружить необычные или скрытые протоколы, в которых может прятаться флаг.
Если strings не дал результата, ищи слово «flag» во всём трафике через display-фильтр tshark: tshark -r capture.pcap -Y "frame contains flag". Это CLI-аналог Ctrl+F в Wireshark, только без ожидания загрузки интерфейса. Ещё имеет смысл поискать начало формата флага в Base64-кодировке — flag{ в Base64 выглядит как ZmxhZ3s.
HTTP — протокол без шифрования. Всё, что по нему передаётся, видно в pcap как есть: заголовки, URL, тело запроса, ответ сервера. В терминах MITRE ATT&CK это T1071.001 (Web Protocols, тактика Command and Control) — атакующие используют HTTP для управления малварью, потому что он сливается с легитимным трафиком. В CTF организаторы моделируют этот сценарий: в HTTP-потоке спрятан флаг, креды или артефакт атаки.
GET-параметры URL — флаг может быть частью адреса: /page.php?secret=flag{abc123}. Извлеки все GET-запросы одной командой: tshark -r capture.pcap -Y http.request -T fields -e ip.src -e http.host -e http.request.uri. На выходе — таблица: IP источника, хост, путь. Пробеги глазами — подозрительные параметры видны сразу.
POST-тело — формы логина, отправка данных, загрузка файлов. Фильтр: tshark -r capture.pcap -Y "http.request.method==POST". Дальше определи номер TCP-потока интересующего пакета и выполни follow stream (ниже покажу как).
Заголовки ответа — авторы задач иногда прячут флаг в нестандартных HTTP-заголовках: X-Flag, X-Secret-Data, X-Custom-Header. По данным ctf.support, нестандартные заголовки — один из методов эксфильтрации в CTF. Просмотри все ответы сервера: tshark -r capture.pcap -Y http.response -T fields -e http.response.code -e http.server.
Заголовок Authorization — если видишь Authorization: Basic dXNlcjpwYXNz, это Base64-закодированная пара «логин:пароль». echo "dXNlcjpwYXNz" | base64 -d → user:pass. Один из первых паттернов, на которые стоит смотреть в HTTP-задачах.
Ключевая техника разбора pcap файла. Нашёл подозрительный HTTP-запрос и хочешь увидеть полную сессию — запрос клиента и ответ сервера целиком? Определи номер TCP-потока (поле tcp.stream) и выполни:
tshark -r capture.pcap -q -z follow,tcp,ascii,3
Здесь 3 — индекс потока (синтаксис поддерживается в tshark 3.0+). В старых версиях используй фильтр: tshark -r capture.pcap -Y 'tcp.stream eq 3'. На экране появится весь диалог: HTTP-заголовки, HTML-тело ответа, иногда прямо с флагом внутри. Полный аналог правой кнопки → Follow → TCP Stream в Wireshark, только быстрее.
Извлечение файлов из HTTP — если в трафике передавали картинку, PDF или архив: tshark -r capture.pcap --export-objects http,./exported/. Файлы окажутся в папке exported. Внутри может быть PNG со стеганографией, текстовик с флагом или исполняемый файл для дальнейшего реверса.
HTTP-дерево — для общей картины HTTP-трафика полезна tshark -r capture.pcap -q -z http,tree. Покажет распределение запросов по методам и кодам ответа. 50 запросов с кодом 200 и один с кодом 301 на необычный путь — вот туда и смотри.
В задачах KnightCTF 2024 (по данным writeup'а Selectel) атакующий с IP 192.168.1.7 отправлял HTTP-запросы к жертве 192.168.1.8. В трафике были видны попытки Command Injection (?|=../../../../../etc/passwd) и SQL Injection. Фильтр tshark -r capture.pcap -Y 'http contains "etc/passwd"' -T fields -e ip.src -e ip.dst мгновенно показал источник атаки. User-Agent содержал строку Nikto — сканировали автоматизированным инструментом. Вся последовательность: разведка → эксплуатация → бэкдор — восстанавливалась из одного pcap-файла.
[Применимо: CTF-задачи с незашифрованным HTTP. Не работает: HTTPS/TLS без предоставленного приватного ключа сервера. Если ключ дан — tshark умеет расшифровывать TLS-трафик, но это уже продвинутый сценарий.]
FTP — T1071.002 (File Transfer Protocols, тактика Command and Control) — передаёт учётные данные без шифрования. Когда клиент подключается к FTP-серверу, в трафике идут текстовые команды USER username и PASS password. Никакого хеширования, никакого TLS по умолчанию. В чём мать родила — прямо в пакете.
Фильтрация FTP-трафика: tshark -r capture.pcap -Y ftp. В выводе увидишь последовательность:
Response: 220 (vsFTPd 2.3.4) — баннер сервера (версия важна для поиска CVE)Request: USER admin — имя пользователяRequest: PASS secret123 — пароль в открытом видеЕсли нужны только креды: tshark -r capture.pcap -Y "ftp.request.command==USER || ftp.request.command==PASS" -T fields -e ftp.request.arg. На выходе — аргументы команд по одному на строку. Скопировал, вставил в формат флага — сдал.
FTP использует два канала: командный (порт 21) и канал данных (порт 20 или динамический из PASV). Сами файлы передаются по data-каналу, а не по командному. Чтобы найти переданный файл:
RETR filename.txt (скачивание) или STOR filename.txt (загрузка) в командном каналеНа практике проще тупо запустить binwalk -e capture.pcap — утилита часто извлекает файлы из pcap автоматически, независимо от протокола передачи. Как альтернатива — NetworkMiner, инструмент для сетевой криминалистики, который по данным hacklido.com автоматически извлекает файлы, изображения и учётные данные из pcap. Но для CTF обычно хватает binwalk.
FTP-задачи в CTF моделируют реальный сценарий: атакующий получил initial access через уязвимый FTP-сервер (например, vsFTPd 2.3.4 с известным бэкдором), затем провёл эксфильтрацию данных (T1048.003 — Exfiltration Over Unencrypted Non-C2 Protocol). В KnightCTF бэкдор vsFTPd создавал reverse shell на порту 6200 — переход от начального доступа к удалённому выполнению команд. Все команды атакующего в reverse shell шли по TCP в открытом виде и были видны через follow stream — фактически bash_history атакующего прямо в pcap.
[Применимо: CTF-задачи и анализ legacy-инфраструктуры. Не работает: FTPS (FTP over TLS) и SFTP (SSH File Transfer Protocol) — трафик зашифрован. В современных инфраструктурах FTP почти не встречается, но в CTF и при пентесте legacy-систем — стабильно.]
DNS — самый недооценённый протокол в network-категории CTF. Его почти всегда пропускают через файрвол (блокировать DNS = сломать интернет для пользователей), и через него можно гнать произвольные данные. В реальных атаках это техника T1071.004 (DNS) в связке с T1132.001 (Standard Encoding) — малварь кодирует украденные данные в Base64 или hex и отправляет как поддомены DNS-запросов.
Вместо обычных запросов к www.google.com в pcap появляются запросы вида:
666c61677b.exfil.evil.com6831645f.exfil.evil.com316e5f646e737d.exfil.evil.comКаждый поддомен — hex-закодированный фрагмент данных. Склеив поддомены в порядке появления и декодировав hex, получишь флаг. Другой вариант — Base32 или url-safe Base64 в поддоменах (классический Base64 содержит символы +, /, =, недопустимые в DNS-именах по RFC 1035, поэтому DNS-туннели используют hex, Base32 или модифицированный Base64-алфавит). Третий — данные прячут в ответах DNS TXT-записей, а не в запросах.
Признаки DNS exfiltration в pcap: аномально длинные поддомены (больше 20 символов), повторяющийся домен верхнего уровня (все запросы к *.evil.com), запросы с hex-паттернами (только символы 0-9a-f), необычная частота DNS-запросов за короткий период.
Первый шаг — вытащи все DNS-запросы:
tshark -r capture.pcap -Y "dns.qry.name" \
-T fields -e dns.qry.name | sort -u
На выходе — уникальные доменные имена из pcap. Нормальные домены (google.com, cdn.example.com) пропускай, ищи аномалии. Длинные hex-строки в поддоменах — почти гарантия exfiltration.
Нашёл подозрительный домен? Допустим, все запросы идут к *.data.evil.com, а поддомены — hex:
tshark -r capture.pcap \
-Y "dns.qry.name contains data.evil.com" \
-T fields -e dns.qry.name | \
sed 's/\.data\.evil\.com//' | \
tr -d '\n' | xxd -r -p
Тут фильтруем DNS-запросы к data.evil.com, вырезаем доменную часть (sed), склеиваем поддомены в одну строку (tr -d '\n') и декодируем hex (xxd -r -p). На выходе — флаг или его фрагмент.
Если кодирование Base64, замени последний пайп: ... | base64 -d. Если данные в TXT-записях ответов — другой фильтр: tshark -r capture.pcap -Y "dns.txt" -T fields -e dns.txt.
DNS exfiltration CTF-задачи стабильно оказываются среди наименее решаемых в категории network. Не потому что сложные — потому что участники не привыкли смотреть на DNS как на канал передачи данных. HTTP и FTP «понятны»: там тело запроса, файлы, логины. DNS кажется «служебным», и его пропускают. А разница между задачей «найди флаг в HTTP» и «найди флаг в DNS» — одна команда tshark.
[Применимо: CTF-задачи с DNS-трафиком в pcap. Не работает: DNS over HTTPS (DoH) или DNS over TLS (DoT) — трафик зашифрован и выглядит как обычный HTTPS. В CTF для новичков DoH пока не встречается.]
Разбор pcap — это этап forensics, когда аналитик восстанавливает действия атакующего по записанному трафику. Понимание того, на какой стадии kill chain находится каждый артефакт, ускоряет решение: знаешь что искать — знаешь какой фильтр ставить.
Типичная цепочка, восстанавливаемая из одного pcap-файла:
Когда читаешь условие задачи — определи, какой этап цепочки моделируется. «Найди IP атакующего» — разведка. «Какой CVE использовал атакующий» — initial access. «Какие команды выполнил» — execution. «Какие данные украл» — exfiltration. Каждый этап → свой набор фильтров.
Алгоритм для любой network-задачи. Распечатай и держи рядом на первых турнирах:
strings capture.pcap | grep -i "формат_флага". Нашёл — сдавай, не думайtshark -r capture.pcap -q -z io,phs. Определи нетипичные или редкие протоколы — с них начинай-Y http.request. FTP: -Y ftp. DNS: -Y dns.qry.name. Смотри, что выделяетсяtshark -r capture.pcap -q -z follow,tcp,ascii,N--export-objects http,./out/. Универсально: binwalk -e capture.pcapecho "строка" | base64 -d. Hex: echo "строка" | xxd -r -ptshark -r capture.pcap -T fields -e dns.qry.name | sort -u и ищи аномально длинные поддомены| Протокол | Что искать | Первая команда tshark |
|---|---|---|
| HTTP | URL-параметры, POST-тела, заголовки | tshark -r pcap -Y http.request -T fields -e http.request.uri |
| FTP | Команды USER/PASS, файлы RETR/STOR | tshark -r pcap -Y ftp |
| DNS | Длинные поддомены, TXT-записи | tshark -r pcap -T fields -e dns.qry.name |
| TCP/raw | Plaintext в нестандартных потоках | strings pcap \| grep -i flag |
Когда алгоритм не работает: зашифрованный трафик (TLS/HTTPS) без предоставленного ключа — нужен ключ от организаторов. Кастомные бинарные протоколы — нужен scapy для ручного разбора полей пакета. Повреждённые pcap-файлы — используй pcapfix broken.pcap -o repaired.pcap перед анализом, как рекомендует ctf.support. Гигабайтные дампы с десятками тысяч потоков — GUI Wireshark для навигации удобнее CLI.
Network — самая предсказуемая категория в CTF для новичков. В 80% задач флаг лежит либо в HTTP-ответе, либо в FTP-кредах, либо закодирован в DNS-поддоменах. Три протокола, пять команд tshark, один grep — и категория закрыта.
Проблема в том, что большинство гайдов учат через Wireshark GUI: «откройте Statistics, нажмите Protocol Hierarchy, правый клик, Apply as Filter». На домашнем ноутбуке это работает. Но когда на турнире доступ — только SSH к боксу с pcap-файлом и нет возможности скачать дамп на свою машину, GUI бесполезен. А tshark работает везде, где есть терминал.
DNS-задачи стабильно имеют самый низкий процент решений в категории network, хотя технически они не сложнее HTTP. Причина — участники не воспринимают DNS как канал передачи данных. В реальных атаках DNS-туннелирование применяется годами (техника T1071.004, тактика Command and Control), APT-группы используют его для эксфильтрации из сетей, где весь остальной исходящий трафик фильтруется. А в CTF этот вектор считают экзотикой и пропускают. Научись распознавать hex и Base64 в поддоменах — будешь закрывать задачи, которые половина участников даже не начинает. Если хочешь пройти базу системно — от сетей до первых практических задач — IB Basics на codeby.school закрывает это без академического тона.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...