CTF Attack-Defense: что это такое и как в него играют
Обновлено 21.08.2026
Attack-Defense (AD, «атака-защита») — формат соревнований, в котором каждой команде выдаётся идентичный сервер с набором заведомо уязвимых сервисов, все команды соединены в общую игровую сеть и на протяжении всей игры одновременно атакуют сервисы соперников и защищают собственные.
Самая наглядная аналогия: всем участникам выдали одинаковый дом с одинаковыми дырами в стенах и замках. Задача — найти эти дыры, попасть в дома соседей и вынести оттуда ценности (флаги), а параллельно залатать собственные — но так, чтобы дверь по-прежнему открывалась и почтальон (проверяющая система) мог занести новую посылку. Наглухо заколоченный дом приносит штраф за то, что «не работает».
Ключевая особенность формата: уязвимости у всех одинаковые. Найденная у себя дыра означает точно такую же дыру у каждого соперника, поэтому один эксплоит применяется сразу ко всему списку участников. Верно и обратное: атаку, направленную против команды, она может применить к остальным.
Чем Attack-Defense отличается от Task-Based
| Критерий | Task-Based | Attack-Defense |
|---|---|---|
| Суть | Решение независимых заданий | Атака чужих сервисов и защита своих |
| Взаимодействие участников | Отсутствует, каждый сам по себе | Прямое: сервисы соперников атакуют |
| Флаги | Один флаг за задание, сдаётся один раз | Обновляются каждый раунд, красть нужно постоянно |
| Ход игры | Фиксированное окно, задания открыты сразу | Непрерывная игра из раундов |
| Автоматизация | Почти не нужна | Обязательна: ферма, скрипты, разбор трафика |
| Инфраструктура участника | Не нужна | Уязвимый сервер, автоматизация, запись трафика |
| Что определяет результат | Сумма очков за задания | Атака, защита и доступность сервисов |
Общее у форматов — категории уязвимостей: в сервисах Attack-Defense встречаются те же классы ошибок, что и в заданиях Task-Based, — веб-уязвимости, ошибки работы с памятью, криптографические просчёты, логические дыры.
Как устроена игровая сеть
Все команды подключаются к общей игровой сети, обычно через VPN. У каждой команды есть свой vulnbox (от vulnerable box — «уязвимая машина»), он же игровой образ: виртуальная машина или сервер, на котором работают все игровые сервисы. IP-адреса участников известны, поэтому цели атаки определены заранее.
Свой vulnbox команда контролирует полностью: заходит на него по SSH, читает исходники сервисов, накатывает патчи, смотрит трафик. Чужие машины доступны только снаружи — ровно так, как их видит любой атакующий в интернете.
Сервисы
Сервис — программа, которая работает на vulnbox и выполняет какие-то функции: веб-приложение, сетевой демон, API. В каждом сервисе заложена одна или несколько уязвимостей. Именно сервисы играют в Attack-Defense роль заданий: их нужно и взломать у соперников, и защитить у себя. Один и тот же сервис может хранить сразу несколько флагов в разных местах — такие места называют flag store, «хранилище флагов».
Флаги и формат флага
Флаг в Attack-Defense — приватная информация, которую проверяющая система кладёт внутрь сервиса: секретное сообщение пользователя, содержимое приватной заметки, значение в базе. Флаги имеют строгий формат, по которому их легко распознать в трафике или в ответе сервиса, — например, строка фиксированной длины из заглавных букв и цифр со служебным символом в конце.
Главное отличие от Task-Based: флаги постоянно обновляются. Старые «протухают» через несколько раундов и перестают приносить очки, а на их место кладутся новые. Один раз украсть флаг недостаточно — атаку нужно повторять раунд за раундом, а значит, автоматизировать.
Раунды
Игра разбита на короткие интервалы — раунды, или тики (tick). Обычно раунд длится от одной до пяти минут. В начале каждого раунда проверяющая система кладёт в сервисы свежие флаги и заново проверяет, что сервисы работают. Вся игра крутится вокруг раундов: за раунд нужно успеть украсть актуальные флаги у соперников и удержать собственные сервисы в рабочем состоянии.
Чекер и жюри
Чекер (checker) — программа организаторов, которая эмулирует работу настоящего пользователя сервиса. Раз в раунд чекер:
- кладёт в сервис новые флаги;
- проверяет, что «старые» данные на месте и сервис отдаёт их корректно;
- проверяет, что вся штатная функциональность работает.
Чекер запускается с центрального сервера организаторов — его называют gameserver или «жюри». Важная деталь: gameserver не запускает эксплоиты и никого не взламывает. Он пользуется сервисом строго легально, как обычный пользователь. Поэтому патч, сломавший нормальную работу сервиса, бьёт именно по проверке чекера — и стоит очков за доступность.
Статусы сервисов
По итогам проверки чекер выставляет каждому сервису статус. Набор зависит от системы, но чаще всего он такой:
- OK (UP) — сервис работает штатно, все проверки пройдены. Только этот статус приносит очки за доступность.
- MUMBLE — сервис отвечает, но работает неправильно: например, отдаёт не то, что должен. Частая причина — патч, задевший легитимную логику.
- CORRUPT — сервис работает, но теряет или портит данные: чекер положил флаг, а прочитать его обратно не смог.
- DOWN — сервис недоступен по сети: упал, завис или закрыт наглухо.
OK
Все проверки пройдены: сервис отвечает и отдаёт ровно то, что должен.
Раунд засчитан в доступность. Только в этом статусе сервис приносит очки.
MUMBLE
Сервис отвечает, но работает неправильно: часть штатных функций сломана.
Раунд не засчитан. Типичная причина — патч, задевший легитимную логику.
CORRUPT
Сервис работает, но теряет или портит данные: положенное значение не читается обратно.
Раунд не засчитан: данные пользователя недоступны.
DOWN
Сервис недоступен по сети: упал, завис или закрыт наглухо.
Раунд не засчитан. Закрытый от атак сервис теряет очки так же, как взломанный.
Набор статусов зависит от проверяющей системы. Часто встречаются ещё два: UNKNOWN — состояние ещё неизвестно (обычно до старта игры) и CHECKER ERROR — сбой самого проверяющего скрипта, не связанный с работой сервиса.
В других системах статусы называются иначе — FAULTY, FLAG_NOT_FOUND, RECOVERING и т. п., — но идея одна: зелёный статус приносит очки, любой другой означает, что сервис работает не так, как должен.
Как начисляются очки
Счёт в Attack-Defense складывается из трёх составляющих, и понимание этой тройки объясняет всю логику формата.
Атака
Flag Points
Очки за украденные флаги. Часто механика «с нулевой суммой»: у атакующего прибавляется, у жертвы убавляется.
Защита
Defense
Очки за флаги, которые у команды не украли: уязвимость закрыта раньше, чем ею воспользовались.
Доступность
SLA
Доля раундов, в которых сервис был в статусе OK. Работает как множитель ко всему счёту.
= позиция команды на скорборде
Проседание любой из трёх составляющих бьёт по итогу: лежащий сервис обнуляет и удачные атаки.
Атакующие очки (Flag Points)
FP (Flag Points) — очки за украденные флаги. Команда находит уязвимость в сервисе соперника, эксплуатирует её, достаёт флаг и сдаёт его в систему организаторов. Каждый валидный, ещё не протухший флаг приносит очки.
Часто механика работает «с нулевой суммой»: когда флаг украден, у атакующего FP растут, а у команды-жертвы падают. То есть удачная атака меняет расстановку сил дважды — атакующий вырывается вперёд, а жертва отстаёт.
Защитные очки
Защитные очки начисляются за флаги, которые не украли. Если соперники не смогли достать флаги из сервиса — потому что уязвимость закрыли вовремя, — очки остаются у команды. Защита в этом формате означает прежде всего патчинг: устранение той самой дыры, через которую идут атаки.
SLA — доступность сервиса
SLA (Service Level Agreement) — метрика доступности, показывающая, насколько стабильно работал сервис. Считается она просто:
SLA = число раундов со статусом OK / общее число прошедших раундовЕсли сервис всю игру был в статусе OK, SLA близок к 100%. Если он падал или работал неправильно, SLA проседает и штрафует итоговый счёт. Обычно SLA выступает множителем: даже при удачных атаках и надёжной защите лежащий сервис обнуляет результат.
Скорборд
Итоговый счёт — комбинация атакующих очков, защитных очков и SLA. Всё это в реальном времени отображается на скорборде — публичной таблице результатов: видно, кто кого ломает, чьи сервисы горят красным и как меняется расстановка сил.
Результат в Attack-Defense определяется одновременно тремя фронтами: атакой на соперников, защитой собственных флагов и работоспособностью сервисов. Провал любого из трёх стоит очков.
Как проходит матч
До старта
Обычно за некоторое время до открытия сети командам выдают доступ к vulnbox и зашифрованные образы сервисов. Промежуток между получением пароля для расшифровки и открытием сети между участниками — как правило, около часа. В это время команды успевают:
- развернуть и запустить все сервисы, убедиться, что они в статусе OK;
- сделать резервную копию исходников сервисов, чтобы было к чему откатиться;
- поднять собственную инфраструктуру: автоматизацию запуска эксплоитов и сдачи флагов, запись трафика, доступ по SSH для всех участников;
- бегло просмотреть исходники в поисках очевидных уязвимостей.
Как только сеть открывается, начинается живая игра: уязвимости можно эксплуатировать сразу.
Атака
Атака в Attack-Defense повторяет логику Task-Based, но с поправкой на автоматизацию:
- Анализ сервиса. Читаются исходники (или реверсится бинарь) собственного сервиса — он идентичен сервису соперников — и ищется уязвимость: инъекция, обход авторизации, ошибка логики, переполнение буфера.
- Написание эксплоита. Пишется скрипт, чаще всего на Python, который подключается к сервису по известному IP, эксплуатирует уязвимость и вытаскивает флаг. Часто помогает attack info (attack data) — служебные данные от организаторов с подсказками о том, где искать флаги: идентификаторы пользователей, пути к объектам, имена файлов.
- Запуск по всем соперникам. Уязвимость одинаковая у всех, поэтому эксплоит запускается сразу по всему списку участников.
- Сдача флагов. Добытые флаги отправляются в систему сдачи (flag submission). Вручную это делать нереально — отсюда автоматизация.
Упрощённый скелет эксплоита под автоматический запуск выглядит так — это шаблон, а не рабочая атака:
#!/usr/bin/env python3
import sys
# IP жертвы приходит первым аргументом от системы автозапуска
target_ip = sys.argv[1]
# 1) подключение к сервису соперника
# 2) эксплуатация уязвимости и получение приватных данных
# 3) извлечение из ответа строк, похожих на флаг
for flag in found_flags:
print(flag) # напечатанные флаги подхватываются и сдаются автоматическиЗащита
Параллельно с атакой команда защищает свои сервисы. Защита — это устранение уязвимости с жёстким условием: штатная функциональность должна сохраниться, иначе чекер выставит MUMBLE, CORRUPT или DOWN и доступность просядет. Подходов два:
- Патч исходного кода. Если сервис написан на Python, Go, PHP или Java, правятся исходники — например, добавляется фильтрация входных данных, — после чего сервис пересобирается и перезапускается, обычно через Docker.
- Бинарный патч. Если исходников нет, правится сам исполняемый файл инструментами вроде
patchelfилиpwntools.
У патчинга есть встроенный компромисс: чтобы применить правку, сервис обычно приходится ненадолго перезапустить, а значит, можно потерять раунд доступности. Поэтому патчи готовят заранее и применяют аккуратно.
Автоматизация: флаг-ферма
Флаг-ферма (flag farm, exploit farm, «ферма») — сердце инфраструктуры участника. Ферма автоматически:
- запускает все эксплоиты по всем соперникам каждый раунд;
- собирает напечатанные эксплоитами флаги;
- отсеивает дубликаты и протухшие значения;
- пачками отправляет свежие флаги в систему сдачи.
Без автоматизации формат не работает: флаги обновляются каждые пару минут, и вручную за ними не угнаться. Существуют готовые открытые решения такого класса — их называют фермами или throwers.
Разбор трафика
Входящий трафик обычно пишут в PCAP и анализируют. Когда соперник атакует сервис, его эксплоит виден в трафике жертвы. Это даёт две вещи:
- разбор чужих атак. По чужому запросу можно понять уязвимость, которую сама команда ещё не нашла, и переиспользовать атаку против всех — приём называется replay;
- точечную защиту. Видно, как именно ломают сервис, а значит, понятно, что патчить в первую очередь.
Для захвата используют tcpdump и Wireshark, для разбора — специализированные анализаторы, которые подсвечивают подозрительные пакеты и помогают находить атаки среди тысяч запросов.
Кто чем занят во время матча
Attack-Defense — командный формат, и работа обычно распределяется по направлениям:
- координатор — держит общую картину, следит за скорбордом, расставляет приоритеты: что патчить первым, кого атаковать;
- администратор инфраструктуры — поднимает и держит ферму, сдачу флагов, запись трафика и доступы;
- разработчики эксплоитов — читают сервисы, находят уязвимости, пишут и поддерживают атаки;
- защитники — готовят и накатывают патчи, следят, чтобы сервисы оставались в статусе OK;
- аналитик трафика — разбирает PCAP, находит чужие атаки и передаёт их в работу.
В небольших составах один участник совмещает несколько направлений — это обычная практика.
Инструменты
| Задача | Инструменты |
|---|---|
| Написание эксплоитов | Python, requests (web), pwntools (pwn) |
| Автоматизация запуска и сдачи флагов | флаг-ферма («thrower») |
| Захват и анализ трафика | tcpdump, Wireshark, анализаторы PCAP |
| Патчинг бинарей | patchelf, pwntools, GDB |
| Реверс-инжиниринг | Ghidra, IDA, Binary Ninja |
| Работа с сервером | SSH, tmux, Docker, git |
| Веб-анализ | Burp Suite, curl, инструменты разработчика в браузере |
Словарь
- Attack-Defense (AD) — формат CTF, где участники одновременно ломают чужие сервисы и защищают свои.
- Vulnbox — уязвимая виртуальная машина команды со всеми игровыми сервисами.
- Сервис — уязвимая программа на vulnbox, которую атакуют и защищают.
- Flag store — место внутри сервиса, где хранится флаг; у одного сервиса их может быть несколько.
- Флаг — строка заданного формата, которую нужно украсть из сервиса и сдать за очки.
- Раунд / тик (round / tick) — короткий игровой интервал (обычно 1–5 минут), в начале которого обновляются флаги.
- Чекер (checker) — программа организаторов, эмулирующая реального пользователя и проверяющая сервис.
- Gameserver / жюри — центральный сервер организаторов: кладёт флаги, запускает чекеры, считает очки.
- SLA — метрика доступности сервиса: доля раундов со статусом OK.
- Статусы сервиса — OK, MUMBLE, CORRUPT, DOWN и их аналоги в конкретной системе.
- FP (Flag Points) — атакующие очки за украденные флаги.
- Defense — защитные очки за флаги, которые не украли.
- Эксплоит (exploit, «сплоит») — скрипт, эксплуатирующий уязвимость и достающий флаг.
- Флаг-ферма (flag farm) — инфраструктура, автоматически запускающая эксплоиты и сдающая флаги каждый раунд.
- Attack info / attack data — служебные подсказки от организаторов, где искать флаги.
- Патч (patch) — правка, закрывающая уязвимость без поломки функциональности.
- PCAP — файл захваченного сетевого трафика.
- Replay — переиспользование чужого эксплоита, найденного в собственном трафике.
- Скорборд (scoreboard) — публичная таблица результатов в реальном времени.
Частые вопросы
Чем Attack-Defense отличается от обычного CTF? Обычный (Task-Based) CTF — независимые задания, которые участники решают параллельно, не мешая друг другу. Attack-Defense — живая игра в общей сети, где сервисы соперников атакуют, а свои защищают, и флаги обновляются каждый раунд.
Обязательно ли уметь программировать? Да, минимум на уровне скриптов. Без эксплоитов и автоматической сдачи флагов формат не работает: красть флаги нужно у всех соперников и каждый раунд.
Почему нельзя просто закрыть сервис от всех? Потому что закрытый сервис не проходит проверку чекера и получает статус DOWN. Доступность входит в счёт как множитель, поэтому «наглухо защищённый» неработающий сервис теряет очки так же, как взломанный.
Зачем нужна флаг-ферма? Флаги обновляются каждый раунд, то есть каждые 1–5 минут, и красть их нужно у всех соперников сразу. Ферма запускает эксплоиты автоматически и сдаёт добытые флаги пачками — вручную такой темп не выдержать.
Что важнее: атаковать или защищаться? Счёт складывается из атаки, защиты и доступности. Провал любой из трёх составляющих дорого стоит: сервис должен работать, флаги не должны утекать, а чужие флаги приносят очки.
Можно ли играть в Attack-Defense в одиночку? Технически да, но формат рассчитан на распределение работы: атака, защита, инфраструктура и разбор трафика идут одновременно и непрерывно.
Легально ли переиспользовать чужой эксплоит из своего трафика? Да, приём replay — стандартная механика формата: всё, что попало в трафик собственной машины, доступно для анализа.
Легально ли всё происходящее? Да. Соревнование проходит в изолированной игровой сети, которую организаторы создали специально для атак и защиты. Атаковать разрешено только игровые сервисы участников соревнования, а не реальные системы.