Hunting Methodology
The 5-Phase Non-Linear Workflow
Phase 1: Understand the Target (before touching anything)
- Read program scope, policy, safe harbor
- Read 5+ disclosed reports in hacktivity
- Map crown jewels: what would hurt the company most?
- Understand the business domain — what features handle money, PII, auth?
Phase 2: Map the Surface
- Subdomain enumeration → live hosts → tech stack detection
- JS bundle analysis → API endpoints, secrets, internal URLs
- Run
/surface for P1/P2/Kill ranking
Phase 3: Hunt (the actual testing)
- Pick P1 target from surface ranking
- Select vuln class based on tech stack:
- Rails/Django/Laravel → IDOR, mass assignment
- Express/Node → prototype pollution, path traversal
- Spring Boot → Actuator, SSTI
- Next.js → SSRF via Server Actions
- GraphQL → introspection, IDOR via node(), mutation auth bypass
- Test with concrete payloads (see /hunt)
- Apply the Sibling Rule on every endpoint
- 20-minute rotation if no progress
- Build a depth matrix before declaring a class exhausted:
- Dimensions:
entrypoint × method × content-type × encoding × bypass
- Minimum 30 combinations on P1 surface (seed with
uv run python3 ../../tools/intel_engine.py matrix <class>)
- Do not stop at the first blocked payload — mutate and continue
- Run cross-context variants for every promising input:
- URL / query, JSON, form-urlencoded, multipart, GraphQL variables
- Header / cookie mirrors, reflected values, stored values, async jobs / webhooks
- Execute encoding ladders systematically:
- raw → URL → double-URL → unicode escape → mixed-case / separator insertion
- Keep the semantic payload constant through each ladder step
- Then stack encodings in a single payload:
html-entity+URL
(%26lt%3Bscript%26gt%3B), URL+html-entity, unicode-escape+URL,
base64+URL. WAFs typically decode once; targets decode twice, so a
payload that looks benign after a single decode still executes at the
sink.
- Execute auth-state permutations:
- unauthenticated, low-priv user A, low-priv user B, high-priv, expired token, stale session, cross-tenant
- Compare response deltas (status, length, timing), not only status codes
- Treat every bypass as a family, not a one-off:
- For WAF / filter blocks, try separator insertion, case toggling, alternate delimiters, parser differentials, and protocol / host normalization tricks
- Log negative evidence (what failed and why) via
uv run python3 ../../tools/brain.py record <target> recon "coverage-<class>" "<details>" so autopilot resume avoids repeating exhausted paths.
Phase 4: Validate + Chain
- Run 7-Question Gate on any signal
- If PASS → check A→B chain table
- If CHAIN REQUIRED → build the chain or drop it
- If KILL → move on immediately
Phase 5: Report + Submit
- Quality check (score ≥ 7)
- Dupcheck against hacktivity
- Submit with PoC + evidence + CVSS 4.0
Wide vs Deep Route Selection
Wide route (recon-heavy): New target, unknown surface, no prior data.
- Run
/pipeline for broad coverage first
- Then
/surface to prioritize
Deep route (hunt-heavy): Known target, mapped surface, returning hunter.
- Run
/resume to see what's untested
- Pick the highest-ROI untested endpoint
- Go deep on one vuln class
Developer Psychology
Developers make CLASS mistakes, not random ones:
- If they forgot auth on endpoint A, they probably forgot on B and C
- If they use sequential integer IDs anywhere, they use them everywhere
- If input validation is weak in one form, check ALL forms
- New features (< 30 days) have the weakest security
- Acquired companies (different code, different team) = fresh attack surface
Time Management
| Rule |
Action |
| 5-minute rule |
No interesting signals after 5 min → skip target |
| 20-minute rotation |
No progress in 20 min → rotate vuln class or endpoint |
| 1-hour rule |
Stuck on one target for 1 hour → switch programs entirely |
| A→B time box |
20 min per B candidate, max 3 candidates |
| Exhaustion rule |
A class is "exhausted" only after the depth matrix baseline + sibling coverage (see Phase 3 steps 6-11) |
ROI Ranking by Bug Class
| Bug Class |
Competition |
Avg Payout |
Verdict |
| IDOR |
Medium |
High |
Best ROI — always test first |
| Auth bypass |
Medium |
High |
Second priority |
| Business logic |
Low |
High |
Unique to each target |
| Race conditions |
Low |
Medium-High |
Under-tested |
| OAuth/OIDC chains |
Low |
High |
Complex but high payoff |
| SSRF → cloud |
Medium |
Very High |
If you find DNS callback |
| Cache poisoning |
Low |
High |
Rare skill |
| XSS |
Very High |
Medium |
Skip unless you have a chain |
| Open redirect |
Very High |
Low |
Only with OAuth chain |
| Missing headers |
Infinite |
$0 |
Never submit |
1---2name: pentest-agents-hunting-methodology3description: Hunting Methodology4---5# Hunting Methodology67## The 5-Phase Non-Linear Workflow89### Phase 1: Understand the Target (before touching anything)101. Read program scope, policy, safe harbor112. Read 5+ disclosed reports in hacktivity123. Map crown jewels: what would hurt the company most?134. Understand the business domain — what features handle money, PII, auth?1415### Phase 2: Map the Surface161. Subdomain enumeration → live hosts → tech stack detection172. JS bundle analysis → API endpoints, secrets, internal URLs183. Run `/surface` for P1/P2/Kill ranking1920### Phase 3: Hunt (the actual testing)211. Pick P1 target from surface ranking222. Select vuln class based on tech stack:23 - Rails/Django/Laravel → IDOR, mass assignment24 - Express/Node → prototype pollution, path traversal25 - Spring Boot → Actuator, SSTI26 - Next.js → SSRF via Server Actions27 - GraphQL → introspection, IDOR via node(), mutation auth bypass283. Test with concrete payloads (see /hunt)294. Apply the Sibling Rule on every endpoint305. 20-minute rotation if no progress316. Build a **depth matrix** before declaring a class exhausted:32 - Dimensions: `entrypoint × method × content-type × encoding × bypass`33 - Minimum 30 combinations on P1 surface (seed with `uv run python3 ../../tools/intel_engine.py matrix <class>`)34 - Do not stop at the first blocked payload — mutate and continue357. Run **cross-context variants** for every promising input:36 - URL / query, JSON, form-urlencoded, multipart, GraphQL variables37 - Header / cookie mirrors, reflected values, stored values, async jobs / webhooks388. Execute **encoding ladders** systematically:39 - raw → URL → double-URL → unicode escape → mixed-case / separator insertion40 - Keep the semantic payload constant through each ladder step41 - Then **stack encodings** in a single payload: `html-entity+URL`42 (`%26lt%3Bscript%26gt%3B`), `URL+html-entity`, `unicode-escape+URL`,43 `base64+URL`. WAFs typically decode once; targets decode twice, so a44 payload that looks benign after a single decode still executes at the45 sink.469. Execute **auth-state permutations**:47 - unauthenticated, low-priv user A, low-priv user B, high-priv, expired token, stale session, cross-tenant48 - Compare response deltas (status, length, timing), not only status codes4910. Treat every bypass as a **family**, not a one-off:50 - For WAF / filter blocks, try separator insertion, case toggling, alternate delimiters, parser differentials, and protocol / host normalization tricks5111. **Log negative evidence** (what failed and why) via `uv run python3 ../../tools/brain.py record <target> recon "coverage-<class>" "<details>"` so autopilot resume avoids repeating exhausted paths.5253### Phase 4: Validate + Chain541. Run 7-Question Gate on any signal552. If PASS → check A→B chain table563. If CHAIN REQUIRED → build the chain or drop it574. If KILL → move on immediately5859### Phase 5: Report + Submit601. Quality check (score ≥ 7)612. Dupcheck against hacktivity623. Submit with PoC + evidence + CVSS 4.06364## Wide vs Deep Route Selection6566**Wide route** (recon-heavy): New target, unknown surface, no prior data.67- Run `/pipeline` for broad coverage first68- Then `/surface` to prioritize6970**Deep route** (hunt-heavy): Known target, mapped surface, returning hunter.71- Run `/resume` to see what's untested72- Pick the highest-ROI untested endpoint73- Go deep on one vuln class7475## Developer Psychology7677Developers make CLASS mistakes, not random ones:78- If they forgot auth on endpoint A, they probably forgot on B and C79- If they use sequential integer IDs anywhere, they use them everywhere80- If input validation is weak in one form, check ALL forms81- New features (< 30 days) have the weakest security82- Acquired companies (different code, different team) = fresh attack surface8384## Time Management8586| Rule | Action |87|---|---|88| 5-minute rule | No interesting signals after 5 min → skip target |89| 20-minute rotation | No progress in 20 min → rotate vuln class or endpoint |90| 1-hour rule | Stuck on one target for 1 hour → switch programs entirely |91| A→B time box | 20 min per B candidate, max 3 candidates |92| Exhaustion rule | A class is "exhausted" only after the depth matrix baseline + sibling coverage (see Phase 3 steps 6-11) |9394## ROI Ranking by Bug Class9596| Bug Class | Competition | Avg Payout | Verdict |97|---|---|---|---|98| IDOR | Medium | High | Best ROI — always test first |99| Auth bypass | Medium | High | Second priority |100| Business logic | Low | High | Unique to each target |101| Race conditions | Low | Medium-High | Under-tested |102| OAuth/OIDC chains | Low | High | Complex but high payoff |103| SSRF → cloud | Medium | Very High | If you find DNS callback |104| Cache poisoning | Low | High | Rare skill |105| XSS | Very High | Medium | Skip unless you have a chain |106| Open redirect | Very High | Low | Only with OAuth chain |107| Missing headers | Infinite | $0 | Never submit |