
Offensive Osint
- 82 installs
- 3.3k repo stars
- Updated August 3, 2026
- elementalsouls/claude-bughunter
Run authorized external recon with concrete probes, wordlists, dorks, and a 48-pattern secret-scan catalog across subdomains, cloud, and identity fabric.
About
An operational arsenal of curl one-liners, regexes, and wordlists for subdomain enum, cloud bucket discovery, secret triage, and identity-fabric mapping, with detail in 15 modular reference files. A red-teamer uses it for any authorized recon: scoping, asset discovery, and attack-path mapping.
- 48-pattern secret-scan catalog across major providers
- Identity fabric deep recon: Entra/Okta/ADFS/M365
Offensive Osint by the numbers
- 82 all-time installs (skills.sh)
- Ranked #1,086 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/elementalsouls/claude-bughunter --skill offensive-osintAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 82 |
|---|---|
| repo stars | ★ 3.3k |
| Last updated | August 3, 2026 |
| Repository | elementalsouls/claude-bughunter ↗ |
What it does
Run authorized external recon with concrete probes, wordlists, dorks, and a 48-pattern secret-scan catalog across subdomains, cloud, and identity fabric.
Files
Offensive OSINT — External Red-Team Arsenal
v3.0 — Refactored 2026-05-02 from a 4,168-line monolith into a lean SKILL.md (~400 lines) plus 15 modular reference files in references/. Detail content loads on demand — Claude reads only the reference files relevant to the current task.0. When to use / When NOT
Use this skill when:
- You need concrete probe paths, wordlists, regexes, payloads, scoring rules, or tool URLs.
- You're executing reconnaissance and need the actual technical reference (vs. methodology).
- You're building a recon automation and need specific lists to seed it.
Do NOT use this skill when:
- The user is asking for active exploitation, post-exploitation, or anything past reconnaissance.
- The user is asking for defensive / blue-team detections.
- The target's authorization isn't established — see §1.
---
1. Authorization & Legal Posture
For assets the operator owns or has written authorization to assess. Soft scope check before acting against an unverified third-party target — see methodology skill §1 for the full posture.
---
2. Confidence Levels
- TENTATIVE — plausible based on indirect evidence (snippet-only dork match, single-source asset, inferred email pattern).
- FIRM — directly observed (subdomain resolves, HEAD-confirmed bucket exists, banner returned).
- CONFIRMED — verified via independent corroboration OR direct verification (live PMAK validation, multiple sources agree, listable bucket with object retrieval).
---
3. Output Format Conventions
Findings should carry: id, module, asset_key, category, severity (info/low/medium/high/critical), confidence, title, description, evidence (url + UTC timestamp + sha256 + raw ≤ 2 KiB), references, remediation. UTC timestamps everywhere.
---
4. Source Hygiene & Citations
URL + UTC timestamp + SHA-256 + tool version + run_id, every artifact. PNG screenshots, JSONL run logs, raw HTTP captures capped at 2 KiB body.
---
5. Do NOT
- Don't paste creds/PII/session tokens into cloud LLMs.
- Don't run destructive probes outside DEEP/
--aggressive. - Don't use validated credentials for anything except read-only liveness check.
- Don't single-source attribute.
- Don't assume vendor labels are ground truth.
---
6. General OSINT (curated tool refs)
- OSINT Bookmarks — comprehensive bookmarks.
- OSINT Framework — tool/resource directory.
- IntelTechniques Tools — investigative suite.
- Bellingcat Toolkit — investigative journalism.
- CyberSudo OSINT Toolkit — OSINT websites list.
- Google Dorks — efficient Google searching.
- Distributed Denial of Secrets — leaked datasets.
- Country-Specific Resources — country-targeted OSINT.
---
How to use this skill
This skill is a lean operational index. Most concrete data (wordlists, regexes, dorks, endpoint catalogs, severity examples) lives in the references/ subfolder, organized by topic.
Workflow when this skill triggers:
1. Read this SKILL.md to anchor on principles (§0-5), scoring rubrics (§20-21), attack-path templates (§39), and the references index below. 2. For task-specific data, read only the reference file(s) you need — do NOT pull all 15. Each reference is self-contained. 3. Use the bug-bounty skill for the local toolkit at ~/security-research/bug-bounty-resources/ and osint-methodology for the planning framework.
Loading rules of thumb:
- Single-class question (e.g., "what's the regex for AWS keys?") → load
secret-patterns.mdonly. - Multi-class engagement (e.g., "do an external recon on target.com") → load
probes-and-wordlists.mdfirst, then add others as the engagement narrows. - Severity / triage question → load
severity-matrix.md.
---
References Index
| File | Coverage | Trigger phrases |
|---|---|---|
probes-and-wordlists.md | API/Swagger/GraphQL paths, cloud-bucket arsenal, JS guess-paths, vendor & cloud-native fingerprints, K8s/CI-CD exposure, doc/wiki leaks, WHOIS/RDAP, DNS catalog, Wayback CDX, copy-paste curl probes, email security analysis, origin/CDN bypass | swagger discovery, graphql introspection, subdomain takeover, cloud bucket enum, S3/GCS/Azure enum, kubernetes exposure, CI CD exposure, vendor fingerprint, WHOIS RDAP, Wayback CDX, copy paste probes, curl one-liner |
identity-fabric.md | Concrete endpoints for Entra/Okta/ADFS/Google/SAML, M365 deep (Teams federation, SharePoint, OneDrive), GraphQL field-suggestion enumeration, user-enum patterns | identity fabric, SSO discovery, IdP fingerprinting, okta enum, entra enum, azure AD enum, ADFS enum, SAML metadata, Microsoft 365 deep, Teams federation, SharePoint enum, OneDrive enum, graphql field suggestion |
secret-patterns.md | 48-pattern secret-regex catalog (AWS, GCP, GitHub PATs, Stripe, Slack, JWT, private keys, Anthropic/OpenAI/HuggingFace, Cloudflare, DigitalOcean, npm, PyPI, Docker Hub, Atlassian, DataDog, Sentry, ngrok) with severity & FP notes | secret scanning, secret leak, leaked credential, JWT triage, AWS key triage, Anthropic API key, OpenAI API key |
secret-validators.md | 9 read-only secret validators + post-discovery enumeration workflows for AWS/GitHub/Slack/Postman/JWT/Anthropic/OpenAI/npm/Atlassian/DataDog | secret validation, post discovery workflow, AWS key triage, JWT triage |
dork-corpus.md | 80+ Google/Bing/DDG dork templates across 9 categories + 13 GitHub code-search dorks tailored for targets | google dorking, bing dorking, github dorking, dork corpus |
recon-stack.md | Subdomain-source stack (passive & active), infrastructure & attack-surface OSINT (Shodan/Censys/crt.sh/JARM/favicon mmh3), TLS deep audit, reverse DNS, IPv6 enumeration | subdomain enumeration, certificate transparency, crt.sh, shodan recon, censys recon, JARM, favicon mmh3, TLS deep audit, JA3 JA4, reverse DNS sweep, IPv6 enumeration |
breach-and-credentials.md | Breach & leak data sources (HudsonRock, HIBP, DeHashed, IntelX, infostealer logs), email-pattern inference, email-harvest source stack | breach lookup, have I been pwned, HudsonRock cavalier, infostealer, dehashed, intelx, email harvest |
people-osint.md | Search engines, username & email investigation, people search, phone OSINT, social media, public records & company info | username investigation, people search, phone OSINT, social media OSINT, public records |
saas-public-surfaces.md | Postman public workspace search (verified endpoint), Stack Exchange OSINT sweep, public SaaS dork stack (Notion, Confluence, Trello) | postman workspace, stack exchange OSINT, Notion public, Confluence anonymous, Trello board |
specialized-osint.md | Threat intel & IOCs, cryptocurrency OSINT, media intelligence, geospatial intelligence, regional search engines, Telegram & messaging intelligence | threat intel, IOCs, cryptocurrency OSINT, media intelligence, geospatial OSINT, regional search, Telegram intelligence |
recon-techniques.md | LinkedIn employee enumeration, job-posting tech-stack analysis, Slack/Discord/Telegram workspace discovery, package-registry leak hunting (npm/PyPI/Docker Hub/Quay/GHCR), sat imagery for physical recon | LinkedIn enumeration, job posting tech stack, Slack workspace discovery, Discord server discovery, npm token leak, PyPI token leak, Docker Hub leak, sat imagery physical recon |
severity-matrix.md | 80+ worked examples mapping observed conditions → finding severity (CRITICAL/HIGH/MEDIUM/LOW/INFO) | severity decision, finding severity, severity matrix |
sector-notes.md | Recon notes for healthcare (DICOM), finance (SWIFT), ICS/SCADA (Modbus/BACnet), IoT, government | sector specific recon, healthcare DICOM, finance SWIFT, ICS SCADA, Modbus, BACnet |
tooling-install.md | Quick-install one-liners for Subfinder, Amass, httpx, nuclei, gau, katana, gowitness, dnsx, mapcidr, naabu, sslyze, testssl.sh, etc. | tooling install, install subfinder, install nuclei, install httpx |
helpers-and-automation.md | AI-assisted OSINT, archiving & evidence preservation, automation & workflow patterns, cross-module sidecar coordination, runnable secret_scan.py helper notes | AI-assisted OSINT, evidence preservation, automation, sidecar |
---
20. Endpoint Interest Score — 0–100 rubric
For every classified endpoint (§22 in methodology skill), apply this rubric:
| Signal | Points | Conditions |
|---|---|---|
| Unauth write | +40 | POST/PUT/DELETE/PATCH endpoint returns 200/201/202/204 anonymously. |
| Open GraphQL introspection | +35 | __schema query returns full type list anonymously. |
| Verb tampering bypass | +30 | OPTIONS reveals method not documented; that method is accessible. |
| Reflected CORS + credentials | +25 | Access-Control-Allow-Origin reflects request Origin AND Access-Control-Allow-Credentials: true. |
| Sensitive keyword in path | +20 | Path matches one of: admin, internal, debug, user, password, token, key, export, upload, backup, config, secret, private, delete, purge, wipe. |
| Schema leak in error | +20 | Response body contains stack trace, ORM error class, framework signature (e.g., ActiveRecord::RecordNotFound, org.hibernate.exception.*, django.db.utils.IntegrityError). |
| API key in URL | +15 | Path or query string contains api_key=, apikey=, token=, access_token=. |
| Wildcard CORS | +10 | Access-Control-Allow-Origin: *. |
| Missing rate-limit headers | +10 | No RateLimit-* / X-RateLimit-* headers; no Retry-After after rapid requests. |
Thresholds:
| Score | Severity |
|---|---|
| ≥ 90 | CRITICAL |
| 70–89 | HIGH |
| 50–69 | MEDIUM |
| 25–49 | LOW |
| < 25 | INFO |
For score ≥ 70, attach an attack_path_hint in evidence (see §29).
---
21. Mobile App Ownership Confidence — 0–100 rubric
Before running deep APK static analysis, score whether the discovered app actually belongs to the target. Threshold: ≥70 = accept.
| Signal | Points |
|---|---|
Package reverse-DNS matches target domain (e.g., com.acme.android ⟂ acme.com) | +40 |
Developer email is <anything>@<target-domain> | +25 |
| Developer website URL is the target domain (or a confirmed sibling brand domain) | +20 |
| App name contains a brand keyword from operator-supplied brand list | +10 |
| App has ≥ minimum review-score threshold (default 20 reviews) | +5 |
Apps below threshold are tagged mobile_review_pending and shown but not analyzed. Operator can re-score with --mobile-ownership-threshold 50 for noisier collection.
---
---
39. Attack-Path Hint Patterns
When emitting a HIGH/CRITICAL API endpoint finding (score ≥ 70), include a one-sentence attack_path_hint in evidence so the operator knows where to start exploiting. Templates:
| Trigger | Attack-path hint |
|---|---|
| Unauth POST / PUT / DELETE | "Unauthenticated {method} {path} — try IDOR + privilege escalation; check whether numeric IDs are sequential or guessable." |
| Open GraphQL introspection | "Open GraphQL introspection on {path} — enumerate mutations, look for `createUser`, `setRole`, `transferFunds`-shaped names; pivot to broken-auth or business-logic flaws." |
| Reflected CORS + creds | "Reflected CORS with credentials on {path} — host CSRF page on attacker-controlled origin; victim's browser will leak {sensitive-data-hint}." |
| Wildcard CORS + sensitive | "Wildcard CORS on {path} returning user-tied data without creds — exfiltrate via cross-origin fetch from any page victim visits." |
| Verb tampering | "Verb tampering: {hidden-method} allowed on documented-{visible-method}-only endpoint → likely missing-method-check authz bug; try {hidden-method} {path} with valid auth." |
| API key in URL | "API key in URL: `?{param}=...` — token leaks to access logs, browser history, Referer headers, third-party CDNs. Check Wayback / Google for cached copies." |
| Schema leak in error | "Schema leak in error response — framework signature `{framework}` exposed; map to known {framework} vulns and craft targeted payloads." |
| Sensitive keyword | "Path contains '{keyword}' — review for direct object reference, mass-assignment, or hidden admin functionality." |
| Open RTDB Firebase | "Open Firebase RTDB at https://{project}.firebaseio.com/.json — read everything, then test write at `/<random-key>.json` with PUT to gauge ACL scope." |
| Listable cloud bucket | "Listable {provider} bucket `{bucket}` — recursive object listing + content-type analysis; look for backups, logs, customer data, AWS keys in JSON configs." |
| .git exposed | "Exposed .git/config on {host} — reconstruct repository with git-dumper or githacker; full source history." |
| .env exposed | "Exposed .env on {host} — grep for `_KEY`, `_SECRET`, `_TOKEN`, `_PASSWORD`; validate all credentials read-only via §23 validators." |
| /actuator/env | "Spring Boot /actuator/env exposed — dump environment variables; look for `spring.datasource.password`, JWT secrets, cloud creds." |
| /actuator/heapdump | "Spring Boot /actuator/heapdump exposed — download HPROF, run `jhat` or VisualVM, search for cleartext secrets in heap strings." |
| Open Elasticsearch | "Open Elasticsearch on {host}:9200 — `/_cat/indices?v` for index list; sample documents from each high-value index; test write to `/test-idx/_doc` to gauge ACL." |
| Open Redis | "Open Redis on {host}:6379 — `INFO`, `KEYS , sample reads; check for write access via CONFIG SET then BGSAVE to write authorized_keys`."* |
| Open MongoDB | "Open MongoDB on {host}:27017 — `show dbs`, `show collections`, sample find queries; check user collection for password hashes." |
| Subdomain takeover | "CNAME for {host} points to unclaimed {provider} resource → register `{takeover-target}` on {provider} to serve content from {host}; pivot to phishing or content injection on the trusted domain." |
| Open kubelet | "Open kubelet on {host}:10250 — `GET /pods` to list; `POST /run/<ns>/<pod>/<container>` for in-container exec without K8s API auth." |
| Open etcd | "Open etcd on {host}:2379 — `etcdctl get / --prefix --keys-only` for full cluster state; secrets stored under `/registry/secrets/`." |
| K8s API anonymous | "Kubernetes API on {host}:6443 with anonymous-auth — `kubectl --server=https://{host}:6443 --insecure-skip-tls-verify get pods --all-namespaces`." |
| Citrix unpatched | "Citrix NetScaler version {ver} on {host} — vulnerable to CVE-{cve} (KEV-listed); see vendor advisory; do not exploit but flag for client immediate patching." |
| F5 BIG-IP TMUI exposed | "F5 BIG-IP TMUI on {host} reachable; CVE-2022-1388 / CVE-2023-46747 KEV applicable; advise immediate patching to vendor-released hotfix." |
| VMware vCenter accessible | "vCenter at {host} accessible without VPN; CVE-2021-21972 RCE if unpatched; check version banner." |
| Cloud function URL unauth | "AWS Lambda Function URL at {url} accessible anonymously — review IAM auth configuration; if unauthenticated by design, audit input validation aggressively." |
| npm typosquat candidate | "Package name `{candidate}` is unregistered + similar to target's published `{official}` — typosquat takeover risk; advise client to defensively register." |
| DMARC missing/permissive | "DMARC `p=none` on {domain} — spoof of `{anything}@{domain}` deliverable to recipients; recommend enforcement to `p=quarantine` or `p=reject` after observing reports." |
| Live AI API key (Anthropic/OpenAI) | "Validated `sk-{provider}-...` key with model access — quota cost can be exfiltrated; rotate immediately + audit usage logs in provider console." |
| Public Slack invite link | "Slack workspace invite link discoverable via search engine — anyone can join the workspace without approval; trivially access internal channels." |
| Open Docker registry | "Public Docker registry at {host} — `GET /v2/_catalog` lists images; pull and scan layers for embedded secrets." |
| Telegram bot token live | "Telegram bot token validated — `getUpdates` reveals bot recipients (admin chats); if `getMe` shows bot is in channels, full message read access." |
Sourcemap with sourcesContent[] | "Sourcemap on {host} includes embedded original sources — full frontend code reconstructable; grep for inline secrets and internal hostnames." |
---
---
49. Skill Self-Test
Drop these prompts into a fresh Claude session to verify the skill loads correctly.
1. "What paths should I probe to find Swagger or OpenAPI specs on a webapp?" → §16.1. 2. "Give me the GraphQL introspection query I should POST." → §16.2. 3. "What are the high-risk ports to flag from a Shodan scan?" → §16.3. 4. "Show me the secret regex catalog." → §17 (48 patterns) + §48 (runnable Python). 5. "How do I score an API endpoint by attack interest?" → §20. 6. "Validate a leaked Postman API key — what URL?" → §23.1. 7. "Give me dorks for pastebin/gist/ghostbin leaks for a target." → §18.3. 8. "What endpoints fingerprint a Microsoft Entra tenant?" → §22.1 + §22.8 for M365 deep. 9. "How do I score whether a discovered Android app belongs to my target?" → §21. 10. "What attack-path hint when I find unauth POST on `/api/users`?" → §39 (first row). 11. "Curl one-liner to test for `/actuator/env`." → §16.13. 12. "Show me the GraphQL field-suggestion enumeration trick when introspection is disabled." → §22.9. 13. "Found a hard-coded JWT in JS. Walk me through full triage." → §23.12 (JWT workflow). 14. "Generate cloud bucket candidates for `<Client Brand Ltd>` with subdomains api/billing/hr." → §16.8. 15. "How do I find Microsoft 365 Teams federation status + SharePoint subdomains?" → §22.8. 16. "Probe paths for Citrix Netscaler / F5 BIG-IP / Pulse Secure." → §16.16. 17. "Find the origin behind Cloudflare on `target.example`." → §16.15 + companion methodology §27. 18. "What ports/paths probe for Kubernetes/etcd/kubelet exposure?" → §16.18. 19. "Audit `acme.com`'s SPF/DMARC for spoof feasibility." → §16.14. 20. "List wordlist sources for subdomain bruteforce + content discovery." → §27.1. 21. "Run reverse-DNS sweep across a /22 the target owns." → §28.5. 22. "Validate an OpenAI API key without burning quota." → §23.6 + §23.12. 23. "Find leaked secrets across npm/PyPI/Docker Hub for the target." → §44. 24. "How do I enumerate target employees on LinkedIn for a phishing list?" → §41. 25. "What's a Slack invite link enumeration technique?" → §43.1. 26. "What's the EPSS score and KEV status for CVE-2024-3400?" → §29.2. 27. "What modern AI API keys (Anthropic / OpenAI / HuggingFace / Cloudflare) match catalog patterns?" → §17 rows 30–48. 28. "Severity matrix for `android:debuggable=true` on prod app?" → §40. 29. "Install commands for the standard recon toolkit (subfinder/httpx/nuclei/etc.)?" → §46. 30. "For a healthcare engagement, what additional ports / protocols matter?" → §47.1. 31. "Pull HudsonRock breach corpus for `target.com` via direct API (no UI)." → §15.0.1. 32. "Run the full §16.14 email security audit from a Windows box (PowerShell)." → §16.14 PowerShell parallel. 33. "crt.sh just 502'd. What's the fallback chain?" → §27.0.1. 34. "Bulk IP → ASN lookup for 200 IPs without burning bgpview rate limit." → §28.1 (Cymru bulk). 35. "Common-prefix subdomain sweep for `target.example` covering vpn / api / staging / portal / intranet." → §16.24. 36. "Legacy mail (`mail.<domain>`) is NXDOMAIN today but breach corpus has employee URLs against it. What's the finding?" → §15.2 legacy-mail-decommissioned pattern. 37. "Confirm M365 tenancy when MX is wrapped by Mimecast (so MX doesn't reveal underlying mail platform)." → §22.1 autodiscover IP correlation + §16.22 autodiscover-as-confirmation. 38. "DMARC RUA points to `kdmarc.com` — what does that tell me?" → §16.14 DMARC reporting-vendor table. 39. "SharePoint HEAD probe returns HTTP 200. Does that mean anonymous access is granted?" → §22.8 (no — tenant exists, not anonymous access; distinguish). 40. "Wayback `.js` query returned empty for a brochure-ware site. Pivot?"* → §16.23 legacy-app pivot (.asp / .php / .jsp / .cfm / .aspx).
---
50. Changelog
- v2.1.1 (2026-04-27) — battle-test gap fixes from real-engagement smoke run. Added: §15.0.1 HudsonRock Cavalier direct-API recipe (curl + PowerShell, full JSON shape, free-tier redaction caveats, rate-limit guidance). §15.2 expanded with legacy-mail-decommissioned escalation pattern (NXDOMAIN legacy mail + breach corpus + autodiscover-confirmed cloud migration → CRITICAL SSO_EXPOSURE). §16.14 expanded with DMARC reporting-vendor table (Kratikal kdmarc / dmarcian / Valimail / Agari / EasyDMARC / DMARC Analyzer / Postmark) + full Windows/PowerShell parallel for the entire email security audit + caveat that PS 5.1
Resolve-DnsName -Type CAAerrors (use PS 7+ ornslookup -type=CAA). §16.22 expanded TXT verification token catalog with 17 new tokens (zscaler-verification, cloudflare-verify, autosect, cisco-site-verification, mscid, _amazonses, salesforce-domain-verification, workday/shopify/klaviyo/mailchimp/hubspot/zendesk/freshworks/intercom/loom/miro/gitlab) + new "Autodiscover-as-confirmation" pattern for M365 detection when MX is wrapped by Mimecast/Proofpoint/Barracuda. §22.1 added passive Autodiscover IP correlation pattern with Microsoft Exchange Online IP ranges. §22.8 added clarification: SharePoint HEAD HTTP 200 = tenant exists, NOT anonymous access granted (operators commonly misread). New §16.23 legacy-app pivot block (when Wayback*.jsreturns empty for brochure-ware sites, pivot to .asp/.php/.jsp/.cfm/.aspx/.json/.xml/.yml/.ini/.conf — with full broad-sweep one-liner). New §16.24 Common-Prefix Subdomain Sweep — formalized active prefix-probe technique with 100+ ordered prefix list, PowerShell + bash + puredns recipes, and real-engagement validation note (passive enum misses 20-40% of high-value subdomains; always pair with active prefix probe). §27.0.1 added crt.sh fallback chain (Censys, CertSpotter, Calidog, Subfinder, OTX, ThreatMiner, URLScan, Anubis-DB) with PowerShell wrapper that retries crt.sh 3× then falls back to Subfinder. §28.1 added Bulk IP→ASN recipes (Cymru bulk WHOIS, RIPEstat, bgp.tools, IPinfo Lite) + caveat that bgpview.io API has aggressive rate limits unsuitable for bulk. §40 severity matrix gained 8 rows: vendor procurement portal exposed + breach corpus hits (HIGH), PII-collection portal over plain HTTP (HIGH), decommissioned legacy mail + breach + cloud migration (CRITICAL), public-facing intranet without VPN (MEDIUM), staging/preprod publicly resolvable (MEDIUM), vpn.<domain> resolves but vendor unknown (INFO escalating to HIGH-CRITICAL on KEV match), DMARC RUA → third-party vendor (INFO). §49 self-test expanded from 30 → 40 prompts targeting all new content. - v2.1 (2026-04-27) — comprehensive expansion based on 32-test smoke-test gap analysis. Added: copy-paste curl probes for every check (§16.13), email security analysis with SPF/DMARC/DKIM/BIMI/MTA-STS/DNSSEC parsing + SaaS tenant inference (§16.14), origin discovery / CDN bypass via DNS history + cert SAN + favicon hash + JARM + Host-header probe (§16.15), vendor product fingerprints for Citrix/F5/Pulse/Fortinet/PaloAlto/Cisco/VMware/Exchange + KEV CVE associations (§16.16), cloud-native service URL fingerprints — Lambda Function URLs, Cloud Run, Cloud Functions, Azure Functions, Vercel, Netlify, Cloudflare Workers, etc. (§16.17), container & Kubernetes exposure (kubelet, etcd, K8s API, dashboard, Helm Tiller, container registries) (§16.18), CI/CD platform exposure (Jenkins deeper, GitLab, GitHub Actions, CircleCI, TeamCity, Argo CD, Spinnaker) (§16.19), documentation/wiki leak paths (Notion, Confluence, Trello, Miro, Lucidchart, Figma, ReadTheDocs, GitBook, Slab, Coda, etc.) (§16.20), WHOIS/RDAP/historical-WHOIS recipes + reverse-WHOIS pivots (§16.21), DNS record catalog with TXT verification token table → SaaS tenant inference (§16.22), Wayback CDX deep usage with all filter parameters (§16.23). Expanded: §17 secret catalog from 29 → 48 patterns adding modern AI API keys (Anthropic, OpenAI legacy + project, HuggingFace), infra (Cloudflare, DigitalOcean), package registries (npm, PyPI, Docker Hub), SaaS (Atlassian, Linear), observability (New Relic, DataDog, Sentry DSN), bot tokens (Discord, Telegram), and ngrok. Expanded §18 dork corpus from 50+ → 80+ with internal-tool exposure (Splunk/Grafana/Kibana/Argo CD/Sonarqube/Confluence/Jira/GitLab/Gitea), backup-file extensions, and sector-specific dorks (healthcare/finance/gov). Added §22.8 Microsoft 365 deep enumeration (Teams federation, SharePoint subdomain probe, OneDrive personal-site probe, OAuth client_id discovery, device-code phishing target check, Power Platform). Added §22.9 GraphQL field-suggestion enumeration recipe + alias batching, query-depth bypass, subscription enumeration, batched-query bypass. Added §23.5–23.9 read-only validators for Anthropic, OpenAI, npm, Atlassian, DataDog (5 new). Added §23.12 post-discovery enumeration workflows (AWS IAM enum, GitHub PAT scope/repo enum, Slack workspace enum, JWT full triage with algorithm-confusion + brute-force + none-bypass, Postman PMAK workspace enum, Anthropic + OpenAI usage enum, generic key provenance enum). Pinned §24 Postman search endpoint with verified shape + DevTools fallback recipe. Added §27.1 wordlist sources (Assetnote, SecLists, jhaddix, OneListForAll, raft-large-words, fuzzdb, etc.) + size guidance. Added §28.4 TLS deep audit (sslyze + testssl.sh + nmap + JA3/JA4 + cipher/protocol/cert checks). Added §28.5 reverse DNS sweep + IPv6 enumeration + BGP route observation. Added §29.2 vulnerability prioritization data sources (NVD/EPSS/CISA KEV/ExploitDB/Metasploit/InTheWild/OpenCVE/Trickest CVE+POC mapping/OSV.dev/VulnCheck KEV) + bulk prioritization workflow. Expanded §39 attack-path hints with 15 more templates (open kubelet/etcd, K8s API anonymous, Citrix/F5/vCenter/Cloud Function unauth, npm typosquat, DMARC missing, live AI keys, Slack invite, sourcemap with sourcesContent). Expanded §40 severity matrix with 30 more worked examples covering Kubernetes/container, vendor products with KEV CVEs, M365/cloud-native, CI/CD misconfig, documentation leaks, email-security gaps, AI/package-registry credentials, TLS issues. Added §41 LinkedIn employee enumeration tradecraft (search techniques + role inference + email-pattern derivation + sock-puppet considerations). Added §42 job posting tech-stack analysis (sources + extraction + tooling). Added §43 Slack/Discord/Telegram/Mattermost workspace discovery. Added §44 package registry leak hunting (npm/PyPI/RubyGems/Cargo/Packagist/NuGet/Maven Central + workflow + typosquat surveillance). Added §45 sat imagery for physical recon (sources + extraction + LinkedIn/Glassdoor/Instagram/conference intel + vehicle/fleet intel). Added §46 tooling quick-install (subdomain, HTTP probing, vuln scanning, content discovery, JS extraction, Wayback, cloud, identity, mobile, TLS, utilities, frameworks). Added §47 sector-specific recon notes (healthcare DICOM/HL7/FHIR/EHR + finance SWIFT/FIX/Bloomberg/banking middleware + ICS-SCADA Modbus/BACnet/S7/DNP3 + IoT MQTT/CoAP/UPnP + government FedRAMP/FISMA + maritime/aviation/auto). Renumbered Runnable Helper → §48, Self-Test → §49 (refreshed for v2.1), Changelog → §50.
- v2.0 (2026-04-27) — major rewrite for external red-team posture. Added: pre-built wordlists (§16), 29-pattern secret catalog (§17), 50+ dork corpus (§18), GitHub code-search dorks (§19), endpoint interest score (§20), mobile ownership confidence (§21), identity-fabric concrete endpoints (§22), read-only secret validators (§23), Postman workspace search (§24), Stack Exchange sweep (§25), public SaaS dorks (§26), subdomain-source stack (§27), domain-level breach severity (§15.1), L2 explorer table (§30.2), USCC + ICP workflow (§14.2), cross-module sidecar coordination (§36), attack-path hint patterns (§39), severity decision matrix (§40), runnable secret-scan helper (§41). Strengthened: confidence levels (§2), output format (§3), do-not rules (§5). Original tool tables retained and lightly reorganized.
---
Related Skills & Chains
- `web2-recon` — When the arsenal needs to be executed against a live host set. Workflow primitive: this skill provides the probe paths and wordlists;
web2-reconruns the actual subfinder → dnsx → httpx → katana pipeline that consumes them. - `osint-methodology` — When this skill's concrete probes need a planning framework. Workflow primitive:
osint-methodologyis the planning skeleton (5-stage pipeline, asset graph, findings rubric); this skill is the operational arsenal that fills each stage with curl one-liners and regexes. - `hunt-subdomain` — When this skill's subdomain enumeration finds stale CNAMEs. Workflow primitive: subdomains discovered via §27 /
references/recon-stack.mdget auto-routed tohunt-subdomainfor takeover validation. - `hunt-cloud-misconfig` — When this skill's cloud-bucket enum surfaces listable buckets / Firebase / actuator endpoints. Workflow primitive: §39 attack-path hints (listable bucket, /actuator/env, open Elasticsearch) hand off to
hunt-cloud-misconfigfor exploitation. - `m365-entra-attack` / `okta-attack` — When identity-fabric fingerprinting finds Entra/Okta. Workflow primitive:
references/identity-fabric.mdfingerprints the IdP; matched platform skill (loaded byhunt-dispatch) takes over for active enumeration.
offensive-osint skill
The "what to reach for" operational arsenal for external red-team OSINT and bug-bounty reconnaissance.
| Field | Value |
|---|---|
| Name | offensive-osint |
| Version | 2.1 |
| Lines | ~3,800 |
| Top-level sections | 51 |
| Subsections | ~135 |
| Companion skill | `osint-methodology` |
When this skill triggers
Auto-triggers on prompts containing any of ~110 trigger phrases. Common ones:
- All triggers from
osint-methodology(most prompts pull both) swagger discovery,openapi discovery,graphql introspection,graphql field suggestionsubdomain enumeration,subdomain takeover,cloud bucket enum,S3 enum,GCS enum,Azure blob enumokta enum,entra enum,azure AD enum,ADFS enum,SAML metadatamobile recon,APK analysis,Microsoft 365 deep,Teams federation,SharePoint enum,OneDrive enumsecret scanning,secret leak,leaked credential,JWT triage,AWS key triagegithub dorking,google dorking,postman workspace,stack exchange OSINTbreach lookup,have I been pwned,HudsonRock cavalier,infostealer,dehashed,intelxshodan recon,censys recon,certificate transparency,crt.sh,JARM,favicon mmh3JS endpoint extraction,sourcemap leakcopy paste probes,curl one-lineremail security analysis,SPF DMARC DKIMorigin discovery,CDN bypass,WAF bypassvendor product fingerprints,Citrix Netscaler,F5 BIG-IP,Pulse Secure,FortiGate,PaloAlto GlobalProtect,Cisco AnyConnect,VMware vCentercloud native fingerprint,Lambda function URL,Cloud Runkubernetes exposure,kubelet,etcdCI CD exposure,Jenkins recon,GitLab self-hosted,GitHub Actions secretsdocumentation leak,Notion public,Confluence anonymous,Trello boardWHOIS RDAP,DNS record catalog,Wayback CDXLinkedIn enumeration,job posting tech stackSlack workspace discovery,Discord server discoverynpm token leak,PyPI token leak,Docker Hub leaksat imagery physical reconTLS deep audit,JA3 JA4,reverse DNS sweep,IPv6 enumerationCVE prioritization,EPSS scoring,CISA KEV,vulnerability prioritizationtooling installsector specific recon,healthcare DICOM,finance SWIFT,ICS SCADA,Modbus,BACnetpost discovery workflowAnthropic API key,OpenAI API key
Full trigger list in the SKILL.md frontmatter.
What's in it
See the parent README's "What's in the box" table for the full §-by-§ breakdown.
Highlights:
- §16 — Pre-built wordlists & probe paths including 28 Swagger paths, 13 GraphQL paths + introspection POST body, 35 high-risk ports, 6 missing security headers, 15 always-on HTTP checks, 5 SAML metadata paths, 8 SSO subdomain prefixes, cloud-bucket arsenal (6 prefixes × 15 suffixes × 47 stems × 3 providers), JS guess-paths, endpoint-extraction regex tiers, internal-host leakage regexes, 27 takeover provider fingerprints, copy-paste curl probes, email security analysis, origin discovery / CDN bypass, vendor product fingerprints, cloud-native fingerprints, container/K8s exposure, CI/CD exposure, doc/wiki leak paths, WHOIS/RDAP, DNS catalog with TXT verification token table, Wayback CDX deep usage.
- §17 — Secret-pattern catalog (48 patterns) with severity, category, false-positive notes.
- §18 — Dork corpus (80+ templates, 9 categories).
- §20 — Endpoint interest score (0–100 rubric).
- §21 — Mobile app ownership confidence (0–100 rubric).
- §22 — Identity-fabric concrete endpoints (incl. M365 Deep + GraphQL field-suggestion enum).
- §23 — 9 read-only secret validators + post-discovery enumeration workflows.
- §39 — 27 attack-path hint templates.
- §40 — Severity decision matrix (80+ worked examples).
- §41–§47 — LinkedIn enum, job posting analysis, Slack/Discord discovery, package registry leaks, sat imagery, tooling install, sector notes.
- §48 — Runnable secret-scan helper (stdlib-only Python, available standalone at `scripts/secret_scan.py`).
Loading
# Local Claude Code install
cp SKILL.md ~/.claude/skills/offensive-osint/SKILL.md
cp scripts/secret_scan.py ~/.claude/skills/offensive-osint/scripts/secret_scan.py
# Or attach to a Claude.ai project / Claude API system promptThe full content lives in this SKILL.md (or in docs/full-skills/offensive-osint.SKILL.full.md if this file is the structured-outline variant).
Helper script
`scripts/secret_scan.py` — stdlib-only Python scanner mirroring the §17 secret-pattern catalog. Run standalone:
python3 scripts/secret_scan.py path/to/repo/ # scan a directory tree
python3 scripts/secret_scan.py file1 file2 file3 # scan specific files
cat my.log | python3 scripts/secret_scan.py # pipe stdinOutput: JSONL — one finding per line — jq-friendly.
Self-test
Run the prompts in `../../tests/smoke-test-prompts.md`. Arsenal-targeted prompts are tagged in the test file.
License
MIT — see LICENSE.
Breach Data, Email-Pattern Inference, Email Harvest
Reference content for the offensive-osint skill. Originally §15 + §11 + §12 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).15. Breach & Leak Data
- Have I Been Pwned — breach lookup; Pwned Passwords API (k-anonymity).
- Dehashed — credential search (paid).
- IntelX — data intelligence.
- LeakCheck, Snusbase, BreachDirectory, Scattered Secrets, Phonebook, LeakPeek.
- Cavalier (Hudson Rock) — infostealer log lookups; FREE; highest single-source ROI for finding compromised employee credentials in corporate SSO.
15.0.1 HudsonRock Cavalier — direct API recipe
The web UI wraps a public, unauthenticated JSON API. Hit it directly:
# By domain (canonical first call)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-domain?domain=target.com" | jq .
# By email (single-account check)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-email?email=alice@target.com" | jq .
# By URL (when target's app is the breach victim)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-url?url=https://app.target.com" | jq .PowerShell:
$hr = Invoke-RestMethod -Uri "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-domain?domain=$D" -TimeoutSec 30
"Employees: $($hr.employees) | Users: $($hr.users) | Third-party: $($hr.third_parties) | Total: $($hr.total)"
$hr.data.employees_urls | Sort-Object -Property occurrence -Descending | Select-Object -First 20
$hr.data.clients_urls | Sort-Object -Property occurrence -Descending | Select-Object -First 15Top-level JSON fields:
total— total stealer entries touching this domain.totalStealers— global stealer-log corpus size (context only).employees— count of<*>@<domain>accounts found.users— count of accounts where the domain appeared as a visited URL (customers/vendors).third_parties— accounts touching adjacent domains in the org.data.employees_urls[]—{occurrence, type, url}— internal apps where employees were logging in when stolen. Subdomain hits here = recon gold.data.clients_urls[]— same shape; user-facing apps (often reveals undocumented public portals).data.stealer_families[]—{_key, _value}→ which stealer (RedLine / Lumma / StealC / Vidar / Raccoon).data.dates_compromised[]—{_key, _value}→ temporal distribution.
Free-tier caveats (CRITICAL to know):
- Subdomain hostnames in
data.*_urls[]past the first few are redacted with asterisks (*****.target.com). Pivot to paid Cavalier tier or other sources for unredacted. - Free endpoint returns counts + sample URLs only. Cleartext passwords + emails are never in the free response.
- Rate limit ~1 req/sec/IP; 429 on burst. Sleep 1s between calls.
- For unredacted creds + bulk enumeration → paid Cavalier portal.
Severity mapping (per §15.1 + §15.2): employees ≥ 10 → CRITICAL, regardless of whether the breached service is still online (legacy Lotus Domino / on-prem mail decommissioned + cloud SSO migration → employees almost always reuse passwords → SSO_EXPOSURE escalates CRITICAL).
15.1 Domain-Level Breach Severity Mapping
When you query a breach corpus by domain, map the result to severity like so:
| Stat | Severity |
|---|---|
| ≥ 10 employees compromised | CRITICAL |
| 1–9 employees compromised | HIGH |
| ≥ 1 end-user (non-employee) compromised | MEDIUM |
| Domain seen in breach with 0 named accounts | INFO |
Employees vs end-users distinction: an employee account is <anything>@<target-domain> (the breach victim is the target's own staff). An end-user account is the target's customer who reused a password — useful for credential-stuffing risk awareness but not directly compromising the target's identity fabric.
15.2 SSO_EXPOSURE finding
When a discovered SSO tenant (Entra GUID / Okta slug / Google Workspace domain) intersects with the breach corpus on its domain → SSO_EXPOSURE finding, severity CRITICAL. Evidence: tenant ID + product + employee count + per-account source attribution.
Legacy-mail-decommissioned pattern (high-value variant):
If mail.<domain> / webmail.<domain> returns NXDOMAIN today but HudsonRock/HIBP corpus still has historical employee credentials against it AND autodiscover.<domain> resolves to Microsoft IPs (M365) or aspmx.l.google.com MX (Workspace), the org migrated from on-prem to cloud — and the stolen passwords almost certainly survived the migration via password reuse. Escalate to CRITICAL `SSO_EXPOSURE` even when the legacy host is dead.
Concrete triggers (all three together): 1. Resolve-DnsName mail.<domain> -Type A → NXDOMAIN (legacy gone) 2. HudsonRock corpus has employee URLs against the old host (e.g. mail.<domain>/names.nsf for Lotus Domino, mail.<domain>/owa/ for Exchange, mail.<domain>/iwaredir.nsf for iNotes, mail.<domain>/zimbra/ for Zimbra) 3. Current MX → M365 / Google Workspace / Zoho cloud (DNS confirms migration)
Evidence pack: tenant GUID + breach count + 3+ legacy URLs from corpus + autodiscover Microsoft IPs + current MX. Recommend forced password rotation + MFA audit + Conditional Access review.
---
11. Email-Pattern Inference (TENTATIVE candidates)
Given a (first_name, last_name, domain), generate these 8 candidate addresses for breach pre-hits, phishing list curation, and downstream enrichment. Mark as TENTATIVE confidence until corroborated.
{first}.{last}@{domain} # john.doe@example.com
{first}{last}@{domain} # johndoe@example.com
{first}@{domain} # john@example.com
{first[0]}{last}@{domain} # jdoe@example.com
{first}.{last[0]}@{domain} # john.d@example.com
{last}@{domain} # doe@example.com
{first}_{last}@{domain} # john_doe@example.com
{first}-{last}@{domain} # john-doe@example.comLowercase before lookup. Strip diacritics for ASCII fallback. If the org uses a known pattern (e.g., Hunter.io shows {first}.{last} is dominant), prioritize that one and mark FIRM.
---
12. Email-Harvest Source Stack
Six parallel sources, dedup at the end:
1. IntelX phonebook API — 2-step search + poll. Largest single source for breach-era addresses. 2. Hunter.io — domain-search endpoint. ~25 free/month. Returns verified emails + roles. 3. crt.sh — extract X.509 SAN extensions. Many certs include admin/contact emails. 4. DuckDuckGo SERP scrape — HTML scrape of "@{target-domain}" results. 5. Bing SERP scrape — same query, complementary index. 6. Wayback CDX — historic snapshots of the target's homepage / contact / about pages often contain emails removed from the live site.
Email regex:
\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\bNoise filter (reject numeric-only locals):
^[0-9]+$(Discards garbage like 12345@example.com from random tokens.)
---
Dork Corpus & GitHub Code-Search Dorks
Reference content for the offensive-osint skill. Originally §18 + §19 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).18. Dork Corpus — 80+ templates, 9 categories
Substitute {domain} with the target domain (e.g., example.com) and {company} with the company name (e.g., Acme Corporation). Run via Google, Bing, Brave, DuckDuckGo, Yandex, Baidu — engines surface different results.
18.1 Files
site:{domain} filetype:env
site:{domain} ext:env OR ext:ini OR ext:cfg OR ext:conf
site:{domain} ext:sql OR ext:sqlite OR ext:dump OR ext:bak
site:{domain} ext:pem OR ext:key OR ext:p12 OR ext:pfx
site:{domain} ext:log
site:{domain} intitle:"index of"
site:{domain} inurl:.git OR inurl:/.git/
site:{domain} inurl:backup OR inurl:.bak OR inurl:old
site:{domain} ext:yml OR ext:yaml
site:{domain} ext:properties18.2 Admin / login panels
site:{domain} inurl:admin OR inurl:login OR inurl:sso OR inurl:dashboard
site:{domain} intitle:"phpMyAdmin"
site:{domain} intitle:"Jenkins"
site:{domain} intitle:"Grafana"
site:{domain} intitle:"Kibana"
site:{domain} intitle:"Splunk"
site:{domain} (intitle:"login" OR intitle:"sign in")
site:{domain} intitle:"GitLab"
site:{domain} intitle:"Swagger" OR intitle:"OpenAPI"
site:{domain} inurl:phpinfo18.3 Secrets / credential leakage
"{domain}" ("api_key" OR "apikey" OR "access_token")
"{domain}" (password OR passwd OR pwd)
site:pastebin.com "{domain}"
site:ghostbin.com "{domain}"
site:rentry.co "{domain}"
site:gist.github.com "{domain}"
site:hastebin.com "{domain}"
"{domain}" "BEGIN RSA PRIVATE KEY"18.4 Cloud / CI / shadow-IT
site:s3.amazonaws.com "{domain}"
site:storage.googleapis.com "{domain}"
site:blob.core.windows.net "{domain}"
site:digitaloceanspaces.com "{domain}"
site:trello.com "{domain}"
site:*.atlassian.net "{domain}"
site:dev.azure.com "{domain}"
site:bitbucket.org "{domain}"
site:firebaseio.com "{domain}"
site:herokuapp.com "{domain}"18.5 Docs / intel mining
site:{domain} filetype:pdf (confidential OR internal OR restricted)
site:{domain} filetype:xlsx OR filetype:csv
site:{domain} filetype:docx
site:scribd.com "{company}"
"{company}" filetype:pdf (salary OR payroll OR org-chart OR "organization chart")
site:linkedin.com/in "{company}"
site:slideshare.net "{company}"18.6 Vuln indicators
site:{domain} intext:"sql syntax" OR intext:"you have an error in your sql"
site:{domain} intext:"Warning: mysql_"
site:{domain} intext:"Fatal error:" intext:"on line"
site:{domain} intext:"stack trace" OR intext:"Traceback (most recent call last)"
"Apache/2.4.49" site:{domain}
"Server: nginx/1.14" site:{domain}
site:{domain} inurl:wp-content OR inurl:wp-includes18.7 Internal tool exposure
site:{domain} intitle:"Splunk"
site:{domain} intitle:"Grafana"
site:{domain} intitle:"Kibana"
site:{domain} intitle:"Prometheus Time Series"
site:{domain} intitle:"Jaeger UI"
site:{domain} intitle:"AlertManager"
site:{domain} intitle:"Argo CD"
site:{domain} intitle:"Sonarqube"
site:{domain} intitle:"Sentry"
site:{domain} intitle:"Confluence"
site:{domain} intitle:"Jira"
site:{domain} intitle:"GitLab"
site:{domain} intitle:"Gitea"
site:{domain} intitle:"Drone CI"
site:{domain} inurl:"/jenkins/"18.8 Backup / dump file extensions
site:{domain} ext:bak OR ext:backup OR ext:old OR ext:orig OR ext:save OR ext:swp
site:{domain} ext:tar OR ext:tar.gz OR ext:tgz OR ext:zip OR ext:rar OR ext:7z
site:{domain} ext:db OR ext:sqlite OR ext:sqlite3 OR ext:mdb
site:{domain} ext:dump OR ext:rdb OR ext:bson
site:{domain} (intext:"-- MySQL dump" OR intext:"PostgreSQL database dump")
site:{domain} ext:pcap OR ext:pcapng OR ext:cap
site:{domain} ext:core OR ext:hprof OR ext:dmp18.9 Sector-specific (healthcare / finance / gov)
# Healthcare
site:{domain} (filetype:pdf OR filetype:xlsx) (HIPAA OR PHI OR "patient records")
site:{domain} ("DICOM" OR "HL7" OR "ICD-10")
# Finance
site:{domain} (filetype:pdf OR filetype:xlsx) (SOC OR "audit report" OR "internal control")
site:{domain} (filetype:pdf OR filetype:xlsx) ("Form 10-K" OR "Form 10-Q" OR earnings)
site:{domain} ("SWIFT" OR "BIC" OR IBAN OR "wire transfer")
# Gov / public sector
site:{domain} (filetype:pdf OR filetype:doc) (FOUO OR "controlled unclassified" OR CUI)
site:{domain} (filetype:pdf OR filetype:xlsx) ("personnel security" OR clearance)18.10 Result classification
After running, score each result via URL signature → title hint → snippet regex:
- CRITICAL URL signatures:
.pem,.p12,.pfx,.keyextensions;id_rsafilename. - HIGH URL signatures:
/.env,/.git/, database dumps,wp-config.bak,/phpmyadmin,/jenkins,/phpinfo.php. - MEDIUM URL signatures:
/admin,/login,/swagger,.log,/backup,.DS_Store. - Snippet content (e.g., a secret regex hit in the snippet) overrides URL signature only if higher severity.
- Confidence: snippet-only match = TENTATIVE (operator must visit URL to confirm; tag detectability=medium).
---
19. GitHub Code-Search Dorks for Targets — 13 dorks
Apply each template to {target} (root domain stem like acme), {domain} (full root domain like acme.com), and optionally {company} (Acme Corporation):
"{target}" filename:.env
"{target}" filename:.env.example
"{target}" filename:config
"{target}" AWS_ACCESS_KEY_ID
"{target}" AWS_SECRET_ACCESS_KEY
"{target}" password
"{target}" api_key
"{target}" secret
"{target}" authorization: Bearer
"{target}" filename:id_rsa
"{target}" filename:.git-credentials
"{target}" filename:wp-config.php
"@{domain}" password # emails + password contextRequirements: GitHub personal access token (any scope; recommend a fine-grained PAT with read-only repo access). Rate limit per token; concurrency cap ≤5.
For each result: 1. Fetch the file (or relevant fragment) via the GitHub Contents API. 2. Run the secret catalog (§17). 3. If a secret hits → SECRET_LEAK finding with catalog severity, evidence = repo URL + file path + matched secret (truncated, last 4 chars only). 4. Optional: clone the repo to a tempdir, run trufflehog/gitleaks for full history scan.
---
AI-Assisted OSINT, Archiving, Automation, Sidecar, Helpers
Reference content for the offensive-osint skill. Originally §33 + §34 + §35 + §36 + §48 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).33. AI-Assisted OSINT
Warning: Never paste PII, sensitive IOCs, or unique pivots into cloud LLMs. They log inputs and may use them for training. Use local models for sensitive analysis.
| Tool | Strength |
|---|---|
| ChatGPT (paid) | Log parsing, dataset analysis, Code Interpreter for CSV/JSON, Vision OCR. |
| Claude (paid) | 200K-token context for large doc dumps + report synthesis. |
| Gemini | Long-context; Deep Research mode with citations. |
| Perplexity Pro (paid) | Real-time web search + reasoning. |
Local / privacy-preserving: Ollama, LM Studio, GPT4All.
33.1 Commercial AI OSINT Platforms
- Cylect — entity extraction + link analysis.
- Fivecast Matrix — generative-AI triage for social-media datasets.
- Recorded Future — AI-driven threat intel.
- DarkOwl Vision — darknet data analysis.
33.2 Deepfake & Synthetic Media Detection
---
34. Archiving & Evidence Preservation
- archive.today — one-page archiver + screenshot.
- URLScan.io — webpage scan + resource map.
- ArchiveBox — self-hosted (HTML, PDF, screenshots, media).
- Hunchly — investigator evidence capture (paid).
- Wayback SavePageNow API v3 — on-demand archiving with job IDs.
- SingleFileZ — browser ext for offline HTML.
- Kasm Workspaces — containerized OSINT browser isolation.
Evidence handling: URL + UTC timestamp + PNG + WARC/SingleFileZ archive, SHA-256 hash all downloads, separate work profiles per case, store evidence read-only, JSONL run logs with run_id + tool versions.
---
35. Automation & Workflows
- n8n — self-hosted workflow automation (RSS → scrape → alert pipelines).
- Huginn — agent-based monitoring/scraping/alerting.
- Playwright — headless browser automation with stealth plugins.
- Browsertrix Crawler — archival crawling with WARC export.
- Prefect / Apache Airflow — workflow orchestration.
---
36. Cross-Module Sidecar Coordination
When you run a multi-module recon, late-arriving outputs need to feed into already-running modules. The pattern:
1. Each module writes a sidecar JSON to a known location when it finishes:
<scan>/mobile_endpoints.json— endpoints + hostnames extracted from APK static analysis.<scan>/secrets_sidecar.json— hostnames + endpoints + Firebase project IDs from secrets-beyond-github sweep.<scan>/sso_tenants.json— discovered IdP tenants for breach correlation.
2. Downstream modules check for sidecars on start; if present, ingest. 3. Cross-feed: API discovery consumes both mobile_endpoints.json and secrets_sidecar.json; SSO×breach correlation consumes sso_tenants.json and the breach DB.
Sidecar shape (mobile_endpoints.json example):
{
"endpoints": [
{"method": "GET", "url": "https://api.acme.com/v1/users", "source": "apk:com.acme.android"},
{"method": "POST", "url": "https://api.acme.com/v1/login", "source": "apk:com.acme.android"}
],
"hostnames": ["api.acme.com", "cdn.acme.com"],
"firebase_project_ids": ["acme-prod-12345"]
}When you implement an ad-hoc multi-tool recon (no platform), use a tmpdir + JSON sidecars + a one-line manifest pattern. Composable, debuggable, replay-able.
---
48. Runnable Helper — secret_scan.py
Drop-in Python helper that mirrors the 29-pattern catalog from §17. Pure stdlib, no dependencies. For operator use against captured text.
#!/usr/bin/env python3
"""Stdlib-only secret scanner. Mirrors the 29-pattern catalog.
Usage:
echo "AKIAIOSFODNN7EXAMPLE" | python3 secret_scan.py
python3 secret_scan.py file1.txt file2.js dir/
Output: one JSON object per line: {pattern, severity, category, match, file, line}
"""
import json
import os
import re
import sys
SEV_CRITICAL = "critical"
SEV_HIGH = "high"
SEV_MEDIUM = "medium"
SEV_LOW = "low"
PATTERNS = [
("AWS_ACCESS_KEY", SEV_CRITICAL, "aws", r"\b(AKIA|ASIA)[0-9A-Z]{16}\b"),
("AWS_SECRET_TYPED", SEV_CRITICAL, "aws", r"(?i)aws[_\-]?secret[_\-]?access[_\-]?key['\"\s:=]+([A-Za-z0-9/+=]{40})"),
("AWS_SECRET_LOOSE", SEV_HIGH, "aws", r"(?i)aws(.{0,20})?(secret|sk)[\"'=: ]+([0-9a-z/+=]{40})"),
("GCP_SERVICE_ACCOUNT", SEV_CRITICAL, "gcp", r'"type"\s*:\s*"service_account"'),
("GOOGLE_API_KEY", SEV_HIGH, "gcp", r"\bAIza[0-9A-Za-z_\-]{35}\b"),
("GH_PAT_CLASSIC", SEV_CRITICAL, "github", r"\bghp_[A-Za-z0-9]{36}\b"),
("GH_PAT_FINEGRAINED", SEV_CRITICAL, "github", r"\bgithub_pat_[A-Za-z0-9_]{82}\b"),
("GH_OAUTH", SEV_HIGH, "github", r"\bgho_[A-Za-z0-9]{36}\b"),
("GH_S2S", SEV_HIGH, "github", r"\bgh[usr]_[A-Za-z0-9]{36,}\b"),
("STRIPE_LIVE", SEV_CRITICAL, "stripe", r"\bsk_live_[0-9A-Za-z]{24,}\b"),
("STRIPE_TEST", SEV_LOW, "stripe", r"\bsk_test_[0-9A-Za-z]{24,}\b"),
("SLACK_TOKEN", SEV_HIGH, "slack", r"\bxox[abpors]-[0-9A-Za-z\-]{10,48}\b"),
("SLACK_WEBHOOK", SEV_MEDIUM, "slack", r"https://hooks\.slack\.com/services/T[A-Z0-9]+/B[A-Z0-9]+/[A-Za-z0-9]+"),
("SENDGRID", SEV_HIGH, "email_svc", r"\bSG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}\b"),
("MAILGUN_V1", SEV_HIGH, "email_svc", r"\bkey-[0-9a-zA-Z]{32}\b"),
("MAILGUN_LOOSE", SEV_HIGH, "email_svc", r"\bkey-[0-9a-f]{32}\b"),
("TWILIO_API", SEV_HIGH, "twilio", r"\bSK[0-9a-fA-F]{32}\b"),
("TWILIO_SID", SEV_MEDIUM, "twilio", r"\bAC[a-f0-9]{32}\b"),
("TWILIO_AUTH", SEV_HIGH, "twilio", r"(?i)twilio(.{0,20})?(auth|token)[\"'=: ]+([a-f0-9]{32})"),
("HEROKU_API", SEV_MEDIUM, "paas", r"(?i)heroku(.{0,20})?api[\"'=: ]+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})"),
("FIREBASE_URL", SEV_LOW, "firebase", r"\bhttps?://[a-z0-9\-]+\.firebaseio\.com\b"),
("JWT", SEV_MEDIUM, "jwt", r"\beyJ[A-Za-z0-9_\-]{10,}\.eyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b"),
("BEARER_AUTH", SEV_MEDIUM, "bearer", r"(?i)authorization[\"'=: ]+bearer\s+[A-Za-z0-9._\-]{20,}"),
("BASIC_AUTH_URL", SEV_MEDIUM, "basic_auth", r"https?://[^/\s:@]+:[^/\s:@]+@[^/\s]+"),
("RSA_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN RSA PRIVATE KEY-----"),
("EC_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN EC PRIVATE KEY-----"),
("OPENSSH_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN OPENSSH PRIVATE KEY-----"),
("GENERIC_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN (DSA |PGP |)PRIVATE KEY-----"),
("GENERIC_API_KEY", SEV_MEDIUM, "generic", r"(?i)(?:api[_\-]?key|apikey|api_secret|access_token|secret[_\-]?token)['\"\s:=]+[\"']([A-Za-z0-9+/=_\-]{24,})[\"']"),
]
COMPILED = [(n, s, c, re.compile(p)) for (n, s, c, p) in PATTERNS]
def scan_text(text: str, source: str = "<stdin>"):
for line_no, line in enumerate(text.splitlines(), start=1):
for name, sev, cat, rx in COMPILED:
for m in rx.finditer(line):
yield {
"pattern": name,
"severity": sev,
"category": cat,
"match": m.group(0)[:80], # truncate to avoid huge dumps
"source": source,
"line": line_no,
}
def scan_path(path: str):
if os.path.isdir(path):
for root, _, files in os.walk(path):
for f in files:
p = os.path.join(root, f)
yield from scan_path(p)
return
try:
with open(path, "r", errors="replace") as fh:
yield from scan_text(fh.read(), source=path)
except Exception:
return
def main():
if len(sys.argv) > 1:
for arg in sys.argv[1:]:
for hit in scan_path(arg):
print(json.dumps(hit))
else:
data = sys.stdin.read()
for hit in scan_text(data):
print(json.dumps(hit))
if __name__ == "__main__":
main()Save as secret_scan.py, then:
python3 secret_scan.py path/to/repo/ # scan a directory tree
python3 secret_scan.py file1 file2 file3 # scan specific files
cat my.log | python3 secret_scan.py # pipe stdinOutput is JSONL — one finding per line — drops cleanly into jq for filtering or directly into a finding store.
---
Identity Fabric — Concrete Endpoints
Reference content for the offensive-osint skill. Originally §22 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).22. Identity Fabric — Concrete Endpoints
Methodology lives in the companion osint-methodology skill §11. This is the URL/payload reference.
22.1 Microsoft Entra (Azure AD)
OIDC metadata + tenant GUID extraction:
GET https://login.microsoftonline.com/{tenant-or-domain}/.well-known/openid-configurationResponse field issuer contains the tenant GUID. GUID regex:
\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\bDetectability: low.
getuserrealm.srf — managed vs federated probe:
GET https://login.microsoftonline.com/getuserrealm.srf?login=<probe-user>@<domain>Response: JSON with NameSpaceType field (Managed / Federated / Unknown). Federated also includes FederationBrandName and AuthURL (the upstream IdP URL). Detectability: low.
Autodiscover v2:
POST https://autodiscover-s.outlook.com/autodiscover/metadata/json/1
Body: {"Email": "<probe-user>@<domain>"}Returns the protocol endpoint for the user; presence indicates tenant membership. Detectability: low.
Autodiscover IP correlation (passive M365 confirmation):
Resolve autodiscover.<domain> and check if it lands in Microsoft Exchange Online IP space. This works even when MX is wrapped by Mimecast/Proofpoint/Barracuda inbound filtering, where MX alone doesn't reveal the underlying mail platform.
dig +short A autodiscover.target.exampleResolve-DnsName "autodiscover.$D" -Type A | Select Name,IPAddressMicrosoft Exchange Online IPs (truncated common ranges): 40.96.0.0/13, 52.96.0.0/14, 13.107.6.152/31, 13.107.18.10/31, 40.99.0.0/16, 40.104.0.0/15, 52.98.0.0/15. Full list: Office 365 URLs and IP address ranges.
If autodiscover.<domain> lands in that space → M365_CONFIRMED even when nothing else does. Detectability: low (passive DNS).
GetCredentialType — user-enum (deep mode only):
POST https://login.microsoftonline.com/common/GetCredentialType
Content-Type: application/json
Body:
{
"username": "<email>",
"isOtherIdpSupported": true,
"checkPhones": false,
"isRemoteNGCSupported": true,
"isCookieBannerShown": false,
"isFidoSupported": true,
"originalRequest": "",
"country": "US",
"forceotclogin": false,
"isExternalFederationDisallowed": false,
"isRemoteConnectSupported": false,
"federationFlags": 0
}Response field IfExistsResult indicates user existence: 0 = exists, 1 = doesn't exist, 5 = exists in federated tenant. Detectability: medium (logged in tenant audit). Cap at 20 attempts per tenant.
22.2 Okta
Org slug derivation: start with stems from discovered subdomains and root-domain stem. Probe <slug>.okta.com and <slug>.oktapreview.com. Slug regex:
[a-z0-9][a-z0-9-]{1,40}\.okta(?:preview)?\.comOIDC fingerprint:
GET https://<slug>.okta.com/.well-known/openid-configuration/api/v1/authn user-enum (deep mode):
POST https://<slug>.okta.com/api/v1/authn
Content-Type: application/json
Body: {"username": "<email>", "password": "invalid_password_for_enum"}Response distinguishes user existence:
400witherrorCode: E0000004→ user doesn't exist (or generic password error in some configs).401withstatus: PASSWORD_WARN/LOCKED_OUT/MFA_REQUIRED→ user exists.
Detectability: medium (audit-log per attempt). Cap at 20 attempts per tenant.
22.3 ADFS
Passive fingerprint:
GET https://{domain}/adfs/idpinitiatedsignon.aspxA 200 OK with a urn:com:microsoft:ADFS: reference in HTML indicates ADFS. Version-string greppable in HTML resource references.
Mex endpoint (deep mode):
GET https://{domain}/adfs/Services/Trust/mexReturns SOAP federation metadata including endpoint URLs, signing certs, and supported claim types.
22.4 Google Workspace
OIDC discovery:
GET https://{domain}/.well-known/openid-configurationGoogle-Workspace-hosted-domain customers expose discovery endpoints with characteristic issuer URI (https://accounts.google.com) and JWKS URI. MX records pointing to aspmx.l.google.com are a corroborating signal.
22.5 Generic OIDC (Keycloak / Auth0 / Ping / OneLogin / Duo)
Discovery: probe /.well-known/openid-configuration on every alive subdomain. The issuer and authorization_endpoint field URLs fingerprint the product:
| Product | URL pattern in issuer |
|---|---|
| Auth0 | https://*.auth0.com |
| OneLogin | https://*.onelogin.com |
| Ping | https://*.pingone.com, https://*.pingidentity.com |
| Duo | https://*.duosecurity.com |
| Keycloak | URL contains /realms/<realm> |
| OneLogin | https://*.onelogin.com |
22.6 SAML metadata
See §16.6.
22.7 AWS account-ID extraction
S3 bucket region header (passive):
HEAD https://<known-bucket>.s3.amazonaws.com/Response includes x-amz-bucket-region. Cross-reference with bucket name entropy and known patterns to scope the account.
ARN regex (in any JSON / HTML / JS response):
arn:aws:[a-z0-9\-]+:[a-z0-9\-]*:([0-9]{12}):Capture group: 12-digit AWS account ID.
`AccountId` property pattern:
(?i)["']?account[_\-]?id["']?\s*[:=]\s*["']([0-9]{12})["']Google OAuth client_id:
\b\d{8,}-[a-z0-9]{10,40}\.apps\.googleusercontent\.com\bMSAL / Microsoft client_id (GUID property):
(?i)["']?client[_\-]?id["']?\s*[:=]\s*["']([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})["']OAuth scope extraction:
(?i)["']?scope["']?\s*[:=]\s*["']([^"']+)["']22.8 Microsoft 365 Deep Enumeration (Teams / SharePoint / OneDrive / OAuth)
Teams federation status:
# Resolve tenant first
curl -sk -m 10 "https://login.microsoftonline.com/${TARGET_DOMAIN}/.well-known/openid-configuration" | jq -r '.issuer'
# Federation API requires authenticated request from a federated tenant; presence of error pattern reveals fed status
curl -sk -m 10 "https://teams.microsoft.com/api/mt/emea/beta/users/<email>/externalsearchv3"SharePoint subdomain probe:
STEM=$(echo $TARGET_DOMAIN | cut -d. -f1)
for sub in "" "-my" "-admin"; do
echo "=== ${STEM}${sub}.sharepoint.com ==="
curl -sk -m 10 -I "https://${STEM}${sub}.sharepoint.com/" -w '%{http_code}\n'
doneReading the result correctly: HTTP 200 from these probes means the tenant exists (Microsoft serves a generic redirect-to-auth page) — it does NOT mean anonymous access is granted to the tenant's content. Distinguish:
- 200 → tenant provisioned (INFO).
- 200 + redirect to a custom anonymous-share URL (
/sites/<x>/Lists/<y>/AllItems.aspx?guestaccesstoken=...) discovered via dorks → HIGH (data exposure). - 401/403 → tenant exists but auth required (INFO).
- 404 / NXDOMAIN → tenant not provisioned at this stem (or vanity-named — check known stems from cert transparency).
PowerShell:
$STEM = ($D -split '\.')[0]
foreach ($s in @("","-my","-admin")) {
try {
$r = Invoke-WebRequest -Uri "https://${STEM}${s}.sharepoint.com/" -Method Head -UseBasicParsing -TimeoutSec 10
"${STEM}${s}.sharepoint.com -> HTTP $($r.StatusCode) (tenant exists)"
} catch {
$code = $_.Exception.Response.StatusCode.value__
if ($code) { "${STEM}${s}.sharepoint.com -> HTTP $code" } else { "${STEM}${s}.sharepoint.com -> no host" }
}
}OneDrive personal site probe (for a known email alice@acme.com):
USER_TOKEN=$(echo "alice@acme.com" | tr '@.' '__')
STEM="acme"
curl -sk -m 10 -I "https://${STEM}-my.sharepoint.com/personal/${USER_TOKEN}/Documents/" -w '%{http_code}\n'
# 401 = exists; 404 = not provisionedM365 OAuth client_id discovery in JS:
curl -sk -m 10 "https://app.target.example/main.js" | \
grep -oE 'clientId["'\''[:=]+ ?["'\'']?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'Device-code phishing target check (look for device_authorization_endpoint in OIDC metadata):
curl -sk -m 10 "https://login.microsoftonline.com/${TARGET_DOMAIN}/v2.0/.well-known/openid-configuration" | \
jq '.device_authorization_endpoint'If non-null and tenant doesn't restrict device-code: MEDIUM finding (device-code phishing feasible).
Power Platform / Dynamics URLs to check:
*.crm.dynamics.com(per-region:crm,crm2-crm15,crm.dynamics.com).*.api.crm.dynamics.com(Web API).make.powerapps.com/flow.microsoft.com(auth-required dashboards).
Severity:
- Discovered SharePoint/OneDrive tenants → INFO (asset only).
- Anonymous SharePoint anonymous-share link → HIGH (data exposure).
device_authorization_endpointenabled on tenant → MEDIUM (operational risk).- Multi-tenant OAuth app with broad Graph scopes published by target → HIGH.
22.9 GraphQL Field-Suggestion Enumeration (when introspection disabled)
When the standard introspection query (§16.2) returns "errors":[{"message":"GraphQL introspection is disabled"}], fall back to field-suggestion enumeration. Apollo and most GraphQL libraries enable "did you mean" suggestions by default.
Detection probe:
curl -sk -m 10 -X POST "$T/graphql" \
-H 'Content-Type: application/json' \
-d '{"query":"{ __schema { types { name } } }"}' | jq -r '.errors[0].message'
# If "introspection disabled" → proceed.Field-suggestion probe (intentionally typo a field name to trigger suggestions):
curl -sk -m 10 -X POST "$T/graphql" \
-H 'Content-Type: application/json' \
-d '{"query":"{ usre { id } }"}' | jq -r '.errors[].message'
# Expected: "Cannot query field \"usre\" on type \"Query\". Did you mean \"user\", \"users\", \"userById\"?"Iterate over a candidate-field wordlist (use SecLists Discovery/Web-Content/graphql.txt or clairvoyance library's seed list). Each suggestion reveals real field names. Continue until no new suggestions emerge.
Tooling:
- Clairvoyance (
pip install clairvoyance) — automated field-suggestion enumerator.clairvoyance -w wordlist.txt -o schema.json https://target.example/graphql. - GraphQL-Cop — auditor that probes for introspection, batching, depth-limit, suggestion config.
pip install graphql-cop. - InQL (Burp extension) — Burp Suite extension for GraphQL endpoint analysis.
- GraphQL Voyager — visualize once schema is reconstructed.
Other GraphQL-when-introspection-disabled techniques:
- Alias-based query batching (rate-limit / auth-bypass surface):
{
"query": "{ a:user(id:1){name} b:user(id:2){name} c:user(id:3){name} ... }"
}Many APIs rate-limit per-request, not per-alias. Test 100+ aliases per request.
- Query-depth-limit bypass (DoS / introspection bypass):
{
"query": "{ user { friends { friends { friends { friends { id } } } } } }"
}If server allows arbitrary depth → DoS surface; if depth-limited but doesn't strip nested __type/__schema → introspection-via-depth.
- Subscription enumeration via WebSocket:
wscat -c "wss://target.example/graphql" -s graphql-ws
> {"type":"connection_init"}
> {"id":"1","type":"start","payload":{"query":"subscription { __schema { types { name } } }"}}- Batched query bypass (some servers process all queries in batch even if first fails):
[
{"query":"{ __schema { types { name } } }"},
{"query":"{ user(id:1) { name } }"}
]Severity:
- Field-suggestion enumeration succeeds (50+ fields recoverable) → MEDIUM
MISCONFIG. - Alias batching not rate-limited → MEDIUM (rate-limit-bypass surface).
- Subscription endpoint exposed without auth → MEDIUM (often used for real-time data exfil).
---
People, Username, Phone, Social, Public Records OSINT
Reference content for the offensive-osint skill. Originally §7 + §8 + §9 + §10 + §13 + §14 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).7. Search Engines
| Tool | Notes |
|---|---|
| Carrot2 | Clusters results by topic |
| etools | Metasearch |
| Kagi | Privacy-first, non-personalized |
| Brave Search | Independent index; Goggles for custom ranking |
| PDF Search | PDF + table of contents |
| Google Fact Check Explorer | Cross-site fact-check |
---
8. Username & Email Investigation
| Tool | Purpose |
|---|---|
| Sherlock | Username search across social networks |
| Maigret | Profile collector by username |
| What's My Name | Username search |
| Holehe | Email registration check |
| Epieos | Email pivots and metadata |
| OSINT Industries | Email/username/phone lookups |
| Hunter.io | Domain → emails |
| EmailRep | Email reputation |
| Emailable | Email verification |
| Mugetsu | X/Twitter username history |
| RocketReach / Apollo | Email enrichment + pattern guessing |
| PhoneInfoga | Phone number intelligence |
Browser extensions: GetProspect, SignalHire.
---
9. People Search
- TruePeopleSearch — free U.S. people search.
- WhitePages, Spokeo, Webmii, Pipl (paid).
- Clearbit — company/individual data enrichment.
- FaceCheck / FaceSeek — reverse face search.
---
10. Phone Number OSINT
- TrueCaller — caller ID + spam blocking.
- ThatsThem — reverse phone search.
- Infobel — non-USA phone search.
- FreeCarrierLookup — carrier/type (US).
- NumlookupAPI [Freemium] — programmatic carrier checks.
- CallerIDTest, Advanced Background Checks.
---
13. Social Media
| Platform | Tool |
|---|---|
| Picuki — profile view without account | |
| X/Twitter | snscrape — preferred CLI scraper; Twint as fallback |
| Graph Search, sowsearch.info, lookup-id.com, whopostedwhat.com | |
| Facebook (research) | Meta Content Library — CrowdTangle successor (researcher-gated) |
| YouTube/Twitch | Social Blade — analytics |
| TikTok | Tokboard — trends + profile analytics |
| Reveddit — removed content; RedTrack.social — user history | |
| Bluesky | Firesky — real-time firehose; SkyView — follower graphs |
| Mastodon | FediSearch — cross-instance search; Fedifinder — find Twitter users on Mastodon |
| Faces | Search4Faces |
---
14. Public Records & Company Information
- OpenCorporates — world's largest open company DB.
- SEC EDGAR — U.S. company filings.
- OpenOwnership Register — beneficial ownership.
- MuckRock — FOIA repository + request tracking.
- EU Tenders (TED) — EU procurement notices.
- World Bank Projects — project + procurement records.
- UK Companies House — UK companies + officers + filings.
14.1 RU registries
Rusprofile, Kontur.Focus (freemium), zakupki.gov.ru (procurement), EGRUL/EGRIP (official, captcha-gated).
14.2 CN registries + USCC + ICP
- GSXT — gsxt.gov.cn National Enterprise Credit Info; cross-check with Tianyancha / Qichacha.
- USCC (Unified Social Credit Code) — 18-character entity ID assigned to all CN legal entities. Format:
<region:6><authority:2><type:1><serial:9>. Useful for joining GSXT records to ICP filings. - ICP Beian — beian.miit.gov.cn — every domain serving traffic in mainland CN must register an ICP filing; the filing links the domain to a USCC, which links to the legal entity in GSXT.
- Workflow:
target.cndomain → ICP lookup → USCC → GSXT → entity name + officers + adjacent registered entities.
14.3 Sanctions & Compliance
- OFAC SDN List, EU Sanctions Map.
- OpenSanctions — aggregated.
- OCCRP Aleph — investigative documents, leaks, company records.
---
Subdomain & Infrastructure Recon
Reference content for the offensive-osint skill. Originally §27 + §28 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).27. Subdomain-Source Stack (Passive)
Practical "what actually returns useful data in 2026" reference, ordered by recall:
| Source | Tier | Notes |
|---|---|---|
| crt.sh | Free | Best single source for cert-derived subdomains; frequently 502s during peak hours — see fallback chain below. |
| VirusTotal | Freemium | Domain → passive DNS history. |
| AlienVault OTX | Free | Passive DNS + URL data. |
| Shodan | Paid (low tier) | Subdomain enum via domain: filter. |
| BinaryEdge | Paid | Comparable to Shodan. |
| FOFA | Freemium | Strong China-side coverage. |
| ZoomEye | Freemium | Comparable to Shodan; CN-strong. |
| Netlas | Paid | Large-scale HTTP/DNS/cert pivots. |
| SecurityTrails | Paid | Passive DNS + asset discovery. |
| RapidDNS | Free | Public passive DNS. |
| Subfinder bundled | Free | Aggregates 30+ free sources via one CLI. |
| Amass | Free | Comparable, more thorough, slower. |
| Recon-ng | Free | Modular framework; many free providers built in. |
DNS AXFR opportunism: for every name server discovered, attempt zone transfer:
dig @<ns-host> <target-domain> AXFRMost NSs reject; those that don't = full zone disclosure (CRITICAL).
Brute-force tier: Subfinder/Subbrute against assetnote.io wordlists (best-curated public wordlist source).
27.0.1 crt.sh down? Fallback chain (try in order)
crt.sh runs on a single nginx in front of a busy Postgres; 502 / 503 / timeout in peak hours is routine. Don't retry-loop — pivot:
D="target.example"
# 1. Censys cert search (free 250 queries/month with key) — same data, different infra
censys search "names: ${D}" --index-type certificates --fields names | jq -r '.names[]' | sort -u
# 2. Cert Spotter API (sslmate) — free w/ rate limits
curl -sk "https://api.certspotter.com/v1/issuances?domain=${D}&include_subdomains=true&expand=dns_names" | \
jq -r '.[].dns_names[]' | sort -u
# 3. CertStream archive (Calidog) — historical CT log mirror
curl -sk "https://crt.calidog.io/?q=${D}" | jq -r '.[].name_value' | sort -u
# 4. Subfinder bundled aggregator (uses 30+ sources internally — Chaos, Anubis, BinaryEdge, BufferOver, Censys, CertSpotter, Crobat, Crtsh, DNSDumpster, FOFA, Fullhunt, GitHub, HackerTarget, IntelX, PassiveTotal, Quake, Rapiddns, Shodan, Spyse, ThreatBook, ThreatMiner, URLScan, VirusTotal, WhoisXML, ZoomEye, etc.)
subfinder -d ${D} -all -recursive -silent
# 5. AlienVault OTX — free, no key
curl -sk "https://otx.alienvault.com/api/v1/indicators/domain/${D}/passive_dns" | \
jq -r '.passive_dns[].hostname' | sort -u
# 6. ThreatMiner — free
curl -sk "https://api.threatminer.org/v2/domain.php?q=${D}&rt=5" | jq -r '.results[]'
# 7. URLScan — passive DNS via past scans
curl -sk "https://urlscan.io/api/v1/search/?q=domain:${D}" | \
jq -r '.results[].page.domain' | sort -u
# 8. Anubis-DB / DNSDumpster (HTML scrape, last resort)
curl -sk -A "Mozilla/5.0" "https://anubisdb.com/anubis/subdomains/${D}" | jq -r '.[]'PowerShell crt.sh wrapper with retry + fallback to Subfinder:
function Get-Subs {
param($D)
for ($i=0; $i -lt 3; $i++) {
try {
$r = Invoke-WebRequest -Uri "https://crt.sh/?q=%25.$D&output=json" -UseBasicParsing -TimeoutSec 90 -UserAgent "Mozilla/5.0"
return ($r.Content | ConvertFrom-Json | %{ $_.name_value -split "`n" } | %{ $_.Trim().ToLower() } | ?{ $_ -and $_ -notlike "*@*" -and $_ -notmatch "^\*\." } | Sort -Unique)
} catch {
"crt.sh attempt $($i+1) failed; sleep 5s..." | Out-Host
Start-Sleep -Seconds 5
}
}
"crt.sh down — pivot to Subfinder: subfinder -d $D -all -silent" | Out-Host
return @()
}27.1 Wordlist Sources for Subdomain + Content Brute-Force
| Source | URL | Notes |
|---|---|---|
| Assetnote Wordlists | https://wordlists.assetnote.io/ | Best-curated; updated regularly. Subdomain top-N (1k, 10k, 100k, 1M, 10M); content-paths per CMS/framework; per-vendor (AWS, Azure, GitLab, etc.). |
| SecLists | https://github.com/danielmiessler/SecLists | Massive collection. Subdomains: Discovery/DNS/subdomains-top1million-110000.txt. Content: Discovery/Web-Content/. |
| jhaddix all.txt | https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056 | Long-running curated list. |
| OneListForAll | https://github.com/six2dez/OneListForAll | Aggregated; very large (millions). |
| dirsearch wordlists | https://github.com/maurosoria/dirsearch | Bundled with the tool. |
| raft-large-words.txt | inside SecLists Discovery/Web-Content/raft-large-words.txt | Time-tested content wordlist. |
| bo0om wordlist | https://github.com/bo0om/wordlists | Russian-language-aware. |
| commonspeak2 | https://github.com/assetnote/commonspeak2-wordlists | Generated from BigQuery commit data. |
| fuzzdb | https://github.com/fuzzdb-project/fuzzdb | Fuzzing payloads + wordlists. |
| PayloadsAllTheThings | https://github.com/swisskyrepo/PayloadsAllTheThings | Per-vuln-class payloads (less for enum, more for follow-on). |
| Custom per-target | n/a | Best practice: derive a custom wordlist from the target's own content (extract every word from their public website + LinkedIn + careers page → unique → use as seed). |
Size guidance:
- <10k entries → fast subdomain check (1–2 min); use for opportunistic/passive-supplement.
- 10k–100k entries → standard depth (10–30 min); use as default brute-force.
- 100k–1M entries → thorough; use when the target is a known high-value engagement (1–4 hours).
- >1M entries → exhaustive; reserve for week-long engagements; expect rate-limiting.
Tooling:
# Subfinder + brute-force with assetnote 100k
subfinder -d target.example -all -recursive | tee passive.txt
puredns bruteforce assetnote-best-dns-wordlist.txt target.example -r resolvers.txt | tee brute.txt
cat passive.txt brute.txt | sort -u > all-subs.txt
# Content brute-force on alive hosts
ffuf -u "https://target.example/FUZZ" -w raft-large-words.txt -mc 200,301,403 -t 50 -ac---
28. Infrastructure & Attack-Surface OSINT
- Shodan, Censys — internet device + cert search.
- GreyNoise — distinguish background noise from targeted scans.
- SecurityTrails — passive DNS + asset discovery.
- SpiderFoot — automated recon + correlation.
- theHarvester — subdomain, email, metadata.
- Recon-ng — web recon framework.
- Amass / Subfinder — passive subdomain.
- BuiltWith — tech stack enumeration.
- Netlas — large-scale HTTP/DNS/cert pivots.
- BinaryEdge / FOFA / ZoomEye — Shodan/Censys complements.
- RiskIQ PassiveTotal — passive DNS/cert/host pivots.
- Spur — IP lookups.
- Robtex — passive DNS + infrastructure.
28.1 ASN/BGP & Internet Measurement
Bulk IP → ASN — recipes that actually work in 2026:
# Cymru bulk WHOIS (fastest; no rate-limit issues; no key required)
echo -e "begin\nverbose\n8.8.8.8\n1.1.1.1\nend" | nc whois.cymru.com 43
# Or one-shot:
whois -h whois.cymru.com " -v 8.8.8.8"
# RIPEstat (free; CORS-friendly; ~1 req/sec polite limit)
curl -sk "https://stat.ripe.net/data/network-info/data.json?resource=8.8.8.8" | jq '.data'
# bgp.tools per-IP API (free; light rate-limit; requires UA)
curl -sk -A "osint-recon/1.0 (contact@example.com)" "https://bgp.tools/api/ip/8.8.8.8" | jq .
# IPinfo Lite (free 50k req/month with free key)
curl -sk "https://ipinfo.io/8.8.8.8?token=<key>" | jq .Watch out:
bgpview.ioAPI has aggressive undocumented rate limits (~1 req/min/IP); not suitable for bulk.bgp.he.nethas no public API; HTML scraping only — fragile.PeeringDBis for facility/IX info, not per-IP ASN lookup.- For bulk (>50 IPs): use the Cymru bulk format above; it accepts hundreds of IPs in one TCP session.
28.2 Certificates & CT Monitoring
- crt.sh, Censys Certificates, CertStream (real-time CT WebSocket), Rapid7 Open Data, Cert Spotter (freemium).
- Favicon mmh3 hash: cluster infrastructure across hosts; pair with Shodan/Censys favicon search for shared-infra discovery.
28.3 Web tech / TLS / fingerprinting
- httpx (ProjectDiscovery) — Wappalyzer-compatible ~600 signatures, JARM, favicon mmh3, TLS cert SHA256, security headers, screenshots. Recommended one-shot probe wrapper for thousands of hosts.
- JARM — TLS handshake hash; stable per server config; useful for clustering.
- Wappalyzer browser extension or CLI for tech enumeration.
28.4 TLS Deep Audit
Beyond the cert SAN + JARM, inspect cipher suites, protocols, and config quality.
sslyze (most thorough):
pip install sslyze
sslyze --regular target.example:443
sslyze --json_out=tls.json target.example:443Reports: protocols supported (TLS 1.0/1.1/1.2/1.3), cipher suites per protocol, cert chain, OCSP, key info, robot/heartbleed/lucky13/poodle/freak/logjam/drown/ccs/ticketbleed.
testssl.sh (thorough + readable output):
docker run --rm -ti drwetter/testssl.sh https://target.example
# Or native install: https://github.com/drwetter/testssl.sh
testssl.sh --jsonfile-pretty=tls-report.json target.example:443nmap script alternative (lighter):
nmap --script ssl-enum-ciphers,ssl-cert -p 443 target.exampleCheck for these issues:
| Issue | Severity | What to look for |
|---|---|---|
| TLS 1.0 / 1.1 supported | MEDIUM | Deprecated; PCI-DSS forbids TLS 1.0. |
| SSL 3.0 / 2.0 supported | HIGH | Critically deprecated. |
| Weak ciphers (RC4, 3DES, CBC modes) | MEDIUM | RC4 = NOMORE attack; 3DES = SWEET32. |
| Anonymous DH | HIGH | No authentication. |
| Self-signed cert on production | MEDIUM | Trust failure. |
| Expired cert | MEDIUM | Operational + trust failure. |
| Cert valid for too long (>397 days) | LOW | Browser warnings since 2020. |
| Wildcard cert covering critical hosts | INFO | Operational risk if private key compromised. |
| Weak key size (<2048 RSA, <256 ECDSA) | HIGH | Cryptographically weak. |
| Heartbleed (CVE-2014-0160) | CRITICAL | Memory disclosure. |
| ROBOT (CVE-2017-13099) | HIGH | Bleichenbacher. |
| CCS injection (CVE-2014-0224) | HIGH | OpenSSL specific. |
| Ticketbleed (CVE-2016-9244) | HIGH | F5-specific memory disclosure. |
| HSTS not present (covered §16.4) | MEDIUM | Header audit. |
JA3 / JA4 reference databases:
- ja3er.com — community-curated JA3 → client-software mapping.
- TLS Fingerprint DB — research aggregator.
- For server JARM: search Shodan
ssl.jarm:<hash>to find shared infrastructure / origin candidates (see §16.15).
28.5 Reverse DNS Sweep & IPv6 Enumeration
When a target owns an IP range (their ASN), enumerate it.
Reverse DNS sweep (within scope):
# Single /24
for i in $(seq 1 254); do
IP="203.0.113.$i"
PTR=$(dig +short -x $IP)
[ -n "$PTR" ] && echo "$IP -> $PTR"
done
# Larger range with parallelism
prips 203.0.113.0/22 | xargs -I {} -P 50 sh -c 'PTR=$(dig +short -x {}); [ -n "$PTR" ] && echo "{} -> $PTR"'Mass DNS approach (better for large ranges):
# zdns: install via go install github.com/zmap/zdns/cmd/zdns@latest
prips 203.0.113.0/22 | zdns PTRBanner-only sweep (no DNS round trip):
# masscan + banner-grab
sudo masscan -p80,443 203.0.113.0/22 --rate=1000 --banners -oX masscan.xmlIPv6 enumeration:
IPv6 has weaker enumeration tradition (huge address space precludes brute-force) but the AAAA records and known-allocation prefixes are still useful.
# AAAA records for every discovered subdomain
for sub in $(cat all-subs.txt); do
AAAA=$(dig +short AAAA $sub)
[ -n "$AAAA" ] && echo "$sub -> $AAAA"
done
# IPv6 reverse DNS sweep is generally infeasible (2^64 host bits per subnet)
# Instead: extract IPv6 prefixes from the target's allocations
whois -h whois.cymru.com " -v target.example.com" # gets ASN; then look up prefixBGP route observation:
- RouteViews —
http://archive.routeviews.org/(free; historical BGP routing table snapshots). - RIPE RIS —
https://ris.ripe.net/(free; route collectors). - Use these to detect route hijacks against the target's prefixes (defensive intel; sometimes IOC).
Reverse DNS pivots from third-party IPs:
If a third-party shows the target's domain in PTR records (e.g., a hosting provider's IP has PTR customer-acme.example.com.hostingprovider.net), that's a pivot for adjacent customer infrastructure on the same provider/datacenter.
---
Specialized Recon Techniques
Reference content for the offensive-osint skill. Originally §41 + §42 + §43 + §44 + §45 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).41. LinkedIn Employee Enumeration
LinkedIn is the highest-signal source for employee enumeration during external red-team work. Use it for: target list generation, role prioritization, email-pattern derivation, pretext development.
41.1 Search techniques
Free LinkedIn (no Sales Navigator):
- People-search by company:
https://www.linkedin.com/search/results/people/?currentCompany=["<company-id>"]. Get company-id from the company's LinkedIn URL or profile JSON. - Bypass connection-degree filter: search shows 1st/2nd-degree only by default; use Google dorking instead.
Google dork for LinkedIn employee enum:
site:linkedin.com/in "<company name>"
site:linkedin.com/in "<company name>" "engineer" # role filter
site:linkedin.com/in "<company name>" "<location>" # location filter
site:linkedin.com/in "<company name>" -inurl:/postsBing/DuckDuckGo equivalents — sometimes return different result sets; cross-engine union.
LinkedIn Sales Navigator (paid):
- Most efficient if available. Lead lists by company × role × seniority. Export CSV.
Tools:
- theHarvester with
-b linkedinsource (uses search-engine-driven enum). - CrossLinked —
https://github.com/m8r0wn/CrossLinked— CLI tool that does the LinkedIn dorking. - LinkedInDumper / Linkook — open-source enum tools (verify currency; they break frequently).
- PhantomBuster / Apollo.io / RocketReach / Hunter.io Email Finder — paid SaaS that does the enum + email derivation in one workflow.
41.2 Role inference for prioritization
For each enumerated employee, capture:
- Name (canonical form: First Last; remove suffixes like "PMP", "PhD" for email-pattern matching).
- Job title (raw + normalized to a role tier).
- Tenure (years at company; longer = more access typically).
- Location (city / region; informs phishing time-of-day).
- Recent activity (posts, comments, articles — informs pretext).
Role priority for breach lookup + phishing target list:
| Role tier | Examples | Why |
|---|---|---|
| P0 | CEO, CFO, CTO, CISO, CIO, COO, GC, CRO | Exec accounts; BEC + finance + legal authority. |
| P1 | VP / Director of IT / Security / Engineering / Finance / HR | Privileged tool access; reset workflows. |
| P2 | DevOps, SRE, Platform, Security Engineer, DBA | GitHub / cloud / CI access; secrets in their accounts. |
| P3 | Software Engineer, Architect, Senior Developer | Code + occasional cloud access. |
| P4 | Sales, Marketing, HR, Finance Analyst, Customer Support | SaaS access (Salesforce, HubSpot, Workday); BEC enabler. |
| P5 | Generic individual contributor, intern, contractor | Lowest single-account value but breadth matters. |
41.3 Email-pattern derivation from confirmed names
For each captured name, derive candidate emails using §11 templates. Cross-reference against:
- Hunter.io
domain-searchto confirm pattern. - Breach corpus (HudsonRock + HIBP + DeHashed + IntelX) to find matches.
41.4 Sock-puppet considerations
- Never connect from the corporate persona. LinkedIn shows "viewed your profile" notifications.
- Use a sock puppet with a plausible profile (5+ years built history, similar industry, mutual connections to throw off correlation). Tools: persona-builder workflows.
- LinkedIn "private mode" (anonymous viewing) — toggle in settings; reduces one signal but Sales Navigator can still see anonymized "someone viewed your profile."
- Connection requests are detectable. Don't send any during recon.
- Profile views accumulate suspicion if you view 100+ employees of one company in a day. Throttle: <20/day per persona.
41.5 Output
Per discovered employee:
Person:
name: "Alice Doe"
title: "Senior DevOps Engineer"
role_tier: P2
company: "Acme Corp"
location: "Boston, MA"
linkedin_url: https://www.linkedin.com/in/alicedoe
derived_emails:
- alice.doe@acme.com (TENTATIVE)
- adoe@acme.com (TENTATIVE)
- alice@acme.com (TENTATIVE)
breach_hits:
- alice.doe@acme.com (HudsonRock; cleartext password redacted; FIRM)
pretext_hooks:
- "DevOps tooling vendor evaluation" (recent posts)
- "Boston DevOps Days speaker" (conference activity)---
42. Job Posting Tech-Stack Analysis
Job postings reveal the target's internal tech stack with surprising precision. Free, public, and they include the exact vendor names.
42.1 Sources
| Platform | URL | Notes |
|---|---|---|
| LinkedIn Jobs | https://www.linkedin.com/jobs/search/?keywords=&f_C=<company-id> | Most current; require LI account. |
| Indeed | https://www.indeed.com/cmp/<company> | Company page with job feed. |
| Glassdoor | https://www.glassdoor.com/Jobs/<company>-Jobs-E<id>.htm | Plus salary data + employee reviews. |
| Lever (ATS) | https://jobs.lever.co/<company> | Direct ATS — full job descriptions. |
| Greenhouse (ATS) | https://boards.greenhouse.io/<company> | Direct ATS. |
| Workable (ATS) | https://apply.workable.com/<company>/ | Direct ATS. |
| AshbyHQ (ATS) | https://jobs.ashbyhq.com/<company> | Direct ATS. |
| AngelList / Wellfound | https://wellfound.com/company/<company>/jobs | Startup-focused. |
| BuiltIn | https://builtin.com/companies/view/<company> | Tech-focused. |
| Stack Overflow Jobs | (deprecated 2022 but archive available) | Historical tech-stack data. |
| Company careers page | https://careers.<target>.com or https://<target>.com/careers | Direct source; sometimes more detail than ATS. |
42.2 What to extract
For each job posting, harvest:
- Required technologies ("must have experience with X, Y, Z") → confirmed in-use.
- Nice-to-have technologies → likely in use but maybe in transition.
- Vendor names (Workday, Salesforce, Snowflake, Databricks, Datadog, etc.) → SaaS tenants.
- Internal tool / project codenames (often slip into "you'll work on Project Aurora") → recon vocabulary.
- Team size hints ("part of a 12-person platform team") → org-structure intel.
- Office locations ("hybrid 3 days in Boston office") → physical recon.
- Cloud + on-prem ratio hints ("migrating from on-prem to AWS") → posture intel.
- Compliance frameworks mentioned (SOC2, FedRAMP, HIPAA, PCI) → defensive priorities + reporting context.
42.3 Tooling
- scrapy / BeautifulSoup — custom scrapers per ATS.
- theHarvester with appropriate sources.
- JobScraper scripts on GitHub.
- Manual — for small targets, manual review of 20–30 postings is fast and high-fidelity.
42.4 Output
Per discovered tech mention:
Tech_inferred:
product: "Snowflake"
category: "data warehouse"
source: "linkedin job posting #<id>"
source_url: https://www.linkedin.com/jobs/view/...
confidence: TENTATIVE (job listing implies in-use; not yet confirmed by direct probe)
posting_date: 2026-03-15
required_or_nice: "required"Aggregate to a target tech-stack profile that informs:
- Which secret patterns to look for (Snowflake-specific keys, Databricks tokens).
- Which SaaS tenants to fingerprint (Snowflake account URL pattern).
- Which vendor-product fingerprints to probe (Snowflake DSN paths in JS).
---
43. Slack / Discord / Telegram Workspace Discovery
43.1 Slack
- Public workspace search (limited; Slack used to have one but deprecated):
- Slofile (third-party):
https://slofile.com/— community Slack workspace directory. - Slacklist / Slack Communities — community-curated lists.
- Invite-link enumeration — Slack invite URLs follow
https://join.slack.com/t/<workspace-slug>/shared_invite/<token>. Common discovery: - Google:
site:join.slack.com "{target}"orinurl:slack.com inurl:shared_invite "{target}". - GitHub:
"join.slack.com/t/<target-stem>"filename:README. - Twitter/X / Reddit: search for shared invite links.
- Confirm workspace exists: visit
https://<slug>.slack.com/api/auth.test(returns workspace metadata when called by an authenticated session, but the page itself returns differently per workspace existence). - High-value finding: any open invite link that bypasses the target's normal member-approval flow → operator can join workspace without authorization → MEDIUM/HIGH finding (depending on what's in the workspace).
43.2 Discord
- Discord server discovery is harder (no central public directory).
- DiscordServers.com — third-party directory.
- Discord.me / Top.gg — community directories.
- Google:
site:discord.gg "{target}"orsite:discord.com "{target}". - Confirm server: invite URLs
https://discord.gg/<token>resolve to a JSON viahttps://discord.com/api/v9/invites/<token>?with_counts=true. Returns server name, ID, member count, channel info. - Bot enumeration: if you find a bot token (catalog §17 row 47), use
getMeto get bot identity + servers it's joined to (read-only check).
43.3 Telegram
Already covered in §38. Quick reference:
- TGStat — channel analytics + search.
- Telemetr — channel growth + overlaps.
- Combot — group analytics.
- View public channels:
https://t.me/s/<channel>. - Invite link enum: search Google
site:t.me "{target}".
43.4 Microsoft Teams (federation)
- See companion methodology skill §11.10.
- Federation status check via Microsoft Graph (auth-required).
- Open-federation default = anyone can chat target's users with
<email>@<target>lookup.
43.5 Mattermost / Rocket.Chat / self-hosted
https://mattermost.<target>.comorchat.<target>patterns.- Open registration check: probe
/signuppage; if accessible without invite → anyone joins. - Check version disclosure (
/api/v4/system/ping) for known CVEs.
---
44. Package Registry Leak Hunting
Public package registries (npm, PyPI, RubyGems, Docker Hub, etc.) often contain inadvertent secrets in published packages.
44.1 npm
- Search packages by org / scope:
npm search "<target-keyword>"
npm view @<scope>/<package-name>- List org's packages:
https://www.npmjs.com/org/<org>orhttps://registry.npmjs.org/-/org/<org>/package. - Per-package historical versions:
https://registry.npmjs.org/<package>— JSON with all versions. - Tarball download for scan:
npm pack <package>@<version>
tar -xzf package-version.tgz
# Run secret catalog (§17) on extracted files- Common leaks:
.envfiles included in published tarball,package.jsonscriptsreferences to internal CI secrets, hardcoded API keys indist/builds.
44.2 PyPI
- Search packages:
https://pypi.org/search/?q=<target>. - Per-package metadata + history:
https://pypi.org/pypi/<package>/json. - Download wheel/sdist for scan:
pip download <package>==<version> --no-deps -d /tmp/pkg
unzip /tmp/pkg/*.whl -d /tmp/pkg/extracted
# Run secret catalog- Common leaks:
setup.pywith hardcoded URLs, embedded test fixtures with real credentials, accidentally-included.pypircfiles.
44.3 RubyGems
- Search:
https://rubygems.org/search?query=<target>. - Per-gem metadata:
https://rubygems.org/api/v1/gems/<gem-name>.json. - Download:
gem fetch <gem-name>
gem unpack <gem-name>-<version>.gem44.4 Cargo (Rust crates)
- Search:
https://crates.io/search?q=<target>. - Per-crate metadata:
https://crates.io/api/v1/crates/<crate-name>.
44.5 Packagist (PHP / Composer)
- Search:
https://packagist.org/search/?q=<target>. - Per-package metadata:
https://packagist.org/packages/<vendor>/<package>.json.
44.6 NuGet (.NET)
- Search:
https://www.nuget.org/packages?q=<target>.
44.7 Maven Central (Java)
- Search:
https://search.maven.org/?q=<target>.
44.8 Docker Hub / Quay / GHCR / ECR Public
Already covered in §16.18; worth noting for completeness as part of registry-sweep workflow.
44.9 Workflow
For each registry, for each candidate package owned-by-target: 1. List all historical versions (often <package>@1.0.0 was clean but <package>@0.9.0 had a leaked key). 2. Download each version's archive. 3. Extract; run secret catalog (§17) over all files. 4. Note .env, package.json/setup.py/Cargo.toml for hardcoded values. 5. For Docker images: scan each layer (use dive or skopeo + docker save + extract layers).
44.10 Typosquat surveillance
For every published package the target owns, generate typosquat candidates (similar names, common substitutions) and check whether they're already taken by attackers (supply-chain attack surface).
# Example: target package "acme-utils"
# Candidates: acme-util, acmeutils, acme_utils, acme.utils, ac-me-utils, etc.
for candidate in acme-util acmeutils acme_utils acme.utils ac-me-utils; do
npm view $candidate 2>&1 | head -3
doneIf a candidate is registered to a non-target party → MEDIUM finding (typosquat, possible supply-chain attack vector).
---
45. Sat Imagery for Physical Recon
For engagements that include a physical-touch component (badge access, tailgating, dumpster diving, on-site network), public imagery helps scout the target.
45.1 Sat imagery sources
| Source | URL | Notes |
|---|---|---|
| Google Earth Pro | desktop app | Historical timeline; high resolution (sub-meter) for major cities. |
| Google Maps | maps.google.com | Current; satellite layer; street view inside building lobbies sometimes. |
| Bing Maps Bird's Eye | bing.com/maps | Oblique/45-degree imagery for many regions; sometimes shows building facades better than top-down. |
| Apple Maps Look Around | (iOS / Mac) | Street-level; 3D in major cities. |
| Yandex Maps Panorama | yandex.com/maps | Russia + global; sometimes higher-resolution street-level than Google. |
| NearMap (paid) | nearmap.com | Highest-resolution commercial; updated frequently in served regions (US/AU/NZ/CA mostly). |
| Maxar / Planet Labs (paid) | maxar.com / planet.com | Tasking + recent imagery. |
| Sentinel Hub EO Browser | apps.sentinel-hub.com | Free Sentinel-2 (10m); good for change detection. |
| NASA Worldview | worldview.earthdata.nasa.gov | Free; multiple sensors. |
| Wayback ArcGIS | livingatlas.arcgis.com/wayback/ | Historical satellite. |
| OpenStreetMap | openstreetmap.org | Crowd-sourced map data with building outlines. |
45.2 What to extract for physical recon
- Building entrance count + locations — main entrance, employee entrances, loading docks, fire exits.
- Parking lot ingress / egress — single guarded entry vs open lot.
- Fence lines + camera locations — physical perimeter.
- HVAC / utility access — roof access, service entries.
- Adjacent occupants — neighboring tenants in same building / business park.
- Vehicle types in lot — proxy for executive presence + employee count.
- Smoking area locations — common social-engineering staging area.
45.3 OSINT-derived physical intel beyond satellites
- LinkedIn employee photos — badge templates often visible in profile photos taken at the office.
- Glassdoor "office tour" photos — employees post interior photos.
- Indeed / Glassdoor reviews — sometimes describe security culture ("loose badge enforcement", "tailgating common").
- Instagram geotagged photos — at the office address; reveals interior layout, badge designs, kitchen / common-area locations.
- Public press releases — often contain "ribbon cutting" photos of new offices showing layout + executive faces.
- Conference talks by IT/security staff — sometimes describe physical security setup.
- Meetup / workshop event listings — at the target's office; may include photos.
45.4 Vehicle / fleet intel
- License plates in LinkedIn/Instagram backgrounds — sometimes correlates to specific exec.
- Company-branded vehicles in sat imagery — fleet count + location.
- Helicopter pad / executive parking — clue to senior-leadership routine.
45.5 Discipline
- Document that imagery + photos are public-source.
- Don't trespass for "verification" — physical recon during OSINT phase = look only.
- Note imagery date — buildings change.
---
Public SaaS Collaboration Surfaces
Reference content for the offensive-osint skill. Originally §24 + §25 + §26 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).24. Postman Public Workspace Universal Search
Postman's public-search endpoint is unauthenticated and indexes every workspace marked public.
Verified endpoint shape (mid-2025 onward):
curl -sk -m 15 \
"https://www.postman.com/_api/ws/proxy" \
-H 'Content-Type: application/json' \
-H 'X-Entity-Team-Id: 0' \
-d '{
"service":"search",
"method":"POST",
"path":"/search-all",
"body":{
"queryIndices":["collaboration.workspace","runtime.collection","runtime.request"],
"queryText":"acme.com",
"size":100,
"from":0,
"clientTraceId":"",
"queryAllIndices":false,
"domain":"public"
}
}' | jq '.data[]'This proxies through Postman's web app to their internal search service. Pagination via from (0, 100, 200, ...).
If the proxy shape changes (it has historically): inspect a real search request from the Postman web UI: 1. Open https://www.postman.com/explore in a browser. 2. Open DevTools → Network tab. 3. Search for any term. 4. Find the request to _api/... — copy as cURL — adapt.
Per-workspace walk:
For each matching workspace ID:
WS_ID="<workspace-id>"
# Workspace metadata (name, description, team, visibility)
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID" | jq .
# List collections + environments + monitors in workspace
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID/collection" | jq '.[].id'
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID/environment" | jq '.[].id'
# Per-collection: full content (requests, headers, scripts, env vars)
COL_ID="<collection-id>"
curl -sk -m 10 "https://www.postman.com/_api/collection/$COL_ID" | jq '.collection.item[]'Ownership scoring signals:
- Creator/team name mentions target domain or brand → strong.
- Workspace name/description mentions target → strong.
- Request URLs contain
*.target.com→ strongest signal (workspace is actively used against target's APIs).
Run secret catalog (§17) over every text blob extracted from the requests, env vars, pre-request scripts, and test scripts.
---
25. Stack Exchange OSINT Sweep
Stack Exchange and its sister sites collect code paste-ins from developers — many include secrets, internal hostnames, and proprietary code excerpts.
Sites to query (8 with highest signal):
stackoverflow.com
serverfault.com
dba.stackexchange.com
devops.stackexchange.com
security.stackexchange.com
superuser.com
sharepoint.stackexchange.com
salesforce.stackexchange.comAPI:
GET https://api.stackexchange.com/2.3/search/advanced
?site=<site>
&q=<target>
&filter=withbody
&pagesize=100Code block extraction regex:
<pre><code>([\s\S]*?)</code></pre>(Stack Exchange wraps code in <pre><code> HTML.)
Pipeline: 1. Search each site for the target name, brand, root domain. 2. Extract code blocks from body HTML. 3. Run secret catalog (§17) over each block. 4. Cross-reference post author email (where exposed in profile) against email_osint discoveries — confirms employee posting target's internal code. 5. Extract hostnames from code blocks → upsert as subdomain assets.
Quota: Stack Exchange API permits 30 requests/day without a key; with a free key, 10,000/day. Throttle with 2-second min interval per call.
---
26. Public SaaS Collaboration Surfaces
Many SaaS collaboration tools allow public sharing. Dork them like search engines.
Platforms with high incident rate:
trello.com
notion.so / notion.site
*.atlassian.net (Jira / Confluence)
miro.com
asana.com
clickup.com
airtable.comDork template:
site:{platform} "{target-keyword}"Run via search-engine adapter (DDG default; Bing / Brave / Yandex / SerpAPI optional). The same classification logic from §18.7 applies.
Common findings:
- Public Trello board with credentials in card titles or attached config files.
- Public Notion page with internal SOPs, API keys in code blocks, customer data.
- Public Confluence space with onboarding docs containing seed creds.
- Public Miro board with architecture diagrams revealing internal hostnames.
---
Secret-Pattern Catalog
Reference content for the offensive-osint skill. Originally §17 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).17. Secret-Pattern Catalog — 48 patterns (29 base + 19 modern)
The catalog runs against any text source: GitHub code, Postman workspaces, JS bodies, sourcesContent blobs, mobile-app strings, Wayback HTML, paste sites, Stack Exchange code blocks. Order matters: most-specific patterns first so generic catches don't pre-empt typed ones.
| # | Name | Regex | Severity | Category |
|---|---|---|---|---|
| 1 | AWS Access Key | `\b(AKIA\ | ASIA)[0-9A-Z]{16}\b` | CRITICAL |
| 2 | AWS Secret Key (typed) | (?i)aws[_\-]?secret[_\-]?access[_\-]?key['"\s:=]+([A-Za-z0-9/+=]{40}) | CRITICAL | aws |
| 3 | AWS Secret (loose) | `(?i)aws(.{0,20})?(secret\ | sk)["'=: ]+([0-9a-z/+=]{40})` | HIGH |
| 4 | GCP Service Account JSON | "type"\s*:\s*"service_account" | CRITICAL | gcp |
| 5 | Google API Key | \bAIza[0-9A-Za-z_\-]{35}\b | HIGH | gcp |
| 6 | GitHub Classic PAT | \bghp_[A-Za-z0-9]{36}\b | CRITICAL | github |
| 7 | GitHub Fine-grained PAT | \bgithub_pat_[A-Za-z0-9_]{82}\b | CRITICAL | github |
| 8 | GitHub OAuth | \bgho_[A-Za-z0-9]{36}\b | HIGH | github |
| 9 | GitHub Server-to-Server | \bgh[usr]_[A-Za-z0-9]{36,}\b | HIGH | github |
| 10 | Stripe Live Key | \bsk_live_[0-9A-Za-z]{24,}\b | CRITICAL | stripe |
| 11 | Stripe Test Key | \bsk_test_[0-9A-Za-z]{24,}\b | LOW | stripe |
| 12 | Slack Token | \bxox[abpors]-[0-9A-Za-z\-]{10,48}\b | HIGH | slack |
| 13 | Slack Webhook | https://hooks\.slack\.com/services/T[A-Z0-9]+/B[A-Z0-9]+/[A-Za-z0-9]+ | MEDIUM | slack |
| 14 | SendGrid Key | \bSG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}\b | HIGH | email_svc |
| 15 | Mailgun Key (v1) | \bkey-[0-9a-zA-Z]{32}\b | HIGH | email_svc |
| 16 | Mailgun Key (loose) | \bkey-[0-9a-f]{32}\b | HIGH | email_svc |
| 17 | Twilio API Key | \bSK[0-9a-fA-F]{32}\b | HIGH | twilio |
| 18 | Twilio Account SID | \bAC[a-f0-9]{32}\b | MEDIUM | twilio |
| 19 | Twilio Auth Token | `(?i)twilio(.{0,20})?(auth\ | token)["'=: ]+([a-f0-9]{32})` | HIGH |
| 20 | Heroku API Key | (?i)heroku(.{0,20})?api["'=: ]+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) | MEDIUM | paas |
| 21 | Firebase URL | \bhttps?://[a-z0-9\-]+\.firebaseio\.com\b | LOW | firebase |
| 22 | JWT (any) | \beyJ[A-Za-z0-9_\-]{10,}\.eyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b | MEDIUM | jwt |
| 23 | Bearer Token Assignment | (?i)authorization["'=: ]+bearer\s+[A-Za-z0-9._\-]{20,} | MEDIUM | bearer |
| 24 | Basic Auth in URL | https?://[^/\s:@]+:[^/\s:@]+@[^/\s]+ | MEDIUM | basic_auth |
| 25 | RSA Private Key | -----BEGIN RSA PRIVATE KEY----- | CRITICAL | private_key |
| 26 | EC Private Key | -----BEGIN EC PRIVATE KEY----- | CRITICAL | private_key |
| 27 | OpenSSH Private Key | -----BEGIN OPENSSH PRIVATE KEY----- | CRITICAL | private_key |
| 28 | Generic Private Key | `-----BEGIN (DSA \ | PGP \ | )PRIVATE KEY-----` |
| 29 | Generic API Key | `(?i)(?:api[_\-]?key\ | apikey\ | api_secret\ |
| 30 | Anthropic API Key | `\bsk-ant-(?:api03\ | admin01)-[A-Za-z0-9_\-]{93,}\b` | CRITICAL |
| 31 | OpenAI API Key (legacy) | \bsk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}\b | CRITICAL | ai_api |
| 32 | OpenAI Project Key | \bsk-proj-[A-Za-z0-9_\-]{40,}T3BlbkFJ[A-Za-z0-9_\-]{40,}\b | CRITICAL | ai_api |
| 33 | OpenAI User Session | \bsess-[A-Za-z0-9]{40}\b | HIGH | ai_api |
| 34 | HuggingFace Token | \bhf_[A-Za-z0-9]{30,}\b | HIGH | ai_api |
| 35 | Cloudflare API Token | \b[A-Za-z0-9_\-]{40}\b (when paired with (?i)cloudflare/X-Auth-Key context) | HIGH | infra_api |
| 36 | Cloudflare Global API Key | (?i)cf[_\-]?api[_\-]?key['"\s:=]+([a-f0-9]{37}) | CRITICAL | infra_api |
| 37 | DigitalOcean Token | \bdop_v1_[a-f0-9]{64}\b | HIGH | infra_api |
| 38 | npm Token (Modern) | \bnpm_[A-Za-z0-9]{36}\b | HIGH | package_registry |
| 39 | PyPI Token | \bpypi-AgENdGV[A-Za-z0-9_\-]+\b | HIGH | package_registry |
| 40 | Docker Hub PAT | \bdckr_pat_[A-Za-z0-9_\-]{27,}\b | HIGH | package_registry |
| 41 | Atlassian API Token | \bATATT3xFfGF0[A-Za-z0-9_\-]{180,}\b | HIGH | saas_api |
| 42 | New Relic License Key | `\b(?:NRAA\ | NRAK\ | NRBR)-[A-F0-9]{27}\b` |
| 43 | DataDog API Key (in DD_API_KEY context) | (?i)dd[_\-]?api[_\-]?key['"\s:=]+([a-f0-9]{32}) | HIGH | observability |
| 44 | Sentry DSN | https://[a-f0-9]+@o[0-9]+\.ingest\.sentry\.io/[0-9]+ | LOW | observability |
| 45 | ngrok Auth Token | \b[12][A-Za-z0-9]{26}_[A-Za-z0-9]{32,}\b (when (?i)ngrok context) | MEDIUM | tunneling |
| 46 | Linear API Key | \blin_api_[A-Za-z0-9]{40}\b | MEDIUM | saas_api |
| 47 | Discord Bot Token | \b[MN][A-Za-z\d]{23}\.[\w\-]{6}\.[\w\-]{27}\b | HIGH | bot_token |
| 48 | Telegram Bot Token | \b\d{8,10}:[A-Za-z0-9_\-]{35}\b | HIGH | bot_token |
False-positive notes:
- Patterns 22 (JWT), 23 (Bearer), 29 (Generic) trigger on test/example data frequently. Always look at context — a JWT in a
README.mdexample block ≠ a JWT in a production.envfile. - Pattern 16 (Mailgun loose) and pattern 11 (Stripe test) are noisy by design; severity is set low for that reason.
- Pattern 24 (Basic auth in URL) catches monitoring-tool URLs and CI-debug URLs as well as real creds — verify before alerting.
- For GitHub's Fine-grained PAT (pattern 7), the
82length is by GitHub's spec — be skeptical of matches significantly longer or shorter.
---
Read-Only Secret Validators
Reference content for the offensive-osint skill. Originally §23 of the monolithic SKILL.md (refactored 2026-05-02 for size/load efficiency).23. Read-Only Secret Validators
Use these to confirm a discovered credential is live. Read-only, never destructive. Tag every validation with detectability and checked_at (UTC).
23.1 Postman API Key (PMAK-*)
GET https://api.getpostman.com/me
Header: X-Api-Key: PMAK-<key>200→ live; response contains{user: {id, username, email}}.401→ dead.- Scope: full read access to the user's Postman account (collections, env vars, history).
- Detectability: low.
23.2 AWS Access Key
sts:GetCallerIdentityUse boto3:
import boto3
sts = boto3.client('sts',
aws_access_key_id='<AKIA...>',
aws_secret_access_key='<secret>',
region_name='us-east-1')
ident = sts.get_caller_identity()
# ident['Account'], ident['Arn'], ident['UserId']- Valid → returns Account ID + ARN + UserId.
- Invalid →
InvalidClientTokenIdorSignatureDoesNotMatch. - ARN scope:
:user/is IAM user (broad),:assumed-role/is temp role (narrow),:rootis account root (do NOT validate root keys you find). - Detectability: medium (CloudTrail logs
GetCallerIdentityin account<found>).
23.3 GitHub PAT
GET https://api.github.com/user
Header: Authorization: token <ghp_*>200→ live; response containslogin,id,name,email(if public).- Response header
X-OAuth-Scopeslists token scopes.reposcope = write to all accessible repos;admin:org= org admin. 401→ dead.- Detectability: low.
23.4 Slack Token
POST https://slack.com/api/auth.test
Header: Authorization: Bearer <xox*-*>200with{"ok": true}→ live; response includesteam,team_id,user,user_id.200with{"ok": false, "error": "invalid_auth"}→ dead.- Detectability: low.
23.5 Anthropic API Key
GET https://api.anthropic.com/v1/models
Headers:
x-api-key: sk-ant-api03-...
anthropic-version: 2023-06-01200→ live; response lists available models.401→ dead.403with org_disabled → key valid but org disabled.- Detectability: low; usage shows in Anthropic Console for the workspace owner.
23.6 OpenAI API Key
GET https://api.openai.com/v1/models
Header: Authorization: Bearer sk-...200→ live; lists models (may include org-specific fine-tunes).401→ dead.429→ live but quota exhausted.- Detectability: low; usage shows in OpenAI dashboard.
23.7 npm Token
GET https://registry.npmjs.org/-/whoami
Header: Authorization: Bearer npm_<token>200with{"username": "<user>"}→ live.401→ dead.- For scope check:
GET /-/npm/v1/tokensreturns the token's permissions (read/publish). - Detectability: low.
23.8 Atlassian API Token
GET https://<workspace>.atlassian.net/rest/api/3/myself
Auth: Basic <base64(email:ATATT3xFfGF0_...)>200→ live; returns account profile + email.401→ dead.- Workspace required — extract from leaked repo URL or Atlassian dork results.
- Detectability: low.
23.9 DataDog API + APP Key
GET https://api.datadoghq.com/api/v1/validate
Headers:
DD-API-KEY: <api-key>
DD-APPLICATION-KEY: <app-key>200→ both keys valid.403→ either key invalid.- Per-region URL varies:
api.datadoghq.eu,api.us3.datadoghq.com, etc. - Detectability: low; appears in DataDog audit log.
23.10 Validator output schema
{
"status": "verified_live" | "verified_dead" | "scope_restricted" |
"scope_unrestricted" | "validation_skipped_by_policy" |
"validation_unsupported" | "validation_failed_transient",
"provider": "postman" | "aws" | "github" | "slack" | "anthropic" | "openai" | "npm" | "atlassian" | "datadog",
"account_id": "<opaque>",
"scope": "<freeform>",
"metadata": {<provider-specific>},
"checked_at": "<UTC ISO8601>",
"detectability": "low" | "medium" | "high"
}23.11 Hard rules
- Read-only endpoint only.
- Never use the validated credential to create, modify, delete, or send anything.
- Tag every validation with detectability.
- Record
checked_at(UTC). - If RoE forbids validation →
validation_skipped_by_policy, stop, document. - For root AWS keys, infrastructure-write GitHub PATs, or admin Slack tokens — flag for the operator and let them decide.
23.12 Post-Discovery Enumeration Workflows
After validation confirms a key is live, you often want to enumerate what it can do. Stay read-only.
AWS access key — IAM enum:
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
# Identity (already done as part of validation)
aws sts get-caller-identity
# IAM-user details (only if ARN was :user/)
aws iam get-user
aws iam list-attached-user-policies --user-name $(aws iam get-user --query 'User.UserName' --output text)
aws iam list-user-policies --user-name $(aws iam get-user --query 'User.UserName' --output text)
aws iam list-groups-for-user --user-name $(aws iam get-user --query 'User.UserName' --output text)
# What can I actually do? (simulate-principal-policy for common dangerous actions)
aws iam simulate-principal-policy \
--policy-source-arn $(aws sts get-caller-identity --query Arn --output text) \
--action-names s3:ListAllMyBuckets ec2:DescribeInstances iam:ListUsers \
secretsmanager:ListSecrets ssm:DescribeParameters \
lambda:ListFunctions rds:DescribeDBInstances
# Read-only enumeration of common services (do not WRITE)
aws s3 ls
aws ec2 describe-instances --output table --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value]'
aws secretsmanager list-secrets --query 'SecretList[*].Name'
aws ssm describe-parameters --query 'Parameters[*].Name'
aws lambda list-functions --query 'Functions[*].FunctionName'
aws rds describe-db-instances --query 'DBInstances[*].DBInstanceIdentifier'
# CloudTrail check — is logging on?
aws cloudtrail describe-trails
# Check MFA enforcement on the user
aws iam get-account-summary | jq '.SummaryMap.AccountMFAEnabled'
aws iam list-mfa-devices --user-name <username>GitHub PAT — repo enum:
TOKEN="ghp_..."
H="Authorization: token $TOKEN"
# Scopes already captured from X-OAuth-Scopes header
curl -sk -m 10 -I -H "$H" https://api.github.com/user | grep -i 'X-OAuth-Scopes'
# All repos accessible (own + collaborator + org member)
curl -sk -m 10 -H "$H" "https://api.github.com/user/repos?affiliation=owner,collaborator,organization_member&per_page=100"
# Org memberships
curl -sk -m 10 -H "$H" "https://api.github.com/user/orgs"
# Per-org: members, repos, secrets (secrets endpoint is metadata-only — names not values)
ORG="<orgname>"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/members"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/repos?per_page=100"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/actions/secrets" # requires admin:org
# Per-repo workflow secrets (metadata)
REPO="<orgname/reponame>"
curl -sk -m 10 -H "$H" "https://api.github.com/repos/$REPO/actions/secrets"Slack token — workspace enum:
TOKEN="xoxb-..."
H="Authorization: Bearer $TOKEN"
# auth.test already validated
# Identity details
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/users.identity" | jq .
# What conversations can I see? (sweeping check; respects scope)
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/conversations.list?types=public_channel,private_channel,mpim,im&limit=200" | jq '.channels[] | {id, name, is_private}'
# Workspace info
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/team.info" | jq .
# User list (only if scope includes users:read)
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/users.list?limit=100" | jq '.members[] | {name, real_name, is_admin}'
# DO NOT: chat.postMessage, files.upload, conversations.invite, etc.JWT — full triage workflow:
JWT="eyJhbGciOiJIUzI1NiI..."
# Decode header
echo "$JWT" | cut -d. -f1 | base64 -d 2>/dev/null | jq .
# Look for: alg (none = critical, HS256/HS384/HS512 = symmetric, RS256/RS512 = asymmetric, ES256 = ECDSA)
# Look for: kid (key ID — possible JKU/X5U injection target)
# Look for: jku, x5u (JKU/X5U values — control these = sign attacker JWTs)
# Decode payload
echo "$JWT" | cut -d. -f2 | base64 -d 2>/dev/null | jq .
# Look for: exp (expired = downgraded), iat, nbf
# Look for: sub, iss, aud (identity disclosure)
# Look for: roles, scopes, permissions (privilege markers)
# Look for: sensitive claims (email, employee ID, SSN, etc.)
# Algorithm-confusion test (RS→HS)
# If alg is RS256, try crafting an HS256 token signed with the public key as secret
# Tools: jwt_tool, jwt-cracker
# Brute-force HS256 secret (if HS256 + short-secret suspicion)
hashcat -m 16500 "$JWT" /path/to/wordlist.txt
# Or: john --format=HMAC-SHA256 jwt-hash.txt --wordlist=...
# Check `none` algorithm bypass
# Re-encode header with alg=none and empty signature; some libraries accept
NEW_JWT=$(echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0 | tr -d '=' | tr '/+' '_-')
NEW_JWT="${NEW_JWT}.$(echo "$JWT" | cut -d. -f2)."
# Test against APIPostman PMAK — workspace enum:
PMAK="PMAK-..."
H="X-Api-Key: $PMAK"
# /me already done (validation)
curl -sk -m 10 -H "$H" https://api.getpostman.com/me | jq '.user'
# Workspaces
curl -sk -m 10 -H "$H" https://api.getpostman.com/workspaces | jq '.workspaces[] | {id, name, type}'
# Per-workspace collections
WS="<workspace-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/workspaces/$WS" | jq '.workspace.collections[]'
curl -sk -m 10 -H "$H" "https://api.getpostman.com/workspaces/$WS" | jq '.workspace.environments[]'
# Per-collection requests (where the secrets often live)
COL="<collection-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/collections/$COL" | jq '.collection.item[]'
# Run secret catalog over the JSON
# Environments (env vars often contain creds)
ENV="<environment-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/environments/$ENV" | jq '.environment.values[] | {key, value}'Anthropic API key — usage enum:
KEY="sk-ant-api03-..."
H="x-api-key: $KEY"
A="anthropic-version: 2023-06-01"
# Models accessible
curl -sk -m 10 -H "$H" -H "$A" https://api.anthropic.com/v1/models | jq '.data[] | .id'
# Usage / quota (admin-scoped tokens only):
curl -sk -m 10 -H "$H" -H "$A" https://api.anthropic.com/v1/organizations/usage_report | jq .
# DO NOT: send actual completion requests against organization budgetOpenAI API key — usage enum:
KEY="sk-..."
H="Authorization: Bearer $KEY"
# Models
curl -sk -m 10 -H "$H" https://api.openai.com/v1/models | jq '.data | length'
# Org info (if key has org scope)
curl -sk -m 10 -H "$H" https://api.openai.com/v1/organizations | jq .
# Files / fine-tunes (sometimes contain training data with PII)
curl -sk -m 10 -H "$H" https://api.openai.com/v1/files | jq .
curl -sk -m 10 -H "$H" https://api.openai.com/v1/fine_tuning/jobs | jq .Generic key — provenance enum: 1. Find the consuming domain (where in JS bundle did the key appear? what URL is the bundle served from?). 2. Check the API docs of the inferred service. 3. If the key matches a known regex, lookup vendor-specific scope check. 4. If unknown service, search GitHub for the key prefix (gh search code "<prefix>" --type=code). 5. Identify scope before validating; some keys are write-broad on first use.
---