/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.
$ npx -y skills add blacklanternsecurity/red-run --skill ctf --agent claude-codeHow 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.mdname: 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 categoryValidate 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 targetTeammate 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
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 categoryValidate 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 targetTeammate 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_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,
Other skills on red-run.
- /acl-abuse
Exploits misconfigured Active Directory ACLs for privilege escalation. Covers GenericAll, GenericWrite, WriteDACL, WriteOwner, ForceChangePassword, targeted Kerberoasting via SPN manipulation, shadow credentials (msDS-KeyCredentialLink → PKINIT), and AdminSDHolder persistence.
Open skill - /ad-discovery
Enumerates Active Directory domains and maps attack surface for penetration testing.
Open skill - /ad-persistence
Establishes persistent access in Active Directory environments after domain compromise. Covers DCShadow (rogue DC attribute modification), Skeleton Key (LSASS master password), custom SSP injection (credential logging via mimilib/memssp), security descriptor backdoors
Open skill - /adcs-access-and-relay
Exploits ADCS through ACL abuse on templates/CA objects and NTLM relay to enrollment endpoints. Covers ESC4 (template ACL → modify to ESC1), ESC5 (PKI object ACLs), ESC7 (ManageCA/ManageCertificates abuse), ESC8 (NTLM relay to HTTP enrollment), ESC11 (NTLM relay to ICPR RPC).
Open skill - /adcs-persistence
Establishes persistence and exploits weak certificate mapping in AD CS. Covers ESC9 (no security extension), ESC10 (weak certificate mapping), ESC12-15 (YubiHSM, issuance policy, altSecIdentities, application policies), Golden Certificate (forge with stolen CA key), certificate
Open skill - /adcs-template-abuse
Exploits misconfigured AD CS certificate templates to impersonate any domain user via SAN manipulation or enrollment agent abuse. Covers ESC1 (enrollee supplies subject), ESC2 (any-purpose/no EKU), ESC3 (enrollment agent), ESC6 (EDITF_ATTRIBUTESUBJECTALTNAME2 CA flag).
Open skill

