From ctf-kit
Manages live CTF competitions with agent teams: auto-triages challenges by category/difficulty, assigns to parallel solvers, tracks progress. Use for time-pressured multi-challenge events.
npx claudepluginhub mysterionrise/ctf-kitThis skill uses the workspace's default tool permissions.
Manage a live CTF competition with a team of AI agents.
Suggests manual /compact at logical task boundaries in long Claude Code sessions and multi-phase tasks to avoid arbitrary auto-compaction losses.
Share bugs, ideas, or general feedback.
Manage a live CTF competition with a team of AI agents.
Use during a live CTF when:
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1ctf init or challenges in known foldersFirst, map out the competition. For each challenge directory:
# List all challenge directories
ls -d */
# Triage each one
for dir in */; do
echo "=== $dir ==="
bash scripts/triage-competition.sh "$dir"
done
Or let the lead scan manually:
Scan the current directory. Each subdirectory is a CTF challenge.
For each one, run /ctf-kit:analyze to determine the category and difficulty.
Build a priority list.
After triage, sort challenges by expected solve speed:
Priority factors (in order):
Create a task for each challenge in the shared task list.
Spawn 3 teammates. Each teammate is a generalist that uses the appropriate category skill for their assigned challenge.
Create an agent team for this CTF competition.
Teammate 1 — "solver-1":
You are a CTF solver. Pick challenges from the task list and solve them.
Use /ctf-kit:analyze to triage, then the appropriate category skill.
When you solve a challenge, mark the task complete and broadcast the flag.
Then claim the next unclaimed challenge.
Teammate 2 — "solver-2":
[same as above]
Teammate 3 — "solver-3":
[same as above]
The task list has all challenges sorted by priority. Each teammate should
claim the highest-priority unclaimed challenge. Do NOT work on a challenge
another teammate is already solving.
When a teammate gets stuck for more than 5 minutes, they should broadcast
for help. Another teammate who finishes their challenge can assist.
The lead's job during competition:
When a teammate is stuck:
Option A: Swap challenges between teammates (fresh eyes):
Tell solver-2 to stop working on "crypto-hard" and swap with solver-3's
"web-easy". Sometimes a different perspective helps.
Option B: Escalate to team-solve mode for one challenge:
Solver-1 just finished "misc-1". Have all 3 teammates collaborate on
"crypto-hard" using /ctf-kit:team-solve approach with crypto team roles.
Option C: Ask user for hints:
Solver-2 is stuck on "forensics-2". The memory dump analysis found nothing
suspicious. Do you have any hints from the competition platform?
When time is up or all challenges are solved:
Competition over. Summarize:
- Challenges solved (with flags)
- Challenges attempted but unsolved (with progress notes)
- Total points scored
Clean up the team.
The lead assigns challenges based on:
| Signal | Action |
|---|---|
| Triage confidence > 80% | Assign to next available teammate |
| Triage confidence 50-80% | Assign, but flag for possible reassignment |
| Triage confidence < 50% | Run /ctf-kit:team-solve instead of single assignment |
| Web/pwn category | Teammate gets plan-approval mode |
| Challenge has dependencies | Block task until dependency is resolved |
If a high-value challenge is the last unsolved and all teammates are free:
All other challenges are solved. Let's focus all 3 teammates on "crypto-500"
using /ctf-kit:team-solve with crypto team roles.
This transitions from breadth (competition mode) to depth (team-solve mode) for the final push.
The lead maintains a scoreboard. After each solve:
=== Competition Progress ===
[SOLVED] misc-100 — solver-1 — flag{example1} — 3 min
[SOLVED] web-200 — solver-2 — flag{example2} — 8 min
[IN PROGRESS] crypto-300 — solver-3 — trying RSA attacks
[QUEUED] forensics-400
[QUEUED] pwn-500
=== Score: 300 / 1500 ===
Each challenge becomes a task with metadata:
Task: Solve "crypto-300"
Category: crypto
Points: 300
Priority: 2 (medium)
Triage: RSA parameters found, confidence 85%
Files: challenge/n.txt, challenge/e.txt, challenge/c.txt
Assigned to: solver-3
Status: in_progress
Dependencies: none
All teammates start with Tier 1 (local analysis) auto-allowed. The lead applies Tier 2 (plan approval) when assigning web, pwn, or osint challenges:
Solver-2, take "web-200". I'm enabling plan approval for your session
since you'll be sending requests to the target. Show me your recon plan
before hitting the target.
User: /ctf-kit:compete
Lead:
1. Scans directory → finds 8 challenges
2. Triages each:
- misc-100 (easy, encoding chain)
- web-100 (easy, robots.txt)
- crypto-200 (medium, XOR)
- web-200 (medium, SQLi)
- forensics-200 (medium, pcap)
- crypto-300 (hard, RSA)
- pwn-400 (hard, buffer overflow)
- misc-500 (hard, multi-layer)
3. Creates priority queue: misc-100, web-100, crypto-200, web-200, forensics-200, ...
4. Spawns solver-1, solver-2, solver-3
5. Auto-assigns:
- solver-1 → misc-100
- solver-2 → web-100 (plan approval on)
- solver-3 → crypto-200
6. solver-1 finishes misc-100 in 2 min → claims web-200
7. solver-3 finishes crypto-200 → claims forensics-200
8. solver-2 finishes web-100 → claims crypto-300
9. ...continues until time or all solved
10. Final scoreboard + team cleanup
/ctf-kit:team-solve — Deep parallel solve for a single challenge/ctf-kit:analyze — Triage a single challenge/ctf-kit:status — Check challenge progress/ctf-kit:flag — Submit and track flags