
Plataforma local de Capture-the-Flag com IA, com lições guiadas sobre injeção de prompt, abuso de chamadas de ferramentas e OSINT contra seis personas de chatbot simuladas.
Um AI Capture-the-Flag local com lições guiadas para profissionais de tecnologia que estão começando em prompt injection. Os jogadores também podem explorar seis personas de IA (uma oculta) que protegem 20 flags por meio de prompt-injection, abuso de tool-call, manipulação de lógica de negócio, fingerprinting de supply-chain, reconhecimento web e OSINT.
O caminho guiado cobre injeção direta, autorização de ferramentas e injeção por meio de um artigo de conhecimento editável. Ele fornece dicas, tentativas salvas, evidências de ferramentas, feedback de conclusão e comparações de ferramentas protegidas. Os laboratórios de prática originais mantêm a pontuação manual de eventos. A inferência do modelo roda localmente via Ollama; após o build e o download do modelo, a plataforma principal não precisa de conexão com a internet.
Email Joe in Product Sales adiciona uma caixa de entrada simulada e uma área de trabalho no estilo Windows. Escreva um e-mail que o assistente do Joe lerá, depois observe o resumo real do modelo e as ações registradas. Três objetivos cobrem um briefing de vendas enganoso, a divulgação de um arquivo interno fictício e um desconto não autorizado. Nenhum servidor de e-mail, Windows, Wine ou modelo adicional é necessário.
ai-ctf/
├── README.md ← você está aqui
├── LICENSE ← MIT
├── platform/ ← tudo o que roda no Docker
│ ├── flags.toml ← config central: edite isto para personalizar os valores das flags
│ ├── docker-compose.yml ← três serviços: web, ollama, decoy
│ ├── Dockerfile ← a imagem do app web
│ ├── app/ ← código-fonte FastAPI (config, personas, tools, chat)
│ ├── data/init.sql ← esquema SQLite + dados de seed de funcionários falsos
│ ├── decoy/ ← nginx minúsculo com duas páginas de flag
│ └── scripts/
│ ├── apply_flags.py ← grava os valores de flags.toml nos arquivos estáticos
│ ├── render_secret.py ← roda na inicialização do contêiner
│ └── dump_chats.py ← exporta o log de chat como HTML (ferramenta do dia do evento)
├── external_artifacts/ ← o que você publica no GitHub / Gist / DNS
│ ├── README.md ← checklist de configuração
│ ├── anvil_chatkit/ ← o pacote falso de supply-chain
│ ├── gist_content.md ← cole isto em um Gist público
│ └── dns_records.txt ← registro TXT a adicionar ao seu domínio
└── docs/ ← a papelada para rodar o evento
├── ANSWER_KEY.md ← soluções guiadas + respostas originais das 20 flags
├── CHEAT_SHEET.md ← soluções funcionais + dicas em níveis (somente GM)
├── OPERATIONS.md ← atualizações, backups e solução de problemas
├── SETUP_RUNBOOK.md ← semana do evento, passo a passo
└── EVENT_DAY_NOTES.md ← script de briefing + solução de problemas
Use o quick start abaixo para o caminho guiado. O guia de operações cobre atualizações, backups, recuperação e verificações pré-evento. O answer key, o cheat sheet, o setup runbook e as notas do evento descrevem o formato opcional do CTF original.
apply_flags.py e
dump_chats.py — o app em si roda dentro do Docker).exiftool (necessário apenas se você alterar a flag de EXIF e quiser que
apply_flags.py regrave o logo).pip install e o pull do modelo Ollama).
Depois disso, a stack local principal roda offline. A cadeia externa opcional de OSINT precisa de acesso à internet.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
Registre um nome de usuário; a plataforma gera uma senha de 12 caracteres e a mostra uma vez. Guarde-a para depois. Você é autenticado automaticamente e pode selecionar Start learning. Jogadores que retornam podem fazer login para retomar o progresso salvo.
O projeto Compose se chama ai-ctf e tem sua própria rede e volume de modelo.
Apenas a UI web publica uma porta no host: 18080 por padrão. Defina CTF_WEB_PORT
em platform/.env para escolher outra porta. O Ollama e o decoy não têm portas
publicadas no host; o app se conecta ao seu próprio contêiner Ollama. Nenhum passthrough de GPU está
configurado. CPU e memória ainda são compartilhadas com outras cargas de trabalho no host.
Se estiver atualizando uma stack criada sob um nome de projeto Compose diferente, mantenha esse
nome com docker compose -p YOUR_EXISTING_PROJECT ... para reutilizar seus contêineres
e volume de modelo. Alterar os nomes de projeto cria uma stack separada.
A lição guiada de Customer Service usa um token de auditoria novo por tentativa em vez do token fixo do evento. Ela reconhece divulgações em texto simples e distingue ver o exemplo resolvido de resolver sem ele. Tentativas novas preservam conversas anteriores e o progresso conquistado. Seu perfil de iniciante confia deliberadamente em um papel alegado de operador de suporte; o bot original de prática de Customer Service permanece separado. Tentativas guiadas existentes mantêm seu perfil anterior até que o jogador comece do zero.
Mais duas lições guiadas usam fixtures fictícias isoladas: acesso a ferramentas de RH, depois um artigo de conhecimento editável que pode redirecionar uma resposta simulada. Elas executam solicitações de ação de modelo validadas por esquema contra essas ferramentas de fixture, registram as chamadas de ferramentas e validam seus resultados. Os jogadores podem repetir os mesmos argumentos por meio de uma verificação de permissão e inspecionar um controle de uso legítimo. Essa comparação verifica o limite da ferramenta, não uma segunda execução do modelo. Nada é enviado por e-mail e nenhum serviço real de RH está conectado. As personas originais permanecem laboratórios de prática autodirigidos com suas respostas originais e pontuação manual.
O cenário de e-mail está disponível em All lessons → Email Joe. Seu File Explorer
usa caminhos familiares como C:\Users\Joe\Documents\Sales; eles identificam
fixtures em memória e nunca acessam o sistema de arquivos do host. Cada e-mail recebe arquivos fictícios novos,
uma caixa de saída e um registro de vendas. Eventos da história são rotulados separadamente da atividade observada do modelo
e das ferramentas. Os objetivos de divulgação de arquivo e alteração de registro exigem ações executadas,
não uma alegação no resumo. Ative Enforce Joe's tool permissions para reexecutar qualquer
objetivo de ferramenta com verificações da aplicação, depois envie um exemplo limpo para verificar o uso normal.
Tentativas, dicas, uso de exemplo resolvido e progresso são salvos.
Para uma instalação existente, alterações na aplicação/templates exigem reconstruir a imagem web; apenas reiniciar não copia o código atualizado:
cd platform
docker compose up -d --build web