К содержимому
CaptureTheFlag.ru

CTF Attack-Defense: что это такое и как в него играют

Обновлено 21.08.2026

Attack-Defense (AD, «атака-защита») — формат соревнований, в котором каждой команде выдаётся идентичный сервер с набором заведомо уязвимых сервисов, все команды соединены в общую игровую сеть и на протяжении всей игры одновременно атакуют сервисы соперников и защищают собственные.

Самая наглядная аналогия: всем участникам выдали одинаковый дом с одинаковыми дырами в стенах и замках. Задача — найти эти дыры, попасть в дома соседей и вынести оттуда ценности (флаги), а параллельно залатать собственные — но так, чтобы дверь по-прежнему открывалась и почтальон (проверяющая система) мог занести новую посылку. Наглухо заколоченный дом приносит штраф за то, что «не работает».

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

Чем Attack-Defense отличается от Task-Based

КритерийTask-BasedAttack-Defense
СутьРешение независимых заданийАтака чужих сервисов и защита своих
Взаимодействие участниковОтсутствует, каждый сам по себеПрямое: сервисы соперников атакуют
ФлагиОдин флаг за задание, сдаётся один разОбновляются каждый раунд, красть нужно постоянно
Ход игрыФиксированное окно, задания открыты сразуНепрерывная игра из раундов
АвтоматизацияПочти не нужнаОбязательна: ферма, скрипты, разбор трафика
Инфраструктура участникаНе нужнаУязвимый сервер, автоматизация, запись трафика
Что определяет результатСумма очков за заданияАтака, защита и доступность сервисов

Общее у форматов — категории уязвимостей: в сервисах Attack-Defense встречаются те же классы ошибок, что и в заданиях Task-Based, — веб-уязвимости, ошибки работы с памятью, криптографические просчёты, логические дыры.

Как устроена игровая сеть

Все команды подключаются к общей игровой сети, обычно через VPN. У каждой команды есть свой vulnbox (от vulnerable box — «уязвимая машина»), он же игровой образ: виртуальная машина или сервер, на котором работают все игровые сервисы. IP-адреса участников известны, поэтому цели атаки определены заранее.

игровая сеть · доступ по VPN в обе стороны vulnbox команды одинаковые уязвимые сервисы vulnbox команды одинаковые уязвимые сервисы vulnbox команды одинаковые уязвимые сервисы жюри · gameserver кладёт свежие флаги, проверяет сервисы
атаки между командами — в обе стороны проверка сервисов чекером
Игровая сеть: каждая команда атакует каждую, жюри проверяет сервисы всех участников

Свой vulnbox команда контролирует полностью: заходит на него по SSH, читает исходники сервисов, накатывает патчи, смотрит трафик. Чужие машины доступны только снаружи — ровно так, как их видит любой атакующий в интернете.

Сервисы

Сервис — программа, которая работает на vulnbox и выполняет какие-то функции: веб-приложение, сетевой демон, API. В каждом сервисе заложена одна или несколько уязвимостей. Именно сервисы играют в Attack-Defense роль заданий: их нужно и взломать у соперников, и защитить у себя. Один и тот же сервис может хранить сразу несколько флагов в разных местах — такие места называют flag store, «хранилище флагов».

Флаги и формат флага

Флаг в Attack-Defense — приватная информация, которую проверяющая система кладёт внутрь сервиса: секретное сообщение пользователя, содержимое приватной заметки, значение в базе. Флаги имеют строгий формат, по которому их легко распознать в трафике или в ответе сервиса, — например, строка фиксированной длины из заглавных букв и цифр со служебным символом в конце.

Главное отличие от Task-Based: флаги постоянно обновляются. Старые «протухают» через несколько раундов и перестают приносить очки, а на их место кладутся новые. Один раз украсть флаг недостаточно — атаку нужно повторять раунд за раундом, а значит, автоматизировать.

Раунды

Игра разбита на короткие интервалы — раунды, или тики (tick). Обычно раунд длится от одной до пяти минут. В начале каждого раунда проверяющая система кладёт в сервисы свежие флаги и заново проверяет, что сервисы работают. Вся игра крутится вокруг раундов: за раунд нужно успеть украсть актуальные флаги у соперников и удержать собственные сервисы в рабочем состоянии.

Раунд (тик) — обычно 1–5 минут начало конец Жюри кладёт свежие флаги проверяет сервисы выставляет статусы и очки Атака эксплоиты идут по всем соперникам сразу сдача добытых флагов Защита разбор трафика и поиск дыры патч и перезапуск сервиса Флаги предыдущих раундов действуют ещё несколько тиков, затем перестают приносить очки — поэтому атака повторяется каждый раунд, а не выполняется один раз.
Что происходит внутри одного раунда

Чекер и жюри

Чекер (checker) — программа организаторов, которая эмулирует работу настоящего пользователя сервиса. Раз в раунд чекер:

  1. кладёт в сервис новые флаги;
  2. проверяет, что «старые» данные на месте и сервис отдаёт их корректно;
  3. проверяет, что вся штатная функциональность работает.

Чекер запускается с центрального сервера организаторов — его называют gameserver или «жюри». Важная деталь: gameserver не запускает эксплоиты и никого не взламывает. Он пользуется сервисом строго легально, как обычный пользователь. Поэтому патч, сломавший нормальную работу сервиса, бьёт именно по проверке чекера — и стоит очков за доступность.

Статусы сервисов

По итогам проверки чекер выставляет каждому сервису статус. Набор зависит от системы, но чаще всего он такой:

  • OK (UP) — сервис работает штатно, все проверки пройдены. Только этот статус приносит очки за доступность.
  • MUMBLE — сервис отвечает, но работает неправильно: например, отдаёт не то, что должен. Частая причина — патч, задевший легитимную логику.
  • CORRUPT — сервис работает, но теряет или портит данные: чекер положил флаг, а прочитать его обратно не смог.
  • DOWN — сервис недоступен по сети: упал, завис или закрыт наглухо.

Все проверки пройдены: сервис отвечает и отдаёт ровно то, что должен.

Раунд засчитан в доступность. Только в этом статусе сервис приносит очки.

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) — метрика доступности, показывающая, насколько стабильно работал сервис. Считается она просто:

code$ _
SLA = число раундов со статусом OK / общее число прошедших раундов

Если сервис всю игру был в статусе OK, SLA близок к 100%. Если он падал или работал неправильно, SLA проседает и штрафует итоговый счёт. Обычно SLA выступает множителем: даже при удачных атаках и надёжной защите лежащий сервис обнуляет результат.

Скорборд

Итоговый счёт — комбинация атакующих очков, защитных очков и SLA. Всё это в реальном времени отображается на скорборде — публичной таблице результатов: видно, кто кого ломает, чьи сервисы горят красным и как меняется расстановка сил.

Результат в Attack-Defense определяется одновременно тремя фронтами: атакой на соперников, защитой собственных флагов и работоспособностью сервисов. Провал любого из трёх стоит очков.

Как проходит матч

До старта

Обычно за некоторое время до открытия сети командам выдают доступ к vulnbox и зашифрованные образы сервисов. Промежуток между получением пароля для расшифровки и открытием сети между участниками — как правило, около часа. В это время команды успевают:

  • развернуть и запустить все сервисы, убедиться, что они в статусе OK;
  • сделать резервную копию исходников сервисов, чтобы было к чему откатиться;
  • поднять собственную инфраструктуру: автоматизацию запуска эксплоитов и сдачи флагов, запись трафика, доступ по SSH для всех участников;
  • бегло просмотреть исходники в поисках очевидных уязвимостей.

Как только сеть открывается, начинается живая игра: уязвимости можно эксплуатировать сразу.

Атака

Атака в Attack-Defense повторяет логику Task-Based, но с поправкой на автоматизацию:

  1. Анализ сервиса. Читаются исходники (или реверсится бинарь) собственного сервиса — он идентичен сервису соперников — и ищется уязвимость: инъекция, обход авторизации, ошибка логики, переполнение буфера.
  2. Написание эксплоита. Пишется скрипт, чаще всего на Python, который подключается к сервису по известному IP, эксплуатирует уязвимость и вытаскивает флаг. Часто помогает attack info (attack data) — служебные данные от организаторов с подсказками о том, где искать флаги: идентификаторы пользователей, пути к объектам, имена файлов.
  3. Запуск по всем соперникам. Уязвимость одинаковая у всех, поэтому эксплоит запускается сразу по всему списку участников.
  4. Сдача флагов. Добытые флаги отправляются в систему сдачи (flag submission). Вручную это делать нереально — отсюда автоматизация.

Упрощённый скелет эксплоита под автоматический запуск выглядит так — это шаблон, а не рабочая атака:

python$ _
#!/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, «ферма») — сердце инфраструктуры участника. Ферма автоматически:

  • запускает все эксплоиты по всем соперникам каждый раунд;
  • собирает напечатанные эксплоитами флаги;
  • отсеивает дубликаты и протухшие значения;
  • пачками отправляет свежие флаги в систему сдачи.
Эксплоиты на каждую уязвимость Ферма запуск по всем IP Отбор без дублей и старых Сдача пачкой в жюри и так каждый раунд: флаги в сервисах уже сменились Уязвимости у всех участников одинаковые, поэтому один эксплоит применяется ко всему списку соперников — вручную повторять это каждые пару минут невозможно, отсюда и автоматизация.
Флаг-ферма превращает один эксплоит в непрерывный поток флагов

Без автоматизации формат не работает: флаги обновляются каждые пару минут, и вручную за ними не угнаться. Существуют готовые открытые решения такого класса — их называют фермами или 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 — стандартная механика формата: всё, что попало в трафик собственной машины, доступно для анализа.

Легально ли всё происходящее? Да. Соревнование проходит в изолированной игровой сети, которую организаторы создали специально для атак и защиты. Атаковать разрешено только игровые сервисы участников соревнования, а не реальные системы.

Читайте также