
Локальная платформа для Capture-the-Flag по ИИ с практическими уроками по инъекциям в промпты, злоупотреблению вызовами инструментов и OSINT против шести симулированных персон чат-ботов.
Локальный AI Capture-the-Flag с пошаговыми уроками для специалистов, впервые сталкивающихся с prompt injection. Игроки также могут исследовать шесть AI-персон (одна скрытая), которые защищают 20 флагов через prompt-injection, злоупотребление вызовами инструментов, манипуляцию бизнес-логикой, фингерпринтинг цепочки поставок, веб-разведку и OSINT.
Пошаговый путь охватывает прямую инъекцию, авторизацию инструментов и инъекцию через редактируемую статью базы знаний. Он предоставляет подсказки, сохранённые попытки, доказательства работы инструментов, обратную связь о завершении и сравнения защищённых инструментов. Оригинальные практические лаборатории сохраняют ручную оценку событий. Инференс модели выполняется локально через Ollama; после сборки и загрузки модели основной платформе не требуется подключение к интернету.
Email Joe in Product Sales добавляет симулированный почтовый ящик и рабочий стол в стиле Windows. Напишите письмо, которое прочитает ассистент Джо, затем наблюдайте за фактическим резюме модели и записанными действиями. Три цели охватывают вводящий в заблуждение коммерческий бриф, раскрытие вымышленного внутреннего файла и несанкционированную скидку. Почтовый сервер, Windows, Wine или дополнительная модель не требуются.
ai-ctf/
├── README.md ← вы здесь
├── LICENSE ← MIT
├── platform/ ← всё, что работает в Docker
│ ├── flags.toml ← центральный конфиг: редактируйте его для настройки значений флагов
│ ├── docker-compose.yml ← три сервиса: web, ollama, decoy
│ ├── Dockerfile ← образ веб-приложения
│ ├── app/ ← исходный код FastAPI (config, personas, tools, chat)
│ ├── data/init.sql ← схема SQLite + тестовые данные фейковых сотрудников
│ ├── decoy/ ← крошечный nginx с двумя страницами флагов
│ └── scripts/
│ ├── apply_flags.py ← вставляет значения из flags.toml в статические файлы
│ ├── render_secret.py ← запускается при старте контейнера
│ └── dump_chats.py ← экспортирует журнал чатов в HTML (инструмент для дня мероприятия)
├── external_artifacts/ ← то, что вы публикуете в GitHub / Gist / DNS
│ ├── README.md ← чек-лист настройки
│ ├── anvil_chatkit/ ← фейковый пакет цепочки поставок
│ ├── gist_content.md ← вставьте это в публичный Gist
│ └── dns_records.txt ← TXT-запись для добавления в ваш домен
└── docs/ ← документация для проведения мероприятия
├── ANSWER_KEY.md ← пошаговые решения + ответы для оригинальных 20 флагов
├── CHEAT_SHEET.md ← рабочие решения + многоуровневые подсказки (только для GM)
├── OPERATIONS.md ← обновления, резервные копии и устранение неполадок
├── SETUP_RUNBOOK.md ← пошаговое руководство на неделю
└── EVENT_DAY_NOTES.md ← сценарий брифинга + устранение неполадок
Используйте быстрый старт ниже для пошагового пути. Руководство по эксплуатации охватывает обновления, резервные копии, восстановление и проверки перед мероприятием. Ключ ответов, шпаргалка, руководство по настройке и заметки о мероприятии описывают опциональный оригинальный формат CTF.
apply_flags.py и
dump_chats.py — само приложение работает внутри Docker).exiftool (нужен только если вы меняете EXIF-флаг и хотите,
чтобы apply_flags.py перезаписал логотип).pip install и загрузки модели Ollama).
После этого основной локальный стек работает офлайн. Опциональная внешняя цепочка OSINT требует доступа в интернет.git clone https://github.com/mubix/ai-ctf.git
cd ai-ctf/platform
# 1. Session secret
echo "SESSION_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(32))')" > .env
# 2. (Optional) Customize flag values — see "Customizing the flags" below.
# Default values work fine for a smoke test.
# 3. Build and start
docker compose build
docker compose up -d ollama
docker compose exec ollama ollama pull qwen2.5:7b-instruct-q4_K_M
docker compose up -d
# 4. Open the platform
open http://localhost:18080/ # or your-machine-ip:18080 on another laptop
Зарегистрируйте имя пользователя; платформа сгенерирует 12-символьный пароль и покажет его один раз. Сохраните его на будущее. Вы автоматически входите в систему и можете выбрать Start learning. Возвращающиеся игроки могут войти, чтобы продолжить сохранённый прогресс.
Проект Compose называется ai-ctf и имеет собственную сеть и том модели.
Только веб-интерфейс публикует порт хоста: 18080 по умолчанию. Установите CTF_WEB_PORT
в platform/.env, чтобы выбрать другой порт. Ollama и decoy не публикуют
порты хоста; приложение подключается к собственному контейнеру Ollama. Проброс GPU не
настроен. CPU и память по-прежнему разделяются с другими рабочими нагрузками на хосте.
При обновлении стека, созданного под другим именем проекта Compose, сохраните это
имя с помощью docker compose -p YOUR_EXISTING_PROJECT ..., чтобы повторно использовать его контейнеры
и том модели. Изменение имён проектов создаёт отдельный стек.
Пошаговый урок Customer Service использует свежий токен аудита для каждой попытки, а не фиксированный токен мероприятия. Он распознаёт раскрытие в виде простого текста и отличает просмотр разобранного примера от решения без него. Свежие попытки сохраняют предыдущие разговоры и заработанный прогресс. Его профиль для начинающих намеренно доверяет заявленной роли оператора поддержки; оригинальный практический бот Customer Service остаётся отдельным. Существующие пошаговые попытки сохраняют свой прежний профиль, пока игрок не начнёт заново.
Ещё два пошаговых урока используют изолированные вымышленные фикстуры: доступ к инструментам HR, затем редактируемая статья базы знаний, которая может перенаправить симулированный ответ. Они выполняют запросы действий модели, прошедшие проверку схемы, против этих фикстурных инструментов, записывают вызовы инструментов и проверяют их результаты. Игроки могут воспроизвести те же аргументы через проверку разрешений и изучить контрольный пример легитимного использования. Это сравнение проверяет границу инструмента, а не второй запуск модели. Ничего не отправляется по почте и никакой реальный HR-сервис не подключён. Оригинальные персоны остаются самостоятельными практическими лабораториями с их оригинальными ответами и ручной оценкой.
Сценарий с электронной почтой доступен через All lessons → Email Joe. Его Проводник
использует знакомые пути, такие как C:\Users\Joe\Documents\Sales; они обозначают
фикстуры в памяти и никогда не обращаются к файловой системе хоста. Каждое письмо получает свежие вымышленные файлы,
исходящие сообщения и запись о продажах. Сюжетные события помечаются отдельно от наблюдаемой активности модели
и инструментов. Цели раскрытия файлов и изменения записей требуют выполненных действий,
а не утверждения в резюме. Включите Enforce Joe's tool permissions, чтобы перезапустить любую
цель инструмента с проверками приложения, затем отправьте чистый пример для проверки нормального использования.
Попытки, подсказки, использование разобранного примера и прогресс сохраняются.
Для существующей установки изменения приложения/шаблонов требуют пересборки веб-образа; одного перезапуска недостаточно для копирования обновлённого кода:
cd platform
docker compose up -d --build web
Таблицы уроков создаются при запуске без удаления существующих учётных записей или истории чатов. Следуйте руководству по эксплуатации, чтобы создать резервную копию существующей установки перед обновлением и убедиться, что игроки могут продолжить свои уроки afterward.
Платформа самостоятельно содержит 16 из 20 флагов. Оставшиеся 4 (#14–17) требуют
внешней инфраструктуры, которую вы публикуете сами — см.
external_artifacts/README.md. Пропустите этот шаг, если вам нужна только
внутриплатформенная половина.
Все 20 значений флагов находятся в одном файле: platform/flags.toml. Редактируйте значения
там, чтобы придать вашему мероприятию собственный колорит (другие токены flag{adjective_noun},
другой код купона, другая зарплата CEO и т. д.).
После редактирования:
cd platform
python3 scripts/apply_flags.py # stamps values into static files
docker compose up -d --build web decoy # copies updated assets into the images
apply_flags.py обновляет файлы, которые не загружаются Python во время выполнения:
data/init.sql (зарплата CEO, флаг #4)decoy/html/private/index.html и decoy/html/internal-tools/index.htmlapp/static/logo.jpg (флаг #20 — требует exiftool в PATH)external_artifacts/ (README chatkit, содержимое gist, DNS-запись,
сообщение коммита setup-history.sh)После изменения любых значений флагов также обновите docs/ANSWER_KEY.md, чтобы ваша
проверочная таблица совпадала.
Пересборка не обновляет строки сотрудников, уже находящиеся в базе данных SQLite: сид использует
INSERT OR IGNORE. Изменение зарплаты CEO в существующем мероприятии всё равно требует целевой
миграции фикстур. Не удаляйте базу данных игроков, чтобы применить это изменение.
Если вы хотите полностью добавить или удалить флаги (изменить, какие персоны существуют, убрать
внешнюю цепочку, добавить новый инструмент), редактируйте platform/app/personas/__init__.py
и platform/app/tools.py напрямую. Здесь нет DSL — персоны И ЕСТЬ
игра.
platform/app/personas/__init__.py) — меньше
защитных оговорок, меньше строк "NEVER", меньше явных примеров отказа.
Процент успеха игроков с первой попытки растёт.OLLAMA_MODEL в docker-compose.yml, загрузите эту модель,
и запустите docker compose up -d web, чтобы применить конфигурацию. Размер модели сам по себе не
определяет сложность. Перепроверьте обычные задачи, разобранные примеры, нативные вызовы инструментов
и структурированные ответы действий с помощью проверок перед мероприятием.file:// LFI через LLM.Оригинальный каталог атак и исторические примеры промптов находятся в docs/CHEAT_SHEET.md.
docs/SETUP_RUNBOOK.md — это чек-лист на неделю (сборка → внешние артефакты →
пробный запуск → день мероприятия). docs/EVENT_DAY_NOTES.md содержит сценарий брифинга игроков,
каталог многоуровневых подсказок и таблицу устранения неполадок.
Для форензики дня мероприятия — "кто на самом деле что решил?" — запустите
platform/scripts/dump_chats.py против примонтированной базы данных SQLite, чтобы создать
автономный HTML-отчёт с чипами обнаружения флагов для каждого сообщения. Это совпадения подстрок,
а не доказательство того, что ассистент раскрыл секрет или выполнил инструмент. Пошаговые
уроки хранят собственные проверенные записи о завершении.
Экспорт ctf_log.html по умолчанию, данные времени выполнения, локальные файлы окружения и релизные
архивы игнорируются Git. Храните экспорты с пользовательскими именами и резервные копии развёртывания вне
рабочей копии или в игнорируемом каталоге platform/data/. Записи игроков, учётные данные
и экспорты чатов должны оставаться приватными.
MIT. См. LICENSE.
Создано Rob Fuller (mubix) для практического обучения AI-безопасности. Код в значительной степени сгенерирован ИИ; проектные решения и контент принадлежат человеку.