ОБСУЖДЕНИЕ Статья 

Разбор задач CTF: pwn, crypto, web, forensics

AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Стальное устройство сетевого ответвителя лежит на антистатическом коврике, с гравировкой CVE-2011-2523 и vsFTPd 2.3.4. От него расходятся четыре разноцветных патч-кабеля — янтарный, бирюзовый, белы...


На KnightCTF 2024 пять задач из категории networking крутились вокруг одного .pcap-файла: определить IP атакующего, опознать уязвимую службу vsFTPd 2.3.4, найти CVE, установить инструмент эксплуатации и вычислить порт reverse shell. Один артефакт - пять флагов, каждый следующий опирается на предыдущий. Именно такие цепочки прокачивают навык, который OSCP проверяет в первую очередь: способность выстроить полную атаку от разведки до получения шелла. Не "решить задачку", а собрать картину целиком.

Ниже - разбор задач CTF по четырём категориям с конкретными примерами, инструментами и ходом мысли на каждой развилке.

Web-категория CTF: от robots.txt до цепочек эксплуатации

1789388556926.webp

Web встречается почти на каждом CTF-турнире - и одновременно это самая недооценённая категория. Новички считают её простой, потому что entry-level задачи действительно тривиальны. Но разрыв между "прочитать robots.txt" и "выстроить цепочку SSRF через SSTI к RCE" - как между "я знаю HTML" и "я ломаю продакшен". Подробнее - в нашем обзоре создание ctf заданий.

Ход мысли на веб-задаче​

Первое действие при получении веб-таска - не запускать сканер, а открыть DevTools. Исходный код страницы, cookies, скрытые поля форм, JavaScript-обработчики. На KnightCTF 2024 задача "Levi Ackerman" решалась за минуту: условие "Levi Ackerman is a robot!" - прямая отсылка к /robots.txt. Переход выдал Disallow: /l3v1_4ck3rm4n.html, а по этому пути лежал флаг. Минута - если знаешь, куда смотреть.

На международных CTF соревнованиях веб-задачи давно ушли дальше. Три вектора, которые встречаются чаще всего, от простого к сложному:

SQL-инъекции - классика, маппится на OWASP A03:2021 (Injection). На CTF от OTUS и Volga CTF задача Databases решалась вводом 1" OR "1"="1" -- в поле поиска. Стандартная UNION-based инъекция раскрывала скрытый товар с флагом в описании. Тут важно не просто знать синтаксис: нужно по ответам сервера определить тип СУБД, проверить количество столбцов через ORDER BY, и только потом строить payload. Бездумная подстановка ' OR 1=1-- из шпаргалки - путь в тупик.

Манипуляция cookie - второй по частоте вектор. На том же CTF задача Cookies содержала base64-закодированный JSON с полем is_admin: "False". Декодировать -> изменить на "True" -> закодировать обратно -> подставить. Три минуты работы. Удивительно, сколько реальных приложений до сих пор так "защищают" админку.

Многоступенчатые цепочки - тут начинается настоящий CTF. На KnightCTF 2024 задача "Kitty" требовала сначала обойти авторизацию через SQL-инъекцию (" or 1=1/*), затем обнаружить в JavaScript-коде скрытый обработчик, принимающий cat flag.txt через POST на /execute. Без анализа клиентского JS эндпоинт был невидим - ни один сканер его бы не нашёл. Gobuster бесполезен, если путь генерируется динамически.

Инструменты для решения задач CTF в web-категории: Burp Suite для перехвата запросов, gobuster для фаззинга директорий, ручной curl для нестандартных случаев. На соревнованиях автоматизация часто медленнее ручного подхода - задачи рассчитаны на понимание механики, а не на скорость сканера.

Pwn: бинарная эксплуатация и обход защит​

1789388595980.webp

Pwn пугает новичков сильнее остальных категорий. И именно поэтому навыки в ней ценятся выше всего. Бинарная эксплуатация - фундамент, на котором строится понимание privilege escalation в OSCP и PNPT.

Алгоритм решения pwn-задачи​

Базовый подход, который применим к типовым CTF-задачам:
  1. Определить архитектуру и защиты: file binary + checksec binary покажут x86/x64, наличие NX, PIE, Stack Canary, RELRO.
  2. Загрузить в Ghidra - найти опасные функции (gets(), strcpy(), scanf("%s")), которые не проверяют размер ввода.
  3. Запустить под GDB с pwndbg - подать паттерн через cyclic 200 из pwntools, определить точное смещение до адреса возврата.
  4. Собрать exploit - перезаписать return address на system("/bin/sh") или построить ROP-цепочку через ROPgadget.
Звучит как алгоритм на четыре шага. На практике между пунктами 2 и 3 можно застрять на часы, разбирая логику бинарника в декомпиляторе.

Три подхода к одной задаче: check-list из pwn.college​

На Advent of Pwn 2025 (pwn.college, Arizona State University) бинарник выполнял арифметические трансформации (add, sub) над 1024 входными байтами и сравнивал результат с захардкоженными значениями. Задачу можно было решить тремя способами - и выбор подхода определял разницу между 10 секундами и 10 минутами.

Perl-скрипт: парсинг objdump, обратные вычисления target = val - accumulated_ops. Быстро, но работает только для обратимой арифметики без ветвлений. Для конкретно этой задачи - за глаза.

angr (символьное выполнение): создать символьный буфер, запустить simgr.explore(find=success_addr, avoid=fail_addr). Максимально автоматический подход, но на миллионе операций работает минуты. Зато не надо думать - скормил бинарник и ждёшь.

Z3 SMT-solver: парсинг операций из objdump, построение системы уравнений, решение за ~10 секунд для 1 048 576 операций. Вот ядро:
Python:
from z3 import *
input_bytes = [BitVec(f'in_{i}', 8) for i in range(1024)]
state = list(input_bytes)
for op, idx, val in operations:
    state[idx] = state[idx] + val if op == 'add' else state[idx] - val
solver = Solver()
for idx, target in targets.items():
    solver.add(state[idx] == target)
if solver.check() == sat:
    m = solver.model()
    solution = bytes(m.eval(b).as_long() for b in input_bytes)
Z3 оказался самым быстрым. Вывод: выбор инструмента определяется типом трансформаций в бинарнике. Чистая арифметика - Z3 или ручной скрипт. Ветвления и сложная логика - angr. Простые случаи - Perl или Python с парсингом. Я обычно начинаю с Z3, потому что он либо решает за секунды, либо сразу понятно, что задача сложнее.

Защиты бинарников и их обход​

Понимание защитных механизмов - обязательное условие для решения задач CTF уровня выше начального:

ЗащитаЧто делаетТипичный обход
NXЗапрет выполнения кода на стекеROP-цепочки
ASLRРандомизация адресов памятиInfo leak через format string
Stack CanaryПроверка целостности стекаУтечка canary через побочный канал
PIEРандомизация базы бинарникаPartial overwrite или info leak
SeccompОграничение доступных syscallio_uring (работал на ядрах до ~5.13; в новых ядрах и hardened-конфигурациях блокируется)

На pwn.college была задача с seccomp-sandbox'ом, который допускал только io_uring_setup, io_uring_enter и io_uring_register - ни read, ни write, ни open. Решение: io_uring выполняет файловые операции (OPENAT, READ, WRITE) через ядро, минуя запрещённые syscall. Флаг IORING_SETUP_NO_MMAP позволял работать без mmap. Это уровень, до которого русскоязычные CTF writeup пока редко добираются. (Оговорка: этот обход работал на конкретной конфигурации ядра; в hardened-окружениях io_uring блокируется.)

Crypto: CTF-задачи на криптографию​

1789388626606.webp

Crypto на CTF - не брутфорс, а математика. Найти слабость в реализации, использовать свойства алгоритма, написать декодер. Если задача решается перебором - скорее всего, ты решаешь не ту задачу.

Три уровня сложности

Кодировки и классика. На CTF от OTUS задача "Algo" маскировала hex-преобразование под "алгоритм хеширования". Строка 666c61677b32646733326473323334327d - просто hex-представление ASCII. bytes.fromhex(hex_string).decode() -> flag{2dg32ds2342}. Сюда же - бинарные кодировки: на том же CTF cookie содержал нули и единицы, которые через перевод в ASCII давали JSON-структуру. Такие задачи - разминка, но на них обидно терять время, если не узнал формат с первого взгляда.

RSA с уязвимыми параметрами. Маленький экспонент e, факторизуемый модуль n, общие множители между двумя ключами - RsaCtfTool решает автоматически, SageMath - вручную. Ключевой навык: определить конкретную слабость по предоставленным параметрам. Если e=3 и шифротекст маленький - кубический корень без модуля. Если два ключа с общим p - GCD и дело в шляпе.

Кастомные конструкции. AES-CBC с padding oracle, линейные конгруэнтные генераторы с предсказуемым seed, ECDSA с повторным нонсом. Тут нужна теория чисел и умение читать чужой код шифрования. На этом уровне CyberChef уже не спасёт.

Ход мысли: определить алгоритм по структуре данных -> найти слабость реализации -> написать скрипт-декодер. Инструменты: pycryptodome для работы с примитивами, CyberChef для быстрых преобразований, SageMath для вычислений на конечных полях.

Forensics: задачи CTF по цифровой форензике​

1789388666617.webp

Forensics - категория без универсального алгоритма. Каждый таск - новый тип артефакта и новый набор инструментов. Но методология всё-таки есть, и она сводится к одному: систематически перебирать слои данных, пока не найдёшь аномалию.

Сетевой трафик​

На KnightCTF 2024 цепочка forensics-задач показала полный цикл анализа .pcap:
  • Protocol Hierarchy в Wireshark - обнаружить, что помимо HTTP присутствует FTP
  • Фильтрация: ip.addr == 192.168.1.8 and ip.addr == 192.168.1.7 and ftp - изолировать трафик между атакующим и уязвимой службой (vsFTPd 2.3.4)
  • Conversations (Statistics -> Conversations) - выявить аномальный трафик на порту 6200/tcp, характерный для бэкдор-шелла vsFTPd 2.3.4 (CVE-2011-2523, CVSS 3.1: 9.8 CRITICAL, CWE-78)
  • TCP Stream Follow - восстановить полную сессию и вытянуть bash_history атакующего
Один .pcap-файл - и полная картина: разведка через Nikto (определена по User-Agent), активация встроенного бэкдора через модуль Metasploit (vsftpd_234_backdoor), bind shell на порту 6200. CVE-2011-2523 - это не уязвимость в классическом смысле, а троянский код в скомпрометированном архиве исходников. По MITRE ATT&CK это прямое отражение Exploit Public-Facing Application (T1190, Initial Access) и Data from Local System (T1005, Collection).

Файловые артефакты​

Первая команда при получении неизвестного файла - file для определения формата, затем binwalk -e для извлечения вложенных данных. strings помогает найти читаемые фрагменты в бинарных файлах. Эта тройка - как скальпель, пинцет и лупа для форензика.

Для Windows-форензики: NTUSER.DAT через reged для извлечения реестра, .evtx через evtx_dump для журналов событий, USN Journal для истории файловых операций, ConsoleHost_history.txt для истории PowerShell (техника Credentials In Files, T1552.001).

Для дампов памяти - Volatility: извлечение процессов, сетевых соединений, DLL-инъекций. Этот инструмент из CTF-практики переходит прямиком в работу SOC-аналитика - тот же Volatility, те же плагины, только артефакты настоящие.

CTF writeup по категориям: что даёт для сертификации​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Часть русскоязычных CTF writeup фокусируется на web и networking, реже углубляясь в pwn и сложную криптографию. Это формирует искажённое представление: будто CTF - это про SQL-инъекции и Wireshark. На международных соревнованиях уровня DownUnderCTF или hxp CTF web-категория давно ушла в цепочки SSRF -> SSTI -> десериализация, а pwn требует обхода seccomp через ядерные примитивы. Разрыв между тем, что разбирают на русском, и тем, что реально решают на CTFtime, бьёт по тем, кто готовится к OSCP на русскоязычных материалах. Экзамен не проверяет умение декодировать base64 - он проверяет способность собрать полную цепочку от initial access до root-шелла.

Совет: не ограничиваться чтением решений. Брать задачи, в которых ничего не понятно - именно они двигают вперёд. Если после двух часов задача не поддаётся - читать writeup и повторять руками, не копипастить в терминал. Так формируется мышечная память на паттерны эксплуатации. Именно поэтому CTF-тренировка работает лучше с прогрессией и обратной связью. На WAPT эту цепочку проходят в течение двух модулей с лабами - для тех, кому writeups мало и нужен ментор.
 
Последнее редактирование модератором:

Ещё по теме