| name | recon-playbook |
| description | Use when starting or restructuring an authorized external web and API assessment. |
| version | 2.0.0 |
| license | MIT |
| platforms | ["linux","macos"] |
| compatibility | Requires curl, jq, subfinder, dnsx, httpx, katana, and optional nmap |
| tags | ["meta","recon","web","api","workflow"] |
| category | meta |
| related_skills | ["attack-patterns-reference","evidence-hygiene","offensive-osint","port-service-discovery","report-writing","subdomain-enumeration","triage-validation","web-enumeration","web2-recon"] |
External Web Recon Playbook
Use this playbook to turn an authorized root domain or asset list into a
prioritized map of web applications, APIs, authentication boundaries, and
testable security hypotheses.
scope
-> assets
-> DNS and services
-> routes and client code
-> APIs and identities
-> hypotheses
-> focused validation
-> evidence and reporting
When to Use
- Beginning an external web, API, or bug bounty assessment.
- Recon output exists but lacks normalization, provenance, or prioritization.
- The target spans multiple applications, subdomains, or identity boundaries.
- A broad scan needs to be converted into focused manual validation.
Do not use this playbook to justify activity outside the agreed scope or to run
every available tool against every asset.
Prerequisites
- Explicit authorization, target boundaries, exclusions, rate limits, and stop
conditions.
curl, jq, subfinder, dnsx, httpx, and katana.
nmap only when IP or port discovery is in scope.
- Approved test identities for authorization and session testing.
- A writable evidence directory.
How to Run
export TARGET="example.test"
export OUTPUT_DIR="${OUTPUT_DIR:-./output/$TARGET}"
mkdir -p \
"$OUTPUT_DIR/assets" \
"$OUTPUT_DIR/http" \
"$OUTPUT_DIR/urls" \
"$OUTPUT_DIR/evidence"
Run each phase only after reviewing the preceding output. Keep raw source files
so every hostname, URL, and hypothesis has provenance.
Procedure
1. Record Scope
Keep a short operator-readable scope record beside the output:
allowed: *.example.test
excluded: status.example.test
identities: anonymous, test-user-a, test-user-b
request rate: 2 requests/second/host
state changes: synthetic records only