Статья Организация CTF соревнований: форматы, скоринг и античит на практике

Инженер в капюшоне сидит спиной к камере перед тремя мониторами в тёмном серверном центре. На центральном экране — дашборд CTF-платформы HackerLab.pro с турнирной таблицей и категориями заданий (forensics, pwn, web, crypto, reverse, osint). Боковые экраны показывают графики сетевого трафика и таймлайн сабмитов. Холодное сине-голубое свечение, серверные стойки на заднем плане.


На прошлогоднем 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
Jeopardy проще всего организовать: нет прямого взаимодействия между командами, не нужна сетевая изоляция. Основная нагрузка - на создание и тестирование CTF заданий для соревнований. Contrast Security в руководстве по организации CTF-событий прямо пишет: написание заданий - самая трудоёмкая часть. Каждый таск нужно проверить на unintended-решения, дать другому автору пройти его и убедиться, что решение логично, а не сводится к угадыванию. Я видел, как таск по crypto за 500 очков решался через 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 соревнований о допустимых методах захвата.

Какой формат выбрать​

КритерийJeopardyAttack-DefenseKing of the Hill
Участники10-1000+10-305-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 соревнований, включая формулу, должны быть доступны участникам за неделю до начала. Иначе после финиша начинаются споры: «а мы не знали, что SLA весит 40%, мы бы не трогали сервис». И формально они правы.

Античит 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
Attack-Defense (до 20 команд):
  • Gameserver: 8 vCPU, 16 ГБ RAM
  • Vulnbox на команду: 2-4 vCPU, 4 ГБ RAM (итого 40-80 ГБ RAM на 20 команд)
  • Сетевая изоляция: VLAN или отдельные подсети
  • VPN: WireGuard (конфиг на каждую команду)
  • Деплой: Ansible - одна playbook на все vulnbox
  • Мониторинг: Prometheus + Grafana
CTFd разворачивается за 15 минут через 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-сеть - и атакующий правит себе очки напрямую в базе.

1777772892175.webp


Если ты пока на стороне игрока, а не организатора, и хочется почувствовать формат изнутри без возни с инфраструктурой — есть готовая площадка из экосистемы Codeby: HackerLab.pro. Двенадцать категорий — forensics, pwn, web, crypto, reverse, osint, steganography и другие классические для CTF — на готовом стенде, с per-team флагами и динамическим скорингом из коробки. Регистрация обязательна, зато не нужно поднимать ни PostgreSQL, ни Docker, ни VPN. Десяток тасков по разным категориям — и понимаешь, где decay начинает работать против тебя, как ловятся unintended-решения, что чувствует команда, у которой не идёт. Этот путь полезно пройти до того, как самому садиться за организацию: иначе многие решения в этой статье останутся теоретическими.

Чеклист перед стартом​

  1. Все таски прошёл второй автор - не тот, кто создавал задание
  2. Формат флагов единообразен, регулярка на платформе принимает все варианты
  3. Контейнеры web/pwn тасков стабильны (политика restart: unless-stopped)
  4. Формула скоринга опубликована в правилах за неделю до старта
  5. Rate limiting включён, брутфорс невозможен
  6. Бэкапы БД по cron каждые 15 минут
  7. Канал связи с участниками готов - Discord-сервер или Telegram-чат
  8. Нагрузочный тест пройден - 100 параллельных сабмитов не роняют скорборд
Четыре года подряд наша команда проводит Jeopardy и каждый раз видим одну и ту же ошибку у тех, кто организует впервые: слишком раннее усложнение формата. Запускают A&D, не имея опыта даже с 50-участниковым Jeopardy. Сетевая изоляция падает, чекеры не покрывают flag stores, команды теряют очки из-за багов инфраструктуры - и разочаровываются не в своих навыках, а в организаторах.

Начинайте с Jeopardy на CTFd: 20 тасков по 5 категориям, динамический скоринг, per-team флаги, rate limit. Проведите три таких соревнования, набейте руку на логистике и коммуникации. Только потом переходите к A&D, где каждая ошибка в конфигурации VLAN обходится в десятки потерянных минут для всех участников одновременно.

CTF - не про «чем сложнее формат, тем круче». Это про стабильную инфраструктуру, честный скоринг и задания, которые хочется решать, а не ругать в чате. Если хочешь не просто организовывать, а системно прокачать веб-категории, которые составляют основу любого Jeopardy - на WAPT эту цепочку проходят в течение двух модулей с лабами.
 
Последнее редактирование:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab