Ctf automation
Orchestrator for CTF triage: fingerprint binaries, detect manifests (package.json/Cargo/go.mod/foundry.toml), find crypto/forensics/AI artefacts, emit JSON+markdown dispatch pointers into ctf-*/SKILL.md PRI. Bundles pwnsetup/cryptosetup/websetup/foreniq/aiprobe scripts. CTFd client (ctfd.py) for sync/triage/submit workflow.From its SKILL.md
npx -y skills add MateoBogo/CLEAVE --skill ctf-automationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.5 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
CTF Automation — one-shot triage and category setup
All scripts live in this directory. Every script emits JSON to stdout (when --json is given) so you can pipe into jq or the next stage of a chain.
Entry point: triage
bash /home/ubuntu/.claude/skills/ctf-automation/triage.sh <challenge-dir>
Outputs:
<challenge-dir>/.ctf-triage.json— machine-readable fingerprint<challenge-dir>/.ctf-triage.md— markdown report with pointers intoctf-*/SKILL.md#pattern-recognition-index
After triage, pick the indicated category script:
| If triage flags | Run next |
|---|---|
elf_dynamic=true | pwnsetup.sh <binary> |
crypto_artefacts>0 | python3 cryptosetup.py <challenge-dir> |
web_urls>0 | websetup.sh <url> |
forensics_artefacts | foreniq.sh <file> |
ai_endpoint | python3 aiprobe.py <url> |
Tool inventory philosophy
Each script performs a command -v check for every external tool it uses. Missing tools do not crash — they print the exact apt install … / go install … / pip install … command for the missing binary and continue on what remains available.
Scripts in this directory
triage.sh— master triage; emits JSON + markdown pointing to Pattern Recognition Index sectionspwnsetup.sh—checksec→ detect libc →libc.riplookup →patchelf→ generateexploit.pypwntools template pre-wired for local+remotecryptosetup.py— parses challenge files; detects RSA (n,e,c), ECDSA sigs (r,s), lattice shapes, post-quantum params (Kyber/Dilithium/Falcon); generates a Sage script stub with correct importswebsetup.sh— chained recon:subfinder→httpx→katana→ffuf→nuclei, merges to single JSONforeniq.sh— RF/audio/logic-analyzer pipeline: GQRX UDP / file →sox22050Hz mono →multimon-ng -a POCSAG512/1200/2400 -f alpha;.srfiles →pulseviewCLI exportaiprobe.py— LLM endpoint auto-attack: argument injection on tool-allow-lists, DNS rebind, language-guardrail-gap, metadata exfil, reverse-order prompt, literal-policy flip. Emits finding JSON per attack.ctfd.py— CTFd platform client: sync challenges + download files, run triage on workspace, submit flags, show progress, pick next challenge.
CTFd workflow (ctfd.py)
Full competition workflow against any CTFd instance:
SKILLS=~/.claude/skills/ctf-automation
# 1. init workspace (once per CTF)
python3 $SKILLS/ctfd.py init \
--url https://ctf.example.com \
--token <your-api-token> \
--out ./workspace
# 2. download all challenges + files
python3 $SKILLS/ctfd.py sync --dir ./workspace
# 3. fingerprint everything
python3 $SKILLS/ctfd.py triage --dir ./workspace
# 4. pick next target (lowest points first)
python3 $SKILLS/ctfd.py next --dir ./workspace
# → prints: Dir, connection info, triage hint
# 5. work the challenge … find flag …
# 6. submit
python3 $SKILLS/ctfd.py submit "CTF{...}" --chal challenge-name --dir ./workspace
# 7. loop back to step 4
python3 $SKILLS/ctfd.py status --dir ./workspace
Workspace layout written by sync:
workspace/
.ctfd.json ← config + challenge index
pwn/
heap-overflow/
vuln libc.so.6 Dockerfile
.meta.json ← id, pts, description, connection_info
.triage.json ← from triage step
.solved ← written on correct submit
web/
login-bypass/
...
next sorts unsolved challenges by points (easiest first); filter by category with --category pwn.
Pattern Recognition dispatch
triage.sh reads the file list and dependency manifests, then writes pointers like:
ctf-pwn/SKILL.md#pattern-recognition-index → row "MAP_FIXED exposed"
ctf-crypto/SKILL.md#pattern-recognition-index → row "post-quantum KEM"
ctf-misc/ai-ml.md → section "Argument injection on allow-listed tools"
The calling agent (/solve-challenge) reads the markdown report and dispatches to the skill(s) indicated. This replaces guessing the category from the user prompt — we dispatch on what is actually in the challenge folder.
Chain example
DIR=/tmp/ch-42
bash triage.sh "$DIR" --json | jq '.hints[]'
# If hints mention "libc":
bash pwnsetup.sh "$DIR/vuln"
# If hints mention "ai_endpoint":
python3 aiprobe.py http://chal.example/api --json > findings.json
Exit codes
0— triage ran, report written2— directory does not exist / unreadable3— no recognisable artefacts (empty, or only text README)
Never exit 1; that's reserved for unexpected script errors, which indicate a bug to fix.
What ships with it: 16 files
118.1 KB alongside SKILL.md, 12 of them executable
docs/
sandbox/
- Dockerfile3.0 KB
- sandbox.shruns6.7 KB
- aiprobe.pyruns7.5 KB
- coordinator.pyruns8.1 KB
- cryptosetup.pyruns6.4 KB
- ctfd.pyruns14.2 KB
- exploit_loop.pyruns12.2 KB
- foreniq.shruns4.4 KB
- learn.pyruns21.3 KB
- pwnsetup.shruns4.6 KB
- review.shruns6.8 KB
- _round2_additions.md4.3 KB
- triage.shruns11.8 KB
- websetup.shruns3.8 KB