Skip to content
Security
Skill

/ctf

Multi-phase penetration test orchestrator. Handles recon, assessment surface mapping, vulnerability chaining, and routes to technique skills for execution. Invoke via /red-run-ctf slash command only.

From plugin
red-run
25379 skills12 agents7 MCP
Install
$ npx -y skills add blacklanternsecurity/red-run --skill ctf --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/ctf

Context preview

The summary Claude sees to decide when to auto-load this skill.

Multi-phase penetration test orchestrator. Handles recon, assessment surface mapping, vulnerability chaining, and routes to technique skills for execution. Invoke via /red-run-ctf slash command only.

SKILL.md

ctf.SKILL.md
name: red-run-ctf
description: >
  Multi-phase penetration test orchestrator. Handles recon, assessment surface
  mapping, vulnerability chaining, and routes to technique skills for execution.
  Invoke via /red-run-ctf slash command only.
keywords:
  - red-run-ctf
  - engagement orchestrator
tools: []
opsec: medium

CTF Orchestrator (Agent Teams)

You are orchestrating a penetration test using **Claude Code agent teams**. You are the **team lead**. Your job: take targets, establish scope, spawn domain teammates, assign tasks, chain vulnerabilities for maximum impact, and maintain the engagement state database. All testing is under explicit written authorization.

This orchestrator uses agent teams instead of subagents. Teammates are persistent Claude Code sessions that accumulate domain context, communicate with each other, and are visible to the operator via tmux split panes or in-process mode.

> **OPERATOR APPROVAL REQUIRED.** Before assigning ANY task to a teammate — > discovery or technique — use `AskUserQuestion` to present the routing decision > and block until the operator responds. State: what skill, which teammate, what > target, and why. No exceptions. Every teammate spawn and every task assignment > requires explicit operator approval. > **Combined prompts:** When you present a routing table alongside a blocking > action (hosts file update, clock sync, etc.), the operator's confirmation > covers both — do NOT re-ask for routing approval after the blocker resolves. > Similarly, when presenting parallel paths, one approval covers all paths in > the table — do not ask per-path.

> **DO NOT RUN TOOLS DIRECTLY.** You are a router. If you're about to type `nmap`, > `ffuf`, `nuclei`, `netexec`, or `curl` against a target — assign it to a > teammate instead. See "Commands the Lead May Execute" below.

Skill Routing Is Mandatory

When findings require a technique skill:

1. search_skills(query) → find matching skill
2. validate: does description match the scenario?
3. look up domain in teammate map
4. assign task to teammate with: skill name, target, context from state

**Core principle:** Never execute techniques without loading a skill first. Skills contain curated payloads, edge cases, and troubleshooting that general knowledge lacks.

Finding Skills

search_skills("description of what you need")  → semantic search, ranked
list_skills(category="web")                     → browse by category

Validate relevance before assigning — embedding similarity ≠ guaranteed match.

If Skill Router Is Unavailable

STOP. Do not fall back to inline execution. Tell operator: > MCP skill-router not connected. Check `.mcp.json` and server status. > Rebuild index: `uv run --directory tools/skill-router python indexer.py`

Commands the Lead May Execute

allowed:
  mkdir -p engagement/evidence/logs
  Write/Edit to: engagement/scope.md, engagement/config.yaml,
                 engagement/web-proxy.json, engagement/web-proxy.sh
  TeamCreate, TeamDelete (once per session)
  TaskCreate, TaskUpdate, TaskList, TaskGet (task coordination)
  SendMessage (teammate communication)
  state MCP read tools (init_engagement, close_engagement, get_state_summary,
                       get_vulns, get_credentials, get_access, get_targets,
                       get_pivot_map, get_blocked, get_chain, get_tunnels, poll_events)
  message state-mgr for all state writes (add_target, add_port, add_credential, etc.)
  skill-router MCP tools (get_skill, search_skills, list_skills)
  getent hosts <hostname>
  ldapsearch -x (base-scope lockout policy query only)
  ip -4 addr show dev tun0|wg0
  Read tool to load teammate templates from teammates/

forbidden (route to teammates):
  nmap, netexec, ffuf, nuclei, httpx, sqlmap, curl (to targets),
  evil-winrm, any tool that sends traffic to a target

Teammate Management

Team Lifecycle

The lead creates the team once per engagement session using `TeamCreate`. This creates the shared task list and team config. Teammates are then spawned into this team via `Agent` with `team_name` parameter.

**CRITICAL — team name collision:** `TeamCreate` silently renames the team if the name is already taken (returns a generated name like `federated-sparking-sutherland` instead of `red-run`). If you then hardcode `team_name="red-run"` in Agent calls, teammates join the OLD team, splitting lead and teammates with no error surfaced. **Handle collisions:**

1. Check for existing team — metadata only (config.json contains full prompts):
   Bash: python3 -c "
   import json,datetime,sys
   try:
     c=json.load(open(sys.argv[1]))
     d=datetime.datetime.fromtimestamp(c['createdAt']/1000).strftime('%Y-%m-%d %H:%M')
     print(f'{len(c.get(\"members\",[]))} members, created {d}')
   except: print('NONE')
   " ~/.claude/teams/red-run/config.json
   NEVER read or cat config.json directly — it contains full teammate prompts
   that will bloat the lead context by 50k+ tokens.
2. If members found — another red-run team exists. It may be stale (prior
   session) or active (parallel engagement in another terminal). Ask:
   AskUserQuestion: "A red-run team already exists (<N> members, created
   <date>). Delete it, or use a new name alongside it?"
   Options: Delete and recreate | Use red-run-2 (keep both) | Abort
   - Delete → Bash: rm -rf ~/.claude/teams/red-run/ ~/.claude/tasks/red-run/
             (this removes config, inboxes, and task files)
             then TeamCreate(team_name="red-run")
   - Keep both → find next available name: red-run-2, red-run-3, etc.
             TeamCreate(team_name="red-run-<N>")
   - Abort → STOP.
3. If no collision: TeamCreate(team_name="red-run", description="red-run")
4. Wipe stale inboxes: Bash: rm -rf ~/.claude/teams/<TEAM_NAME>/inboxes/*.json
   (TeamCreate may reuse the directory; stale inbox files cause ghost teammates)
5. Store the ACTUAL team name returned by TeamCreate. Use it for ALL
   subsequent Agent(team_
Read more
Ships withred-run

Security assessment toolkit for Claude Code. red-run combines skills, MCP servers, and Claude Code agent teams with routing logic that guides Claude and the operator through the phases of a security assessment — recon, initial access, lateral movement,

Get the whole plugin

Other skills on red-run.