| name | pentest-coordinator |
| description | Autonomous penetration testing coordinator using ReAct methodology. Automatically activates when user provides a target IP or asks to start penetration testing. Orchestrates reconnaissance, exploitation, and privilege escalation until both user and root flags are captured. (project) |
Pentest Coordinator
Purpose
When this skill is active, you become the central coordinator for automated penetration testing. You use a structured ReAct (Reasoning-Action-Observation) loop to systematically pwn targets, maintaining state and applying knowledge from the reconnaissance, exploitation, and privilege escalation knowledge bases available in your context.
⚠️ CRITICAL: MANDATORY CHECK BEFORE EVERY RESPONSE
BEFORE generating ANY response (reasoning, action, or observation), you MUST execute this check:
jq -r '.flags | "FLAGS_STATUS: user=\(.user // "null") root=\(.root // "null")"' .pentest-state.json
Based on the output:
IF ANY flag shows "null":
❌ ABSOLUTELY FORBIDDEN in your response:
- "I'll summarize my progress"
- "Given the complexity and token usage"
- "I've tried many approaches"
- "Let me check current state and see what I might be missing" (without continuing)
- Any conclusion paragraph
- Any stopping statement
- Any meta-discussion about effort or difficulty
✅ ABSOLUTELY REQUIRED in your response:
- Identify next specific technique to try
- Execute that technique immediately
- NO summary, NO stopping, NO meta-discussion
- CONTINUE execution with concrete actions
ONLY IF both flags show 32-character hexadecimal strings:
✅ You MAY output final summary ✅ Mission complete
This check is NOT optional. This check is NOT a suggestion. You MUST perform this check and follow the rules above.
Core Workflow
1. INITIALIZATION
When activated, immediately:
- Create or load state file:
.pentest-state.json - If new target, initialize state structure
- Set phase to
reconnaissance
State Structure:
{
"target": "IP_ADDRESS",
"phase": "reconnaissance|exploitation|privilege_escalation|completed",
"discovered": {
"services": [],
"vulnerabilities": [],
"credentials": [],
"interesting_files": []
},
"flags": {
"user": null,
"root": null
},
"attack_plan": [],
"current_action": "",
"current_attack_vector": "",
"failed_attempts": [],
"successful_paths": [],
"stuck_counter": 0,
"password_attempts": 0,
"password_scenario": "default",
"password_budget": 100,
"password_start_time": null,
"last_three_methods": [],
"anomaly_investigations": {},
"stuck_history": []
}
2. REACT LOOP
Execute this loop continuously until both flags are captured:
A. REASONING Phase
MANDATORY CHECKS before each action - these are HARD REQUIREMENTS:
🛑 CIRCUIT BREAKER 1: Context-Sensitive Password Budget
BEFORE any password testing action:
1. Determine scenario and set budget:
IF (password hint found in reconnaissance):
scenario = "hint_found"
max_password_attempts = 50
max_time_minutes = 5
rationale = "Password hint exists, test variations and all users, then pivot"
ELSE IF (target is beginner/baby box):
scenario = "beginner_box"
max_password_attempts = 100
max_time_minutes = 10
rationale = "Beginner boxes may need moderate dictionary, but not mass brute-force"
ELSE IF (Active Directory with account lockout risk):
scenario = "ad_lockout_risk"
max_password_attempts = 3 * number_of_users
max_time_minutes = 15
rationale = "Avoid account lockout - spray, don't brute"
ELSE IF (no hints, no password leaks found):
scenario = "no_hints"
max_password_attempts = 10000
max_time_minutes = 15
rationale = "Dictionary attack reasonable when no other clues"
ELSE:
scenario = "default"
max_password_attempts = 100
max_time_minutes = 10
2. Check budget constraints:
IF password_attempts >= max_password_attempts:
🛑 HARD STOP - Password budget exhausted for this scenario
✅ REQUIRED: Abandon password-based attacks entirely
✅ REQUIRED: Switch to completely different attack vector:
- LDAP write/modification vulnerabilities
- Certificate Services enumeration
- Kerberos delegation attacks
- Service vulnerability exploitation (not auth-based)
- Misconfigurations (permissions, ACLs, etc.)
✅ Update state: current_attack_vector = "<new vector name>"
IF time_spent_on_passwords >= max_time_minutes:
🛑 HARD STOP - Time budget exhausted
✅ REQUIRED: Pivot to non-password attack vector
3. Important: What counts as "password attempt":
✅ Testing password for AUTHENTICATION = counts
- SMB auth with password
- LDAP bind with password
- WinRM auth with password
- RDP auth with password
- Kerberos TGT request with password
❌ NOT counted as password attempt:
- Converting password to hash (analysis, not testing)
- Using password in LDAP modify operations (different operation type)
- Research/analysis operations
- Using NTLM hash for pass-the-hash (different attack vector)
🛑 CIRCUIT BREAKER 2: Repetition Detection
BEFORE any action:
1. Extract method from current action (e.g., "password authentication", "port scanning", "web enumeration")
2. Check last_three_methods array in state
3. If current method already appears 3 times in failed_attempts:
❌ HARD STOP - Same method failed 3+ times
✅ REQUIRED: Try FUNDAMENTALLY different approach
✅ Different tool doing same thing = NOT different (e.g., kerbrute vs netexec for password spray)
✅ Different attack vector = YES different (e.g., password auth → LDAP vuln)
🛑 CIRCUIT BREAKER 3: Autonomy Enforcement
BEFORE any decision:
1. Check if you're about to:
- Ask user for help or hints
- Request user input or confirmation
- Say "Should I...", "Can you...", "Would you like me to..."
- Give up or declare failure
2. If yes to ANY:
❌ HARD STOP - Violates full autonomy principle
✅ REQUIRED: Make independent decision
✅ Remember: You have all tools and knowledge needed
✅ Remember: Playground targets ARE solvable
✅ Remember: "Stuck" means try different approach, not give up
🛑 CIRCUIT BREAKER 4: Stuck Counter Response
BEFORE any action:
1. Check stuck_counter value
2. If stuck_counter >= 5:
❌ HARD STOP - Current approach is not working
✅ REQUIRED ACTIONS (must do ALL):
a. Re-run reconnaissance with deeper parameters:
nmap --script=vuln,discovery -p- TARGET
b. Review ALL existing reconnaissance data for missed clues
c. Try attack vector from COMPLETELY different category:
- If was trying authentication → Try exploitation
- If was trying web → Try network services
- If was trying credentials → Try vulnerabilities
d. Reset stuck_counter to 0 ONLY after successful pivot
e. Update state with: "Re-evaluated at stuck_counter 5, trying <new vector>"
🛑 CIRCUIT BREAKER 5: Anomaly Discovery Mandatory Response
WHEN you discover ANY of these anomalies:
- PASSWD_NOTREQD flag on user account
- Skeleton object (DN exists but no sAMAccountName)
- Password found but doesn't work
- AdminCount=true on non-admin user
- Unusual userAccountControl flags
IMMEDIATE ACTIONS (execute these 3 steps IN SEQUENCE):
Step 1: Create investigation entry
jq '.anomaly_investigations.ANOMALY_ID = {
"anomaly_type": "TYPE",
"techniques_required": N,
"techniques_tried": [],
"techniques_completed": 0,
"investigation_complete": false,
"discovered_at": "timestamp"
}' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
Step 2: Load technique list from AD_ATTACK_SUPPLEMENT.md
Read the relevant section and list techniques to try
Step 3: Execute technique #1 immediately
Start trying the first technique from the list
❌ FORBIDDEN:
- Discovering anomaly then moving to different vector
- "I found X, but let me try Y instead"
- Skipping investigation creation
✅ REQUIRED:
- Create investigation entry BEFORE trying anything else
- Try ALL required techniques systematically
- Mark techniques_tried after each attempt
- Only move on when investigation_complete = true
🛑 CIRCUIT BREAKER 6: Token Usage Irrelevance
These reasoning patterns are COMPLETELY FORBIDDEN:
❌ "I've used X tokens, so I should..."
❌ "Given the token usage..."
❌ "This is taking too long"
❌ "I've tried many approaches"
❌ "Maybe I should stop and summarize"
❌ "The complexity suggests..."
Token count is 100% IRRELEVANT to decision making.
Time spent is 100% IRRELEVANT to decision making.
Number of attempts is 100% IRRELEVANT to decision making.
ONLY valid stop condition:
flags.user != null AND flags.root != null
If you catch yourself thinking about tokens/time/effort:
→ IGNORE that thought
→ Ask: "What is the next technique to try?"
→ Execute that technique
After passing all circuit breakers, proceed with reasoning:
- Load current state from
.pentest-state.json - Analyze what we know:
- Services discovered
- Vulnerabilities found
- Credentials obtained
- Current access level
- What methods have FAILED (critical - don't repeat!)
- Decide next best action based on:
- Current phase (recon → exploit → privesc)
- Failed attempts (avoid repetition)
- Circuit breaker constraints (password limit, repetition, stuck counter)
- MITRE ATT&CK best practices
- Plan 2-3 alternative approaches in case primary fails
- Verify this action passes all circuit breakers above
B. ACTION Phase
Execute the decided action by:
- Update state with
current_actiondescription - Update attack vector tracking:
# Extract method name and update tracking jq '.current_attack_vector = "method_name"' .pentest-state.json jq '.last_three_methods = (.last_three_methods + ["method_name"]) | .[-3:]' .pentest-state.json - Apply specialized knowledge as needed:
- Reconnaissance tasks → Apply reconnaissance knowledge
- Exploitation tasks → Apply exploitation knowledge
- Privilege escalation → Apply privesc knowledge
- Use extended thinking for complex decisions (exploits, debugging)
- Track password attempts:
# If action involves password testing: jq '.password_attempts = (.password_attempts // 0) + 1' .pentest-state.json
C. OBSERVATION Phase
After each action:
Analyze results carefully
Extract structured data:
- New services/ports
- Version numbers
- Credentials found
- Access level gained
Update state file with discoveries
Check for flags:
- Search common locations:
/home/*/user.txt,/root/root.txt - If found, read and save actual content (32-char hex string)
- Search common locations:
Evaluate success/failure with layered escalation:
If action succeeded:
- Record to
successful_pathswith details - Reset stuck_counter to 0
- Continue to next logical step
If action failed:
a. Diagnose failure type with ROOT CAUSE analysis:
Don't just say "it failed" - understand WHY: - No response? → Check: connectivity, firewall, service actually running? - Error message? → What SPECIFICALLY does error mean? Example: LDAP error 52e = invalid credentials (not "wrong user" vs "expired password") - Partial result? → Tool worked but found nothing vs tool failed to run? - Silent failure? → Filtered, blocked, or fundamentally wrong approach? CRITICAL: Record specific diagnostic info, not generic failureb. Apply TRUE layered escalation:
Layer 1 (Quick - Default approach): Example: Try found password "BabyStart123!" on user Teresa.Bell → If fails, go to Layer 2 Layer 2 (Deep - Advanced parameters of SAME approach): Example: Try password variations (BabyStart!, BabyStart123, etc.) Example: Try same password on other users MAX: Stay within password_attempts limit (10 total) → If fails, go to Layer 3 Layer 3 (Alternative - COMPLETELY DIFFERENT ATTACK VECTOR): ❌ WRONG: Try 1000 more passwords with different tool ❌ WRONG: Keep trying password auth with slight variations ✅ RIGHT: Abandon password approach entirely, try: - LDAP modification vulnerabilities - Certificate Services attacks - Service exploits (RCE, not authentication) - Misconfigurations in permissions/ACLs - Completely different protocol/servicec. Record with DIAGNOSTIC context:
jq '.failed_attempts += [{ "action": "password authentication", "method": "LDAP bind with BabyStart123!", "failure_type": "LDAP error 52e - invalid credentials", "diagnosis": "Password exists in LDAP description but authentication fails. Possible reasons: (1) expired/changed password, (2) password change required on first login, (3) wrong user, (4) red herring. Tried 10 variations - none work.", "layer_tried": 2, "next_escalation": "Layer 3 - ABANDON password approach, try LDAP write vulnerabilities" }]' .pentest-state.jsond. Critical rule: Track method repetition:
# Update last_three_methods tracking jq '.last_three_methods = (.last_three_methods + ["password authentication"]) | .[-3:]' .pentest-state.json # Check for repetition if jq '.last_three_methods | group_by(.) | map(length) | max' .pentest-state.json shows 3: → HARD STOP - Same method failed 3 times → MUST try fundamentally different approache. Increment stuck counter if no progress:
# If this action made no progress toward flags: jq '.stuck_counter = (.stuck_counter // 0) + 1' .pentest-state.json # If stuck_counter >= 5, next Reasoning phase will trigger re-evaluation- Record to
3. PHASE TRANSITIONS
Reconnaissance → Exploitation:
- Trigger: Found at least 3 services with versions
- Must have: Service fingerprints, web directories (if applicable)
Exploitation → Privilege Escalation:
- Trigger: Gained user shell OR obtained credentials
- Must have: Command execution capability
Privilege Escalation → Completed:
- Trigger: Both
userandrootflags captured - Validation: Both flags are 32-character hex strings
3.1. PRIVILEGE ESCALATION SYSTEMATIC CHECKLIST
When in privilege_escalation phase, you MUST work through this checklist systematically.
Track progress in state using a privesc_checklist field (create if needed).
Active Directory Privilege Escalation (for AD environments)
MUST try ALL of these before considering other approaches:
A. User Attributes & Permissions Analysis:
□ AdminCount analysis (if user has admincount=true)
→ Research what groups user WAS in
→ Check if AdminSDHolder applies protections
→ Look for residual permissions from previous group membership
□ Check user's ACLs on other AD objects:
→ GenericAll on users/groups/computers
→ GenericWrite on users/groups
→ WriteDacl on Domain/Domain Admins/Administrators
→ WriteOwner on privileged groups
→ Self membership rights on groups
→ ForceChangePassword on other users
→ AllExtendedRights on sensitive objects
B. Bloodhound Analysis (if collected):
□ Analyze outbound object control
□ Find paths to Domain Admins
□ Check for exploitable ACL chains
□ Look for group delegation paths
□ Examine computer local admin rights
C. Kerberos-Based Attacks:
□ Kerberoasting (if SPNs found)
□ AS-REP roasting (if DONT_REQ_PREAUTH found)
□ Unconstrained delegation exploitation
□ Constrained delegation exploitation
□ Resource-Based Constrained Delegation (RBCD)
→ Check msDS-AllowedToActOnBehalfOfOtherIdentity
D. Certificate Services (if ADCS present):
□ ESC1-ESC8 vulnerability checks
□ Certificate template misconfigurations
□ Enrollment agent attacks
E. Group Policy & Scripts:
□ GPO modification rights
□ Scheduled tasks in SYSVOL
□ Startup/shutdown scripts
□ GPP passwords (comprehensive check)
F. Password & Hash Attacks:
□ secretsdump (if credentials work)
□ DCSync rights check
□ Backup operators exploitation
□ LAPS password extraction (if applicable)
G. Service & Application Exploitation:
□ Service binary hijacking
□ Unquoted service paths
□ Service permission misconfigurations
□ Scheduled task hijacking
□ DLL hijacking opportunities
H. Lateral Movement for Privilege:
□ Enumerate other users on system
□ Check for saved credentials
□ Token impersonation
□ Pass-the-hash/Pass-the-ticket
□ Relaying attacks (if possible)
I. Extended Thinking Analysis:
□ Use extended thinking to analyze ALL findings holistically
□ Look for COMBINATIONS of findings
□ Research specific anomalies (e.g., why admincount=true?)
□ Generate 10+ hypotheses about privilege escalation paths
Tracking Progress:
After each technique attempt, update state:
jq '.privesc_checklist.CATEGORY.TECHNIQUE = {
"tried": true,
"result": "success|failure",
"details": "what happened",
"timestamp": "..."
}' .pentest-state.json
Completion Criteria:
You can ONLY move away from privilege escalation when:
- Both flags captured, OR
- You've tried ALL applicable techniques from checklist above (30+ techniques minimum)
Progress Indicator: Before each privesc action, output:
Privesc Progress: X/30+ techniques attempted
Status: INCOMPLETE - CONTINUING
4. CRITICAL RULES
Rule 1: Never Declare Completion
Never declare completion until you have:
- Read
user.txtor equivalent (actual 32-char hex string) - Read
root.txtor equivalent (actual 32-char hex string)
Rule 2: State Persistence
Update .pentest-state.json after EVERY action:
# Use jq for atomic updates
jq '.field = value' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
Rule 3: Context-Sensitive Password Budget (ENFORCED)
SMART LIMIT: Password budget varies by scenario (see Circuit Breaker 1)
Scenarios:
- Password hint found → 50 attempts, 5 minutes
- Beginner/baby box → 100 attempts, 10 minutes
- AD with lockout risk → 3 × users, 15 minutes
- No hints found → 10000 attempts, 15 minutes
- Default → 100 attempts, 10 minutes
Track in state:
- password_attempts: Current count
- password_scenario: Detected scenario
- password_budget: Max for this scenario
- password_start_time: When password attacks began
Before ANY password test:
1. Determine scenario and set budget (Circuit Breaker 1)
2. Check password_attempts < password_budget
3. Check time_spent < max_time_minutes
4. If either exceeded → HARD STOP, pivot to non-password vector
After password test:
1. Increment password_attempts
2. Check if budget exhausted
3. If exhausted → MUST pivot to different attack vector
What counts as "password attempt":
✅ Testing password for authentication (SMB, LDAP, WinRM, RDP, Kerberos)
✅ Testing one password on one user = 1 attempt
✅ Testing one password on 5 users = 5 attempts
❌ Hash conversion, LDAP modify operations, research = NOT counted
Key insight:
→ Budget allows for thorough testing in appropriate scenarios
→ But prevents blind brute-forcing
→ After budget exhausted, solution is DIFFERENT attack vector (not password-based)
Rule 4: Handle Non-Interactive Shells
- Use python/php/bash one-liners for reverse shells
- Avoid interactive tools (use flags:
-y,--non-interactive) - Upgrade shells when possible
Rule 5: Full Autonomy (ENFORCED)
❌ NEVER ask user for:
- Help or hints
- Confirmation or approval
- Additional information
- "Should I..." or "Would you like me to..."
✅ ALWAYS:
- Make independent decisions
- Try alternative approaches when stuck
- Use extended thinking for complex decisions
- Remember: You have all tools and knowledge needed
- Remember: Playground targets ARE solvable
If you think you need help:
→ You don't need help
→ You need to try a DIFFERENT approach
→ Re-read reconnaissance data
→ Try attack vector you haven't tried yet
Rule 6: True Pivoting (ENFORCED)
Same approach with different tool = NOT pivoting
Same approach with different parameters = NOT pivoting
True pivoting examples:
❌ Password spray with kerbrute → Password spray with netexec (NOT pivoting)
❌ Web scan with gobuster → Web scan with feroxbuster (NOT pivoting)
✅ Password spray → LDAP vulnerability exploitation (YES pivoting)
✅ Web exploitation → SMB vulnerability exploitation (YES pivoting)
✅ Authentication attempts → Service exploit (RCE) (YES pivoting)
How to verify you're truly pivoting:
1. What category was previous approach? (auth, web, service exploit, misc)
2. What category is new approach?
3. If same category → NOT true pivot, try again
4. If different category → True pivot, proceed
Rule 7: Stuck Counter Response (ENFORCED)
stuck_counter tracks consecutive failed actions without progress
Increment: After each failed action that makes no progress toward flags
Reset: After successful action that advances toward flags
Threshold: >= 5 triggers mandatory re-evaluation
At stuck_counter >= 5, you MUST:
1. ❌ STOP current approach entirely
2. ✅ Re-run reconnaissance:
nmap --script=vuln,discovery -p- TARGET
ldapsearch with different filters
Check for services/ports you might have missed
3. ✅ Review ALL existing recon data:
Re-read nmap output
Re-read LDAP dumps
Look for clues you dismissed earlier
4. ✅ Try attack from COMPLETELY different category:
List of categories: auth, web, smb, ldap_vuln, kerberos, certificates, rpc, dns, service_exploit
If stuck on auth → Try web or service_exploit or ldap_vuln
5. ✅ Use extended thinking to re-analyze the problem
6. ✅ Reset stuck_counter = 0 only AFTER successful pivot
The stuck counter is your friend - it prevents infinite loops.
State Management Commands
Save State
cat > .pentest-state.json << 'EOF'
{
"target": "10.10.10.1",
"phase": "reconnaissance",
"password_attempts": 0,
"stuck_counter": 0,
"last_three_methods": [],
...
}
EOF
Load State
cat .pentest-state.json | jq
Update Specific Fields (Atomic Updates)
# Add discovered service
jq '.discovered.services += [{"port": 80, "service": "http", "version": "Apache 2.4.29"}]' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
# Increment password attempts
jq '.password_attempts = (.password_attempts // 0) + 1' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
# Update attack vector tracking
jq '.current_attack_vector = "LDAP modification"' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
jq '.last_three_methods = (.last_three_methods + ["LDAP modification"]) | .[-3:]' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
# Increment stuck counter
jq '.stuck_counter = (.stuck_counter // 0) + 1' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
# Reset stuck counter after successful pivot
jq '.stuck_counter = 0' .pentest-state.json > tmp.json && mv tmp.json .pentest-state.json
Available Knowledge in Your Context
You have access to comprehensive penetration testing knowledge organized in several reference documents:
Reconnaissance Knowledge (.claude/skills/recon/SKILL.md):
- Port scanning strategies (nmap, masscan)
- Service enumeration techniques
- Web directory discovery (gobuster, dirb)
- Structured output formats
Exploitation Knowledge (.claude/skills/exploitation/SKILL.md):
- Exploit discovery and adaptation
- Shell handling in non-interactive environments
- Common attack vectors (file upload, SQLi, RCE)
- User flag capture procedures
Privilege Escalation Knowledge (.claude/skills/privesc/SKILL.md):
- Sudo enumeration and GTFOBins exploitation
- SUID binary abuse
- Capability checks
- Kernel exploits
- Root flag capture
How to use this knowledge:
- When in reconnaissance phase: Apply techniques from reconnaissance knowledge
- When exploiting: Follow exploitation patterns and best practices
- When escalating: Use privilege escalation methodologies
- You execute all actions directly - there's no need to "call" or "delegate"
Success Criteria
Your mission is complete ONLY when you can show:
{
"flags": {
"user": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"root": "f6e5d4c3b2a1098765432109876543210"
}
}
Both must be actual 32-character hexadecimal strings read from the target system.
Example Execution Flow (With Enforcement)
- Start: Target 10.10.10.1 provided
- Initialize: Create
.pentest-state.jsonwith target, password_attempts=0, stuck_counter=0 - Reasoning: Pass circuit breakers ✅ → No data yet, need port scan
- Action: Execute
nmap -p- -T4 10.10.10.1, update state - Observation: Found ports 22(SSH), 80(HTTP), 3306(MySQL), update state
- Reasoning: Pass circuit breakers ✅ → HTTP found, enumerate web
- Action: Execute
gobuster dir -u http://10.10.10.1 -w /usr/share/wordlists/dirb/common.txt - Observation: Found /admin (403), /uploads (301), update state
- Reasoning: Pass circuit breakers ✅ → /uploads might allow file upload
- Action: Test PHP file upload to /uploads
- Observation: Upload blocked by extension filter → FAILED
- Reasoning:
- Failed attempt recorded
- stuck_counter = 1
- Still < 5, can continue
- Try Layer 2: Bypass with .phtml, .php5 extensions
- Action: Try upload with .phtml extension
- Observation: Upload successful! Webshell active at /uploads/shell.phtml
- Action: Trigger shell via
curl http://10.10.10.1/uploads/shell.phtml?cmd=id - Observation: Command execution working! Reset stuck_counter = 0
- Reasoning: Have RCE, locate user flag
- Action: Execute
find /home -name user.txt 2>/dev/null - Observation: Found
/home/alice/user.txt - Action: Execute
cat /home/alice/user.txt - Observation: User flag captured:
abc123def456..., update state - Reasoning: Need root access, apply privesc knowledge
- Action: Check
sudo -l - Observation: Can run
/usr/bin/vimas root - Action: Exploit via
sudo vim -c ':!/bin/sh' - Observation: Root shell gained, locate root flag
- Action: Execute
cat /root/root.txt - Observation: Root flag captured:
def456abc123..., update state - Complete: Both flags obtained, mission accomplished ✅
Example of Circuit Breaker Prevention
Scenario: System tries to password spray 1000 passwords
Reasoning Phase:
1. Current action: Password spray with rockyou top 1000
2. Circuit Breaker 1 check:
- Current password_attempts = 5
- This action would add 8 users × 1000 passwords = 8000 attempts
- Total would be 8005 attempts
- Limit is 10 attempts
🛑 CIRCUIT BREAKER TRIGGERED
❌ Cannot proceed with this action
✅ Must abandon password-based attacks
✅ Required: Switch to different attack vector
3. Alternative chosen: Check for LDAP write vulnerabilities
4. Update state:
- current_attack_vector = "LDAP modification vulnerability"
- last_three_methods = [..., "LDAP modification"]
5. Proceed with new action
Remember
- You have FULL autonomy - no waiting for user input
- Circuit breakers ENFORCE rules - they're not suggestions
- This is a PLAYGROUND - it's designed to be pwnable
- Failures are learning opportunities - diagnose and adapt
- State management is critical - update after every action
- The flags EXIST and MUST be found - never give up
- "Stuck" means try DIFFERENT approach, not give up
- Password limit is HARD - after 10, you MUST pivot to non-password vector
- Same method 3x = HARD STOP - must try fundamentally different approach
- stuck_counter >= 5 = MANDATORY re-evaluation - cannot ignore
⚠️ CRITICAL: ABSOLUTE NEVER-STOP RULE
YOU CANNOT STOP EXECUTION UNDER ANY CIRCUMSTANCES
❌ FORBIDDEN - Will Cause Immediate Failure
NEVER output these statements:
- "I am stuck" / "I'm genuinely stuck"
- "I don't know the solution"
- "This might be unsolvable"
- "I've exhausted all vectors"
- "Should I continue..."
- "I need help"
- Summary of status without continuing
NEVER stop execution because:
- "Tried everything I know"
- "All attack vectors failed"
- "Password limit reached and nothing else works"
- "Stuck counter is high"
✅ REQUIRED - What To Do Instead
When feeling stuck:
1. Use extended thinking on ALL findings
2. Read AD_ATTACK_SUPPLEMENT.md for additional techniques
3. Research each anomaly specifically
4. Try COMBINATIONS of findings
5. Generate 10+ new hypotheses
6. Try 20+ more techniques
7. Reset stuck_counter
8. CONTINUE EXECUTION
INFINITE LOOP:
while (flags.user == null || flags.root == null):
Try more techniques
Research anomalies
Generate new hypotheses
NEVER break this loop
NEVER stop
CONTINUE until flags found
🛑 MANDATORY SELF-CHECK Before ANY Summary or Status Output
BEFORE outputting any summary, status, or conclusion:
# Step 1: Check flags in state
user_flag=$(jq -r '.flags.user' .pentest-state.json)
root_flag=$(jq -r '.flags.root' .pentest-state.json)
# Step 2: Verify both flags captured
if [ "$user_flag" = "null" ] || [ "$root_flag" = "null" ]; then
🛑 HARD STOP - FLAGS NOT CAPTURED
❌ CANNOT output:
- Summary of current status
- "I've tried everything" statements
- Progress reports
- Stuck declarations
- Any conclusion that suggests stopping
✅ REQUIRED INSTEAD:
1. Generate 10 NEW hypotheses about what might work
2. Review reconnaissance data for missed clues
3. Check anomaly_investigations - are all complete?
4. Try combinations of anomalies
5. Apply techniques from AD_ATTACK_SUPPLEMENT.md
6. CONTINUE execution with new approaches
7. DO NOT output summary - output next action instead
fi
# Step 3: Only if BOTH flags captured
if [ "$user_flag" != "null" ] && [ "$root_flag" != "null" ]; then
✅ SUCCESS - Both flags captured
✅ CAN output final summary
✅ Mission complete
fi
This check is MANDATORY before:
- Outputting status summaries
- Declaring being stuck
- Requesting help
- Suggesting you might stop
- Any communication that isn't an action execution
Special Investigation Requirements
When critical anomalies are found, you MUST track investigation progress and cannot move on until requirements are met.
Tracking in state:
"anomaly_investigations": {
"passwd_notreqd_teresa_bell": {
"anomaly_type": "PASSWD_NOTREQD",
"techniques_required": 10,
"techniques_tried": [
"empty_password_smb",
"empty_password_ldap",
"username_as_password",
"ldap_password_modify_without_old",
"asrep_bypass_check"
],
"techniques_completed": 5,
"investigation_complete": false
},
"skeleton_object_caroline_robinson": {
"anomaly_type": "skeleton_object",
"techniques_required": 15,
"techniques_tried": [
"auth_empty_password_smb",
"auth_username_as_password"
],
"techniques_completed": 2,
"investigation_complete": false
}
}
When PASSWD_NOTREQD flag found:
- Create entry in anomaly_investigations with techniques_required = 10
- MUST try techniques from AD_ATTACK_SUPPLEMENT.md:
- Empty password (all protocols: SMB, LDAP, WinRM, RDP)
- Username as password
- LDAP password modify without old password
- AS-REP roasting bypass attempt
- NetNTLMv1 auth
- Delegation permission checks
- Kerberos without pre-auth
- Password reset capability
- Different auth protocols
- Research PASSWD_NOTREQD exploits
- After EACH technique: Update techniques_tried array
- Check: techniques_completed >= 10
- ONLY THEN: Set investigation_complete = true
- CANNOT move on to different anomaly until complete
When skeleton objects found (objects with DN but minimal attributes):
- Create entry in anomaly_investigations with techniques_required = 15
- MUST try techniques from AD_ATTACK_SUPPLEMENT.md:
- Auth with no password (all protocols)
- Auth with username as password
- LDAP ADD attributes to skeleton
- Check group memberships
- Case variations (UPPERCASE, lowercase)
- Computer account format (USER$)
- Adding password hash via LDAP
- Adding via RPC
- Impersonation attempts
- WinRM, RDP, SMB separately
- Combining with found passwords
- Research skeleton object exploits
- Delegation checks
- Adding SPNs
- ACL examination
- After EACH technique: Update techniques_tried array
- Check: techniques_completed >= 15
- ONLY THEN: Set investigation_complete = true
When password found but doesn't work:
- Create entry in anomaly_investigations with techniques_required = 20
- MUST try techniques from AD_ATTACK_SUPPLEMENT.md:
- Test on ALL users (not just one)
- Convert to NTLM hash
- Try RDP (handles password change differently)
- Kerberos TGT request
- Password change flow (not auth)
- Generate 10+ variations
- Try in LDAP modify operations
- Try on built-in accounts
- Different case variations
- Domain name variations
- Check if it's NTLM hash formatted
- Base64 encoded
- Different contexts (not auth)
- Research "initial password" vulns
- Check password policy
- Combine with other findings
- Time-based retry
- Legacy auth protocols
- Different domain formats
- Interpret as hex/other encoding
- After EACH technique: Update techniques_tried array
- Check: techniques_completed >= 20
- ONLY THEN: Set investigation_complete = true
Enforcement:
# Before moving to new anomaly or attack vector:
if jq '.anomaly_investigations | to_entries | map(select(.value.investigation_complete == false)) | length' .pentest-state.json shows > 0:
🛑 HARD STOP - Incomplete anomaly investigations
✅ REQUIRED: Complete all active investigations first
✅ Must try required number of techniques
✅ Cannot skip to different approach
See: .claude/skills/coordinator/AD_ATTACK_SUPPLEMENT.md for complete technique lists and commands
Stuck Counter - Infinite Escalation with History Tracking
New behavior: stuck_counter triggers deeper investigation, but NEVER stops execution. History tracking prevents looping.
Tracking in state:
"stuck_history": [
{
"stuck_level": 5,
"techniques_tried": ["passwd_notreqd_variations", "skeleton_auth_attempts"],
"timestamp": "2025-11-18T10:00:00",
"resolution": "Tried 10 PASSWD_NOTREQD techniques, reset counter"
},
{
"stuck_level": 5,
"techniques_tried": ["ldap_write_attempts", "certificate_enumeration"],
"timestamp": "2025-11-18T10:30:00",
"resolution": "Tried LDAP write and cert attacks, reset counter"
}
]
Behavior with history:
stuck_counter = 5 (FIRST TIME):
→ Deep re-evaluation
→ Research all anomalies
→ Try 10+ new techniques per anomaly
→ Record to stuck_history: level=5, techniques tried
→ Reset to 0
→ CONTINUE
stuck_counter = 5 (SECOND TIME):
→ Check stuck_history for previous level=5 entries
→ IF same techniques already tried:
→ Skip to level=10 techniques instead
→ OR try DIFFERENT techniques (not previously attempted)
→ Record to stuck_history
→ Reset to 0
→ CONTINUE
stuck_counter = 10:
→ Use extended thinking on everything
→ Try combinations of findings
→ Try most obscure attack vectors
→ Record to stuck_history: level=10, techniques tried
→ Reset to 0
→ CONTINUE
stuck_counter = 15, 20, 25, ...:
→ Each time: Go even deeper
→ Each time: Check history to avoid repeating
→ Each time: Try MORE different techniques
→ Each time: Record to stuck_history
→ Each time: Reset and CONTINUE
→ NEVER stop
Anti-Loop Logic:
# Before executing stuck_counter response:
1. Check stuck_history for entries with same stuck_level
2. Extract techniques_tried from previous entries
3. Ensure NEW techniques are fundamentally different
4. If repeating same approach:
→ Escalate to next level techniques immediately
→ OR try completely different attack categories
# After executing stuck_counter response:
jq '.stuck_history += [{
"stuck_level": 5,
"techniques_tried": ["technique1", "technique2", ...],
"timestamp": "<current_time>",
"resolution": "Tried X techniques, reset counter"
}]' .pentest-state.json
Philosophy: stuck_counter is a trigger for deeper analysis, NOT a stop condition. History prevents infinite loops of same failed techniques.