ОБСУЖДЕНИЕ Статья 

Создание CTF заданий: от идеи до деплоя — практическое руководство для авторов

AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Макросъёмка одноплатного компьютера на антистатическом коврике: разъём GPIO с шлейфом, обугленная дорожка UART тускло светится красным, на радиаторе лазером выгравирована маркировка уязвимости. Ряд...


На BSidesSF 2026 автономный AI-агент решил все 52 задания и занял первое место. Не ассистировал команде - победил в одиночку. И это не приговор формату CTF. Это приговор ленивому подходу к проектированию тасков. Большинство заданий, которые автор считает «сложными», построены на паттернах из публичных writeup-ов - для модели, натренированной на миллионах таких разборов, это не задача, а поиск по индексу. Статья - полная карта процесса: от первого вопроса «чему научит мой таск» до момента, когда docker-compose up поднимает инфраструктуру на 500 участников.

Карта темы: навигатор по разработке CTF заданий​

#ПодтемаПодробнее
1Структура флага, нарратив и типичные провалы авторовКак создать CTF таск: структура флага, сторителлинг и ошибки авторов
2Кривая сложности, динамический скоринг и борьба с unintendedБалансировка сложности CTF заданий
3CTFd, kCTF, Docker-изоляция от 50 до 2000 участниковCTF инфраструктура развёртывание
4Форматы соревнований, системы подсчёта очков и античитОрганизация CTF соревнований
5Gameserver, чекеры и SLA для Attack-DefenseAttack-Defense CTF организация
6Reverse-таски: упаковщики, OEP, KeyGenРеверс-инжиниринг для CTF
7CTF как инструмент тренировки Red/Blue Team и оценки кандидатовCTF соревнования по кибербезопасности
8Первые шаги в поиске уязвимостейС чего начать искать уязвимости новичку

Образовательная цель задания - то, без чего всё остальное бессмысленно​

Каждый второй автор начинает разработку CTF задания с вопроса «какую уязвимость воткнуть». Неправильный вопрос. Правильный: какой конкретный навык отработает участник, решив этот таск? Без ответа задание превращается в головоломку ради головоломки - участник потратит час, получит флаг и не вынесет ничего применимого.

Три фильтра перед открытием редактора кода​

Прежде чем писать первую строчку кода уязвимого сервиса, прогоните идею через три вопроса:
  • Какая реальная атака моделируется? SQL injection, buffer overflow, memory forensics - таск должен отражать сценарий, который встречается на реальном пентесте или при расследовании инцидента. Задание на Base64/ROT13 в десятый раз не моделирует ничего.
  • Какой инструмент или методология отрабатывается? Если участник после решения не узнал ничего нового о Ghidra, pwntools, Wireshark или Burp Suite - задание пустое. Хорошие таски заставляют изучить конкретный инструмент в процессе решения.
  • Для какой аудитории? Easy-таск для школьников на первом CTF и easy-таск для пентестеров с опытом - два принципиально разных задания. Школьнику «прочитай robots.txt» - нормально. Пентестеру easy - это одношаговая техническая задача с реальным вектором.

Контекст реального мира​

Контекст определяет, будет ли задание полезным за пределами соревнования. Forensics-таск на артефактах Linux-десктопа - звучит нормально, пока не задашь вопрос: как часто IR-специалисты расследуют инциденты на рабочих станциях с Linux? «Скомпрометированный веб-сервер» или «дамп памяти Windows-машины с подозрительной активностью» - правдоподобнее и учит навыкам, которые пригодятся при реальном реагировании на инцидент.

Связь между CTF-заданиями и реальными техниками атак описана в MITRE ATT&CK: web-таск с эксплуатацией публичного приложения (T1190) или forensics-задание на поиск учётных данных в файлах (T1552.001) - это не абстрактные задачи, а тренировка конкретных detection-сценариев.

Подробный разбор формулирования образовательных целей и антипаттернов: Как создать CTF таск: структура флага, сторителлинг и ошибки авторов

7 категорий CTF заданий: что строить и какие навыки закладывать​

Разработка задач для CTF начинается с выбора категории. У каждой - своя специфика создания, свои грабли и свои требования к инфраструктуре.

КатегорияКлючевой навык участникаТребует контейнера?Типичная ошибка автора
WebЭксплуатация веб-уязвимостей (OWASP Top 10)ДаЗабыл закрыть .git-директорию
CryptoКриптоанализ, разбор ошибок в реализацииНет (обычно)Задание решается brute-force за секунды
PwnBinary exploitation, работа с памятьюДаНе отключил ASLR или оставил лишние gadgets
ReverseРеверс-инжиниринг бинарниковНет (обычно)Флаг лежит plaintext в строках бинарника
ForensicsАнализ дампов, артефактов, логовНетОтвет подбирается перебором трёх файлов
SteganoИзвлечение скрытых данныхНетРешается одной командой binwalk -e
PPC/MiscСкриптинг, автоматизация, нестандартное мышлениеИногдаСлишком узкое условие, единственный язык решения

Распределение по категориям в рамках одного ивента: стремитесь к 2-6 заданий на категорию (рекомендации rCTF docs) и избегайте ситуации, когда одна категория заметно тоньше других. Если нет сильного автора по crypto - лучше три качественных таска, чем шесть «для количества». Проверено: шесть слабых crypto-тасков убивают репутацию ивента надёжнее, чем полное отсутствие категории.

Для начинающих авторов и тех, кто ищет первые вектора эксплуатации: С чего начать искать уязвимости новичку

Создание web заданий CTF: от одношаговой injection до цепочек эксплойтов​

Web - самая популярная категория на большинстве CTF. И самая коварная по части unintended solutions. Автор тратит две недели на цепочку из SQL injection, bypass фильтрации и LFI, а участники за 40 минут находят .git-директорию и читают флаг из конфигурационного файла. Видел такое не раз - обидно до зубовного скрежета.

Чеклист для web-таска​

Проектирование сценария эксплуатации уязвимости для CTF:
  1. Выберите один основной вектор атаки (OWASP A03:2021 - Injection, path traversal, SSTI, deserialization). Одношаговые таски для easy, цепочки из 2-3 шагов для medium/hard.
  2. Напишите уязвимый сервис на Flask, Express или Go. Избегайте фреймворков с встроенной защитой (Django ORM по умолчанию экранирует SQL) - либо явно отключайте защиту, либо используйте raw-запросы.
  3. Уберите все непреднамеренные точки входа: .git, .env, debug-эндпоинты, стандартные учётные записи, directory listing.
  4. Добавьте «шум» - дополнительные маршруты, которые не ведут к флагу, но создают реалистичное окружение.

Пример: минимальный web-таск на SSTI​

Уязвимый Flask-сервис для категории easy - Server-Side Template Injection в Jinja2:
Python:
from flask import Flask, request, render_template_string
app = Flask(__name__)

@app.route('/greet')
def greet():
    name = request.args.get('name', 'guest')
    return render_template_string(f'Hello, {name}!')
Участник должен обнаружить, что параметр name подставляется напрямую в шаблон, и отправить {{config}} или {{7*7}} для подтверждения SSTI. Intended path - через [B]subclasses[/B] к чтению файла с флагом. Задание моделирует реальный вектор T1190 (Exploit Public-Facing Application).

После написания - прогоните dirsearch и nikto по собственному сервису. Проверьте HTTP-заголовки на утечку версий. Если сами нашли обход за 10 минут - участники найдут за 5.

Написание crypto заданий CTF: грань между математикой и решаемостью​

Crypto-таски - единственная категория, где задание может быть математически безупречным и при этом абсолютно несправедливым. Если участнику для решения нужно знать теорему, о которой он услышит впервые - это не задание, а экзамен по алгебре.

Принципы проектирования crypto-тасков​

Easy: классические шифры с известной слабостью. Цезарь с известным фрагментом plaintext, XOR с коротким ключом, RSA с маленьким e и общим модулем. Участник учится применять стандартные атаки.

Medium: ошибки реализации стандартных протоколов. AES-CBC с предсказуемым IV, повторное использование nonce в потоковом шифре, padding oracle. Нужно понимать протокол, а не просто натравить инструмент.

Hard: авторская криптосистема с неочевидной уязвимостью. Но участник должен иметь возможность обнаружить слабость через анализ предоставленного кода - не через угадывание. Если для решения нужна телепатия - это не hard, это баг.

Частая ошибка: brute-force как unintended​

Автор проектирует RSA-задание с кастомной генерацией простых чисел, рассчитывая на факторизацию через специфическую слабость. Но ключ получается настолько малым, что factordb.com возвращает ответ за секунду. Правило: перед деплоем проверьте, что размер ключа не позволяет brute-force в пределах времени соревнования. Прогоните числа через factordb и yafu. На одном ивенте видел, как «hard» RSA-таск на 512 бит был решён первым - через 4 минуты после старта. Автор потом долго оправдывался.

Генерация динамических флагов для crypto-заданий описана в гайде: Как создать CTF таск: структура флага, сторителлинг и ошибки авторов

Pwn задания CTF: разработка binary exploitation тасков​

Pwn - самая требовательная категория к инфраструктуре и к квалификации автора. Бинарник должен быть уязвимым ровно так, как задумано, и защищённым от всего остального. Тонкая грань, на которой многие спотыкаются.

Контролируемые митигации​

Каждый pwn-таск - комбинация включённых и выключенных защит. Управляйте ими явно через флаги компиляции:
Bash:
# Easy: всё выключено, простой stack overflow
gcc -o easy_pwn -fno-stack-protector -z execstack -no-pie task.c
# Medium: NX включён, нужен ROP
gcc -o med_pwn -fno-stack-protector -z noexecstack -no-pie task.c
# Hard: PIE + canary, нужен leak
gcc -o hard_pwn -fstack-protector-all -z noexecstack -pie task.c
После компиляции - checksec (из pwntools). Убедитесь, что митигации соответствуют intended difficulty. Если хотите NX, но случайно собрали с -z execstack - участники просто запихнут шеллкод на стек, и ваш ROP-таск станет easy. Классическая ошибка, встречается чаще, чем хотелось бы.

Тестирование pwn-тасков​

Напишите solve.py с использованием pwntools до того, как считаете таск готовым. Solve-скрипт - не бонус, а часть разработки. Если вы не можете написать надёжный exploit - участники тоже не смогут, но по другим причинам, и в чате поддержки будет ад.

Запустите exploit минимум 10 раз подряд. Если хотя бы одна попытка падает из-за race condition или смещения стека - исправляйте. На соревновании участник не будет разбираться, его ли это ошибка или ваша. Он просто напишет в Discord «таск сломан» - и будет прав.

Подробный разбор реверс-инжиниринга для CTF, включая анализ упаковщиков и поиск OEP: Реверс-инжиниринг для CTF: анализ упаковщиков, поиск OEP и написание KeyGen

Докеризация CTF заданий: изоляция без компромиссов​

Каждое задание, которое принимает пользовательский ввод по сети, обязано жить в контейнере. Без исключений. Участники будут запускать reverse shell, форк-бомбы и пытаться читать /etc/shadow. Ваша задача - сделать так, чтобы всё это не затронуло соседние таски и хост.

Docker compose для CTF инфраструктуры: базовые правила​

Один контейнер - одно задание. Если заданию нужен веб-сервер и база данных, используйте docker-compose с отдельными сервисами, но изолируйте сетевой доступ через internal-сети.

Минимальные базовые образы: alpine или debian-slim вместо полноценного ubuntu. Меньше поверхность атаки, быстрее сборка, меньше неожиданных бинарников, которые участник может использовать для unintended. На одном ивенте участник нашёл python3 в образе, где его быть не должно, и через него вытянул флаг - автор использовал ubuntu:latest «для удобства».

Non-root внутри контейнера. Сервис задания должен работать от непривилегированного пользователя. Даже если участник получит RCE - выход из контейнера будет значительно сложнее.

Security defaults для docker-compose​

YAML:
services:
  web-task:
    build: ./web-task
    read_only: true
    tmpfs:
      - /tmp:size=64M
    deploy:
      resources:
        limits:
          memory: 256M
          pids: 64
    networks:
      - task-net
    security_opt:
      - no-new-privileges:true
Что здесь зачем:

ДирективаЗачем
read_only: trueФайловая система только для чтения - участник не запишет бэкдор на диск
tmpfs: /tmp:size=64MОграниченный tmpfs для временных файлов
pids: 64Защита от форк-бомб
memory: 256MЛимит памяти - защита от heap spray и утечек
no-new-privilegesЗапрет эскалации привилегий через SUID-бинарники

Network isolation: для multi-container заданий используйте internal-сети, чтобы база данных не торчала наружу напрямую. Участник должен попасть к БД только через уязвимое приложение.

Детальный разбор инфраструктурных решений от 50 до 2000 участников: CTF инфраструктура развёртывание: CTFd, kCTF и Docker-изоляция

Инфраструктура для CTF: от платформы до CI/CD пайплайна​

Выбор платформы: CTFd и альтернативы​

CTFd - де-факто стандарт для jeopardy-формата. Открытый исходный код, плагинная архитектура, поддержка динамического скоринга. Разработан изначально для соревнования CSAW в NYU. Ограничение, о котором забывают: CTFd управляет логистикой (регистрация, scoreboard, сдача флагов), но не занимается провижинингом инфраструктуры заданий - это ваша головная боль.

Для Attack-Defense формата CTFd не подходит. Нужны специализированные решения с gameserver-ом, чекерами и SLA-мониторингом. Подробный разбор: Attack-Defense CTF организация: от gameserver до автоматизации SLA

rCTF - альтернатива с встроенным Docker-инстансером, который создаёт изолированные контейнеры для каждой команды и уничтожает их по таймауту. Для заданий, требующих per-team инстансов (pwn, web с persistent state), это серьёзное преимущество перед CTFd.

CI/CD: автоматический деплой заданий из Git-репозитория​

Исследователи из Университета Наварры (статья «CTF as a Service», arXiv:2603.22511) описывают архитектуру, где задания автоматически деплоятся из Git-репозитория через CI/CD пайплайн. Каждый push в ветку main запускает сборку Docker-образов, прогон тестов (включая проверку, что solve-скрипт возвращает правильный флаг) и деплой в оркестратор.

Минимальный pipeline для GitLab CI:
YAML:
test-challenge:
  script:
    - docker-compose -f challenge/docker-compose.yml up -d
    - sleep 5
    - python3 challenge/solve.py | grep -q "FLAG{"
    - docker-compose -f challenge/docker-compose.yml down
Этот подход убивает двух зайцев: автор не может задеплоить сломанное задание (CI не пропустит), и каждый таск имеет верифицированный solve-скрипт.

Конфигурация CTFd: на что обратить внимание​

Формат флага - задайте единый префикс (например, codeby{...}) и настройте case-insensitive проверку, если ваши флаги не содержат значимого регистра. Один участник, потративший 20 минут на угадывание O vs 0 - это UX-провал, а не сложность.

Dynamic scoring - очки за задание уменьшаются с количеством решений. Звучит справедливо, но на внутренних ивентах участники воспринимают потерю очков негативно. Для публичных CTF - работает. Для корпоративных - лучше статические очки. Проверено на нескольких корпоративных ивентах: динамический скоринг вызывает больше жалоб, чем мотивации.

Anti-bruteforce - CTFd поддерживает rate-limiting на сдачу флагов. Включайте всегда. 10 попыток в минуту - разумный порог.

Тестирование CTF заданий перед соревнованием: 5 этапов, которые спасают ивент​

Тестирование - самая недооценённая фаза разработки задач для CTF. Большинство провалов на живых соревнованиях связаны не с плохой идеей, а с тем, что автор не пытался сломать собственное задание.

Этап 1: Автор решает свой таск с нуля​

После написания задания подождите 2-3 дня. Потом откройте чистую среду (новый контейнер, новая VM) и решите задание, не заглядывая в исходный код. Если застряли - задание либо слишком сложное, либо у него неочевидный intended path. Два дня паузы - минимум. За это время мозг забывает «очевидные» подсказки, которые очевидны только автору.

Этап 2: Перекрёстное тестирование другим автором​

Минимум два независимых тестера на каждое задание (рекомендация из документации rCTF). Тестер не должен знать intended solution. Его задача - решить таск и зафиксировать путь решения. Путь совпадает с intended - отлично. Не совпадает - у вас unintended solution, и лучше узнать об этом сейчас.

Этап 3: Автоматизированная проверка solve-скрипта​

Каждое задание должно иметь solve.py, который на выходе даёт флаг. Прогоняйте его в CI при каждом изменении Dockerfile или кода сервиса. Один раз solve-скрипт ломается в CI - один раз вы ловите баг до деплоя.

Этап 4: Adversarial testing​

Запустите против web-таска сканер (nikto, dirsearch, sqlmap). Проверьте, что pwn-бинарник не содержит строковых утечек (strings binary | grep -i flag). Попробуйте стянуть .git, .env, docker-compose.yml через веб-сервер. На одном из ивентов автор оставил flag.txt в корне Docker-образа, доступным через directory traversal в nginx - при том, что intended path проходил через три шага эксплуатации. Участники сдали флаг через 8 минут после старта. Автор был в шоке.

Этап 5: Нагрузочное тестирование​

Если ожидается 200+ участников, запустите 50 одновременных solve-скриптов. Проверьте, что сервис не падает под нагрузкой и что лимиты pids/memory в Docker работают корректно. Fork-бомба от одного участника не должна убивать сервис для остальных.

Детальный разбор методов поиска unintended solutions и конкретные антипаттерны: Балансировка сложности CTF заданий: от кривой difficulty до борьбы с unintended solutions

Балансировка сложности: кривая difficulty для разных аудиторий​

Правильное распределение сложности - разница между ивентом, где участники уходят через час, и ивентом, о котором говорят полгода. Универсальной формулы нет, но есть проверенные отправные точки.

Распределение сложности по типу аудитории​

Тип CTFEasyMediumHardExtreme
Обучающий (студенты, первый CTF)35%35%25%5%
Конференция (опытная аудитория)10%25%40%25%
Корпоративный (смешанная аудитория)25%35%30%10%

Easy-таски решают критическую задачу - они дают участнику первый флаг. Участник, который за два часа не сдал ни одного задания, уходит. Просто встаёт и уходит. Первый флаг создаёт ощущение прогресса и мотивирует копать дальше. Обязательно включайте 1-2 таска, которые решаются за 10-15 минут.

Extreme - не «сделаю сам, потому что могу». Написать задание уровня extreme, которое будет одновременно сложным, интересным и решаемым - тяжело даже для опытного автора. Если не уверены - лучше ещё один quality medium, чем сломанный extreme, который никто не решит и который не научит ничему.

Сторителлинг как инструмент баланса​

Объединяющая тема соревнования (кинофраншиза, ретро-игры, корпоративный детектив) создаёт дополнительную мотивацию. Участник не просто «ищет SQL injection» - он проникает в систему антагониста. Тема также даёт естественный способ встраивать подсказки через элементы сюжета, а не через прямые указания.

Пример: задание называется «Financial PATH», описание - история сотрудника, чей «карьерный путь» привёл к финансовым секретам. Слово PATH - подсказка на path traversal. Для новичка незаметно, для внимательного участника - вектор атаки. Такие штуки работают лучше, чем «hint: посмотрите на URL».

CTF как инструмент тренировки и оценки команд: CTF соревнования по кибербезопасности: тренировка Red/Blue Team и оценка кандидатов в ИБ

Деплой CTF заданий: чеклист автора перед стартом соревнования​

За неделю до ивента каждое задание проходит финальную проверку. Чеклист ниже собран из опыта нескольких десятков соревнований и рекомендаций документации rCTF.

Pre-event чеклист для каждого таска​

  • [ ] Задание решаемо с предоставленными материалами. Если есть файлы для скачивания - проверить, что это правильные версии (авторы часто обновляют код, забывая пересобрать архив)
  • [ ] solve.py выводит корректный флаг
  • [ ] Флаг соответствует ожидаемому формату (PREFIX{...})
  • [ ] Прогнан перекрёстный плейтест (минимум 2 тестера)
  • [ ] Удалённые сервисы доступны и стабильны
  • [ ] Docker-контейнеры собираются и запускаются без ошибок
  • [ ] Авторский writeup написан и доступен команде поддержки
  • [ ] Флаг не гуглится (прогоните через поисковик)
  • [ ] Промежуточные данные (пароли, ключи в задании) не гуглятся
  • [ ] Нет утечек в публичные репозитории, Pastebin, gist
  • [ ] dirsearch/nikto по web-таску не выявляет непреднамеренных путей
  • [ ] strings по бинарнику не выдаёт флаг в plaintext
  • [ ] Security defaults в Docker включены (read_only, pids limit, memory limit)

Таймлайн подготовки ивента​

Начинайте минимум за 2-3 месяца. Один рабочий график:
  • 3 месяца до старта: выбор даты, общий план заданий, проверка CTFtime на конфликты с крупными CTF, контакт со спонсорами.
  • 2 месяца до старта: начало написания заданий.
  • 2 недели до старта: заморозка новых идей. Фокус на плейтест, ревизии, настройку платформы и инфраструктуры.
  • 1 неделя до старта: финализация всех заданий, открытие регистрации, подготовка Discord для участников.
Подробнее о форматах соревнований, системах подсчёта очков и мерах против читерства: Организация CTF соревнований: форматы, скоринг и античит на практике

AI и будущее CTF: почему старые паттерны больше не работают​

CTFAgent на базе GPT-4o и Gemini-2.5-Pro превосходит 88% человеческих команд в полностью автоматическом режиме на задачах PicoCTF. Специализированный crypto-агент KryptoPilot показывает 100% solve rate на бенчмарке InterCode-CTF. Мультиагентные системы вроде D-CIPHER координируют planner- и executor-агентов для покрытия всех категорий. Цифры неприятные, но игнорировать их - себе дороже.

Почему большинство заданий падают перед AI​

AI-модели обучены на датасетах, включающих writeup-ы, exploit-базы и документацию. Когда задание следует известному паттерну - стандартный buffer overflow, типовой SQL injection, задокументированная криптографическая слабость - модель не рассуждает, а находит совпадение в обучающих данных. Исследователи NYU (NYU CTF Bench) подтвердили: модели справляются с паттерн-задачами, но ломаются на multi-step reasoning в незнакомых контекстах. Команда CTFusion показала, что при использовании только live-задач, никогда не появлявшихся в обучающих данных, производительность агентов резко падает.

По сути, AI решает CTF-задания так же, как плохой студент решает экзамен - по шпаргалке. Если задача есть в шпаргалке - ответ мгновенный. Если нет - ступор.

5 принципов проектирования AI-устойчивых заданий​

  1. Оригинальные уязвимости. Кастомные приложения с авторскими логическими багами, нестандартные реализации протоколов, уникальные комбинации технологий - заставляют рассуждать, а не извлекать из памяти.
  2. Неоднозначность и необходимость суждений. Incident response-сценарии с одновременным триажем нескольких алертов, forensics с misleading evidence, оценка бизнес-воздействия - AI плохо справляется с контекстуальными суждениями.
  3. Динамическое окружение. Attack-Defense с ротацией флагов каждые 1-5 минут, где нужно поддерживать exploit-ы и патчить собственные сервисы одновременно.
  4. Взаимодействие с live-системами. Задания, требующие работы с реальной сетью или инфраструктурой, которую невозможно полностью симулировать в промпте.
  5. Командная координация. Форматы, требующие real-time взаимодействия людей с разными ролями (network defense, forensics, коммуникация) - автономным агентам координация между ролями пока недоступна.
Вывод для авторов: цель не в том, чтобы сделать задания «сложнее». Цель - сделать их менее предсказуемыми. Оригинальный jeopardy-таск с кастомным сценарием тестирует реальный аналитический навык, который AI пока не может воспроизвести.

Куда движется разработка задач для CTF​

Три вектора определят следующие 1-2 года:

Персонализация инфраструктуры. Модель «один сервис на всех» уходит. Архитектуры вроде CTF-as-a-Service (описанной исследователями из UPNA) с per-team инстансами через Docker Swarm или kCTF становятся стандартом. Это усложняет инфраструктуру, но устраняет целый класс проблем: утечку флагов между командами, race condition при эксплуатации shared-сервисов, DoS одного задания, убивающий доступ для всех.

Scoring beyond flags. Оценка только по сданным флагам оптимизирует именно то поведение, в котором AI уже сильнее людей. Скоринг, учитывающий документацию процесса, defensive actions и time-to-detect, меняет правила игры. CSAW Agentic Automated CTF уже требует от участников предоставлять полные траектории решений.

Writeup до деплоя - обязательно. Если writeup не написан до того, как задание попало на платформу - задание не готово. Writeup - не бонус, а инструмент верификации: он фиксирует intended solution, проверяет воспроизводимость и закрепляет образовательную цель.

Большинство авторов CTF-заданий тратят 80% времени на проектирование intended path и 0% - на попытку сломать собственный таск. Результат предсказуем: на каждом втором ивенте хотя бы один таск сдаётся через unintended за первые 40 минут. И те же авторы потом жалуются на «нечестных» участников, хотя проблема - в отсутствии adversarial testing.

Ещё одна закономерность, которую мало кто признаёт вслух: большинство «hard»-заданий на современных CTF - не hard для AI-агентов. Они hard для людей, которые не читали нужный writeup, и trivial для модели, которая «прочитала» все writeup-ы за последние 10 лет. Настоящая сложность - в оригинальности сценария, а не в количестве шагов. Таск из одного шага с авторской логической ошибкой в кастомном протоколе сложнее для автоматизации, чем пятишаговая цепочка из стандартных OWASP-уязвимостей.

Авторы, которые поймут это раньше других, будут определять формат соревнований на ближайшие годы. Остальные продолжат удивляться, почему их CTF «решается ботами». Попробуйте прямо сейчас: возьмите свой последний таск, скормите его GPT-4o и посмотрите, за сколько секунд он выдаст solve. Если ответ - меньше минуты - вы знаете, что делать.

Совсем скоро на HackerLab появятся лабы, которые не решаются копипастой из writeup-а и не решаются AI.
 
Последнее редактирование:

Ещё по теме