В Attack/Defense команда одновременно защищает свои сервисы и атакует такие же сервисы соперников. Организаторы регулярно добавляют новые флаги, чекер проверяет доступность и корректность сервисов, а игровые раунды идут без пауз.
Играть можно без специальной инфраструктуры. Раньше так и делали: запускали эксплоиты из tmux, передавали флаги скриптом в проверяющую систему, открывали дампы трафика в Wireshark и правили сервисы руками. Этот подход работает, пока задач и целей мало.
Представим игру с 40 командами. У нас четыре рабочих эксплоита, каждый нужно запускать против 39 соперников в каждом раунде. Получается 156 запусков. Для каждого нужно получить актуальные цели, ограничить время работы, собрать вывод, извлечь флаги и отправить их до истечения срока действия. Параллельно команда должна смотреть входящий трафик и закрывать чужие атаки.
Эту работу можно выполнять вручную. Но тогда часть команды занимается не поиском уязвимостей, а диспетчеризацией процессов.
Инфраструктура участника автоматизирует четыре задачи: централизованную сдачу флагов, децентрализованный запуск эксплоитов, анализ и фильтрацию трафика.
1. Централизованная сдача флагов
Exploit farm, или ферма эксплоитов, — это система, которая регулярно запускает эксплоиты против команд-соперников, собирает найденные флаги и централизованно отправляет их в игровую систему.
Что выбрать: S4DFarm
Что делает: список всех целевых хостов (команд), убирание дубликатов флагов, отправка флагов в чексистему, получение статистики по заработанным поинтам, по желанию графики и т.д.
Зачем: чтобы изолировать разработку эксплоита от взаимодействия с чексистемой, участник просто разрабатывает эксплоит, который забирает флаг с сервиса, дальше этот флаг сам отправляется в конкретную чексистему по конкретному протоколу, которая запущена на текущем A/D.

2. Децентрализованный запуск эксплоитов
Ферма принимает флаги, но эксплоиты где-то должны выполняться.
На небольшой игре их можно запускать на ноутбуках авторов. На большой игре число запусков растёт как произведение трёх величин:
число эксплоитов × число целей × частота запуска
Параллельный запуск сокращает время, но увеличивает потребление ресурсов машин участников, особенно памяти и ядер процессора. Эту задачу можно решить горизонтальным масштабированием. Вместо одного большого раннера команда запускает клиенты на нескольких машинах.
Что выбрать: neo
Что делает: принимает код эксплоита и запускает его в кластере из множества хостов, интегрируется с фермой, запускает эксплоит на всех командах и отправляет все флаги в ферму.
Зачем: если неудобно вручную запускать эксплоит на всех командах локально, если не хватает ресурсов для запуска всех сплоитов, если хочется закрыть ноутбук и пойти курить кальян, но сплоиты продолжили работать.
S4DFarm выросла из DestructiveFarm, а Neo использует совместимый с DestructiveFarm API: получает конфигурацию через GET /api/get_config и передаёт флаги через POST /api/post_flags. Поэтому эти инструменты можно собрать в один стек.

3. Анализаторы трафика
Анализатор трафика — это инструмент, который перехватывает сетевые пакеты или читает их из дампа трафика, собирает пакеты в потоки и помогает находить, просматривать и разбирать запросы к сервисам.
В Attack/Defense анализатор используют, чтобы восстановить атаки соперников: увидеть переданные данные, выделить подозрительный запрос и на его основе написать эксплоит, фильтр или исправление сервиса.
Что выбрать: Packmate
Что делает: автоматически получает дампы входящего и исходящего трафика со всех сервисов (по портам), предоставляет интерфейс для просмотра стримов и запросов, поиск по всему трафику, упрощает командную работу (разметка подозрительных стримов, прямые ссылки на стримы и т.д.), шаблоны эксплоитов из трафика.
Зачем: понять как атакуют ваши сервисы, искать чужие эксплоиты и копировать их, удобно использовать, так как дампы доставляются автоматически.
Packmate работает и с текстовыми, и с бинарными сервисами. Он умеет искать обычные строки, регулярные выражения и бинарные последовательности. Найденные фрагменты подсвечиваются в пакетах.

4. Фильтрация трафика
После анализа трафика команда понимает, какой запрос эксплуатирует сервис. Лучшее решение — исправить уязвимость в коде и проверить, что чекер продолжает работать.
Но полноценный патч не всегда можно написать сразу. В таком случае команда может временно заблокировать известный способ эксплуатации перед сервисом:
чекер и соперники → прокси или фаерволл → сервис
Входящие TCP- или HTTP-сообщения проходят через фильтры. Фильтр может пропустить сообщение, изменить его или закрыть соединение.
Для stateful-протоколов фильтр получает не только текущее сообщение, но и несколько предыдущих сообщений того же TCP-соединения. Поэтому правило может учитывать контекст: например, сначала клиент авторизовался, затем вызвал опасную команду.
Что выбрать: ctf_proxy
Что делает: по сути, это firewall с удобными правилами, терминирует входящий трафик на себе, блокирует запросы, которые удовлетворяют правилам (содержат какую-то строку и т.д.), легитимные запросы пропускает в сервис.
Зачем: отрезать атаки, которые видно в трафике, без модификации сервиса

Как компоненты работают вместе
Полная схема делится на атакующий и защитный контуры.
Атакующий контур
автор эксплоита → Neo → рабочие машины → сервисы соперников → S4DFarm → игровая система
Автор передаёт эксплоит в Neo. Сервер распределяет эксплоит и цели между раннерами. Раннеры выполняют атаки и передают флаги в S4DFarm. Ферма централизованно сдаёт их и сохраняет статусы.
Защитный контур
чекер и соперники → прокси → наш сервис
сетевой интерфейс → анализатор трафика → анализ потока → новый фильтр или патч
ctf_proxy пропускает или блокирует запросы. Packmate сохраняет трафик для анализа. Найденная атака превращается во временный фильтр ctf_proxy или приводит к патчингу сервиса.

Выводы
S4DFarm, Neo, Packmate и ctf_proxy не находят уязвимости и не принимают решений за игроков. Они сокращают время между четырьмя событиями: команда написала эксплоит, получила флаг, увидела чужую атаку и закрыла её.
Цель тулинга проста: игрок занимается уязвимостью один раз, инфраструктура повторяет нужные действия до конца игры.