На прошлогоднем Jeopardy с 300+ участниками скорборд лёг на 40-й минуте. Динамический скоринг в CTFd пересчитывал стоимость тасков при каждом сабмите, а база данных - SQLite по дефолту. Перезапуск, миграция на PostgreSQL, потеря двух раундов и час разборок в чате с участниками. Одна конфигурационная ошибка, которую наша команда поймала бы на тесте за 10 минут. Организация CTF соревнований - не про «закинул таски на платформу и открыл регистрацию». Это инженерная задача, где каждая деталь - от формулы скоринга до rate limit на сабмиты - определяет, будет соревнование рабочим или превратится в хаос.
Три формата CTF - три разных инфраструктуры
CTF формат Jeopardy (Task-Based)
Jeopardy - самый распространённый формат. Команды решают набор независимых заданий из разных категорий: web, crypto, pwn, reverse, forensics, OSINT, stegano, misc. Каждый таск содержит скрытый флаг - строку видаflag{s0m3_t3xt}, которую нужно извлечь и отправить на платформу в обмен на очки.Параметры, которые надо зафиксировать до старта:
- Длительность: 24-72 часа (онлайн) или 6-8 часов (очно)
- Масштабируемость: от 10 до 1000+ команд без изменения инфраструктуры
- Инфраструктура: центральный сервер с self-host платформой (CTFd 3.x — open-source стандарт), контейнеры для web/pwn тасков. Если организация не цель, а хочется сразу играть на готовой инфре — есть managed-альтернативы вроде HackerLab.pro из экосистемы Codeby, про них чуть ниже.
- Категории: стандартный набор для соревнований уровня CSAW CTF, PicoCTF - web, crypto, pwn, reverse, forensics, OSINT, stegano, misc
strings на бинарнике - автор забыл убрать дебаг-вывод. Второй автор нашёл бы это за минуту.Ограничения формата: Jeopardy не тестирует навыки защиты и работу в реальном времени. Участники не взаимодействуют друг с другом напрямую - это соревнование «каждый против задач», а не «команда против команды». Для тех, кто идёт к OSCP или работает в blue team, этого недостаточно.
Attack-Defense CTF
Attack-Defense - оригинальный формат CTF, приближённый к реальному противостоянию. Каждая команда получает идентичный сервер (vulnbox) с набором уязвимых сервисов. Задача - эксплуатировать уязвимости на серверах противников для захвата флагов (Exploit Public-Facing Application, T1190) и одновременно патчить свои сервисы, не ломая их функциональность.Игра идёт по тикам - раундам длительностью 1-5 минут. Каждый тик gameserver размещает свежие флаги в сервисах всех команд и проверяет их доступность. По данным maplebacon.org, типичное A&D-соревнование длится 6-10 часов и требует постоянного присутствия всей команды. Отошёл на обед - потерял 20 тиков.
Три источника очков:
| Компонент | Что даёт очки | Как потерять |
|---|---|---|
| Attack Points | Эксплуатация сервиса противника, сабмит его флага | Не нашли уязвимость - нет атакующих очков |
| Defense Points | Отсутствие успешных атак на ваш сервис | Противник эксплуатировал - потеря defense |
| SLA Points | Сервис работает и проходит проверки gameserver | Агрессивный патч сломал функциональность |
Gameserver отслеживает состояние каждого сервиса:
OK, DOWN, FAULTY, FLAG_NOT_FOUND, RECOVERING. Если команда «запатчила» сервис, просто заблокировав все подключения, чекер зафиксирует DOWN и команда потеряет SLA-очки. Вот он, ключевой баланс: нельзя выключить сервис и стать неуязвимым. На каждом A&D хотя бы одна команда наступает на эти грабли - iptables -P INPUT DROP и радостное «нас никто не сломает». Через тик - SLA в нуле.Инфраструктура A&D на порядок сложнее Jeopardy. Нужна сетевая изоляция между командами (VLAN), VPN-доступ (обычно WireGuard), gameserver для размещения флагов и проверки SLA, система чекеров. Open-source решения: ctf-gameserver.org (используется в FAUST CTF), ENOWARS infrastructure. Для деплоя vulnbox на 20 команд используется Ansible - одна playbook разворачивает идентичные серверы с уязвимыми сервисами.
King of the Hill CTF
King of the Hill (KotH) - редкий формат, где команды соревнуются за контроль над общим ресурсом. Очки начисляются за время удержания. По данным maplebacon.org, KotH обычно встречается как часть более крупных A&D-соревнований вроде DEF CON CTF Finals (12 команд), а не как самостоятельный формат.Главная организаторская головная боль KotH - DoS соседей (Endpoint Denial of Service, T1499). Без жёстких правил команды начинают ронять сервисы противников вместо эксплуатации уязвимостей. Зачем искать SQLi, если можно
hping3 --flood? Необходимы: мониторинг сетевого трафика, штрафы за деструктивные действия, явные правила CTF соревнований о допустимых методах захвата.Какой формат выбрать
| Критерий | Jeopardy | Attack-Defense | King of the Hill |
|---|---|---|---|
| Участники | 10-1000+ | 10-30 | 5-20 |
| Сложность организации | Низкая | Высокая | Средняя |
| Сетевая изоляция | Нет | Да (VLAN + VPN) | Да |
| Навыки защиты | Нет | Да | Частично |
| Подходит новичкам | Да | Нет | Нет |
| Команда организаторов | 2-3 человека | 5-8 человек | 4-6 человек |
| Длительность | 24-48 ч (онлайн) | 6-10 ч | 4-8 ч |
Для CTF начинающих организаторов - однозначно Jeopardy. Для опытных команд, которые уже провели 3-5 Jeopardy и хотят усложнить формат - Attack-Defense.
Скоринг CTF: от статики до decay-функций
Статический и динамический скоринг
Статический скоринг: каждому таску заранее назначается фиксированное количество очков - 100 за easy, 200 за medium, 500 за hard. Прозрачно, но хрупко: если организатор ошибся в оценке сложности и «хард» за 500 очков решили 80% команд - баланс сломан. Я такое видел на региональном CTF: таск по pwn за 500 очков оказался проще, чем web за 200. Топ-10 определялся тем, кто первый догадался открыть pwn-категорию.Динамический скоринг CTF (decay) решает проблему автоматически. Стоимость таска уменьшается по мере того, как его решают. CTFd поддерживает это из коробки:
Код:
value = max(minimum, initial - decay * (solves - 1))
initial=500, minimum=50, decay=15 таск, который решили 30 команд, стоит max(50, 500 - 15*29) = max(50, 65) = 65 очков. Таск, который решила одна команда, стоит 500.По данным emergentmind.com, есть и более сложные модели: time-decay (очки убывают со временем, независимо от решений) и rank-based (первый решивший получает бонус с геометрическим убыванием для последующих). На практике для соревнований до 300 участников стандартного decay в CTFd хватает за глаза.
Скоринг в Attack-Defense
В A&D gameserver рассчитывает очки по трём компонентам каждый тик. Весовые коэффициенты определяют стратегию команд:- Высокий вес SLA - команды фокусируются на стабильности, патчат осторожно
- Высокий вес attack - стимулирует агрессивную эксплуатацию
- Высокий вес defense - поощряет быстрое закрытие уязвимостей
Античит CTF: как ловить шаринг флагов и брутфорс
Fingerprinting флагов и rate limiting
Флаг-шаринг - главная боль Jeopardy. Команда A решает таск, передаёт флаг команде B. Три уровня защиты:Per-team флаги: каждая команда получает уникальный флаг для одного задания. Реализуется через соль:
flag{sha256(task_id + team_id + secret)}. Если две команды сдали одинаковый флаг - шаринг очевиден. CTFd поддерживает через плагины; managed-платформы вроде HackerLab.pro обычно реализуют это в стандартной поставке без дополнительной настройки.Rate limiting на сабмиты: без ограничений команды могут брутфорсить флаги (Brute Force, T1110). Стандарт - не более 10 попыток в минуту на команду с нарастающим кулдауном. В CTFd настраивается через параметр
RATELIMIT_DEFAULT.Мониторинг аномалий: резкий всплеск сабмитов, идентичное время решения у двух команд, решение тасков в нелогичном порядке (hard до easy). По данным emergentmind.com, хорошо работают эвристики по таймингам: синхронные сабмиты с разницей менее 30 секунд - повод копнуть глубже. Для мониторинга - связка Grafana + ClickHouse с экспортом логов сабмитов.
SLA-проверки и чекеры в Attack-Defense
В A&D античит встроен в механику. Чекер - Python-скрипт, который каждый тик: размещает новый флаг в сервисе, проверяет, что флаг извлекается штатным способом, тестирует базовую функциональность.Типичная ловушка (и я на неё наступал): чекер проверяет только
GET /, а уязвимость сидит в POST /api/secret. Команда отключает API, сохраняет SLA и становится неуязвимой. Поэтому чекеры нужно тестировать так же тщательно, как сами сервисы - покрывать все flag stores и основные эндпоинты. Правило простое: если через эндпоинт можно утащить флаг - чекер обязан его проверять.CTF платформа и инфраструктура
Требования к окружению
Jeopardy (до 300 участников):- Сервер: 4 vCPU, 8 ГБ RAM, 50 ГБ SSD
- ОС: Ubuntu 22.04 LTS или Debian 12
- Платформа: CTFd 3.x (GitHub ~5.5k звёзд, активно поддерживается) для self-host
- БД: PostgreSQL 15+ (не SQLite - под нагрузкой ляжет, проверено на собственной шкуре)
- Контейнеризация: Docker 24+, docker-compose
- Сеть: стабильный канал 100+ Мбит/с, публичный IP или CDN
- Gameserver: 8 vCPU, 16 ГБ RAM
- Vulnbox на команду: 2-4 vCPU, 4 ГБ RAM (итого 40-80 ГБ RAM на 20 команд)
- Сетевая изоляция: VLAN или отдельные подсети
- VPN: WireGuard (конфиг на каждую команду)
- Деплой: Ansible - одна playbook на все vulnbox
- Мониторинг: Prometheus + Grafana
docker-compose up, поддерживает динамический скоринг, плагины и интеграцию с Discord. Для A&D - ctf-gameserver.org (open-source, используется в FAUST CTF) или ENOWARS infrastructure.Принципиальный момент - изоляция тасков. Не хостите задания на том же сервере, что и CTF платформу. Если участник получит RCE через pwn-таск и дотянется до базы CTFd - соревнование окончено. Минимум: Docker с
--network=none для бинарных тасков и отдельная подсеть для web-тасков. Для A&D проблема ещё острее - компрометация gameserver через vulnbox означает полную манипуляцию скорингом (Data Manipulation, T1565). Один vulnbox с пробросом в management-сеть - и атакующий правит себе очки напрямую в базе.Если ты пока на стороне игрока, а не организатора, и хочется почувствовать формат изнутри без возни с инфраструктурой — есть готовая площадка из экосистемы Codeby: HackerLab.pro. Двенадцать категорий — forensics, pwn, web, crypto, reverse, osint, steganography и другие классические для CTF — на готовом стенде, с per-team флагами и динамическим скорингом из коробки. Регистрация обязательна, зато не нужно поднимать ни PostgreSQL, ни Docker, ни VPN. Десяток тасков по разным категориям — и понимаешь, где decay начинает работать против тебя, как ловятся unintended-решения, что чувствует команда, у которой не идёт. Этот путь полезно пройти до того, как самому садиться за организацию: иначе многие решения в этой статье останутся теоретическими.
Чеклист перед стартом
- Все таски прошёл второй автор - не тот, кто создавал задание
- Формат флагов единообразен, регулярка на платформе принимает все варианты
- Контейнеры web/pwn тасков стабильны (политика
restart: unless-stopped) - Формула скоринга опубликована в правилах за неделю до старта
- Rate limiting включён, брутфорс невозможен
- Бэкапы БД по cron каждые 15 минут
- Канал связи с участниками готов - Discord-сервер или Telegram-чат
- Нагрузочный тест пройден - 100 параллельных сабмитов не роняют скорборд
Начинайте с Jeopardy на CTFd: 20 тасков по 5 категориям, динамический скоринг, per-team флаги, rate limit. Проведите три таких соревнования, набейте руку на логистике и коммуникации. Только потом переходите к A&D, где каждая ошибка в конфигурации VLAN обходится в десятки потерянных минут для всех участников одновременно.
CTF - не про «чем сложнее формат, тем круче». Это про стабильную инфраструктуру, честный скоринг и задания, которые хочется решать, а не ругать в чате. Если хочешь не просто организовывать, а системно прокачать веб-категории, которые составляют основу любого Jeopardy - на WAPT эту цепочку проходят в течение двух модулей с лабами.
Последнее редактирование: