TL;DR
- 目的:Perform recon scope triage assessment during authorized security testing. Use this skill when indicators of the vulnerability class are present in the
- 适用:通用
- 输入:目标信息
- 输出:执行结果 + 证据
- 红线:仅限授权范围内;扫描限速 -c 10 -rl 10;所有动作记 oplog
- 关联:上游:003-src-session-start → 下游:003-src-session-start(按需调用)
Web "Critical" triage — the soft-404 control
Automated .env / .git / actuator / admin-panel "Criticals" are overwhelmingly soft-404s: SPA/framework catch-alls returning HTTP 200 (or 403) for every path. Verify EACH before believing it:
# the "finding"
curl -s -o /tmp/a -w "%{http_code} %{size_download}\n" https://host.target.com/.env
# a junk control on the same host
curl -s -o /tmp/b -w "%{http_code} %{size_download}\n" https://host.target.com/zzz-nonsense-$RANDOM
# identical byte length / body → FALSE POSITIVE (catch-all), discard
cmp -s /tmp/a /tmp/b && echo "SOFT-404 false positive" || echo "differs — investigate"
Real exposures have a content-type + signature that differs from the catch-all (.git/config starts [core]; .env has KEY=value; phpinfo has the XHTML-transitional doctype + PHP Version). A physical .php/phpinfo.php that returns a bigger/different body than the junk control is the real-vs-soft-404 tell.
The triage workflow
- Confirm the canonical owned-domain set first (the SOW/program domain + its verified subdomains + the verified Entra/Okta/Google tenant brand name). This is your ownership anchor.
- For each asset class, apply the verify-by column above. No signal → quarantine, don't test.
- Re-baseline the severity counts against only-owned assets. Report the delta — "N Criticals → M after ownership + soft-404 triage" is itself a finding about the ASM program.
- Quarantine collisions explicitly (a
loot/quarantined_<source>.txt) so it's auditable that you saw them and chose not to target them.
- Surface the meta-finding: if the supplied ASM/recon feed is mostly false-positive, that misallocates the owner's remediation budget and buries real risk — write it up (Medium/Strategic).
Anti-patterns
- Trusting the tool's "owned" label. Tools keyword-match; they don't prove ownership. Verify.
- Targeting a same-named third party because it was "in the report." Out of scope + real harm. A combo line
user@<word>company.com is a different company's employee.
- Reporting soft-404s as exposures. Always run the junk-path control.
- Counting typosquats / missing-headers / brand-collision repos as offensive findings. They're defensive/hygiene/noise — they pad the report and erode credibility.
- Skipping triage "to save time." Untriaged, you spend the whole engagement on other people's assets and find nothing real.
Why this matters (calibration)
For a target whose brand is a common word, expect the bulk of automated "owned" assets to be collisions:
- Repos that are unrelated open-source projects (ad-block lists, scrapers, student projects, a different company's SDK) merely containing the word.
- Mobile apps published by entirely different companies that share the name — banks, credit unions, dating apps, dispensaries, home-care services are all real-world collision categories. (Good ASM tooling will tell you it accepted zero as owned.)
- Cloud buckets in the global namespace holding some unrelated org's content (other-language documents, demo/sample data, another industry's files).
- Breach combos full of emails from sibling-named-but-different companies (
<word>group.com, <region><word>.com).
On a real engagement against a dictionary-word brand, after clearing this noise the only genuinely-owned high-severity finding was discoverable solely by manual tradecraft (a JS-bundle → API discovery, see hunt-spa-api) — it was nowhere in the hundreds of scanner "Criticals." Triage-first is what made the engagement productive instead of a goose chase.
Workflow
- Seed input — Root domain, company name, or ASN as starting point
- Passive collection — crt.sh, shodan, censys, theHarvester (no target touch)
- Active enumeration — subfinder with public resolvers (
-rate-limit 20)
- Validation — Resolve and probe live hosts (httpx)
- Fingerprint — Identify technology stack (nmap, wappalyzer)
- Reporting — Aggregate findings into recon report
Related Skills & Chains
triage-validation — asset-ownership triage (this skill) precedes finding-validity triage (the 7-Question Gate). Ownership first, then validity.
redteam-mindset — "aggressive default" means probe every owned live surface; this skill defines which surfaces are owned so persistence isn't wasted on collisions.
hunt-spa-api — once an API host passes ownership triage, this is how you test it.
offensive-osint / osint-methodology — feed ownership anchors (verified domains, tenant brand, dev accounts) from OSINT into this triage.
When to Use
- Target presents indicators of the vulnerability class this skill covers
- Fingerprint or recon indicates the relevant technology stack is in use
- Authorized testing scope covers the target endpoint or component
- Findings need to be validated through this skill's methodology
When NOT to Use
- Target is clearly outside this skill's scope (refer to related skills)
- No authorization for testing
- Need a different category of testing (use related skills)
1---2name: scope-triage3description: 授权范围快速分诊:资产清点优先级排序、入口面识别、决定先走哪条攻击链。触发词:分诊、范围梳理、资产优先级。会话启动后第一步执行。4license: MIT5---67## TL;DR89- **目的**:Perform recon scope triage assessment during authorized security testing. Use this skill when indicators of the vulnerability class are present in the10- **适用**:通用11- **输入**:目标信息12- **输出**:执行结果 + 证据13- **红线**:仅限授权范围内;扫描限速 -c 10 -rl 10;所有动作记 oplog14- **关联**:上游:003-src-session-start → 下游:003-src-session-start(按需调用)151617## Web "Critical" triage — the soft-404 control1819Automated `.env` / `.git` / `actuator` / admin-panel "Criticals" are overwhelmingly **soft-404s**: SPA/framework catch-alls returning HTTP 200 (or 403) for *every* path. Verify EACH before believing it:20```bash21# the "finding"22curl -s -o /tmp/a -w "%{http_code} %{size_download}\n" https://host.target.com/.env23# a junk control on the same host24curl -s -o /tmp/b -w "%{http_code} %{size_download}\n" https://host.target.com/zzz-nonsense-$RANDOM25# identical byte length / body → FALSE POSITIVE (catch-all), discard26cmp -s /tmp/a /tmp/b && echo "SOFT-404 false positive" || echo "differs — investigate"27```28Real exposures have a content-type + signature that differs from the catch-all (`.git/config` starts `[core]`; `.env` has `KEY=value`; phpinfo has the XHTML-transitional doctype + `PHP Version`). A physical `.php`/`phpinfo.php` that returns a *bigger/different* body than the junk control is the real-vs-soft-404 tell.2930---3132## The triage workflow33341. **Confirm the canonical owned-domain set first** (the SOW/program domain + its verified subdomains + the verified Entra/Okta/Google tenant brand name). This is your ownership anchor.352. **For each asset class, apply the verify-by column above.** No signal → quarantine, don't test.363. **Re-baseline the severity counts** against only-owned assets. Report the *delta* — "N Criticals → M after ownership + soft-404 triage" is itself a finding about the ASM program.374. **Quarantine collisions explicitly** (a `loot/quarantined_<source>.txt`) so it's auditable that you saw them and chose not to target them.385. **Surface the meta-finding:** if the supplied ASM/recon feed is mostly false-positive, that misallocates the owner's remediation budget and buries real risk — write it up (Medium/Strategic).3940---4142## Anti-patterns4344- **Trusting the tool's "owned" label.** Tools keyword-match; they don't prove ownership. Verify.45- **Targeting a same-named third party** because it was "in the report." Out of scope + real harm. A combo line `user@<word>company.com` is a different company's employee.46- **Reporting soft-404s as exposures.** Always run the junk-path control.47- **Counting typosquats / missing-headers / brand-collision repos as offensive findings.** They're defensive/hygiene/noise — they pad the report and erode credibility.48- **Skipping triage "to save time."** Untriaged, you spend the whole engagement on other people's assets and find nothing real.4950---5152## Why this matters (calibration)5354For a target whose brand is a common word, expect the bulk of automated "owned" assets to be collisions:55- **Repos** that are unrelated open-source projects (ad-block lists, scrapers, student projects, a different company's SDK) merely containing the word.56- **Mobile apps** published by entirely different companies that share the name — banks, credit unions, dating apps, dispensaries, home-care services are all real-world collision categories. (Good ASM tooling will tell you it accepted *zero* as owned.)57- **Cloud buckets** in the global namespace holding some unrelated org's content (other-language documents, demo/sample data, another industry's files).58- **Breach combos** full of emails from sibling-named-but-different companies (`<word>group.com`, `<region><word>.com`).5960On a real engagement against a dictionary-word brand, after clearing this noise the only genuinely-owned high-severity finding was discoverable solely by manual tradecraft (a JS-bundle → API discovery, see `hunt-spa-api`) — it was nowhere in the hundreds of scanner "Criticals." Triage-first is what made the engagement productive instead of a goose chase.6162---6364## Workflow65661. **Seed input** — Root domain, company name, or ASN as starting point672. **Passive collection** — crt.sh, shodan, censys, theHarvester (no target touch)683. **Active enumeration** — subfinder with public resolvers (`-rate-limit 20`)694. **Validation** — Resolve and probe live hosts (httpx)705. **Fingerprint** — Identify technology stack (nmap, wappalyzer)716. **Reporting** — Aggregate findings into recon report72## Related Skills & Chains7374- **`triage-validation`** — asset-ownership triage (this skill) precedes finding-validity triage (the 7-Question Gate). Ownership first, then validity.75- **`redteam-mindset`** — "aggressive default" means probe every *owned* live surface; this skill defines which surfaces are owned so persistence isn't wasted on collisions.76- **`hunt-spa-api`** — once an API host passes ownership triage, this is how you test it.77- **`offensive-osint` / `osint-methodology`** — feed ownership anchors (verified domains, tenant brand, dev accounts) from OSINT into this triage.787980## When to Use8182- Target presents indicators of the vulnerability class this skill covers83- Fingerprint or recon indicates the relevant technology stack is in use84- Authorized testing scope covers the target endpoint or component85- Findings need to be validated through this skill's methodology8687## When NOT to Use8889- Target is clearly outside this skill's scope (refer to related skills)90- No authorization for testing91- Need a different category of testing (use related skills)