@aegis-scan/skills 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/ATTRIBUTION.md +111 -0
  2. package/CHANGELOG.md +48 -3
  3. package/package.json +1 -1
  4. package/skills/compliance/aegis-native/brutaler-anwalt/CHANGELOG.md +202 -0
  5. package/skills/compliance/aegis-native/brutaler-anwalt/LICENSE +43 -0
  6. package/skills/compliance/aegis-native/brutaler-anwalt/README.md +236 -0
  7. package/skills/compliance/aegis-native/brutaler-anwalt/SKILL.md +339 -5
  8. package/skills/compliance/aegis-native/brutaler-anwalt/references/aegis-integration.md +3 -4
  9. package/skills/compliance/aegis-native/brutaler-anwalt/references/audit-patterns.md +842 -5
  10. package/skills/compliance/aegis-native/brutaler-anwalt/references/bgh-urteile.md +226 -10
  11. package/skills/compliance/aegis-native/brutaler-anwalt/references/branchenrecht.md +365 -1
  12. package/skills/compliance/aegis-native/brutaler-anwalt/references/checklisten.md +33 -0
  13. package/skills/compliance/aegis-native/brutaler-anwalt/references/dsgvo.md +26 -0
  14. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BDSG/paragraphs.md +62 -0
  15. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BFSG/paragraphs.md +85 -0
  16. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BGB/paragraphs.md +112 -0
  17. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DDG/paragraphs.md +71 -0
  18. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DSGVO/articles.md +182 -0
  19. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/articles.md +108 -0
  20. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/articles.md +131 -0
  21. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HGB-AO/paragraphs.md +61 -0
  22. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/INDEX.md +93 -0
  23. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/paragraphs.md +67 -0
  24. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/paragraphs.md +117 -0
  25. package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VSBG/paragraphs.md +57 -0
  26. package/skills/compliance/aegis-native/brutaler-anwalt/references/it-recht.md +22 -0
  27. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/INDEX.md +122 -0
  28. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/mistral-eu.md +123 -0
  29. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/openai-dpa.md +120 -0
  30. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/nextauth-tom.md +120 -0
  31. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/supabase-auth-tom.md +104 -0
  32. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/proxy-csp-pattern.md +93 -0
  33. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/payment/stripe-pci-tom.md +121 -0
  34. package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/plausible-pattern.md +107 -0
  35. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/AffiliateDisclaimer.tsx.example +54 -0
  36. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/COMPLIANCE-AUDIT-TRAIL-template.md +95 -0
  37. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSE-Section-UGC.md.example +77 -0
  38. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSFA-template.md +76 -0
  39. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/LostFoundReportForm-consent.tsx.example +126 -0
  40. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/README.md +33 -0
  41. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/UmamiScript.tsx.example +64 -0
  42. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/VVT-template.md +60 -0
  43. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/data-retention-cron.ts.example +52 -0
  44. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/data-retention-workflow.yml.example +47 -0
  45. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/proxy-strict-dynamic.ts.example +80 -0
  46. package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/security.txt.example +26 -0
  47. package/skills/compliance/aegis-native/brutaler-anwalt/scripts/health-check.sh +120 -0
  48. package/skills/defensive/aegis-native/rls-defense/SKILL.md +85 -0
  49. package/skills/foundation/aegis-native/aegis-module-builder/SKILL.md +5 -1
  50. package/skills/foundation/aegis-native/aegis-orchestrator/SKILL.md +87 -4
  51. package/skills/foundation/aegis-native/aegis-quality-gates/SKILL.md +69 -9
  52. package/skills/offensive/matty-fork/cicd-redteam/SKILL.md +531 -0
  53. package/skills/offensive/matty-fork/cloud-security/SKILL.md +106 -0
  54. package/skills/offensive/matty-fork/container-escape/SKILL.md +174 -0
  55. package/skills/offensive/matty-fork/mobile-pentester/SKILL.md +357 -0
  56. package/skills/offensive/matty-fork/subdomain-takeover/SKILL.md +154 -0
  57. package/skills/osint/elementalsouls-fork/offensive-osint/README.md +92 -0
  58. package/skills/osint/elementalsouls-fork/offensive-osint/SKILL.md +4177 -0
  59. package/skills/osint/elementalsouls-fork/osint-methodology/README.md +66 -0
  60. package/skills/osint/elementalsouls-fork/osint-methodology/SKILL.md +1695 -0
  61. package/sbom.cdx.json +0 -1
@@ -0,0 +1,1695 @@
1
+ <!-- aegis-local: forked 2026-05-01 from elementalsouls/Claude-OSINT@ea42241d068e8112da0e4e28006207125c835c2e (MIT-licensed); attribution preserved, see ATTRIBUTION.md -->
2
+
3
+ ---
4
+ name: osint-methodology
5
+ description: "Comprehensive OSINT methodology for external red-team operations and authorized attack-surface assessments. Covers the 5-stage recon pipeline (seed discovery, asset expansion, enrichment, exposure analysis, reporting), asset-graph discipline with 29 asset types, severity rubric (CRITICAL/HIGH/MEDIUM/LOW/INFO), confidence upgrade workflows, time budgeting, asset-level triage rules, scale-based tactics, identity-fabric mapping (Entra/Okta/ADFS/Google/SAML/M365 Teams+SharePoint+OAuth), API and auth-map methodology, JavaScript deep analysis, mobile attack surface, cloud attack surface, breach×identity correlation, detectability tagging, detection-aware probing (back-off, persona rotation), read-only validator discipline, WAF/CDN bypass + origin discovery, vulnerability prioritization (CVE/EPSS/KEV), phishing infrastructure planning + pretext development, bug bounty submission templates, client deliverable templates with risk translation, threat-actor investigation (incl. RU/CN pivots), cryptocurrency tracing, image/video forensics, chronolocation. Use when planning or executing reconnaissance against authorized targets, mapping an organization's external attack surface, investigating a person/entity, tracing crypto flows, geolocating media, or performing attribution work."
6
+ version: 2.1
7
+ triggers:
8
+ - external recon
9
+ - external red team
10
+ - red team external
11
+ - attack surface management
12
+ - attack surface mapping
13
+ - ASM
14
+ - perimeter recon
15
+ - target reconnaissance
16
+ - bug bounty recon
17
+ - asset discovery
18
+ - footprint
19
+ - attack path
20
+ - identity fabric
21
+ - SSO discovery
22
+ - IdP fingerprinting
23
+ - tenant fingerprinting
24
+ - M365 enumeration
25
+ - Microsoft 365 recon
26
+ - API discovery
27
+ - GraphQL introspection
28
+ - mobile recon
29
+ - APK analysis
30
+ - cloud bucket enumeration
31
+ - bucket enum
32
+ - breach correlation
33
+ - secret leak hunt
34
+ - origin discovery
35
+ - CDN bypass
36
+ - WAF bypass
37
+ - vulnerability prioritization
38
+ - CVE prioritization
39
+ - EPSS
40
+ - CISA KEV
41
+ - phishing infrastructure
42
+ - pretext development
43
+ - bug bounty submission
44
+ - responsible disclosure
45
+ - client report
46
+ - exec summary
47
+ - risk translation
48
+ - confidence upgrade
49
+ - time budget
50
+ - engagement profile
51
+ - asset triage
52
+ - detection-aware probing
53
+ - back-off strategy
54
+ - persona rotation
55
+ - OSINT methodology
56
+ - open source intelligence
57
+ - target profiling
58
+ - data correlation
59
+ - OSINT workflow
60
+ - intelligence collection
61
+ - OSINT campaign
62
+ - recon methodology
63
+ - threat actor investigation
64
+ - attribution
65
+ ---
66
+
67
+ # OSINT Methodology — External Red-Team Edition
68
+
69
+ ## 0. When to use this skill / When NOT
70
+
71
+ **Use this skill when:**
72
+ - Planning or executing external reconnaissance against an authorized target (red team, bug bounty in-scope, ASM engagement).
73
+ - Mapping an organization's external attack surface end-to-end (subdomains → assets → exposure → attack paths).
74
+ - Investigating a person, entity, or threat actor where evidence discipline matters.
75
+ - Tracing cryptocurrency flows, geolocating media, performing image/video forensics, or chronolocating events.
76
+ - Building a structured OSINT campaign that needs reproducibility, severity grading, and clean handoffs.
77
+ - Producing client-facing deliverables (exec summaries, technical reports, reproduction packages) from offensive engagements.
78
+
79
+ **Do NOT use this skill when:**
80
+ - The user is asking for active exploitation, post-exploitation, lateral movement, AD privilege escalation, malware development, or anything beyond reconnaissance — those are out of scope.
81
+ - The user is asking for blue-team / defensive content (SIEM rules, detection engineering) — different domain.
82
+ - The target's authorization is unclear and the user is asking you to act against a third-party asset they don't own — see §1 below; gently surface the scope question before proceeding.
83
+
84
+ ---
85
+
86
+ ## 1. Authorization & Legal Posture
87
+
88
+ This skill is intended for assets the operator owns or has written authorization to assess (red-team rules of engagement, bug-bounty in-scope assets, ASM contracts).
89
+
90
+ **Soft scope check:** when a user asks you to act against a target whose authorization isn't established earlier in the conversation, ask once before proceeding:
91
+
92
+ > *"Quick scope check: is this a target you own or have written authorization to assess (e.g., a red-team engagement, in-scope bug-bounty asset, or your own infrastructure)? I want to make sure we stay on the right side of the engagement boundary."*
93
+
94
+ Once authorization is asserted, proceed without re-asking. If the user explicitly states the engagement type (e.g., "this is for our pentest of acme.com under contract"), you don't need to ask again.
95
+
96
+ **Always-on guardrails (regardless of authorization):**
97
+ - Never weaken auth, rate limits, banners, or any safety control that enforces scope on the target side.
98
+ - Never run destructive probes (true SYN scans on production, masscan at line rate, fuzzing/brute-force) outside an explicit DEEP / `--aggressive` mode.
99
+ - Never paste real PII, valid credentials, session tokens, API keys, or other secrets into cloud-hosted LLMs or third-party services.
100
+ - Never take action against assets outside the documented scope, even if "obviously related" (subsidiaries, vendors, employees' personal accounts, etc.).
101
+
102
+ ---
103
+
104
+ ## 2. Confidence Levels
105
+
106
+ Every assertion you make during an engagement should carry a confidence level. Three levels:
107
+
108
+ | Level | Meaning | Examples |
109
+ |---|---|---|
110
+ | **TENTATIVE** | Plausible based on indirect evidence; unverified. | Snippet-only Google dork match; email pattern inferred from name; subdomain returned by one passive source only; favicon-hash overlap (two hosts share a favicon — could be shared infra, could be a coincidence). |
111
+ | **FIRM** | Directly observed but uncorroborated. | Subdomain that resolves to an IP; HEAD-confirmed bucket exists (private); CT-log entry shows certificate; Shodan banner returned. |
112
+ | **CONFIRMED** | Multiple independent corroborations OR directly verified. | Live-validated PMAK token (read-only `/me` returned 200); breach corpus + crt.sh + DNS all agree; bucket listable AND files retrievable; user enumerated AND password reset flow returns valid hint. |
113
+
114
+ **Rule of three for attribution:** require three independent weak signals, OR one strong + one weak, before asserting linkage. Don't single-source attribute.
115
+
116
+ ### 2.1 Confidence Upgrade Workflows
117
+
118
+ Confidence isn't static — every TENTATIVE asset should have a documented path to FIRM and to CONFIRMED. Use these per-asset-type rules.
119
+
120
+ | Asset type | TENTATIVE → FIRM | FIRM → CONFIRMED |
121
+ |---|---|---|
122
+ | **Subdomain** | Returned by ≥2 independent passive sources, OR DNS A/AAAA/CNAME resolves successfully. | Serves on a standard port (80/443/22/etc.) AND HTTP banner / TLS cert / SSH banner returned. |
123
+ | **IP** | Discovered via ≥2 sources (passive DNS, ASN lookup, Shodan). | Active probe responds (TCP SYN-ACK on at least one port, or ICMP echo reply). |
124
+ | **WebApp** | URL extracted from JS / API / archive but not yet hit. | HTTP request returns 2xx/3xx/4xx (any non-network-error response) AND content-length > 0. |
125
+ | **Email** | Generated from a name pattern OR returned by snippet-only dork. | Listed in Hunter.io / EmailRep / IntelX / breach corpus, OR `MAIL FROM`/`RCPT TO` SMTP probe returns 250 (without delivery — abort at DATA). |
126
+ | **Bucket (S3/GCS/Azure)** | Permutation candidate; no probe yet. | HEAD returns 200, 301, or 403 (existence confirmed). Then CONFIRMED when GET returns object listing or known object retrieval. |
127
+ | **Endpoint (API / wayback)** | Extracted from JS regex / Wayback / Postman. | HTTP request returns non-404 (route exists). Then CONFIRMED when the endpoint's behavior is fingerprinted (auth posture, response shape, rate limits). |
128
+ | **Credential / secret** | Matches catalog regex in captured text. | Read-only validator (`/me`, `auth.test`, `sts:GetCallerIdentity`, `/user`) returns success. Then CONFIRMED with documented scope + account ID. |
129
+ | **Person** | Name extracted from a single source (LinkedIn / breach / GitHub commit). | Confirmed by a second source (Hunter.io role + LinkedIn profile, or two breach sources with same email). |
130
+ | **Repo** | Name match on org keyword in GitHub search. | Repo metadata shows confirmed org/email/website match. Then CONFIRMED when commit-history shows employee involvement. |
131
+ | **Mobile app** | Name match in app store. | Ownership-confidence score ≥70 (see companion skill §21). Then CONFIRMED when binary metadata (signing cert, package name, dev account) ties back to target. |
132
+ | **Certificate** | Returned by crt.sh once. | CT-log entry confirmed in ≥2 logs. Then CONFIRMED when serving on a discovered host. |
133
+ | **SSO tenant** | Discovery-endpoint returns OIDC metadata. | Tenant GUID extracted AND domain resolves through the tenant's expected MX / autodiscover / SP record. |
134
+
135
+ **Default reporting posture:** never claim CONFIRMED without explicit corroboration. When in doubt, downgrade. Operators trust under-claims more than over-claims.
136
+
137
+ ---
138
+
139
+ ## 3. Output Format Conventions
140
+
141
+ When you produce findings during an active session, structure each finding to match the schema below — it drops cleanly into asset-management tools.
142
+
143
+ ```
144
+ Finding:
145
+ id: <stable hash or UUID>
146
+ module: <which technique discovered it; "manual" if hand-found>
147
+ asset_key: <typed key, e.g. sub:api.example.com or webapp:https://example.com/admin>
148
+ category: <e.g. SECRET_LEAK, MISSING_HSTS, OPEN_GRAPHQL_API, LEAKED_CRED, SSO_EXPOSURE>
149
+ severity: <info|low|medium|high|critical>
150
+ confidence: <tentative|firm|confirmed>
151
+ title: <one-line summary>
152
+ description: <2-5 sentences>
153
+ evidence:
154
+ url: <where it was found>
155
+ timestamp: <UTC ISO8601>
156
+ sha256: <hash of any downloaded artifact>
157
+ raw: <truncated to 2 KiB>
158
+ references:
159
+ - <CVE-ID, advisory URL, vendor doc>
160
+ remediation: <action the asset owner can take>
161
+ ```
162
+
163
+ **Always use UTC timestamps**. Local time creates correlation bugs across notes/screenshots/logs.
164
+
165
+ ---
166
+
167
+ ## 4. Source Hygiene & Citations
168
+
169
+ For every artifact you capture, record: **URL + UTC timestamp + SHA-256 hash + tool version + run_id**.
170
+
171
+ - Hash all downloaded files with SHA-256.
172
+ - Screenshot in PNG (lossless, smaller than full-page WARC for evidence packs).
173
+ - Capture raw HTTP requests/responses, capped at 2 KiB body to keep evidence packs small.
174
+ - Use JSONL (NDJSON) logs, one line per event, with a `run_id` so the entire engagement is replayable.
175
+ - Separate evidence read-only from working copies; never edit captured artifacts.
176
+
177
+ When citing a source in your output, prefer durable references (CVE, vendor advisory, ATT&CK technique ID, RFC) over ephemeral ones (a Twitter post, a forum thread). If the only source is ephemeral, archive it (archive.today, Wayback SavePageNow) before citing.
178
+
179
+ ---
180
+
181
+ ## 5. Do NOT (hard rules)
182
+
183
+ - DO NOT paste creds, session tokens, API keys, real PII, infostealer logs, or unique pivots into cloud LLMs (ChatGPT, Claude.ai, Gemini, Perplexity). Use local models (Ollama, LM Studio, GPT4All) for sensitive analysis.
184
+ - DO NOT assume vendor labels are ground truth. Cross-label sanity: TRM, Chainalysis, Arkham can disagree. Treat every label as a hypothesis.
185
+ - DO NOT assume 1:1 bridge flows. Bridges/mixers/wrappers introduce mint/burn semantics; validate with on-chain proofs.
186
+ - DO NOT assert ownership from a single signal. Favicon-hash overlap, shared CT issuer, shared NS — each is a hypothesis. Need rule-of-three.
187
+ - DO NOT run fuzzing, SYN scans, masscan, or `nuclei fuzzing/*` templates outside an explicit DEEP / `--aggressive` mode.
188
+ - DO NOT use a credential validator to do anything except read-only verification (no create/delete/send).
189
+ - DO NOT mirror-image (assume the target thinks like you do). Separate capability from intent and sponsorship.
190
+ - DO NOT confuse correlation with control.
191
+ - DO NOT escalate when you encounter active defenses; back off and document (see §6.4).
192
+
193
+ ---
194
+
195
+ ## 6. OpSec
196
+
197
+ ### 6.1 Sock Puppets
198
+
199
+ A sock puppet is a fake account that cannot be linked to you. Build a posting history, age the account, use it from a separate browser profile.
200
+
201
+ Resources & techniques:
202
+ - Persona generation: [Fake Name Generator](https://www.fakenamegenerator.com/), [This Person Does Not Exist](https://thispersondoesnotexist.com/).
203
+ - Browser isolation: [Firefox Multi-Account Containers](https://addons.mozilla.org/firefox/addon/multi-account-containers/), or dedicated profiles per persona.
204
+ - Disposable phone numbers: Burner, Silent Link (some platforms reject VoIP — keep a backlog of numbers).
205
+ - Hardware passkeys for any high-value persona; store recovery codes offline.
206
+ - Audit every browser extension before installation. Supply-chain attacks on popular extensions have repeatedly targeted investigators — assume the popular ones are at higher risk, not lower.
207
+ - Maintain chain-of-custody: timestamp every action, hash every key artifact, record tool versions per case.
208
+ - Personas should look like real low-engagement accounts: profile photo (synthetic), bio, a few low-effort posts spread across weeks before the persona is "used."
209
+
210
+ References:
211
+ - [Effective Sock Puppets](https://medium.com/@unseeable06/creating-an-effective-sock-puppet-for-your-osint-investigation-95fdbb8b075a)
212
+ - [Ultimate Guide to Sock Puppets](https://osintteam.blog/the-ultimate-guide-to-sockpuppets-in-osint-how-to-create-and-utilize-them-effectively-d088c2ed6e36)
213
+
214
+ ### 6.2 Detectability & OpSec Tagging
215
+
216
+ Every probe leaves a footprint. Tag every operation in your notes with a detectability level so you can reason about the SIEM trail you're leaving on the target's side.
217
+
218
+ | Tag | Examples |
219
+ |---|---|
220
+ | **Low** | Passive Shodan InternetDB; CT-log queries (crt.sh); Wayback CDX; passive DNS (SecurityTrails); Hunter.io email enrichment; HTTP HEAD on public buckets; `getuserrealm.srf`; Microsoft OIDC metadata fetch. |
221
+ | **Medium** | Microsoft `GetCredentialType` user-enum; Okta `/api/v1/authn` user-enum; Postman API key validation; AWS `sts:GetCallerIdentity` (logs to CloudTrail); Slack `auth.test`; full-page screenshots; Swagger/GraphQL probes against a 28/13-path wordlist; targeted favicon-hash + JARM fingerprinting. |
222
+ | **High** | Active port scans (naabu / masscan / nmap); Nuclei full template runs against production; subdomain brute-force at scale; APK download from third-party mirrors; deep-mode user enumeration past N attempts per tenant; SMTP `RCPT TO` enumeration; web fuzzing (ffuf/gobuster). |
223
+
224
+ When working with a client, document the operations actually run and their detectability tag in the engagement report — clients appreciate knowing what their detection stack should have caught.
225
+
226
+ **Defaults:** passive by default. Active probes only when (a) explicitly authorized, (b) within agreed maintenance windows, and (c) with the operator's awareness of the resulting log volume.
227
+
228
+ ### 6.3 Validator Discipline
229
+
230
+ When you discover a credential in the wild (a leaked API key, a sourcemap-exposed token, a hard-coded PMAK in a public Postman workspace), you may want to confirm it's live. Do this with **read-only validators only**.
231
+
232
+ Discipline:
233
+ - Read-only endpoint only (e.g., `/me`, `/whoami`, `auth.test`, `sts:GetCallerIdentity`).
234
+ - Never use the validated credential to create, modify, delete, or send anything.
235
+ - Tag the validation attempt with detectability — every validator generates an audit-log entry on the provider side.
236
+ - Record `checked_at` (UTC), the response (truncated), and the scope/account-ID returned.
237
+ - If the operator's rules of engagement forbid validation, mark the credential `validation_skipped_by_policy` and stop.
238
+
239
+ Concrete validator endpoints (Postman, AWS, GitHub, Slack, Anthropic, OpenAI, npm, Atlassian, DataDog) live in the companion `offensive-osint` skill.
240
+
241
+ ### 6.4 Detection-Aware Probing (signs of detection + back-off)
242
+
243
+ Your probes will eventually hit detection. Recognize the signs and back off **before** you trip an active response.
244
+
245
+ **Signs you've been detected (in roughly increasing severity):**
246
+
247
+ 1. **Rate-limit responses** — `429 Too Many Requests`, `Retry-After` header set, `X-RateLimit-Remaining: 0`.
248
+ 2. **Captcha interstitials** — Cloudflare interstitial page, hCaptcha challenge, AWS WAF page.
249
+ 3. **WAF page** — explicit "Access denied" with provider branding (Cloudflare, Akamai, Imperva, F5 ASM, AWS WAF, Sucuri).
250
+ 4. **Status code drift** — endpoints that previously returned 200/401 now return 403 only from your IP.
251
+ 5. **Banner change** — server header shape or response timing changes consistently.
252
+ 6. **DNS poisoning back to NXDOMAIN** — target's authoritative servers stop resolving subdomains (probably their CDN took over).
253
+ 7. **Honeypot bait** — endpoints that look too good (`/admin/db_dump.sql`, exposed `.env` with credentials that don't validate). Real exposures rarely look this clean.
254
+ 8. **Direct contact** — your sock-puppet email gets a "we noticed unusual activity" message; or, in extreme cases, your IP gets a courtesy abuse-contact email.
255
+
256
+ **Back-off ladder:**
257
+
258
+ 1. **Slow down.** Halve your concurrency. Add 2–10s jitter between requests.
259
+ 2. **Switch endpoints.** Stop hitting the path that triggered. Move to a different module of the recon pipeline.
260
+ 3. **Switch persona.** New User-Agent (rotate among realistic browsers), new TLS fingerprint (different httpx/curl version).
261
+ 4. **Switch IP.** Rotate to a new egress (residential proxy, Tor for sensitive lookups, a different cloud region).
262
+ 5. **Pause.** Wait 1–24 hours. Many WAFs have rolling-window IP-based reputation; passive time often resets it.
263
+ 6. **Document and consult.** If you've hit (3) WAF, (4) status drift, or (8) direct contact, **stop active probing and consult the engagement lead**. Continued probing past these signals risks scope violation.
264
+
265
+ **Persona / IP rotation rules:**
266
+ - Never rotate persona to one that's been used in a prior engagement against the same target.
267
+ - Use residential proxies (Bright Data, Smartproxy, IPRoyal) for high-detectability work — but be aware they're sometimes IP-blocklisted by Cloudflare.
268
+ - Tor exit nodes are useful for **passive lookups** (CT logs, archive sites) but are blocked by most active-probe targets.
269
+ - Cloud egress IPs (AWS / GCP / Azure) are often blocklisted aggressively for recon. Use sparingly.
270
+ - Document every rotation with timestamp + reason; reviewers will ask.
271
+
272
+ **Don't:**
273
+ - Don't try to "outsmart" a confirmed WAF block by sending more aggressive payloads. That's how clients get extra logs and how you get caught.
274
+ - Don't switch source IPs to evade an explicit block-list — that crosses into evasion territory and may breach the rules of engagement.
275
+ - Don't ignore signals because the dashboard says "still up." The probe is being silently logged; the response will come later.
276
+
277
+ ---
278
+
279
+ ## 7. External Red-Team Recon Pipeline
280
+
281
+ A 5-stage pipeline for any authorized external assessment. Stages are sequential; modules within a stage can run concurrently.
282
+
283
+ ### Stage 1 — Seed Discovery
284
+ Establish the ground truth of who/what the target is.
285
+
286
+ - WHOIS on the seed domain (registrant, dates, name servers).
287
+ - ASN enumeration: which AS does the org own/use? (Hurricane Electric BGP Toolkit, RIPEstat, BGPView.)
288
+ - DNS records (A/AAAA/MX/TXT/NS/SOA/CAA) — records-only, no walking yet.
289
+ - Certificate Transparency history for the root domain (crt.sh, Censys).
290
+
291
+ ### Stage 2 — Asset Expansion
292
+ Discover everything that might belong to the target.
293
+
294
+ - Subdomain enumeration (passive sources first: crt.sh, VirusTotal, AlienVault OTX, Shodan, then permutations and bruteforce).
295
+ - Cloud bucket enumeration (S3/GCS/Azure permutations from company name + subdomain stems — see §15).
296
+ - Typosquat domain generation (dnstwist variants → resolve → WHOIS) — for both phishing risk and adjacent corp assets.
297
+ - Wayback CDX archive endpoints for forgotten paths.
298
+ - Mobile app discovery (Android via google-play-scraper, iOS via iTunes Search API — see §14).
299
+ - DNS deep walking (NSEC walk on misconfigured zones, AXFR opportunism).
300
+ - LinkedIn employee enumeration → email-pattern derivation.
301
+
302
+ ### Stage 3 — Enrichment
303
+ Add depth to the discovered assets.
304
+
305
+ - Port + service detection (Shodan InternetDB free → naabu/masscan if authorized).
306
+ - Live TLS handshakes (cert chain, JARM, favicon mmh3 hash).
307
+ - Web tech detection (Wappalyzer-style ~600 signatures via httpx).
308
+ - WAF/CDN inference (header markers).
309
+ - Origin discovery if behind CDN (see §27).
310
+ - Security header audit.
311
+ - Bulk screenshots (triage 1000s of hosts visually).
312
+ - Email harvesting (6 parallel sources).
313
+ - Email security audit (SPF/DMARC/DKIM/BIMI/MTA-STS).
314
+ - GitHub code-search dorking (13 dork templates × 29+ secret regexes).
315
+ - JavaScript deep analysis (sourcemaps, secrets, endpoints, internal-host leakage).
316
+ - SSO/IdP tenant fingerprinting (Entra, Okta, ADFS, Google, SAML, M365 Teams/SharePoint/OAuth — see §11).
317
+ - API & auth-map discovery (Swagger/OpenAPI, GraphQL, Postman).
318
+ - Secrets-beyond-GitHub sweep (Postman public workspaces, Stack Exchange, Trello/Notion/Atlassian dorks).
319
+ - Vendor product fingerprinting (Citrix/F5/PaloAlto/Pulse/Fortinet/Cisco/VMware/Exchange).
320
+ - Container / CI-CD / cloud-native exposure check.
321
+ - Job posting harvest for tech-stack inference.
322
+
323
+ ### Stage 4 — Exposure Analysis
324
+ Convert assets into findings.
325
+
326
+ - Nuclei (15 always-on built-in checks + optional binary).
327
+ - TLS deep audit (sslyze / testssl.sh).
328
+ - Breach × identity correlation (HudsonRock Cavalier, HIBP, DeHashed, IntelX, local corpus → SSO_EXPOSURE findings).
329
+ - Targeted misconfiguration probes (`.git/config`, `.env`, `phpinfo.php`, `/actuator/env`, `/actuator/heapdump`, `_cat/indices`, `/console`, `/manager/html`).
330
+ - Vulnerability prioritization (CVE × EPSS × CISA KEV × public-POC availability — see §28).
331
+
332
+ ### Stage 5 — Reporting
333
+ Make the work usable.
334
+
335
+ - Risk scoring per finding (CVSS + program-specific weights).
336
+ - Asset graph export (D3-friendly nodes/links, GraphML, JSON).
337
+ - Client-facing report (executive summary + technical detail + remediation — see §31).
338
+ - Reproduction package (run_id, tool versions, raw evidence, JSONL log).
339
+ - Bug bounty submission (if applicable — see §30).
340
+
341
+ ### 7.5 Pipeline Priority Order (highest signal density first)
342
+
343
+ When budget is constrained, work in this order:
344
+
345
+ 1. **Breaches** — infostealer logs (HudsonRock Cavalier free tier) + HIBP + DeHashed. Highest ROI for red teams; often gives valid plaintext creds for corp SSO. Requires emails as input.
346
+ 2. **GitHub recon** — code-search dorks. Finds AWS keys, Slack tokens, JWT secrets, `.env` files. Fastest path to cloud pivot.
347
+ 3. **Nuclei misconfig sweep** — exposed admin panels, CVEs with public POCs.
348
+ 4. **Cloud buckets** — permutate company name + subdomain stems. Listable bucket = CRITICAL.
349
+ 5. **Ports** — Shodan InternetDB first (free, keyless). VPN concentrators, RDP, Jenkins, GitLab-CE, Elasticsearch are the high-value pivot points.
350
+ 6. **Email OSINT** — feeds breaches; feeds phishing list.
351
+ 7. **Web tech / WAF / screenshots** — triage thousands of hosts; know the stack before probing.
352
+ 8. **Wayback** — archived JS often has hard-coded keys; archived endpoints reveal removed admin/dev paths.
353
+ 9. **DNS deep + email security** — SPF/DMARC gaps enable email spoofing; TXT verification tokens reveal SaaS tenancies.
354
+ 10. **Certificates** — CT-log timeline catches forgotten subdomains; weak ciphers = cheap findings.
355
+ 11. **ASN + reverse DNS** — corporate IP space hosts unadvertised infra.
356
+ 12. **WHOIS** — registrant PII reveals adjacent corp assets.
357
+ 13. **Typosquat** — actively-registered squats are findings; unregistered ones go on the phishing-domain shortlist.
358
+ 14. **Security headers** — low standalone value but required for client reports.
359
+
360
+ ### 7.6 Time Budgeting & Engagement Profiles
361
+
362
+ Stage and asset count drive how long a recon takes. Rough estimates (single operator on a typical SaaS-style target):
363
+
364
+ | Stage | Small org (<100 employees) | Medium (100–1K) | Large (1K+) |
365
+ |---|---|---|---|
366
+ | 1. Seed discovery | 30 min | 30 min | 30 min |
367
+ | 2. Asset expansion | 1–2 h | 2–4 h | 4–8 h |
368
+ | 3. Enrichment (per 100 alive webapps) | ~1 h | ~1 h | ~1 h |
369
+ | 4. Exposure analysis | 1–3 h | 3–6 h | 6–12 h |
370
+ | 5. Reporting | 2–4 h | 4–8 h | 1–2 days |
371
+
372
+ **Engagement profiles:**
373
+
374
+ - **1-hour rapid recon ("how exposed is X?")** — Stage 1 (15 min) → passive subdomain (crt.sh + Subfinder, 10 min) → Shodan InternetDB on resolved IPs (5 min) → email harvest via Hunter+IntelX (10 min) → breach lookup on emails (10 min) → executive-summary-only output (10 min).
375
+ - **4-hour focused recon ("phish-readiness check")** — adds: full email harvest, LinkedIn employee enum, SPF/DMARC analysis, typosquat candidate generation, SSO/IdP fingerprinting. Output: phishing-feasibility report + target email list.
376
+ - **1-day standard recon** — full Stages 1–4 with the priority order above. Output: per-asset finding list + asset graph + exec summary.
377
+ - **1-week deep recon** — all of standard, plus: deep-mode user enumeration, JS deep analysis at full budget, mobile attack surface, cloud-native fingerprinting, vendor product fingerprinting, package registry leak hunting, vulnerability prioritization. Output: full client deliverable package + reproduction bundle.
378
+ - **Ongoing monitoring (weekly diff)** — re-run Stages 1–3 weekly; diff against baseline; alert on new asset / new finding / asset disappeared.
379
+
380
+ **When to abort early:**
381
+ - After Stage 1 if scope is wrong (target turns out to be subsidiary of unrelated corp; rules of engagement need clarification).
382
+ - After Stage 2 if attack surface is below threshold (no public webapps + no exposed services + no leaked emails → little to find externally).
383
+ - During any stage if you hit the WAF / detection signs in §6.4.
384
+
385
+ ---
386
+
387
+ ## 8. Asset Graph Discipline
388
+
389
+ Treat every discovery as a typed asset in a graph, not a free-floating string.
390
+
391
+ ### 8.1 Asset Taxonomy (29 types)
392
+
393
+ | Category | Asset Types |
394
+ |---|---|
395
+ | **DNS / Network** | `domain`, `subdomain`, `ip`, `netblock`, `asn` |
396
+ | **Service** | `port`, `service`, `certificate` |
397
+ | **Identity** | `email`, `person`, `credential` |
398
+ | **Code / Config** | `repo`, `secret` |
399
+ | **Cloud / Storage** | `bucket`, `firebase_project` |
400
+ | **Web** | `webapp`, `wayback_endpoint`, `api_endpoint`, `api_spec`, `graphql_schema` |
401
+ | **Mobile** | `mobile_app`, `deep_link`, `exported_component` |
402
+ | **Phishing / Adversarial** | `typosquat_domain` |
403
+ | **Collaboration / SaaS** | `postman_collection`, `postman_workspace`, `postman_api_key`, `stack_post`, `saas_public_surface` |
404
+
405
+ ### 8.2 Asset Schema
406
+
407
+ Every asset carries:
408
+ - `type` — one of the 29 above.
409
+ - `key` — unique dedup id (typed prefix, e.g. `sub:api.example.com`, `email:alice@example.com`).
410
+ - `value` — the actual string/object.
411
+ - `sources[]` — every source that confirmed this asset (deduplicated).
412
+ - `confidence` — TENTATIVE / FIRM / CONFIRMED.
413
+ - `first_seen`, `last_seen` — UTC timestamps.
414
+ - `attrs{}` — type-specific metadata (e.g., for a `webapp`: status_code, title, tech-stack list, JARM, favicon mmh3, screenshot path).
415
+
416
+ ### 8.3 Edge Taxonomy
417
+
418
+ Relationships are typed edges, not text:
419
+ `RESOLVES_TO`, `HOSTED_ON`, `IN_NETBLOCK`, `BELONGS_TO_ASN`, `LISTED_IN_CERT`, `OWNED_BY`, `ALIAS_OF`, `BREACHED_FROM`, `EMPLOYED_BY`, `HOSTS_REPO`, `TYPOSQUAT_OF`, `EXPOSES`, `DOCUMENTED_BY`, `BELONGS_TO_HOST`, `REQUIRES_AUTH`, `LEAKS_SCHEMA`, `SHIPPED_BY_ORG`, `CONTAINS_SECRET`, `TALKS_TO_HOST`, `EXPOSES_DEEPLINK`, `HAS_EXPORTED_COMPONENT`, `USES_FIREBASE_PROJECT`, `LACKS_PINNING_FOR`.
420
+
421
+ ### 8.4 Discipline rules
422
+
423
+ - **Every discovery is an asset.** Don't write findings against free-floating strings; create the asset first, then attach the finding.
424
+ - **Dedup by key, not by value.** Same value, different type ≠ same asset (`sub:api.example.com` and `webapp:https://api.example.com/` are different assets with a `BELONGS_TO_HOST` edge).
425
+ - **Provenance is non-negotiable.** `sources[]` must list every source. If two sources confirmed it, both go in.
426
+ - **Confidence is per-source, then aggregated.** A subdomain returned by 3 passive sources is FIRM; one returned by snippet-only Bing is TENTATIVE.
427
+ - **Late binding via sidecars.** When module A produces output that module B needs, write a JSON sidecar (`mobile_endpoints.json`, `secrets_sidecar.json`) — don't block module B on module A. See §24.
428
+
429
+ ### 8.5 Asset-Level Triage Rules
430
+
431
+ When you have a mixed bag of assets and limited probe budget, prioritize by what each asset *enables*:
432
+
433
+ **WebApp priority by hostname signal (highest first):**
434
+
435
+ 1. Auth-related hostnames (`auth.`, `login.`, `sso.`, `idp.`, `accounts.`, `oauth.`).
436
+ 2. Admin paths (`/admin`, `/dashboard`, `/console`, `/manager`, `/wp-admin`, `/phpmyadmin`).
437
+ 3. Dev/staging hosts (`dev.`, `staging.`, `stg.`, `qa.`, `uat.`, `test.`, `sandbox.`, `preprod.`, `preview.`) — lower defenses, often dump prod data.
438
+ 4. API hostnames (`api.`, `services.`, `gateway.`, `graph.`).
439
+ 5. Customer-facing hostnames (`portal.`, `app.`, `my.`, `account.`).
440
+ 6. Marketing / content (`www.`, `blog.`, `news.`, `careers.`, `support.`).
441
+
442
+ **Subdomain priority by inferred function:**
443
+
444
+ - API > Admin > Dev > Auth > Prod-app > Marketing.
445
+
446
+ **IP priority by netblock:**
447
+
448
+ - Corporate ASN-owned (most likely to host unadvertised internal infra).
449
+ - Cloud netblocks (AWS / GCP / Azure / DO / OVH) — high turnover but interesting for cloud-native services.
450
+ - CDN ranges (Cloudflare / Akamai / Fastly) — usually edge, not origin; defer unless doing origin discovery.
451
+
452
+ **Email priority by role hint:**
453
+
454
+ | Role indicator | Priority | Why |
455
+ |---|---|---|
456
+ | `ceo@`, `cfo@`, `cto@`, `ciso@` | HIGHEST | Exec accounts have highest breach value (BEC, finance authority, board access). |
457
+ | `it@`, `helpdesk@`, `support@`, `security@` | HIGH | IT/security accounts have privileged tool access; helpdesk accounts handle reset workflows. |
458
+ | `dev`, `engineer`, `architect`, `dba` | MEDIUM | Developer accounts often have GitHub / cloud / CI access. |
459
+ | `sales`, `marketing`, `hr`, `finance` | MEDIUM | SaaS access (Salesforce, HubSpot, Workday); finance enables BEC. |
460
+ | Generic role accounts (`info@`, `noreply@`, `contact@`) | LOW | Often unmonitored or alias forwarded; less personal context. |
461
+
462
+ **Repo priority by recency + naming:**
463
+
464
+ - Recently-pushed (last 30 days) > stale.
465
+ - Public repo with target name in description > target name only in code.
466
+ - Forked from internal-looking parent > standalone.
467
+ - Mentions `prod`, `internal`, `private`, `secret` in name → priority HIGH despite being public (may be misnamed or accidentally exposed).
468
+
469
+ **Application order:** when you have N assets and budget for M probes (M < N), apply asset-type priority first, then within-type priority. E.g.: 50 subdomains → probe API + admin + dev first (~15), then auth + prod-app (~20), defer marketing/content to a later pass.
470
+
471
+ ---
472
+
473
+ ## 9. Findings Rubric & Severity Mapping
474
+
475
+ Severity is operational, not subjective. Use these anchors:
476
+
477
+ ### 9.1 CRITICAL
478
+
479
+ Pre-auth code execution, confirmed valid credentials, listable production data, fundamental trust violations.
480
+
481
+ Examples:
482
+ - `.git/config` exposed on production webapp (full source-code disclosure).
483
+ - `/.env` exposed (credentials in plaintext, often DB / cloud / API).
484
+ - Spring Boot `/actuator/env` or `/actuator/heapdump` reachable unauthenticated.
485
+ - Listable S3 / GCS / Azure bucket containing user data.
486
+ - Unauthenticated POST/PUT/DELETE to a write endpoint that mutates state.
487
+ - Open Firebase Realtime Database (`https://{project}.firebaseio.com/.json` returns data).
488
+ - `android:debuggable=true` in a production Android app.
489
+ - Live-validated credential (PMAK, AWS key, Anthropic/OpenAI key) with broad scope.
490
+ - ≥10 employees compromised in a breach corpus + their tenant identified (SSO_EXPOSURE).
491
+ - Open Elasticsearch cluster (`/_cat/indices` returns data).
492
+ - Open Docker API (`/v1.40/containers/json` returns containers).
493
+ - Open Redis (no AUTH; can write `authorized_keys`).
494
+ - Open Kubernetes API server with anonymous-auth enabled.
495
+ - Open kubelet on 10250 (pod exec without auth).
496
+ - Open etcd on 2379 (cluster state and secrets).
497
+ - BlueKeep-vulnerable RDP, EternalBlue-vulnerable SMB.
498
+ - Citrix Netscaler / F5 BIG-IP with version-specific RCE CVE.
499
+
500
+ ### 9.2 HIGH
501
+
502
+ Significant exposure but not yet RCE; clear path to escalation; high-value information disclosure.
503
+
504
+ Examples:
505
+ - Public secret in a GitHub repo (PAT, AWS key, Slack token, etc.).
506
+ - Sourcemap (`.js.map`) accessible — full original-source disclosure of frontend.
507
+ - Open GraphQL introspection on production (full schema leaked → mutations to enum).
508
+ - Subdomain takeover possible (CNAME points to unclaimed Heroku/Shopify/etc.).
509
+ - Reflected CORS with credentials (`Access-Control-Allow-Origin: <reflected>` + `Access-Control-Allow-Credentials: true`).
510
+ - Verb tampering: hidden DELETE/PATCH on an endpoint that publicly only allows GET.
511
+ - Missing HSTS on a sensitive path (`/login`, `/sso`, `/admin`, `/auth`) — escalated from MED.
512
+ - Exposed Jenkins/Tomcat-Manager/phpMyAdmin admin UI (no auth or default creds).
513
+ - Telnet (port 23) reachable.
514
+ - WebView with JS bridge in a mobile app (XSS → RCE potential).
515
+ - Sensitive deep-link handler in a mobile app.
516
+ - DMARC policy `p=none` on production sending domain (spoof-feasible).
517
+ - Vendor product banner with known unpatched CVE (KEV-listed).
518
+
519
+ ### 9.3 MEDIUM
520
+
521
+ Information disclosure, hardening gaps, brute-force exposure.
522
+
523
+ Examples:
524
+ - Missing security headers on standard pages: HSTS, CSP.
525
+ - Apache `/server-status` or `/server-info` reachable.
526
+ - `phpinfo()` or `/info.php` reachable on dev/staging only.
527
+ - Internal IP / hostname / K8s service DNS leaked in JS.
528
+ - Schema leakage in error pages (stack traces, ORM signatures).
529
+ - `android:allowBackup=true` in Android app.
530
+ - `android:usesCleartextTraffic=true` in Android app.
531
+ - Exported activity/service without `android:permission` protection.
532
+ - Missing rate-limit on an API endpoint.
533
+ - Wildcard CORS (`Access-Control-Allow-Origin: *`) on an API that returns user-tied data (no creds).
534
+ - Slack webhook URL leaked.
535
+ - Twilio Account SID leaked (without auth token).
536
+ - SPF record permissive (`+all` or many includes).
537
+
538
+ ### 9.4 LOW
539
+
540
+ Cosmetic or marginal hardening gaps.
541
+
542
+ Examples:
543
+ - Missing `X-Frame-Options`.
544
+ - Missing `X-Content-Type-Options`.
545
+ - `.DS_Store` exposed.
546
+ - Stripe **test** key leaked.
547
+ - Firebase URL exposed (URL only, no open RTDB).
548
+ - Certificate pinning missing in mobile app.
549
+ - Outdated WordPress install detected (no known exploit yet).
550
+ - BIMI not configured (brand impersonation risk only).
551
+
552
+ ### 9.5 INFO
553
+
554
+ Worth recording, no action required immediately.
555
+
556
+ Examples:
557
+ - Missing `Referrer-Policy` / `Permissions-Policy`.
558
+ - Discovered `/.well-known/security.txt`.
559
+ - `robots.txt` reveals interesting paths.
560
+ - Private bucket exists but is locked down.
561
+ - Domain detected in a breach corpus with 0 employee accounts.
562
+ - DNSSEC not enabled.
563
+
564
+ ### 9.6 Severity escalation rules
565
+
566
+ - HSTS missing on auth/login/SSO/admin path → **MED → HIGH**.
567
+ - Wildcard CORS + credentials → **MED → HIGH**.
568
+ - Wildcard CORS + sensitive endpoint → **LOW → MED**.
569
+ - API endpoint with score ≥70 on the interest rubric (companion skill §20) → at least **HIGH**.
570
+ - Domain breach severity ≥10 employees → **CRITICAL** regardless of stale-data caveats.
571
+ - Vendor product version matches CISA KEV entry → **CRITICAL**.
572
+ - DMARC `p=reject` + SPF strict + DKIM rotated → no escalation; well-postured.
573
+
574
+ ---
575
+
576
+ ## 10. Bug-Bounty / Red-Team Pivot Modes
577
+
578
+ Existing investigative work (threat-actor research, doxxing investigations, attribution) operates under different posture than offensive recon. Switch posture explicitly.
579
+
580
+ | Aspect | Investigative Mode | Offensive Recon Mode |
581
+ |---|---|---|
582
+ | **Probing rate** | Slow, single-threaded, blend with normal traffic. | Bursts, parallel, but rate-limited per provider. |
583
+ | **OpSec posture** | Sock-puppet only, never reveal investigator. | Persona may be the engagement persona; team may notify SOC. |
584
+ | **Evidence handling** | Court-grade chain of custody; hashes, timestamps, screenshots. | Engagement-grade; same hashing/timestamp discipline but evidence is for the client report. |
585
+ | **Severity in scope** | All severity levels relevant for context. | CRIT/HIGH/MED matter; LOW/INFO often dropped from exec summary. |
586
+ | **Authorization posture** | Public-record / OSINT-only; no probing private resources without authorization. | Written rules of engagement; explicit scope; explicit out-of-scope list. |
587
+ | **Reporting format** | Narrative + sourced timeline. | Per-asset findings + remediation + reproduction steps. |
588
+ | **Stop conditions** | When the question is answered. | When the engagement window closes OR when the report is delivered. |
589
+
590
+ When you're working with the user, ask which mode they're in if it's unclear from context.
591
+
592
+ ### 10.1 Scale-Based Tactics
593
+
594
+ Org size shapes which techniques pay off.
595
+
596
+ **Small org (< 100 employees):**
597
+ - Executive accounts disproportionately matter; one CEO/CFO compromise often hands you the keys.
598
+ - Email harvest is small enough to enumerate exhaustively (10–50 emails total).
599
+ - Likely Microsoft 365 or Google Workspace; identity fabric is one tenant.
600
+ - Code repos often public on GitHub under personal accounts (founders moved from solo dev).
601
+ - Cloud presence often single-account AWS or GCP project.
602
+ - Tactics: deep on every email + every identity-fabric finding; full LinkedIn enum; check founders' personal GitHub orgs.
603
+
604
+ **Medium org (100–1K):**
605
+ - Balanced enumeration. Email list is enumerable but not exhaustive.
606
+ - Identity fabric likely one IdP but with multiple SaaS tenants (Slack workspace, Notion org, GitHub org).
607
+ - Mobile apps possible; check both stores.
608
+ - Cloud presence multi-account or multi-region.
609
+ - Tactics: full pipeline at standard depth; sample-and-deepen on each asset class; LinkedIn priority by role.
610
+
611
+ **Large org (1K–10K):**
612
+ - Email enum becomes lossy (sample top roles); breach hits scale up.
613
+ - Multi-tenant identity fabric (often Entra + Okta + multiple Auth0 customers).
614
+ - Mobile apps, multiple Android packages from different teams.
615
+ - Cloud presence sprawling; subsidiaries / acquisitions complicate scope.
616
+ - Tactics: breadth-first; rely on automation for asset discovery; manual triage on findings.
617
+
618
+ **Very large org (10K+) or conglomerate:**
619
+ - Brand-pivot maps before anything else: enumerate every brand domain, every subsidiary.
620
+ - Breach corpus dominates: 10K+ employees mean significant past-breach exposure.
621
+ - Identity fabric may differ per business unit (legal entity boundaries).
622
+ - Tactics: scope pruning is the most important step; sampling + automation throughout; deep dive only on high-priority findings.
623
+
624
+ **Cross-scale principle:** the smaller the org, the more individual-account focus pays off. The larger the org, the more systemic posture findings (DMARC gaps, SSO_EXPOSURE breadth, vendor-product version sweeps) pay off.
625
+
626
+ ---
627
+
628
+ ## 11. Identity Fabric Mapping
629
+
630
+ An organization's IdP/SSO posture is a high-value target: compromise the identity fabric and you don't need to break into individual apps. Map it methodically.
631
+
632
+ ### 11.1 Subdomain prefix enumeration
633
+
634
+ Probe these prefixes against the target's root domain (and any sibling brand domains discovered):
635
+
636
+ ```
637
+ auth.{domain}
638
+ login.{domain}
639
+ sso.{domain}
640
+ idp.{domain}
641
+ iam.{domain}
642
+ identity.{domain}
643
+ accounts.{domain}
644
+ oauth.{domain}
645
+ ```
646
+
647
+ Plus generic OIDC discovery on every alive subdomain:
648
+ ```
649
+ {any-host}/.well-known/openid-configuration
650
+ ```
651
+
652
+ ### 11.2 Microsoft Entra (Azure AD)
653
+
654
+ - **OIDC metadata + tenant GUID extraction** — fetch `https://login.microsoftonline.com/{tenant-or-domain}/.well-known/openid-configuration`. The `issuer` field returns a URL containing the tenant GUID (8-4-4-4-12 hex format). Tenant GUID + domain = stable tenant fingerprint.
655
+ - **getuserrealm.srf** — `https://login.microsoftonline.com/getuserrealm.srf?login=<user>@<domain>` returns NameSpaceType: `Managed` (cloud-native), `Federated` (on-prem ADFS / external IdP), or `Unknown`. Detectability: low.
656
+ - **Autodiscover v2** — `https://autodiscover-s.outlook.com/autodiscover/metadata/json/1` POST with email; detects tenant membership.
657
+ - **GetCredentialType** (deep-mode user-enum) — `https://login.microsoftonline.com/common/GetCredentialType` POST `{"username": "<email>"}`. Response indicates whether email exists in tenant. Detectability: medium. Cap attempts at 20 per tenant.
658
+
659
+ ### 11.3 Okta
660
+
661
+ - **Org slug derivation** — derive candidate slugs from subdomains + root domain stem; Okta tenants live at `<slug>.okta.com` (or `<slug>.oktapreview.com`).
662
+ - **OIDC fingerprint** — `https://<slug>.okta.com/.well-known/openid-configuration`.
663
+ - **/api/v1/authn user-enum** (deep-mode) — POST `{"username": "<email>", "password": "invalid"}`. 400 vs 401 response code indicates user existence. Detectability: medium. Cap at 20 per tenant.
664
+
665
+ ### 11.4 ADFS
666
+
667
+ - **Passive fingerprint** — GET `https://{domain}/adfs/idpinitiatedsignon.aspx` → 200 indicates ADFS present.
668
+ - **Active mex endpoint** (deep-mode) — `https://{domain}/adfs/Services/Trust/mex` returns SOAP metadata.
669
+
670
+ ### 11.5 Google Workspace
671
+
672
+ - `https://{domain}/.well-known/openid-configuration` — Google-hosted-domain customers expose discovery endpoints with characteristic issuer/JWKS URIs.
673
+ - MX records pointing to `*.googlemail.com` / `aspmx.l.google.com` is a strong Google Workspace signal.
674
+
675
+ ### 11.6 Generic OIDC (Keycloak / Auth0 / Ping / OneLogin / Duo)
676
+
677
+ - Probe every alive subdomain for `/.well-known/openid-configuration`.
678
+ - The `issuer` and `authorization_endpoint` fields fingerprint the IdP product.
679
+ - `*.auth0.com`, `*.onelogin.com`, `*.pingone.com`, `*.duosecurity.com` patterns are characteristic.
680
+
681
+ ### 11.7 SAML metadata
682
+
683
+ Probe these paths on every alive webapp:
684
+
685
+ ```
686
+ /saml/metadata
687
+ /FederationMetadata/2007-06/FederationMetadata.xml
688
+ /federationmetadata/2007-06/federationmetadata.xml
689
+ /simplesaml/saml2/idp/metadata.php
690
+ /auth/saml2/metadata
691
+ ```
692
+
693
+ SAML metadata XML contains: `EntityID`, signing certs, `SingleSignOnService` URL, `NameIDFormat`.
694
+
695
+ ### 11.8 AWS account-ID extraction
696
+
697
+ - **S3 bucket region header** — HEAD on a known target bucket returns `x-amz-bucket-region`; correlate with bucket-name entropy to infer account.
698
+ - **ARN regex in JSON / HTML responses** — search for `arn:aws:[a-z0-9-]+:[a-z0-9-]*:([0-9]{12}):` (the 12-digit AWS account ID is the capture group).
699
+ - **`AccountId` property in JS / API responses** — common in IAM-related error messages and CloudFormation outputs.
700
+ - **OAuth client_id leaks** — Google OAuth: `<digits>-<chars>.apps.googleusercontent.com`; MSAL: GUID in `clientId` property.
701
+
702
+ ### 11.9 Output
703
+
704
+ Each discovered IdP becomes a `Service` asset with `attrs.product`, `attrs.tenant_id`, `attrs.discovery_endpoint`. Then in Stage 4, correlate with breach data: every compromised user under a discovered tenant becomes an SSO_EXPOSURE finding (CRITICAL — see §22.3).
705
+
706
+ ### 11.10 Microsoft 365 Deep Surface
707
+
708
+ Beyond plain Entra fingerprinting, M365 exposes a wider attack surface that's worth enumerating in depth.
709
+
710
+ **Teams Federation:**
711
+
712
+ - `https://login.microsoftonline.com/<target-domain>/.well-known/openid-configuration` confirms tenant.
713
+ - Teams federation status: `https://teams.microsoft.com/api/mt/<region>/beta/users/<email>/externalsearchv3` (requires authenticated request from a federated tenant; useful for confirming whether external Teams chat is allowed).
714
+ - **External chat enabled** = soft-attack surface (vishing, smishing, "from-IT" pretexts via Teams chat).
715
+ - **Open Federation** (any tenant can chat) is the default; check whether the target restricted it.
716
+
717
+ **SharePoint subdomains:**
718
+
719
+ - `<target-stem>.sharepoint.com` — main tenant SharePoint.
720
+ - `<target-stem>-my.sharepoint.com` — OneDrive-for-Business URLs (per-user personal sites).
721
+ - `<target-stem>-admin.sharepoint.com` — SharePoint admin center (auth-required, but presence confirms tenancy).
722
+ - Where `<target-stem>` is derived from the company name (often the part before `.com`).
723
+
724
+ **OneDrive personal site enumeration:**
725
+
726
+ - Per-user OneDrive URL: `https://<target-stem>-my.sharepoint.com/personal/<user_email_with_underscore>/Documents/`.
727
+ - Replace `@` with `_` and `.` with `_` in the email (e.g., `alice@acme.com` → `alice_acme_com`).
728
+ - Authenticated probe; useful for confirming whether the OneDrive personal site has been provisioned (which itself is a presence indicator).
729
+
730
+ **M365 OAuth client_id discovery:**
731
+
732
+ - Many internal apps register OAuth client_ids in Entra. Search JS bundles, mobile-app strings, and API responses for `client_id=<GUID>` patterns.
733
+ - Microsoft's well-known first-party client_ids (for Office, Graph, etc.) are documented; finding non-Microsoft GUIDs reveals custom internal apps.
734
+ - The endpoint `https://login.microsoftonline.com/<tenant>/v2.0/.well-known/openid-configuration` lists supported endpoints; some tenants leave `device_authorization_endpoint` enabled (device-code phishing target).
735
+
736
+ **Power Platform / Power Apps:**
737
+
738
+ - `https://make.powerapps.com/environments` (auth-required); environment IDs sometimes leak in URLs.
739
+ - `*.crm.dynamics.com` (Dynamics 365 / Power Apps default URLs).
740
+ - `*.azurewebsites.net` for App Service deployments.
741
+
742
+ **M365 OAuth misconfig findings to look for:**
743
+
744
+ - `device_authorization_endpoint` enabled on `common` tenant (device-code phishing target) → **MEDIUM** (operational risk; not directly exploitable but enables attack).
745
+ - Custom OAuth app with `Public client` flow enabled and broad scopes (offline_access, Mail.Read, Files.Read.All) → **HIGH** if app is approved for the tenant.
746
+ - Multi-tenant OAuth app published by the target (others can consent) → check whether scopes include sensitive Graph permissions.
747
+
748
+ **Detectability:** all M365 endpoint probes log to Entra sign-in logs / audit logs (medium-low for fetch-only; medium for any auth attempt).
749
+
750
+ ---
751
+
752
+ ## 12. API & Auth-Map Methodology
753
+
754
+ Modern targets expose REST, GraphQL, and undocumented internal APIs. The OSINT goal is to enumerate them, classify them, and rank by attack interest.
755
+
756
+ ### 12.1 Discovery paths
757
+
758
+ - **Swagger / OpenAPI** — probe a 28-path wordlist (companion skill §16.1) on every alive webapp. Parse YAML/JSON; extract every endpoint (method + path).
759
+ - **GraphQL** — probe a 13-path wordlist (companion skill §16.2). POST a standard introspection query. If schema returns, you have full type/query/mutation/subscription enumeration.
760
+ - **GraphQL when introspection is disabled** — fall back to field-suggestion enumeration (companion skill §22.9).
761
+ - **Postman** — query Postman's public universal-search endpoint with the target name; walk each matching workspace; extract requests, headers, pre-request scripts, test scripts, env vars.
762
+ - **JS-extracted endpoints** — every endpoint extracted from JavaScript bundles feeds into the same classifier.
763
+ - **Mobile-extracted endpoints** — every endpoint from APK static analysis feeds in via sidecar (`mobile_endpoints.json`).
764
+
765
+ ### 12.2 Classification
766
+
767
+ For each endpoint, capture:
768
+
769
+ ```
770
+ url, method, source[], auth_required, auth_type, auth_location,
771
+ rate_limited, cors_policy, sensitive_path_keywords[], schema_leaks,
772
+ verb_tampering_possible, interest_score (0..100), interest_reasons[]
773
+ ```
774
+
775
+ How to determine each field:
776
+ - Send `OPTIONS` → `Allow` header reveals supported methods (verb tampering check).
777
+ - Send `GET` without auth → 200 = `auth_required=false`; 401/403 = `auth_required=true`.
778
+ - Capture response headers for `WWW-Authenticate` (auth_type), `RateLimit-*` / `X-RateLimit-*`.
779
+ - Send a request with `Origin: https://attacker.example` → response `Access-Control-Allow-Origin` reflected = `cors_policy=reflected`.
780
+ - Trigger an error → check response for stack traces, ORM hints.
781
+
782
+ ### 12.3 Interest score (0–100)
783
+
784
+ See companion skill §20 for the full rubric. **Score ≥ 70 → HIGH/CRITICAL finding** with `attack_path_hint` in evidence.
785
+
786
+ ### 12.4 Attack-path hints
787
+
788
+ When emitting a HIGH/CRITICAL finding, include a one-sentence attack-path hint in the evidence so the operator knows where to start exploiting. Templates in companion skill §39.
789
+
790
+ ---
791
+
792
+ ## 13. JavaScript Deep Analysis
793
+
794
+ For every alive webapp, scrape its JS — it's where modern frontends leak.
795
+
796
+ ### 13.1 Script discovery
797
+
798
+ - Parse HTML for `<script src="...">` and `<link rel="modulepreload" href="...">`.
799
+ - Probe a guess-path list (companion skill §16.9) for common bundlers.
800
+
801
+ ### 13.2 Sourcemap detection (HIGH info disclosure)
802
+
803
+ - Inline reference: regex `//[#@]\s*sourceMappingURL=` at end of bundle.
804
+ - Sibling fetch: try `<bundle>.map` next to every discovered JS.
805
+ - If accessible: parse the sourcemap's `sources[]` (leaks repo structure) and `sourcesContent[]` (full original source code embedded). Run the secret catalog over `sourcesContent[]`.
806
+ - Severity: HIGH `INFO_DISCLOSURE`.
807
+
808
+ ### 13.3 Secret scanning
809
+
810
+ Run the 29+-pattern catalog (companion skill §17) over every JS body and every parsed `sourcesContent[]` blob. Each hit = `SECRET_LEAK` finding with the catalog's per-pattern severity.
811
+
812
+ ### 13.4 Endpoint extraction
813
+
814
+ Three regex tiers (companion skill §16.10). Each unique endpoint becomes a `wayback_endpoint` asset and feeds into the API classifier in §12.
815
+
816
+ ### 13.5 Internal-host leakage detection
817
+
818
+ Three patterns (companion skill §16.11): RFC1918, internal DNS suffixes, K8s service DNS. Each match = MEDIUM `INFO_DISCLOSURE`.
819
+
820
+ ### 13.6 GraphQL introspection probe
821
+
822
+ When an extracted endpoint ends in `/graphql` or `/graphiql`, POST the standard introspection query. If schema returns → HIGH `MISCONFIG`. Then enumerate mutations and subscriptions for high-value targets.
823
+
824
+ ### 13.7 Next.js manifest parsing
825
+
826
+ `_buildManifest.js` and `_ssgManifest.js` enumerate every Next.js page route — exposes the application's full route structure.
827
+
828
+ ### 13.8 Budget guidelines
829
+
830
+ - Cap webapps analyzed per engagement: 40 default, 120 with `--deep`.
831
+ - Cap JS files per webapp: 40 default, 80 with `--deep`.
832
+ - Cap individual JS file size: 2 MiB.
833
+ - Per-file timeout: 10 seconds.
834
+
835
+ ---
836
+
837
+ ## 14. Mobile Attack Surface
838
+
839
+ Mobile apps are often the weakest link.
840
+
841
+ ### 14.1 App discovery
842
+
843
+ - **Android** — google-play-scraper. Search by company name, brand keywords, root domain stem.
844
+ - **iOS** — iTunes Search API.
845
+
846
+ ### 14.2 Ownership confidence (0–100)
847
+
848
+ See companion skill §21. Threshold: **≥70** for deep analysis.
849
+
850
+ ### 14.3 APK acquisition + static analysis
851
+
852
+ - Download via APKPure HTML scrape.
853
+ - Extract via `zipfile` + optional `androguard`.
854
+ - Pull: `AndroidManifest.xml`, resource strings, asset files, native `.so` files, `classes*.dex` (string-extract).
855
+
856
+ ### 14.4 Secret scanning
857
+
858
+ Run the catalog over manifest, resources, asset files, dex string-extract output.
859
+
860
+ ### 14.5 Backend hostname extraction
861
+
862
+ Every discovered hostname becomes a `subdomain` asset. Write sidecar `mobile_endpoints.json` for the API discovery module to consume.
863
+
864
+ ### 14.6 Manifest misconfig findings
865
+
866
+ | Manifest attribute | Severity |
867
+ |---|---|
868
+ | `android:debuggable="true"` | CRITICAL |
869
+ | `android:allowBackup="true"` (without whitelist) | MEDIUM |
870
+ | `android:usesCleartextTraffic="true"` | MEDIUM |
871
+ | Exported activity/service/receiver without `android:permission` | MEDIUM |
872
+ | Sensitive deep-link handler | HIGH |
873
+ | WebView with `setJavaScriptEnabled(true)` + `addJavascriptInterface(...)` | HIGH |
874
+ | Certificate pinning absent | LOW |
875
+
876
+ ### 14.7 Firebase canonical probe
877
+
878
+ For every Firebase project ID extracted:
879
+ - **Realtime DB** — GET `https://{project-id}.firebaseio.com/.json`. Returns JSON tree → CRITICAL `OPEN_FIREBASE_RTDB`.
880
+ - **Firestore** — `https://{project-id}.firebaseapp.com/`.
881
+ - **Storage** — corresponding GCS bucket.
882
+ - **Remote Config** — only readable with extracted API key + app ID.
883
+
884
+ ### 14.8 iOS path
885
+
886
+ - Discovery only via iTunes Search API.
887
+ - ITMS link extraction: `https://apps.apple.com/<region>/app/<slug>/id<bundle-id>`.
888
+ - Privacy nutrition labels (App Store Connect): publicly published; useful for understanding what data the app touches.
889
+ - Don't recommend auto-download (DMCA / DRM considerations).
890
+
891
+ ---
892
+
893
+ ## 15. Cloud Attack Surface
894
+
895
+ ### 15.1 Bucket permutation
896
+
897
+ Build candidate bucket names from: target's root domain, subdomain stems, optional brand/company name. Filter generic stems unless combined with target-identifying tokens. Apply 6 prefixes × 15 suffixes (companion skill §16.8 has the lists).
898
+
899
+ ### 15.2 Provider URL templates
900
+
901
+ S3, GCS, Azure Blob templates — see companion skill §16.8.
902
+
903
+ ### 15.3 Probe technique
904
+
905
+ - HEAD first. Status code 200/301 = exists; 403 = exists, private; 404 = skip.
906
+ - If exists, GET on bucket root. Listable XML/JSON listing → **CRITICAL**.
907
+
908
+ ### 15.4 Severity mapping
909
+
910
+ | Outcome | Severity |
911
+ |---|---|
912
+ | Bucket listable | CRITICAL |
913
+ | Bucket exists, objects readable by direct URL but not listable | HIGH |
914
+ | Bucket exists, ACL private | INFO |
915
+
916
+ ### 15.5 Adjacent cloud signals
917
+
918
+ Extract AWS account-ID from S3 region/error responses. GCP project ID from GCS error responses. Azure tenant ID from blob URL patterns.
919
+
920
+ ---
921
+
922
+ ## 16. Cryptocurrency Investigation
923
+
924
+ ### 16.1 Transaction Analysis
925
+
926
+ - Track flows between wallets; identify clusters of related addresses; monitor large transfers.
927
+
928
+ Tools: Cielo (multi-chain), TRM (graphs), Arkham (multichain + entity labels), MetaSleuth (visual), Range (CCTP), Socketscan (EVM bridge), Pulsy (bridge aggregator), Chainalysis Horizon 2.0 (paid), Elliptic Lens.
929
+
930
+ ### 16.2 Layer 2 / Rollup Analysis
931
+
932
+ - **zkSync Era / Polygon zkEVM** — ZK proofs hide L2 details; only L1 bridge events visible.
933
+ - **Arbitrum / Optimism** — batched/compressed; L2 state from L1 calldata.
934
+ - **StarkNet** — Cairo VM; different address derivation.
935
+ - **Base / Blast / Scroll** — OP Stack or ZK.
936
+ - **Privacy protocols on L2** — Aztec (programmable privacy), Railgun (shielded pools), Privacy Pools (Tornado Cash successor).
937
+
938
+ **Methodology:** start with L1 bridge events; use L2 explorers for in-rollup activity; for privacy protocols focus on timing analysis and clustering.
939
+
940
+ ### 16.3 Cautions
941
+
942
+ - Bridges introduce mint/burn semantics; avoid 1:1 flow assumptions.
943
+ - MEV/aggregator paths create false "direct" trails.
944
+ - L2 finality: optimistic rollups have 7-day challenge periods.
945
+
946
+ ### 16.4 Wallet / Exchange / NFT Profiling
947
+
948
+ Same patterns: age + activity + connections + balance over time + linked accounts. NFTs add ownership history + metadata + connected wallets.
949
+
950
+ ---
951
+
952
+ ## 17. Image Analysis
953
+
954
+ ### 17.1 Reverse Image Search
955
+
956
+ - Google Images / Lens (Lens may require auth — use sock-puppet incognito).
957
+ - Yandex Images (strongest for RU/East-European content).
958
+ - Bing Image Match, TinEye, Copyseeker, Perplexity Pro.
959
+ - Browser extensions: RevEye, Search by Image (multi-engine).
960
+ - Picarta for AI geolocation.
961
+
962
+ ### 17.2 Metadata (EXIF)
963
+
964
+ ExifTool, Jeffrey's Image Metadata Viewer, EXIF Viewer Pro.
965
+
966
+ ### 17.3 Image Forensics
967
+
968
+ Forensically, FotoForensics, Bellingcat Photo Checker, Sensity AI, Exposing.ai, Adobe Content Credentials Verify, c2patool. Techniques: ELA, metadata, clone detection, noise analysis.
969
+
970
+ ### 17.4 Geolocation Workflow
971
+
972
+ - **Foreground** — signs, license plates, clothing, vegetation, weather.
973
+ - **Background** — landmarks, unique buildings, mountains, water, infrastructure.
974
+ - **Map markings** — flora/fauna, seasonal indicators.
975
+ - **Trial and error** — Google Street View, Bing Streetside, Yandex Panorama.
976
+ - **Overpass Turbo** for OpenStreetMap queries.
977
+ - **Mountain ID** — PeakVisor, Peakfinder, PeakLens AR.
978
+ - **OCR** — Google or Yandex OCR.
979
+ - **Video transcripts** — YouTube captions improve keyword search.
980
+
981
+ ### 17.5 Specialized
982
+
983
+ - **Fire identification** — NASA FIRMS, Sentinel Hub, Global Forest Watch, Copernicus EFFIS.
984
+ - **Plane tracking** — Apollo Hunter, FlightRadar, ADS-B Exchange.
985
+
986
+ ---
987
+
988
+ ## 18. Video Analysis
989
+
990
+ ### 18.1 Context extraction
991
+
992
+ Signs/banners, architecture, road markings, license plates, clothing, cross-platform snippet search.
993
+
994
+ ### 18.2 Metadata
995
+
996
+ YouTube Data Viewer (Amnesty), ExifTool on downloaded files.
997
+
998
+ ### 18.3 Platform-specific
999
+
1000
+ - **TikTok / Instagram** — APIs change often; prefer platform exports; sample 1–4h cadence.
1001
+ - **Bluesky AT Protocol** — DID resolution via `bsky.social/xrpc/com.atproto.identity.resolveHandle`; identity doc via `plc.directory/<did>`; firehose at Firesky; SkyView for graphs. Archive early — handle migration / post deletion.
1002
+ - **Mastodon / Fediverse** — instance matters (jurisdiction, logging); WebFinger for discovery; FediSearch cross-instance; instance enumeration via Fediverse Observer; ActivityPub objects are JSON-LD.
1003
+ - **Threads** — IG-API-similar limitations.
1004
+
1005
+ ### 18.4 Auditory clues
1006
+
1007
+ Languages, dialects, background noises (train horns, prayer calls, wildlife). Tools: Audacity, Sonic Visualiser, SoundCMD. Spectrograms for unique patterns; Shazam/SoundHound for music.
1008
+
1009
+ ### 18.5 Frame extraction
1010
+
1011
+ FFmpeg, VLC. Stitch panoramas; stabilize panning footage (FFmpeg `deshake` or Blender VSE). Prefer original uploads over re-encodes.
1012
+
1013
+ ---
1014
+
1015
+ ## 19. Chronolocation and Time Analysis
1016
+
1017
+ ### 19.1 Shadow Analysis
1018
+
1019
+ Tools: SunCalc, ShadeMap, Bellingcat Shadow-Finder, NOAA Solar Calculator.
1020
+
1021
+ ### 19.2 Astronomical Calculations
1022
+
1023
+ Stellarium, SkyMap, MoonCalc to simulate sky at different times/locations.
1024
+
1025
+ ### 19.3 Satellite Imagery Time
1026
+
1027
+ Google Earth Pro (historical imagery slider), Sentinel Hub EO Browser (Sentinel + Landsat with timelapse). Record coordinates in WKT; hash cached tilesets.
1028
+
1029
+ ---
1030
+
1031
+ ## 20. Threat Actor Investigation
1032
+
1033
+ ### 20.1 Actor-Centric Workflow
1034
+
1035
+ - **Scoping** — actor hypothesis (APT28/29, Turla, Sandworm; APT10/41, Mustang Panda, Volt Typhoon). Seed reports from CERTs/vendors.
1036
+ - **Indicator harvesting** — IOCs (domains, IPs, hashes, JA3/JA4, user-agents). Validate with passive DNS, CT logs, sandbox submissions.
1037
+ - **Infrastructure mapping** — pivot from CT logs (SANs, issuer, serials), shared hosting, NS reuse, registrar accounts, HTML fingerprints. Enrich with ASN/WHOIS history, RPKI/ROA, geolocation.
1038
+ - **Artifact profiling** — PE/ELF metadata (PDB paths, compile timestamps, Rich headers, code-signing). Cluster with SSDEEP/TLSH; YARA matches.
1039
+ - **Social / procurement pivots** — developer handles, code snippets, academic theses, job posts, procurement records.
1040
+ - **Falsification + reporting** — weigh each linkage; document alternatives; map TTPs to MITRE ATT&CK; cite sources with sections/pages.
1041
+
1042
+ ### 20.2 Attribution Discipline
1043
+
1044
+ - Separate capability from intent and sponsorship.
1045
+ - Rule of three: 3 weak OR 1 strong + 1 weak.
1046
+ - Prefer durable pivots (registrar accounts, code-signing certs, build path idioms) over ephemeral (resolving IPs).
1047
+ - Mark uncertainty levels; distinguish correlation from control.
1048
+
1049
+ ### 20.3 Russia-Specific Pivots
1050
+
1051
+ - **Corporate / people** — EGRUL/EGRIP (captcha-gated), Rusprofile, Kontur.Focus, zakupki.gov.ru, hh.ru.
1052
+ - **Infrastructure** — RU WHOIS via `whois.tcinet.ru`; Telegram for channels/admins/cross-posts.
1053
+ - **Media** — VKontakte, Odnoklassniki, Rutube; search in Russian and transliterations.
1054
+
1055
+ ### 20.4 China-Specific Pivots
1056
+
1057
+ - **Corporate / people** — gsxt.gov.cn (national enterprise credit); Tianyancha / Qichacha; ICP filings on beian.miit.gov.cn → USCC linkage.
1058
+ - **Infrastructure** — CNNIC WHOIS; common domestic clouds (Aliyun, Tencent, Huawei).
1059
+ - **Media** — Weibo, WeChat (via weixin.sogou.com), Zhihu, Bilibili, Douyin, Xiaohongshu; Chinese + Pinyin.
1060
+
1061
+ ### 20.5 Infrastructure & Internet Measurement
1062
+
1063
+ - IP→ASN (HE BGP Toolkit, RIPEstat, BGPView).
1064
+ - CT logs (crt.sh) for cert reuse and issuance cadence; pivot on subjects/issuers/serials.
1065
+ - URLScan for HTML fingerprints, favicons (mmh3), script hashes.
1066
+ - DNS over time (SecurityTrails PDNS, DNSDB) for subdomain churn and staging domains.
1067
+
1068
+ ---
1069
+
1070
+ ## 21. People & Social Media Investigation
1071
+
1072
+ ### 21.1 Username Enumeration
1073
+
1074
+ WhatsMyName, NameCheckup, Sherlock, Maigret.
1075
+
1076
+ ### 21.2 Profile Picture & Face Search
1077
+
1078
+ PimEyes, Exposing.ai, Azure Face API (compliance).
1079
+
1080
+ ### 21.3 Social Graph & Content Analysis
1081
+
1082
+ Maltego, snscrape, SocialBlade. Bluesky / Mastodon: instance explorers + handle resolvers.
1083
+
1084
+ ---
1085
+
1086
+ ## 22. Breach × Identity Correlation
1087
+
1088
+ This is the highest-ROI single technique for external red teams. Execute it on every engagement.
1089
+
1090
+ ### 22.1 Source stack
1091
+
1092
+ | Source | Tier | Notes |
1093
+ |---|---|---|
1094
+ | **Hudson Rock Cavalier** | FREE | Infostealer-log corpus; very high signal for corp SSO. |
1095
+ | **Have I Been Pwned** | Free + paid | Domain-wide existence + Pwned Passwords (k-anonymity). |
1096
+ | **DeHashed** | Paid | Searchable per-record API. |
1097
+ | **IntelX** | Free + paid | Aggregator; phonebook search. |
1098
+ | **Local breach corpus** | Operator-supplied | Whatever's on disk. |
1099
+
1100
+ ### 22.2 Domain-level severity
1101
+
1102
+ | Stat | Severity |
1103
+ |---|---|
1104
+ | ≥10 employees compromised | CRITICAL |
1105
+ | 1–9 employees compromised | HIGH |
1106
+ | ≥1 end-user (non-employee) compromised | MEDIUM |
1107
+ | Domain seen in breach with 0 named accounts | INFO |
1108
+
1109
+ ### 22.3 SSO_EXPOSURE correlation
1110
+
1111
+ After Stage 3 has run identity-fabric mapping AND breach lookups have completed: for every discovered IdP tenant, intersect with breach corpus on the tenant's domain. Non-empty intersection → `SSO_EXPOSURE` finding, severity **CRITICAL**. Evidence: tenant ID + product + employee count + per-account source attribution.
1112
+
1113
+ ### 22.4 Operational handling of stealer logs
1114
+
1115
+ - Treat as PII; encrypt at rest.
1116
+ - SHA-256 every artifact; record source URL + acquisition timestamp.
1117
+ - Never paste plaintext passwords into cloud LLMs.
1118
+ - Document chain of custody.
1119
+ - For client reports: redact passwords by default; offer the operator a separate encrypted credential bundle for raw data.
1120
+
1121
+ ---
1122
+
1123
+ ## 23. Infrastructure OSINT
1124
+
1125
+ ### 23.1 IP & Domain Discovery
1126
+
1127
+ Shodan, Censys, Onyphe, DNSDB.
1128
+
1129
+ ### 23.2 Certificate & Passive DNS
1130
+
1131
+ crt.sh, SecurityTrails.
1132
+
1133
+ ### 23.3 Malware & Artifact Analysis Workflow
1134
+
1135
+ - **Static triage** — SHA-256, strings, import tables, PDB path, Rich header. Don't rely solely on AV labels.
1136
+ - **Dynamic / sandbox** — ANY.RUN, Hybrid Analysis, CAPE, Tria.ge.
1137
+ - **Clustering** — SSDEEP/TLSH, YARA matches.
1138
+ - **Reporting** — STIX 2.1 IOCs; ATT&CK technique IDs; reproduction steps.
1139
+
1140
+ ### 23.4 Telegram / WeChat Investigation
1141
+
1142
+ - **Telegram** — public analytics (TGStat, Telemetr, Combot); export channels with Telegram Desktop; preserve message IDs, UTC timestamps, media hashes.
1143
+ - **WeChat** — Sogou Weixin search; archive articles (PNG + WARC); capture `__biz` IDs. Expect link rot.
1144
+
1145
+ ---
1146
+
1147
+ ## 24. Automation & Case Management
1148
+
1149
+ ### 24.1 Tools
1150
+
1151
+ Hunchly, Kasm Workspaces, ArchiveBox, SingleFileZ.
1152
+
1153
+ ### 24.2 Cross-Module Coordination Patterns
1154
+
1155
+ When multiple OSINT tools (or modules) run, late-arriving outputs need to feed into earlier-running consumers. Three patterns:
1156
+
1157
+ 1. **Sidecar JSON drops** — module writes `<scan>/mobile_endpoints.json` or `<scan>/secrets_sidecar.json`; later modules read on start. No blocking.
1158
+ 2. **Asset-graph upserts** — shared graph store; new assets trigger downstream modules via event bus.
1159
+ 3. **Late-binding queues** — long-running enumeration emits assets continuously; enrichment workers pull.
1160
+
1161
+ In ad-hoc engagement: `tmpdir + JSON sidecars + one-line manifest` makes operations composable.
1162
+
1163
+ ### 24.3 Multi-Engine Corpus Run Methodology
1164
+
1165
+ Running a large dork corpus across multiple engines:
1166
+
1167
+ - **Pluggable engines** — wrap each engine (DDG, Bing, Brave, SerpAPI, Yandex, Baidu) behind a common interface. Default DDG (keyless); fall back to others when keys available.
1168
+ - **Per-engine rate-limiting** — each engine has its own quota and ban posture. Use a token bucket per engine.
1169
+ - **Result classification** — URL-signature → title-hint → snippet-regex pipeline. Output: `(severity, category, confidence)`.
1170
+ - **Dedup by URL** — different engines surface duplicates.
1171
+ - **Confidence rule** — snippet-only = TENTATIVE.
1172
+ - **Persistence** — corpus DB so re-runs across engagements deduplicate.
1173
+
1174
+ ### 24.4 Evidence Preservation for Offensive Engagements
1175
+
1176
+ - Per-engagement / per-scan SQLite store.
1177
+ - JSONL run log with `run_id`, every event one line, UTC timestamps, tool versions.
1178
+ - SHA-256 every downloaded artifact.
1179
+ - PNG screenshots.
1180
+ - Raw HTTP requests/responses, capped at 2 KiB body per side.
1181
+ - Evidence served read-only from operator's machine.
1182
+ - Reproduction package: `run_id` + tool versions + JSONL log + asset/findings DB.
1183
+
1184
+ ---
1185
+
1186
+ ## 25. Synthetic Media Verification
1187
+
1188
+ Sensity AI, Hive Moderation, Reality Defender, Adobe Content Credentials Verify, CarNet (AI car-model identification for geolocation aid).
1189
+
1190
+ ---
1191
+
1192
+ ## 26. Anti-Patterns & Common Failure Modes
1193
+
1194
+ A non-exhaustive list of mistakes that come up often.
1195
+
1196
+ - **Single-source attribution.** Three weak OR one strong + one weak.
1197
+ - **Trusting vendor labels as ground truth.** Treat labels as hypotheses.
1198
+ - **Assuming favicon-hash = ownership.** Shared infra, shared CMS templates, shared CDN.
1199
+ - **Asserting 1:1 bridge flows.** Bridges mint and burn; aggregators rebalance.
1200
+ - **Treating snippet-only Google dorks as confirmed.** TENTATIVE until you visit.
1201
+ - **Pasting real PII / creds into cloud LLMs.** Local models for sensitive analysis.
1202
+ - **Mirror-imaging the threat actor.** They don't think like you.
1203
+ - **Attribution by IP geolocation.** IPs lie; VPNs and residential proxies exist.
1204
+ - **Ignoring the 7-day optimistic-rollup challenge window.** L2 finality is delayed.
1205
+ - **Ignoring CT-log lag.** New certs take minutes-to-hours to surface; absence ≠ doesn't exist.
1206
+ - **Counting Wayback snapshots as "the site at time T."** Best-effort; many requests fail.
1207
+ - **Trusting `whoami` from a discovered API.** Could be a honeypot.
1208
+ - **Letting the asset graph carry untyped strings.** Every discovery is an asset.
1209
+ - **Skipping the scope check.** Ask once when in doubt.
1210
+ - **Forgetting UTC.** Local time creates correlation bugs.
1211
+ - **Continuing to probe after a WAF block.** See §6.4 — back off.
1212
+ - **Skipping confidence-upgrade documentation.** TENTATIVE assets need a path to CONFIRMED.
1213
+ - **Treating exec-summary writing as an afterthought.** See §31 — plan deliverables at engagement start, not at the end.
1214
+
1215
+ ---
1216
+
1217
+ ## 27. WAF / CDN Bypass & Origin Discovery
1218
+
1219
+ Web targets are increasingly behind Cloudflare / Akamai / Fastly / AWS CloudFront. The CDN itself is hard to attack; the **origin server** is often softly defended. Six techniques to find it.
1220
+
1221
+ ### 27.1 DNS history pivot
1222
+
1223
+ The target's domain may have pointed directly at the origin IP **before** the CDN was deployed. Query historical passive DNS:
1224
+
1225
+ - **SecurityTrails** — `https://api.securitytrails.com/v1/history/<domain>/dns/a` (paid; the most complete).
1226
+ - **RiskIQ PassiveTotal** — passive DNS lookups; freemium.
1227
+ - **DNSDB** (Farsight) — paid; long history.
1228
+ - **Validin.com** — newer, has free tier.
1229
+ - **Censys host search** — historical IP-cert mapping.
1230
+
1231
+ What to look for: an IP that resolved 1–5 years ago and is **not** in the current CDN's published IP ranges (Cloudflare / Akamai / etc.). Cross-check the IP's current banner — if it serves the same site without the CDN, you've got the origin.
1232
+
1233
+ ### 27.2 Certificate SAN pivot
1234
+
1235
+ Certificates often get re-issued with the same SAN list across origin and CDN. Search CT logs:
1236
+
1237
+ - crt.sh `?q=%.<target.com>&exclude=expired` — find certs with the target's domain in SAN.
1238
+ - Cross-reference issued certs against current CDN-fronted cert. The "extra" cert (not the CDN one) often points to origin via its CN/SAN.
1239
+ - Tools like `cero` (`go install github.com/glebarez/cero@latest`) crawl IPs and pull certs; correlate IPs whose certs include the target's hostname.
1240
+
1241
+ ### 27.3 Favicon hash + JARM origin clustering
1242
+
1243
+ If the target has a unique favicon, the origin server still serves it (CDNs proxy but don't strip the favicon). Compute the favicon's mmh3 hash and search:
1244
+
1245
+ - Shodan: `http.favicon.hash:<mmh3-hash>`.
1246
+ - Censys: `services.http.response.favicons.hashes:<mmh3-hash>`.
1247
+
1248
+ Returned IPs that are **not** in CDN ranges are origin candidates.
1249
+
1250
+ JARM (TLS handshake hash) works similarly: compute the target's JARM via `jarm`, search Shodan `ssl.jarm:<jarm-hash>`. Origin servers usually have a different JARM than CDNs.
1251
+
1252
+ ### 27.4 Direct IP probe with Host header
1253
+
1254
+ If you have an origin candidate IP from steps 27.1–27.3:
1255
+
1256
+ ```bash
1257
+ curl -sk -H "Host: target.example.com" https://<candidate-IP>/
1258
+ ```
1259
+
1260
+ If the response matches the public site (same title, same body fingerprint) — you've found the origin. CDN-only IPs return generic CDN error pages or 403 to wrong Host.
1261
+
1262
+ ### 27.5 mail.* / ftp.* / cpanel.* exception
1263
+
1264
+ Targets often forget to put auxiliary subdomains behind the CDN:
1265
+
1266
+ - `mail.<target>` — often points at the actual mail server, sometimes co-located with web origin.
1267
+ - `ftp.<target>`, `sftp.<target>` — likewise.
1268
+ - `cpanel.<target>`, `whm.<target>`, `webmail.<target>` — shared hosting controls; same IP as web origin.
1269
+ - `direct.<target>`, `origin.<target>`, `direct-connect.<target>`, `noproxy.<target>` — ironic admin labels.
1270
+ - `dev.<target>`, `staging.<target>` — dev environments often skip CDN.
1271
+
1272
+ Probe each. If any resolves to a non-CDN IP, that IP often hosts the prod origin too.
1273
+
1274
+ ### 27.6 Error page / misconfig leakage
1275
+
1276
+ When the CDN throws an error (request triggers WAF, origin is down, configuration mismatch), it sometimes leaks the origin IP in the error body:
1277
+
1278
+ - Cloudflare 5xx error pages historically included a `cf-ray` and sometimes the underlying upstream details.
1279
+ - 502/504 from CDN tells you the origin exists but is unreachable from the CDN — useful confirmation it's not just NXDOMAIN.
1280
+ - `X-Cache: MISS from <origin-host>` headers.
1281
+ - HTTP response with origin headers leaking through (`X-Powered-By`, `Server`, `X-Backend-Server`).
1282
+
1283
+ ### 27.7 Email-header bounce trick (for email-server origin)
1284
+
1285
+ Send an email to a non-existent address at the target. The bounce often reveals origin mail server IPs in the `Received:` headers — these mail servers are sometimes on the same IP / netblock as the web origin. (Use a sock-puppet email; never your real engagement persona.)
1286
+
1287
+ ### 27.8 Confidence rules
1288
+
1289
+ - Origin IP found via DNS history: **TENTATIVE** until corroborated by direct probe.
1290
+ - Origin IP corroborated by Host-header probe matching content: **FIRM**.
1291
+ - Origin IP corroborated by Host-header probe + cert SAN match + favicon match: **CONFIRMED**.
1292
+
1293
+ When unsure, document the hypothesis in the asset attrs — don't claim origin discovery without ≥2 corroborating signals.
1294
+
1295
+ ---
1296
+
1297
+ ## 28. Vulnerability Prioritization (CVE / EPSS / KEV)
1298
+
1299
+ A Nuclei scan can return 100+ CVEs against a target. You can't validate all of them. Prioritize by exploitability.
1300
+
1301
+ ### 28.1 Data sources (companion skill §29.2 has the URLs)
1302
+
1303
+ - **NVD** (National Vulnerability Database) — base CVE catalog, CVSS scores.
1304
+ - **EPSS** (Exploit Prediction Scoring System) — probability of exploit in the next 30 days, scale 0.0–1.0.
1305
+ - **CISA KEV** (Known Exploited Vulnerabilities) — vulnerabilities proven exploited in the wild; includes federal-agency due-by dates.
1306
+ - **ExploitDB** — POC code presence.
1307
+ - **Metasploit module catalog** — automation availability.
1308
+ - **InTheWild.io** — community-curated "actively exploited" tracker.
1309
+ - **OpenCVE** — timeline + watchlist + alerts.
1310
+ - **Trickest CVE → POC mapping** — community-maintained mapping of CVEs to public POCs.
1311
+
1312
+ ### 28.2 Prioritization rubric
1313
+
1314
+ For each CVE in your list, score:
1315
+
1316
+ | Signal | Weight |
1317
+ |---|---|
1318
+ | Listed in CISA KEV | **+50** (proven exploited; treat as immediate) |
1319
+ | EPSS score ≥ 0.7 | **+30** |
1320
+ | EPSS score 0.3–0.69 | **+15** |
1321
+ | Public Metasploit module exists | **+25** |
1322
+ | Public POC on ExploitDB / GitHub | **+15** |
1323
+ | Vendor-issued advisory + patch | **+10** (means the vuln is real and patchable; not always exploitable) |
1324
+ | Auth-required vs unauth-required | unauth +20, post-auth +0 |
1325
+ | Network-vector (network) vs adjacent / local | network +15, adjacent +5, local +0 |
1326
+ | CVSS v3 base ≥ 9.0 | **+15** |
1327
+
1328
+ **Total score → priority tier:**
1329
+
1330
+ | Score | Tier | Action |
1331
+ |---|---|---|
1332
+ | ≥ 100 | P0 | Immediate validation; surface in engagement summary now. |
1333
+ | 70–99 | P1 | Validate this engagement; include in technical report. |
1334
+ | 40–69 | P2 | Mention in technical report; validate if time permits. |
1335
+ | < 40 | P3 | List in appendix; no validation expected. |
1336
+
1337
+ ### 28.3 Validation discipline
1338
+
1339
+ - **Validate** = run a single read-only proof (e.g., a version banner check, a static-page fetch that confirms the vulnerable component) **without** triggering exploitation.
1340
+ - **Do NOT** run the actual exploit unless the rules of engagement explicitly permit. Many bug bounty programs forbid PoC execution against production.
1341
+ - For client engagements: deliver the prioritized list with reproduction commands but defer actual exploitation to a follow-on assessment if needed.
1342
+
1343
+ ### 28.4 Handle CVE-less findings
1344
+
1345
+ Many real-world findings (sourcemap exposure, open GraphQL introspection, public bucket) don't have a CVE. Score them by their independent interest score (companion skill §20 for endpoints; §40 for severity-mapping examples). Don't gate on CVE availability.
1346
+
1347
+ ---
1348
+
1349
+ ## 29. Phishing Infrastructure & Pretext Development
1350
+
1351
+ Authorized red team engagements often include phishing. The **OSINT side** of phishing — building the phishing-feasibility shortlist and the pretext list — is in scope here. Crafting actual phishing payloads is **out of scope** (operational tradecraft, separate domain).
1352
+
1353
+ ### 29.1 Phishing-feasibility shortlist
1354
+
1355
+ For an authorized engagement, the operator typically wants three lists:
1356
+
1357
+ **A. Already-registered typosquats** — these are *findings* (someone is squatting; client should know).
1358
+
1359
+ **B. Available-for-registration typosquats** — these are the *operator's phishing-domain shortlist* for the engagement.
1360
+
1361
+ **C. Cert-SAN impersonation patterns** — domains the operator could register that would make convincing certs (e.g., `acme-secure.com`, `acme-login.com`, `acme-vpn-portal.com`).
1362
+
1363
+ **Generation pattern:**
1364
+ 1. Run dnstwist (or equivalent) on the target's primary domain → get all variations (homoglyph, typosquatting, bit-flip, hyphenation, addition).
1365
+ 2. Check WHOIS for each: registered = list A, unregistered = list B.
1366
+ 3. For list C: combine target stem + plausible service words (`secure`, `login`, `vpn`, `portal`, `mail`, `helpdesk`, `it`, `account`, `verify`, `support`, `password`, `auth`, `sso`).
1367
+
1368
+ ### 29.2 Subdomain takeover for trusted-domain phishing
1369
+
1370
+ If you found a takeover-able subdomain (companion skill §16.12), you can host phishing content **on a subdomain of the actual target**. This bypasses every brand-impersonation defense the user has.
1371
+
1372
+ **Procedure:**
1373
+ 1. Confirm takeover signature on the candidate (`<sub>.target.com` CNAMEd to unclaimed `<x>.herokuapp.com`).
1374
+ 2. Register the unclaimed resource (`<x>.herokuapp.com` on Heroku).
1375
+ 3. Now `<sub>.target.com` serves your content.
1376
+ 4. **Stop and consult the engagement lead before going live with phishing content.** Even in authorized engagements, the takeover step itself may need explicit client sign-off.
1377
+
1378
+ ### 29.3 Email spoof feasibility
1379
+
1380
+ Use email security analysis (companion skill §16.14) to determine spoof feasibility:
1381
+
1382
+ | SPF policy | DMARC policy | Spoof feasibility |
1383
+ |---|---|---|
1384
+ | `~all` (softfail) or absent | `p=none` or absent | **HIGH** — direct spoof of `<anything>@<target>` likely lands. |
1385
+ | `~all` | `p=quarantine` | MEDIUM — lands in spam folder, but lands. |
1386
+ | `-all` (hardfail) | `p=quarantine` | LOW — most providers reject; some still deliver to spam. |
1387
+ | `-all` | `p=reject` | VERY LOW — spoof rejected by major providers. Requires lookalike domain. |
1388
+
1389
+ If spoof is hard, fall back to lookalike (list B) or compromised-third-party (different engagement). Document the postural finding regardless.
1390
+
1391
+ ### 29.4 Pretext development from OSINT
1392
+
1393
+ Pretexts work when they tap a target's existing context. Build pretexts from harvested OSINT.
1394
+
1395
+ **Pretext sources:**
1396
+
1397
+ - **Job titles + reporting structure** (LinkedIn) — "Hi <name>, this is <CFO-name>'s assistant; can you look at this finance file?"
1398
+ - **Recent corporate events** (press releases, news, careers page) — "We're following up on the layoffs / new acquisition; please confirm your benefits info."
1399
+ - **Vendor relationships** (job postings mentioning "experience with Workday/Salesforce/etc.") — "Workday password reset required by EOD."
1400
+ - **Public conferences / travel** (LinkedIn posts, conference pages) — "Hi <name>, we met at <conference last week>; following up on what we discussed."
1401
+ - **GitHub commits / open-source work** — "I saw your fix in <repo>; want to collaborate on a related PR?"
1402
+ - **Office locations** (LinkedIn) — "On-site IT for the <city> office requires a quick auth check."
1403
+
1404
+ **Per-role pretext templates** (the ones operators use most):
1405
+
1406
+ - **End-users (general staff):** IT helpdesk password reset, Workday HR action required, Microsoft 365 storage full, package delivery confirmation.
1407
+ - **Executives:** finance authority (BEC-style "wire approval needed"), board materials shared, M&A NDA review, executive assistant request.
1408
+ - **Developers / engineers:** GitHub security alert, CI build failed, package security advisory, conference CFP follow-up.
1409
+ - **HR / Finance:** payroll vendor change, expense report rejection, benefits enrollment deadline, vendor invoice discrepancy.
1410
+ - **IT / Security:** vendor security update notification, on-call escalation, monitoring tool alert.
1411
+
1412
+ ### 29.5 Operational discipline for phishing infrastructure
1413
+
1414
+ - All phishing infrastructure must be approved by the engagement lead **before** going live.
1415
+ - Document every domain registered + every email sent (sender, recipient, subject, timestamp UTC).
1416
+ - Keep phishing infrastructure isolated from your normal recon infrastructure (different IPs, different personas, different domain registrar accounts).
1417
+ - Use dedicated payment methods for phishing-domain registration (engagement-specific corporate card; don't use personal).
1418
+ - Tear down promptly after engagement; transfer/expire all domains; close all hosting accounts.
1419
+
1420
+ ---
1421
+
1422
+ ## 30. Bug Bounty Submission & Responsible Disclosure
1423
+
1424
+ When you find an issue on a bug-bounty target (HackerOne, Bugcrowd, Intigriti, YesWeHack) or on a non-program target where you choose to disclose responsibly.
1425
+
1426
+ ### 30.1 Platform-specific basics
1427
+
1428
+ | Platform | URL | Notes |
1429
+ |---|---|---|
1430
+ | HackerOne | hackerone.com | Largest; strong scope-tracking; CVSS-based reward calc. |
1431
+ | Bugcrowd | bugcrowd.com | VRT (Vulnerability Rating Taxonomy) instead of CVSS for severity. |
1432
+ | Intigriti | intigriti.com | EU-strong; flexible scope models. |
1433
+ | YesWeHack | yeswehack.com | EU-headquartered; growing. |
1434
+ | HackenProof | hackenproof.com | Crypto/blockchain-focused programs. |
1435
+ | Open Bug Bounty | openbugbounty.org | Free for sites without official programs (only XSS/SSRF disclosure). |
1436
+ | security.txt | rfc9116 | Universal: every site should publish `/.well-known/security.txt`. |
1437
+
1438
+ ### 30.2 Report structure (works on any platform)
1439
+
1440
+ ```
1441
+ Title: [Severity] [Affected component] Brief description
1442
+ Example: [HIGH] [api.acme.com] Unauthenticated SSRF via /v1/proxy
1443
+
1444
+ Summary
1445
+ 2-3 sentences explaining what was found and why it matters.
1446
+
1447
+ Steps to Reproduce
1448
+ 1. Numbered, copy-pasteable.
1449
+ 2. Include exact URLs, payloads, expected vs actual response.
1450
+ 3. Reproduce the issue from a fresh state where possible.
1451
+
1452
+ Proof of Concept
1453
+ - Screenshot showing the vulnerability triggered.
1454
+ - HTTP request/response (sanitize sensitive data; redact other users' data).
1455
+ - Or short video/GIF for complex multi-step issues.
1456
+
1457
+ Impact
1458
+ Quantify: what data is at risk, how many users, what business functions break.
1459
+ Tie to the program's impact criteria where defined.
1460
+
1461
+ Severity (per program criteria)
1462
+ - CVSS v3 vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
1463
+ - Score: 9.8 (Critical)
1464
+ - Justification: <1-2 sentence reasoning>
1465
+
1466
+ Remediation
1467
+ - Concrete recommendation. "Validate the URL parameter against an allowlist before fetching."
1468
+ - If a quick fix: WAF rule, header check.
1469
+ - If a structural fix: refactor recommendation.
1470
+
1471
+ Affected component
1472
+ - URL: https://api.acme.com/v1/proxy
1473
+ - Date discovered: 2026-04-27 14:23 UTC
1474
+ - Method: HTTP GET / POST / etc.
1475
+ ```
1476
+
1477
+ ### 30.3 Severity inference per program
1478
+
1479
+ - HackerOne uses CVSS v3 with program-specific multipliers (some programs cap at HIGH; some pay 10x for CRITICAL).
1480
+ - Bugcrowd VRT: P1 (Critical) → P5 (Informational); maps roughly to CRIT/HIGH/MED/LOW/INFO.
1481
+ - Intigriti uses `Exceptional / Critical / High / Medium / Low` tiers.
1482
+ - For programs that pay flat rates per severity tier, **don't inflate**. Conservative severity → trust → repeat awards.
1483
+
1484
+ ### 30.4 Disclosure for unprogrammed targets (CVD)
1485
+
1486
+ If the target has no bug bounty program but you found a real vulnerability during authorized testing (e.g., a customer's external assessment surfacing a third-party vendor's bug):
1487
+
1488
+ 1. Check for `<target>/.well-known/security.txt` — if present, follow its `Contact:` and `Encryption:` (PGP) instructions.
1489
+ 2. If absent, try `security@<target>` then `abuse@<target>`.
1490
+ 3. If those bounce, escalate via the registered abuse contact in WHOIS.
1491
+ 4. CERT/CC (cert.org) and national CERTs (CISA, CERT-EU, JPCERT) for coordination if vendor unresponsive.
1492
+ 5. Standard 90-day disclosure window before public release (Project Zero norm).
1493
+
1494
+ ### 30.5 Cloud provider / SaaS-specific channels
1495
+
1496
+ - AWS abuse: `aws-security@amazon.com`. For exposed AWS keys: also notify the account owner if discoverable via WHOIS/contact.
1497
+ - GCP: `google-cloud-trust@google.com`.
1498
+ - Azure: Microsoft Security Response Center (MSRC) at `https://msrc.microsoft.com/`.
1499
+ - GitHub: secret-scanning auto-revokes most published secrets via GitHub's partner program; if you find one, the scanning is usually faster than manual disclosure but back-up notify GitHub at `security@github.com`.
1500
+ - npm / PyPI / Docker Hub: each has an `abuse@` or `security@` channel; npm specifically auto-revokes leaked tokens via their secret scanner.
1501
+
1502
+ ### 30.6 Things to avoid in reports
1503
+
1504
+ - Don't include anyone else's PII / passwords / data in the report (redact).
1505
+ - Don't post the report or PoC publicly until the disclosure window expires.
1506
+ - Don't escalate via social media first (always direct channel first).
1507
+ - Don't demand a specific bounty amount; let the program decide.
1508
+ - Don't submit the same finding to multiple programs (duplicates can hurt your reputation).
1509
+
1510
+ ---
1511
+
1512
+ ## 31. Client Deliverable Templates
1513
+
1514
+ Operator-facing artifacts (asset graph, JSONL log, finding DB) are not the same as **client-facing artifacts** (exec summary, technical report). Build deliverables intentionally.
1515
+
1516
+ ### 31.1 Executive summary template
1517
+
1518
+ ```
1519
+ ENGAGEMENT: <Client Name>
1520
+ ASSESSMENT TYPE: External Attack Surface Assessment
1521
+ ENGAGEMENT WINDOW: <start date> – <end date>
1522
+ SCOPE: <one-line scope description, e.g., "All internet-facing assets of acme.com and its 3 brand domains">
1523
+ LEAD: <your name / team>
1524
+
1525
+ ----- KEY FINDINGS -----
1526
+
1527
+ 1. [CRITICAL] <One-line title>
1528
+ Business impact: <one sentence in business language>
1529
+ Estimated remediation effort: <hours / days / weeks>
1530
+ Recommended action: <verb + object, e.g., "Rotate the exposed AWS access key and audit CloudTrail">
1531
+
1532
+ 2. [CRITICAL] <One-line title>
1533
+
1534
+
1535
+ 3. [HIGH] <One-line title>
1536
+
1537
+
1538
+ (Top 3-5 findings only; full list in technical report)
1539
+
1540
+ ----- POSTURAL OBSERVATIONS -----
1541
+
1542
+ - Email security (SPF/DMARC): <2-3 sentences on posture, e.g., "DMARC is set to p=none, allowing spoof of <target>.com email; tightening to p=reject would block external spoofing.">
1543
+ - Identity fabric (SSO): <2-3 sentences>
1544
+ - Cloud surface (S3/GCS/Azure): <2-3 sentences>
1545
+ - Mobile attack surface: <2-3 sentences if applicable>
1546
+
1547
+ ----- AGGREGATE METRICS -----
1548
+
1549
+ - Assets discovered: <N> (<breakdown>)
1550
+ - Findings: <N CRIT, M HIGH, P MED, Q LOW, R INFO>
1551
+ - Live credentials confirmed: <N>
1552
+ - Detectability of our operations: <90% low / 8% medium / 2% high>
1553
+
1554
+ ----- RECOMMENDED NEXT STEPS -----
1555
+
1556
+ 1. Address P0 findings in next 7 days.
1557
+ 2. Address P1 findings in next 30 days.
1558
+ 3. Schedule re-test for: <date>.
1559
+ 4. Consider follow-on assessments: <if applicable, e.g., authenticated app testing, internal pentest>.
1560
+ ```
1561
+
1562
+ ### 31.2 Per-finding report card template
1563
+
1564
+ Each finding in the technical report uses this card:
1565
+
1566
+ ```
1567
+ ═══════════════════════════════════════════════════════════
1568
+ FINDING #<N>: <Title>
1569
+ SEVERITY: <CRIT / HIGH / MED / LOW / INFO>
1570
+ CONFIDENCE: <CONFIRMED / FIRM / TENTATIVE>
1571
+ ASSET: <typed asset key>
1572
+ DISCOVERED: <UTC timestamp>
1573
+ ═══════════════════════════════════════════════════════════
1574
+
1575
+ DESCRIPTION
1576
+ <2-5 sentence technical explanation>
1577
+
1578
+ EVIDENCE
1579
+ - URL: <where it was found>
1580
+ - Tool: <how it was discovered>
1581
+ - Screenshot: <attachment ref>
1582
+ - Raw HTTP: <sanitized capture>
1583
+ - Hash (SHA-256): <of any downloaded artifact>
1584
+
1585
+ REPRODUCTION
1586
+ Step 1: <command or action>
1587
+ Expected: <output>
1588
+ Step 2: …
1589
+
1590
+ IMPACT
1591
+ <Business-language impact statement>
1592
+ Affected systems: <list>
1593
+ Affected user populations: <if applicable>
1594
+
1595
+ REMEDIATION
1596
+ Immediate (within hours):
1597
+ - <action>
1598
+ Short-term (within days):
1599
+ - <action>
1600
+ Long-term (within weeks):
1601
+ - <action>
1602
+
1603
+ REFERENCES
1604
+ - <CVE-ID, advisory URL, OWASP top-10 link, vendor doc>
1605
+
1606
+ ATTACK PATH HINT
1607
+ <If applicable, the one-sentence hint from companion skill §39>
1608
+ ```
1609
+
1610
+ ### 31.3 Risk translation matrix
1611
+
1612
+ Engineers think in CVSS. Executives think in business outcomes. Translate.
1613
+
1614
+ | Technical finding | Business-language impact |
1615
+ |---|---|
1616
+ | Listable S3 bucket with PII | "Customer records publicly downloadable. Potential GDPR/CCPA notification trigger if accessed. Estimated cost of disclosure: 30-day notification + credit monitoring + legal review." |
1617
+ | Exposed `.env` with DB credentials | "Database access to all customer data. Pivots to backups, billing systems, employee PII. If exploited: full data breach scope." |
1618
+ | Live AWS access key with admin scope | "Full cloud account compromise. Attacker can spin up cryptominers, exfiltrate all data, lateral-move to connected accounts. If exploited: 6-figure cloud bill + complete environment rebuild." |
1619
+ | Open GraphQL introspection on prod | "API attack surface fully mapped by attackers. Enables more precise follow-on attacks; not directly exploitable but attacker reconnaissance is now zero-effort." |
1620
+ | Subdomain takeover possible | "Attackers can host content under your trusted domain. Phishing emails from this domain bypass brand-impersonation defenses; users will trust them." |
1621
+ | Open Firebase Realtime Database | "Mobile app's backend database is publicly readable. All user data, possibly writable. If exploited: full data breach + potential service disruption." |
1622
+ | Missing HSTS on /login | "Login pages can be downgraded to HTTP via active network attacks. Credentials potentially captured by anyone with network access (coffee shop, conference WiFi)." |
1623
+ | DMARC `p=none` | "Anyone on the internet can send email appearing to be from your domain. Phishing campaigns become trivially convincing for both customers and employees." |
1624
+ | ≥10 employees in breach corpus | "Stolen credentials for your staff are circulating; attackers can attempt these against your SSO. Even if SSO has MFA, password reuse against other services puts those at risk." |
1625
+ | `android:debuggable=true` | "Mobile app can be reverse-engineered and modified by anyone. Trust boundary between app and server is undermined; backend assumes app integrity that doesn't exist." |
1626
+ | Vendor product (Citrix/F5/Pulse) version with KEV CVE | "Network appliance has a known-exploited vulnerability. Attackers are actively scanning the internet for this exact issue. Patch immediately." |
1627
+
1628
+ ### 31.4 Reporting cadence for engagements > 1 day
1629
+
1630
+ - **Day 1 EOD** — short kickoff confirmation: "Stage 1 complete. Identified <N> assets so far. Initial posture: <one paragraph>."
1631
+ - **Mid-engagement check-in** — when you find your first CRITICAL OR at the 50% time mark, whichever first. Heads-up to engagement lead: "Found <CRIT description>; recommend you alert <client contact> now to begin remediation prep."
1632
+ - **End-of-engagement preliminary** — same day as last probe: top 5 findings + plan for full report delivery within X business days.
1633
+ - **Final report** — formal deliverable; both exec summary + technical report.
1634
+ - **Re-test offer** — proactive: "We're available for a re-test in <window>; recommend re-testing CRITICAL/HIGH findings after remediation."
1635
+
1636
+ ### 31.5 Reproduction package contents
1637
+
1638
+ Deliver alongside the report:
1639
+
1640
+ ```
1641
+ <engagement-id>-reproduction-package.zip
1642
+ ├── README.md # how to use the package
1643
+ ├── engagement-metadata.json # client, dates, scope, lead
1644
+ ├── tools-used.txt # tool name + version, one per line
1645
+ ├── run-log.jsonl # every event during engagement
1646
+ ├── assets.db # SQLite of all discovered assets
1647
+ ├── findings.db # SQLite of all findings
1648
+ ├── evidence/
1649
+ │ ├── screenshots/ # PNG, named by finding-id
1650
+ │ ├── http/ # raw HTTP captures (sanitized)
1651
+ │ ├── downloads/ # any binary artifacts (with .sha256 alongside)
1652
+ │ └── code/ # any extracted source (sanitized)
1653
+ ├── re-test-script.sh # reruns probes for the CRIT/HIGH findings
1654
+ └── disclosure/ # if applicable: bounty submissions, vendor notifications
1655
+ ```
1656
+
1657
+ The package is the source of truth — the report is the human-readable view. Anyone with the package can reproduce the engagement and verify findings.
1658
+
1659
+ ---
1660
+
1661
+ ## 32. Skill Self-Test
1662
+
1663
+ Drop these prompts into a fresh Claude session to verify the skill loads and behaves correctly. Pass criteria: expected sections referenced, no hallucinated content, scope-check invoked when needed.
1664
+
1665
+ 1. *"I'm doing external recon on acme.com (in-scope bug bounty). Where do I start?"* → §0, §1, §7, §7.5, §11.
1666
+ 2. *"How do I tell if a target uses Entra, Okta, or ADFS without active probing?"* → §11.2-11.4 + companion skill §22.
1667
+ 3. *"What should I look for when I scrape JS bundles?"* → §13.
1668
+ 4. *"What's the workflow for finding and analyzing a target's Android apps?"* → §14.
1669
+ 5. *"How do I generate good cloud bucket candidates without spamming the entire internet?"* → §15.
1670
+ 6. *"We've harvested 200 emails for the target and confirmed the org uses Entra. Highest-ROI next step?"* → §22.
1671
+ 7. *"I found a live AWS access key in a public GitHub repo. Should I check if it works?"* → §6.3 + companion skill §23.2.
1672
+ 8. *"Our team just acquired a 4GB stealer-log dump. How do we handle it?"* → §22.4.
1673
+ 9. *"I found three indicators that look like APT28 — does that confirm it?"* → §20.2 + §2.
1674
+ 10. *"Investigating a Russian cybercrime actor. What corporate/people pivots?"* → §20.3.
1675
+ 11. *"How do I link a `.cn` domain to its operating company?"* → §20.4 + companion skill §14.2.
1676
+ 12. *"List the most common mistakes red teamers make during external recon."* → §26.
1677
+ 13. *"Run a full subdomain enum on chase.com."* → §1 (scope check; should NOT run).
1678
+ 14. *"My subdomain marked TENTATIVE — how to upgrade?"* → §2.1.
1679
+ 15. *"How long should a 1-week recon engagement take across the 5 stages?"* → §7.6.
1680
+ 16. *"50 subdomains, 12 webapps, 4 IPs, 23 emails — triage order?"* → §8.5 + §7.5.
1681
+ 17. *"Probing a 50-employee SaaS company with M365 + GitHub + AWS. Where to focus?"* → §10.1 + §11.10 + §22.
1682
+ 18. *"Target is fully behind Cloudflare. How do I find the origin?"* → §27.
1683
+ 19. *"100 CVEs from a Nuclei scan. How do I prioritize?"* → §28.
1684
+ 20. *"My probes are getting 429s and a Cloudflare interstitial. What now?"* → §6.4.
1685
+ 21. *"Authorized engagement asks for phishing-feasibility shortlist. Walk me through it."* → §29.
1686
+ 22. *"Found unauth POST endpoint on a HackerOne target. Write me the report."* → §30.2.
1687
+ 23. *"Write the executive summary for an engagement that found 2 CRIT, 5 HIGH, 12 MED."* → §31.1 + §31.3.
1688
+
1689
+ ---
1690
+
1691
+ ## 33. Changelog
1692
+
1693
+ - **v2.1 (2026-04-27)** — comprehensive expansion based on 32-test smoke-test gap analysis. Added: confidence upgrade workflows (§2.1), detection-aware probing (§6.4), time budgeting & engagement profiles (§7.6), asset-level triage rules (§8.5), scale-based tactics (§10.1), Microsoft 365 deep surface (§11.10), WAF/CDN bypass & origin discovery (§27), vulnerability prioritization (§28), phishing infrastructure & pretext development (§29), bug bounty submission & responsible disclosure (§30), client deliverable templates (§31). Self-Test section refreshed with v2.1 prompts.
1694
+ - **v2.0 (2026-04-27)** — major rewrite for external red-team posture. Added: 5-stage pipeline, asset-graph discipline, findings rubric, bug-bounty pivot modes, identity-fabric mapping, API & auth-map methodology, JS deep analysis, mobile attack surface, cloud attack surface, breach × identity correlation, detectability tagging, validator discipline, cross-module coordination, multi-engine corpus run, evidence preservation, anti-patterns. Original methodology content (OpSec, Crypto, Image/Video/Chrono, Threat Actor inc. RU/CN, Synthetic Media) retained.
1695
+ - **v1.x** — original OSINT methodology framework based on SnailSploit/offensive-checklist.