
프롬프트 인젝션, 도구 호출 악용, 그리고 6개의 시뮬레이션된 챗봇 페르소나를 대상으로 한 OSINT에 관한 가이드 레슨을 제공하는 로컬 AI 캡처 더 플래그 플랫폼.
프롬프트 인젝션이 처음인 기술자를 위한 안내형 레슨이 포함된 로컬 AI Capture-the-Flag. 플레이어는 프롬프트 인젝션, 도구 호출 악용, 비즈니스 로직 조작, 공급망 핑거프린팅, 웹 정찰, OSINT를 통해 20개의 플래그를 보호하는 여섯 개의 AI 페르소나(하나는 숨겨짐)를 탐색할 수도 있습니다.
안내 경로는 직접 인젝션, 도구 권한 부여, 편집 가능한 지식 문서를 통한 인젝션을 다룹니다. 힌트, 저장된 시도, 도구 증거, 완료 피드백, 보호된 도구 비교를 제공합니다. 원래의 연습 랩은 수동 이벤트 채점을 유지합니다. 모델 추론은 Ollama를 통해 로컬에서 실행되며, 빌드와 모델 다운로드 후에는 핵심 플랫폼에 인터넷 연결이 필요하지 않습니다.
Email Joe in Product Sales는 시뮬레이션된 받은편지함과 Windows 스타일 데스크톱을 추가합니다. Joe의 어시스턴트가 읽을 이메일을 작성한 다음, 실제 모델 요약과 기록된 작업을 확인하세요. 세 가지 목표는 오해를 유발하는 영업 브리프, 가상의 내부 파일 공개, 무단 할인을 다룹니다. 메일 서버, 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이며 자체 네트워크와 모델 볼륨을 가집니다.
웹 UI만 호스트 포트를 게시합니다: 기본적으로 18080. 다른 포트를 선택하려면
platform/.env에서 CTF_WEB_PORT를 설정하세요. Ollama와 decoy는 게시된
호스트 포트가 없으며, 앱은 자체 Ollama 컨테이너에 연결됩니다. GPU 패스스루는
구성되지 않습니다. CPU와 메모리는 여전히 호스트의 다른 워크로드와 공유됩니다.
다른 Compose 프로젝트 이름으로 생성된 스택을 업그레이드하는 경우, 해당
이름을 docker compose -p YOUR_EXISTING_PROJECT ...로 유지하여 컨테이너와
모델 볼륨을 재사용하세요. 프로젝트 이름을 변경하면 별도의 스택이 생성됩니다.
안내형 Customer Service 레슨은 고정 이벤트 토큰 대신 시도마다 새로운 감사 토큰을 사용합니다. 평문 공개를 인식하고, 예제를 보면서 해결한 것과 보지 않고 해결한 것을 구분합니다. 새로운 시도는 이전 대화와 획득한 진행 상황을 보존합니다. 초보자 프로필은 의도적으로 주장된 지원 운영자 역할을 신뢰합니다. 원래의 Customer Service 연습 봇은 별도로 유지됩니다. 기존 안내형 시도는 플레이어가 새로 시작할 때까지 이전 프로필을 유지합니다.
두 개의 추가 안내형 레슨은 격리된 가상 픽스처를 사용합니다: HR 도구 접근, 그다음 시뮬레이션된 응답을 리디렉션할 수 있는 편집 가능한 지식 문서. 이들은 해당 픽스처 도구에 대해 스키마 검증된 모델 작업 요청을 실행하고, 도구 호출을 기록하며, 결과를 검증합니다. 플레이어는 권한 검사를 통해 동일한 인수를 재생하고 정당한 사용 제어를 검사할 수 있습니다. 이 비교는 두 번째 모델 실행이 아니라 도구 경계를 확인합니다. 이메일은 발송되지 않으며 실제 HR 서비스도 연결되지 않습니다. 원래 페르소나는 원래 답변과 수동 채점을 가진 자기 주도형 연습 랩으로 남습니다.
이메일 시나리오는 All lessons → Email Joe에서 사용할 수 있습니다. File Explorer는
C:\Users\Joe\Documents\Sales와 같은 친숙한 경로를 사용하며, 이는 메모리 내 픽스처를
식별할 뿐 호스트 파일 시스템에 접근하지 않습니다. 각 이메일은 새로운 가상 파일, 발신함,
영업 기록을 받습니다. 스토리 이벤트는 관찰된 모델 및 도구 활동과 별도로 레이블이 지정됩니다.
파일 공개 및 기록 변경 목표는 요약의 주장이 아니라 실행된 작업을 요구합니다.
Enforce Joe's tool permissions를 활성화하여 애플리케이션 검사로 두 도구 목표 중 하나를
다시 실행한 다음, 정상 사용을 확인하기 위해 깨끗한 예제를 보내세요. 시도, 힌트, 예제 사용,
진행 상황이 저장됩니다.
기존 설치의 경우 애플리케이션/템플릿 변경에는 웹 이미지 재빌드가 필요합니다. 재시작만으로는 업데이트된 코드가 복사되지 않습니다:
cd platform
docker compose up -d --build web
레슨 테이블은 기존 계정이나 채팅 기록을 삭제하지 않고 시작 시 생성됩니다. 업데이트 전에 기존 설치를 백업하고 플레이어가 이후 레슨을 이어갈 수 있는지 확인하려면 운영 가이드를 따르세요.
플랫폼은 20개 플래그 중 16개를 자체 포함합니다. 나머지 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 EXIF 메타데이터 (플래그 #20 — PATH에 exiftool 필요)external_artifacts/ 파일 (chatkit README, 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" 줄, 명시적 거부 예시를 줄입니다.
플레이어의 첫 시도 성공률이 올라갑니다.docker-compose.yml에서 OLLAMA_MODEL을 편집하고, 해당 모델을 풀한 다음,
docker compose up -d web을 실행하여 구성을 적용합니다. 모델 크기만으로는 난이도가
확립되지 않습니다. 이벤트 전 점검을 사용하여
정상 작업, 예제, 네이티브 도구 호출, 구조화된 작업 응답을 다시 확인하세요.file:// LFI를 트리거합니다.원래 공격 카탈로그와 과거 예시 프롬프트는 docs/CHEAT_SHEET.md에 있습니다.
docs/SETUP_RUNBOOK.md는 이벤트 주간 체크리스트입니다 (빌드 → 외부 아티팩트 →
드라이 런 → 이벤트 당일). docs/EVENT_DAY_NOTES.md에는 플레이어 브리핑 스크립트,
단계별 힌트 카탈로그, 문제 해결 표가 있습니다.
이벤트 당일 포렌식 — "누가 실제로 무엇을 해결했는가?" — 를 위해
바인드 마운트된 SQLite DB에 대해 platform/scripts/dump_chats.py를 실행하여
메시지별 플래그 감지 칩이 포함된 자체 포함 HTML 보고서를 생성하세요. 이는 부분 문자열
일치이며, 어시스턴트가 시크릿을 공개했거나 도구를 실행했다는 증거가 아닙니다. 안내형
레슨은 자체 검증된 완료 기록을 유지합니다.
기본 ctf_log.html 내보내기, 런타임 데이터, 로컬 환경 파일, 릴리스
아카이브는 Git에서 무시됩니다. 사용자 지정 이름의 내보내기와 배포 백업은
체크아웃 외부나 무시된 platform/data/ 디렉터리에 보관하세요. 플레이어 기록, 자격 증명,
채팅 내보내기는 비공개로 유지해야 합니다.
MIT. LICENSE를 참조하세요.
실습형 AI 보안 교육을 위해 Rob Fuller (mubix)가 제작했습니다. 코드는 대부분 AI가 생성했으며, 설계 결정과 콘텐츠는 사람이 소유합니다.