关于 offensive-osint
面向授权攻击性 OSINT 侦察的技术参考技能,供安全人员查找具体工具、信息源、模式和查询流程,而非提供通用方法论。
主要功能
- 01精选 OSINT 工具参考
- 02用户名与邮件调查
- 03邮件模式及采集指引
- 04公共记录与公司信息源
- 05泄露数据参考
适用场景
- 01为授权侦察任务选择信息源
- 02构建邮件采集工作流
- 03通过公共记录调查组织
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ elementalsouls/ claude-osint --skill offensive-osint安装后在 Claude Code 中输入/offensive-osint确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdscripts/h1_reference.pysecret_scan.py详细介绍
Offensive OSINT — 外部红队工具库
配套技能:
osint-methodology(“如何思考”技能)。此技能说明“该用什么”。请结合使用。
0. 何时使用 / 何时不要使用
在以下情况下使用此技能:
- 需要具体的探测路径、字典、正则表达式、有效载荷、评分规则或工具 URL。
- 正在执行侦察,需要查阅实际技术资料(而非方法论)。
- 正在构建侦察自动化工具,需要特定列表作为种子数据。
在以下情况下不要使用此技能:
- 用户要求主动利用、利用后操作,或任何超出侦察范围的内容。
- 用户要求防御性检测 / 蓝队检测。
- 尚未确认目标已获授权——请参阅 §1。
1. 授权与法律立场
适用于操作人员拥有或已获得书面授权进行评估的资产。针对未经核实的第三方目标采取行动前,先进行宽松的范围检查——完整的处理立场请参阅方法论技能 §1。
2. 置信度等级
- TENTATIVE — 基于间接证据得出的合理推断(仅凭摘要匹配的 dork、单一来源资产、推断出的电子邮件模式)。
- FIRM — 直接观察到(子域名可解析、经 HEAD 请求确认存储桶存在、返回了横幅)。
- CONFIRMED — 经独立佐证验证或直接验证(实时 PMAK 验证、多个来源结论一致、可列出对象且能检索对象的存储桶)。
3. 输出格式约定
发现项应包含:id、module、asset_key、category、severity(info/low/medium/high/critical)、confidence、title、description、evidence(url + UTC 时间戳 + sha256 + 原始数据 ≤ 2 KiB)、references、remediation。所有时间戳均使用 UTC。
4. 来源规范与引用
每项资料均记录 URL + UTC 时间戳 + SHA-256 + 工具版本 + run_id。PNG 截图、JSONL 运行日志、原始 HTTP 抓取内容的正文上限为 2 KiB。
5. 不要
- 不要将凭据 / PII / 会话令牌粘贴到云端大模型中。
- 不要在 DEEP/
--aggressive之外运行破坏性探测。 - 不要将已验证的凭据用于只读存活性检查以外的任何用途。
- 不要仅依靠单一来源进行归属判断。
- 不要假设供应商标签就是真实依据。
6. 通用 OSINT(精选工具参考)
- OSINT 书签 — 全面的书签合集。
- OSINT 框架 — 工具 / 资源目录。
- IntelTechniques 工具 — 调查工具套件。
- Bellingcat 工具包 — 调查新闻工具。
- CyberSudo OSINT 工具包 — OSINT 网站列表。
- Google Dorks — 高效使用 Google 搜索。
- Distributed Denial of Secrets — 泄露数据集。
- 国家特定资源 — 针对特定国家的 OSINT 资源。
7. 搜索引擎
| 工具 | 说明 |
|---|---|
| Carrot2 | 按主题对结果进行聚类 |
| etools | 元搜索 |
| Kagi | 注重隐私,不进行个性化 |
| Brave Search | 独立索引;Goggles 可自定义排名 |
| PDF Search | PDF + 目录 |
| Google Fact Check Explorer | 跨站点事实核查 |
8. 用户名与电子邮件调查
| 工具 | 用途 |
|---|---|
| Sherlock | 跨社交网络搜索用户名 |
| Maigret | 根据用户名收集个人资料 |
| What's My Name | 搜索用户名 |
| Holehe | 检查电子邮件注册情况 |
| Epieos | 电子邮件关联线索与元数据 |
| OSINT Industries | 查询电子邮件、用户名和电话号码 |
| Hunter.io | 域名 → 电子邮件 |
| EmailRep | 电子邮件信誉 |
| Emailable | 电子邮件验证 |
| Mugetsu | X/Twitter 用户名历史记录 |
| RocketReach / Apollo | 电子邮件信息补全 + 格式推测 |
| PhoneInfoga | 电话号码情报 |
浏览器扩展:GetProspect、SignalHire。
9. 人员搜索
- TruePeopleSearch — 免费的美国人员搜索。
- WhitePages、Spokeo、Webmii、Pipl(付费)。
- Clearbit — 补全公司和个人数据。
- FaceCheck / FaceSeek — 反向人脸搜索。
10. 电话号码 OSINT
- TrueCaller — 来电显示 + 垃圾电话拦截。
- ThatsThem — 反向电话号码搜索。
- Infobel — 美国以外的电话号码搜索。
- FreeCarrierLookup — 运营商/类型(美国)。
- NumlookupAPI [Freemium] — 以编程方式查询运营商。
- CallerIDTest、Advanced Background Checks。
11. 电子邮件格式推断(暂定候选)
给定 (first_name, last_name, domain),生成以下 8 个候选地址,用于泄露数据预匹配、钓鱼列表整理和后续信息补全。在得到佐证前,置信度标记为 TENTATIVE。
{first}.{last}@{domain} # [email protected]
{first}{last}@{domain} # [email protected]
{first}@{domain} # [email protected]
{first[0]}{last}@{domain} # [email protected]
{first}.{last[0]}@{domain} # [email protected]
{last}@{domain} # [email protected]
{first}_{last}@{domain} # [email protected]
{first}-{last}@{domain} # [email protected]
查询前先转换为小写。作为 ASCII 回退处理时,去除变音符号。如果该组织采用已知格式(例如,Hunter.io 显示 {first}.{last} 是最常见格式),则优先使用该格式并标记为 FIRM。
12. 电子邮件采集来源组合
六个并行来源,最后去重:
- IntelX phonebook API — 两步搜索 + 轮询。单一来源中,泄露事件时期的地址数量最多。
- Hunter.io — 域名搜索端点。每月约 25 次免费查询。返回已验证的电子邮件和角色信息。
- crt.sh — 提取 X.509 SAN 扩展。许多证书包含管理员/联系人的电子邮件。
- DuckDuckGo SERP 抓取 — 抓取
"@{target-domain}"搜索结果的 HTML。 - Bing SERP 抓取 — 使用相同查询,补充索引结果。
- Wayback CDX — 目标网站首页、联系页面和关于页面的历史快照,通常包含已从网站现行版本中移除的电子邮件。
电子邮件正则表达式:
\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b
噪声过滤器(拒绝仅含数字的本地部分):
^[0-9]+$
(丢弃由随机令牌生成的 [email protected] 等无效地址。)
13. 社交媒体
| 平台 | 工具 |
|---|---|
| Picuki — 无需账号即可查看个人资料 | |
| X/Twitter | snscrape — 首选命令行抓取工具;Twint 作为备用 |
| Graph Search,sowsearch.info,lookup-id.com,whopostedwhat.com | |
| Facebook(研究) | Meta Content Library — CrowdTangle 的后继产品(仅限研究人员访问) |
| YouTube/Twitch | Social Blade — 分析 |
| TikTok | Tokboard — 趋势和个人资料分析 |
| Reveddit — 已删除的内容;RedTrack.social — 用户历史记录 | |
| Bluesky | Firesky — 实时数据流;SkyView — 关注者关系图 |
| Mastodon | FediSearch — 跨实例搜索;Fedifinder — 查找 Mastodon 上的 Twitter 用户 |
| 人脸 | Search4Faces |
14. 公共记录与公司信息
- OpenCorporates — 全球最大的开放公司数据库。
- SEC EDGAR — 美国公司申报文件。
- OpenOwnership Register — 受益所有权信息。
- MuckRock — FOIA 存储库和申请跟踪。
- EU Tenders (TED) — 欧盟采购公告。
- World Bank Projects — 项目和采购记录。
- UK Companies House — 英国公司、管理人员和申报文件。
14.1 俄罗斯注册信息库
Rusprofile、Kontur.Focus(免费增值模式)、zakupki.gov.ru(采购),EGRUL/EGRIP(官方,需通过验证码验证)。
14.2 中国注册信息库 + USCC + ICP
- GSXT — gsxt.gov.cn 国家企业信用信息公示系统;与 Tianyancha / Qichacha 交叉核验。
- USCC(统一社会信用代码) — 分配给所有中国法人实体的 18 位实体 ID。格式:
<region:6><authority:2><type:1><serial:9>。可用于将 GSXT 记录与 ICP 备案关联。 - ICP 备案 — beian.miit.gov.cn — 所有在中国大陆提供流量服务的域名都必须进行 ICP 备案;备案信息将域名关联到 USCC,而 USCC 又关联到 GSXT 中的法人实体。
- 工作流:
target.cn域名 → ICP 查询 → USCC → GSXT → 实体名称 + 管理人员 + 关联注册实体。
14.3 制裁与合规
- OFAC SDN List、EU Sanctions Map。
- OpenSanctions — 汇总数据。
- OCCRP Aleph — 调查文件、泄露数据、公司记录。
15. 泄露与数据泄漏
- Have I Been Pwned — 泄露查询;Pwned Passwords API(k-匿名性)。
- Dehashed — 凭证搜索(付费)。
- IntelX — 数据情报。
- LeakCheck、Snusbase、BreachDirectory、Scattered Secrets、Phonebook、LeakPeek。
- Cavalier (Hudson Rock) — 信息窃取程序日志查询;免费;在企业 SSO 中查找凭证遭入侵的员工时,单一数据源的 ROI 最高。
15.0.1 HudsonRock Cavalier — 直接 API 配方
Web 界面封装了一个公开、无需身份验证的 JSON API。直接调用:
# 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/[email protected]" | 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 15
顶层 JSON 字段:
total— 涉及此域名的窃密日志总条目数。totalStealers— 全局窃密日志语料库大小(仅作背景参考)。employees— 找到的<*>@<domain>账户数量。users— 域名出现在访问过的 URL 中的账户数量(客户/供应商)。third_parties— 涉及组织关联域名的账户数量。data.employees_urls[]—{occurrence, type, url}— 员工凭据被盗时登录的内部应用。此处的子域名命中是侦察黄金线索。data.clients_urls[]— 结构相同;面向用户的应用(常能揭示未公开记录的公共门户)。data.stealer_families[]—{_key, _value}→ 窃密程序类型(RedLine / Lumma / StealC / Vidar / Raccoon)。data.dates_compromised[]—{_key, _value}→ 时间分布。
免费套餐注意事项(务必了解):
data.*_urls[]中前几个之后的子域名主机名会以星号脱敏(*****.target.com)。如需未脱敏信息,请升级至付费 Cavalier 套餐或使用其他来源。- 免费端点只返回计数和示例 URL。免费响应中绝不会包含明文密码和电子邮件地址。
- 速率限制约为每个 IP 每秒 1 次请求;突发请求会返回 429。两次调用之间应等待 1 秒。
- 如需未脱敏凭据和批量枚举,请使用付费 Cavalier 门户。
严重性映射(参见 §15.1 和 §15.2): employees ≥ 10 → CRITICAL,无论遭入侵的服务是否仍在线(旧版 Lotus Domino/本地邮件系统已停用并迁移至云端 SSO → 员工几乎总会重用密码 → SSO_EXPOSURE 升级为 CRITICAL)。
15.1 域名级泄露严重性映射
按域名查询泄露语料库时,按以下方式映射结果严重性:
| 统计数据 | 严重性 |
|---|---|
| ≥ 10 名员工凭据遭入侵 | CRITICAL |
| 1–9 名员工凭据遭入侵 | HIGH |
| ≥ 1 名终端用户(非员工)凭据遭入侵 | MEDIUM |
| 在泄露数据中发现域名,但没有具名账户 | INFO |
**员工与终端用户的区别:**员工账户是 <anything>@<target-domain>(泄露事件受害者是目标组织自己的员工)。终端用户账户属于重用了密码的目标组织客户——这有助于了解凭据填充风险,但不会直接危及目标组织的身份系统。
15.2 SSO_EXPOSURE 发现项
当发现的 SSO 租户(Entra GUID / Okta slug / Google Workspace 域名)与泄露语料库中的域名相匹配时,生成 SSO_EXPOSURE 发现项,严重性为 CRITICAL。证据:租户 ID + 产品 + 员工数量 + 各账户的来源归属。
旧版邮件系统已停用模式(高价值变体):
如果 mail.<domain> / webmail.<domain> 今天返回 NXDOMAIN,但 HudsonRock/HIBP 语料库仍记录了针对该域名的历史员工凭据,并且 autodiscover.<domain> 解析到 Microsoft IP(M365),或 MX 记录为 aspmx.l.google.com(Workspace),则说明组织已从本地系统迁移至云端——被盗密码几乎肯定因密码重用而在迁移后仍可用。即使旧主机已停用,也应升级为 CRITICAL SSO_EXPOSURE。
具体触发条件(以下三项必须同时满足):
Resolve-DnsName mail.<domain> -Type A→ NXDOMAIN(旧系统已下线)- HudsonRock 语料库中有针对旧主机的员工 URL(例如,Lotus Domino 的
mail.<domain>/names.nsf、Exchange 的mail.<domain>/owa/、iNotes 的mail.<domain>/iwaredir.nsf、Zimbra 的mail.<domain>/zimbra/) - 当前 MX 指向 M365 / Google Workspace / Zoho 云服务(DNS 确认已迁移)
证据包:租户 GUID + 泄露计数 + 语料库中至少 3 个旧版 URL + Microsoft IP 的 autodiscover 记录 + 当前 MX。建议强制轮换密码 + 审计 MFA + 审查 Conditional Access。
16. 预构建字典表与探测路径
可直接复制粘贴的工具集,相关条目已标注严重性。
16.1 Swagger / OpenAPI 发现 — 28 个路径
对每个存活的 Web 应用探测每个路径。使用 GET(如果受到速率限制,则使用 HEAD)。
swagger.json
swagger.yaml
swagger/v1/swagger.json
swagger/v2/swagger.json
swagger-ui.html
swagger-ui/
swagger-resources
api-docs
api-docs.json
api/swagger
api/swagger.json
api/swagger-ui.html
api/v1/swagger.json
api/v2/swagger.json
api/v3/api-docs
v2/api-docs
v3/api-docs
openapi.json
openapi.yaml
openapi/v1
openapi/v3
docs
redoc
rapidoc
api/docs
api/documentation
.well-known/openapi
严重性:
- 无需身份验证即可访问 Swagger/OpenAPI 规范 → 高
LEAKY_API_SPEC(泄露完整端点列表;通常会暴露未公开的内部 API)。 - 需要身份验证,但任何已验证用户均可访问 → 中(仍会泄露内部 API 的范围)。
16.2 GraphQL 发现 — 13 个路径
graphql
graphiql
api/graphql
v1/graphql
v2/graphql
query
api/query
gql
altair
playground
subscriptions
graphql/console
api/v1/graphql
标准内省 POST 请求正文:
{
"operationName": "IntrospectionQuery",
"query": "query IntrospectionQuery { __schema { types { name kind fields { name type { name kind } } } queryType { name } mutationType { name } subscriptionType { name } } }"
}
严重性:
- 无需身份验证即可通过内省获取架构 → 高
OPEN_GRAPHQL_API。 - 可以枚举字段建议(服务器会针对拼写错误的字段名返回“你是否想找……”)→ 中(即使禁用了内省,也能重新推导出部分架构)。
/graphql接受批量查询([...]请求正文)→ 中(可绕过速率限制;可通过混合批量请求绕过身份验证)。
UI 标记(严重性较低,但仍可发现):
- HTML 响应包含
graphiql、playground、apollo studio、altair→ 暴露了 GraphiQL UI(通常是意外部署到生产环境的)。
16.3 高风险端口 — 35 项服务
对于每个开放端口,按照下表给出严重性和“攻击者为何会关注”。开放端口观测数据来源:推荐从 Shodan InternetDB(免费,每秒 1 个请求)开始。
| 端口 | 服务 | 严重性 | 重要性 |
|---|---|---|---|
| 21 | FTP | HIGH | 通常启用了匿名读取;凭据以明文传输。 |
| 22 | SSH | LOW | 横幅会泄露版本信息;可遭受暴力破解。 |
| 23 | Telnet | HIGH | 明文协议;绝不应对外开放。 |
| 25 | SMTP | LOW | 存在开放中继风险;可查看版本横幅。 |
| 53 | DNS | LOW | 递归查询可放大 DDoS 攻击;可尝试 AXFR。 |
| 80 | HTTP | INFO | 标准端口。 |
| 110 | POP3 | LOW | 未启用 STARTTLS 时以明文传输。 |
| 111 | rpcbind | MEDIUM | 可枚举 NFS 导出。 |
| 135 | MS RPC | HIGH | 可通过 Impacket 枚举。 |
| 139 | NetBIOS-SSN | HIGH | 可枚举文件和打印机。 |
| 143 | IMAP | LOW | 未启用 STARTTLS 时以明文传输。 |
| 161 | SNMP | HIGH | 团体字符串通常为 public/private;可完整枚举设备。 |
| 389 | LDAP | HIGH | 匿名绑定可完整转储目录。 |
| 443 | HTTPS | INFO | 标准端口。 |
| 445 | SMB | CRITICAL | EternalBlue、SMB 中继、匿名共享。 |
| 465 | SMTPS | LOW | 可查看横幅。 |
| 514 | rsyslog | MEDIUM | 日志注入/DoS。 |
| 587 | SMTP-MSA | LOW | 可查看横幅。 |
| 631 | IPP/CUPS | MEDIUM | 可枚举打印服务器/旧版 CUPS 中存在 RCE。 |
| 873 | rsync | HIGH | 通常可列出模块;可能暴露备份数据。 |
| 1433 | MSSQL | HIGH | 可暴力破解;xp_cmdshell。 |
| 1521 | Oracle TNS | HIGH | 可暴力破解;可枚举 SID。 |
| 2049 | NFS | HIGH | 导出内容对所有人可读。 |
| 2375 | Docker API(未加密) | CRITICAL | 未经身份验证即可接管容器/主机。 |
| 2376 | Docker API(TLS) | HIGH | 存在绕过证书验证的风险。 |
| 3000 | 常见开发服务/Grafana | MEDIUM | 通常是 Grafana/使用默认凭据的 Express 开发服务。 |
| 3306 | MySQL | HIGH | 可暴力破解;默认凭据为 root:""。 |
| 3389 | RDP | CRITICAL | BlueKeep/DejaBlue/NLA 绕过。 |
| 5432 | PostgreSQL | HIGH | 可暴力破解;默认凭据为 postgres:postgres。 |
| 5601 | Kibana | HIGH | 通常无需身份验证;可借此转向 Elasticsearch。 |
| 5900 | VNC | HIGH | 通常无需身份验证或密码较弱。 |
| 5984 | CouchDB | HIGH | 默认无需身份验证;处于 admin party 状态。 |
| 6379 | Redis | CRITICAL | 默认无需身份验证;可写入 authorized_keys 以获取 SSH 访问权限。 |
| 7001 | WebLogic | HIGH | 存在大量 CVE(CVE-2020-14882 等)。 |
| 8000 | 常见开发服务 | MEDIUM | Django、常见开发服务器。 |
| 8080 | HTTP-alt | MEDIUM | Tomcat、Jenkins、常见代理。 |
| 8443 | HTTPS-alt | MEDIUM | 与 8080 相同。 |
| 8888 | 常见开发服务/Jupyter | HIGH | Jupyter 通常会暴露交互式 Shell。 |
| 9090 | Cockpit/Prometheus | HIGH | 服务器管理界面/指标抓取。 |
| 9200 | Elasticsearch | CRITICAL | 通常无需身份验证。 |
| 9300 | Elasticsearch transport | HIGH | 可加入集群并实现 RCE。 |
| 11211 | memcached | MEDIUM | UDP DDoS 放大;可转储数据。 |
| 27017 | MongoDB | CRITICAL | 默认无需身份验证。 |
| 50070 | Hadoop NameNode | HIGH | 可浏览 HDFS。 |
当 Shodan InternetDB 为某个端口返回 vulns[] 时,将该发现的严重性提升一个等级,并在证据中列出 CVE。
16.4 缺失安全响应头 — 6 项发现
对于每个可访问的 Web 应用,审计响应头。下表中每个缺失的响应头都算作一项发现。
| 响应头 | 严重性(默认) | 严重性(敏感路径) | 备注 |
|---|---|---|---|
Strict-Transport-Security | MEDIUM | HIGH | 敏感路径:/login、/signin、/sso、/admin、/auth。 |
Content-Security-Policy | MEDIUM | MEDIUM | 失去对 XSS 影响的缓解能力。 |
X-Frame-Options | LOW | LOW | 点击劫持。(CSP 的 frame-ancestors 是现代替代方案。) |
X-Content-Type-Options | LOW | LOW | MIME 嗅探可能导致 XSS。 |
Referrer-Policy | INFO | INFO | 外链可能泄露信息。 |
Permissions-Policy | INFO | INFO | 加强功能策略。 |
16.5 持续运行的 HTTP 检查 — 15 个路径
无论 Nuclei 是否可用,都对每个存活的 Web 应用执行这些检查。成本低,信号强。
| 路径 | 发现 | 严重性 | 匹配逻辑 |
|---|---|---|---|
/.git/config | 暴露的 .git 仓库 | 严重 | 响应正文包含 [core]、[remote、repositoryformatversion |
/.git/HEAD | 暴露的 .git/HEAD | 高 | 响应正文匹配 ^ref:\s |
/.env | 暴露的 .env | 严重 | 多行正则表达式 ^\s*[A-Z_][A-Z0-9_]*\s*= |
/server-status | Apache server-status | 中 | 响应正文包含 Apache Server Status 或匹配的标题 |
/server-info | Apache mod_info | 中 | 响应正文包含 Apache Server Information |
/.DS_Store | 暴露的 .DS_Store | 低 | 字节签名 \x00\x00\x00\x01Bud1 |
/phpinfo.php | phpinfo() 泄露 | 高 | 响应正文包含 phpinfo()、PHP Version 或匹配的标题 |
/info.php | phpinfo()(备用路径) | 高 | 同上 |
/actuator/env | Spring Boot /actuator/env | 严重 | 响应正文包含 "propertySources"、systemProperties、systemEnvironment |
/actuator/heapdump | Spring Boot 堆转储 | 严重 | HPROF 魔数 / 大型二进制下载 |
/_cat/indices | Elasticsearch 未受保护 | 高 | 返回索引列表 |
/console | Jenkins 脚本控制台 | 高 | 响应正文包含 Jenkins/Script Console |
/manager/html | Tomcat Manager | 高 | 响应正文包含 Tomcat Web Application Manager |
/wp-admin/install.php | 遗留的 WP 安装程序 | 低 | 响应正文包含 WordPress Installation |
/.well-known/security.txt | 披露政策信息 | 信息 | 解析联系人和政策字段 |
另外,解析 /robots.txt 中的 Disallow: 路径,将其作为该目标的下一层字典。
16.6 SAML 元数据 — 5 个路径
/saml/metadata
/FederationMetadata/2007-06/FederationMetadata.xml
/federationmetadata/2007-06/federationmetadata.xml
/simplesaml/saml2/idp/metadata.php
/auth/saml2/metadata
可访问的 SAML 元数据 XML 会泄露:EntityID、签名证书(通常有固定证书,可作为证书复用的切入点)、SingleSignOnService URL、NameIDFormat。标记为 MISCONFIG(严重性为低,除非元数据泄露内部主机名或非公开证书,此时为中)。
16.7 SSO 子域名前缀 — 8 个前缀
针对根域名和每个同级品牌域名逐一探测:
auth.{domain}
login.{domain}
sso.{domain}
idp.{domain}
iam.{domain}
identity.{domain}
accounts.{domain}
oauth.{domain}
另外,对每个存活的子域名探测 /.well-known/openid-configuration(无论是否匹配前缀)。
16.8 云存储桶排列组合工具集
6 个前缀:
"" # bare candidate
backup-
assets-
static-
dev-
prod-
15 个后缀:
"" # bare candidate
-backup
-assets
-static
-media
-data
-uploads
-dev
-prod
-staging
-logs
-private
-public
-dump
-archive
47 个通用词干(除非与可识别目标的令牌组合,否则过滤):
www, mail, email, app, apps, web, webmail, ftp, cdn, static, assets, media, img, images,
videos, download, downloads, upload, uploads, data, files, docs, support, help, kb,
blog, news, dev, test, staging, stg, qa, uat, sandbox, preprod, preview, vpn,
mx, smtp, imap, pop, dns, ns, ns1, ns2, mx1, mx2
提供商 URL 模板:
S3:
https://{candidate}.s3.amazonaws.com/
https://{candidate}.s3-{region}.amazonaws.com/ # try us-east-1, us-west-2, eu-west-1, ap-southeast-1 first
https://s3.{region}.amazonaws.com/{candidate}/
GCS:
https://{candidate}.storage.googleapis.com/
https://storage.googleapis.com/{candidate}/
Azure Blob:
https://{candidate}.blob.core.windows.net/
**探测技术:**先发送 HEAD 请求 → 200/301 = 存在,403 = 存在但为私有,404 = 跳过。若存在,则 GET 根路径 → 如果返回 XML/JSON 对象列表,标记为 严重 PUBLIC_CLOUD_BUCKET。可以直接通过 URL 读取对象但无法列出对象 → 标记为 高 PUBLIC_CLOUD_BUCKET_OBJECT_READ。
16.9 用于发现端点的 JS 猜测路径
对每个存活的 Web 应用探测这些路径(除抓取的 <script src=...> 外):
/main.js
/app.js
/bundle.js
/runtime.js
/index.js
/vendor.js
/_next/static/_buildManifest.js
/_next/static/_ssgManifest.js
/static/js/main.js
/static/js/bundle.js
/assets/index.js
/static/js/main.<hash>.js # try hash discovery via 404 patterns
对于找到的每个 JS 文件,也尝试访问 <jsfile>.map,检查是否存在源码映射泄露(高 INFO_DISCLOSURE)。
16.10 端点提取正则表达式分级
共三级,按顺序应用于每个 JS 正文和每个 sourcesContent[] 内容块:
第 1 级 — 通用引号包围的路径:
['"`](/[A-Za-z0-9_\-./{}\[\]?=&%:]+)['"`]
匹配组:路径。召回率高,但误报很多——后续应用允许列表进行过滤。
第 2 级 — 类似 API 的路径(对第 1 级结果进行倾向性筛选):
['"`](/(?:api|graphql|gql|v\d+|swagger|openapi|rest|services|internal|admin|auth|oauth|user|users|account|accounts|search|export|upload|file|files|download|webhook|hooks|callback|admin)/[A-Za-z0-9_\-./{}\[\]?=&%:]+)['"`]
第 3 级 — 完整 URL:
\bhttps?://[A-Za-z0-9.\-]+\.[A-Za-z]{2,}(?::\d+)?[/A-Za-z0-9_\-./{}\[\]?=&%:#]*
按 (method, normalized-path-template) 去重,其中模板会将 /123/ 替换为 /{id}/ 等。
16.11 内部主机泄露正则表达式
对每个 JS 正文、sourcesContent、APK 字符串和清单运行:
RFC1918:
\b(?:10\.(?:\d{1,3}\.){2}\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.(?:\d{1,3})\.(?:\d{1,3})|192\.168\.(?:\d{1,3})\.(?:\d{1,3})|127\.(?:\d{1,3}\.){2}\d{1,3})\b
内部 DNS 后缀:
\b[A-Za-z0-9][A-Za-z0-9\-]{0,62}\.(?:internal|corp|lan|intranet|local|prod|staging|dev|qa|test)\b
Kubernetes 服务 DNS:
\b[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+\.svc(?:\.cluster\.local)?\b
每个匹配项 → 标记为中 INFO_DISCLOSURE。按主机汇总:如果许多匹配项都指向同一个内部子域名,该子域名就可作为未来任何内部阶段的侦察线索。
16.12 子域名接管提供商指纹(摘要,27 个提供商)
留意这些 CNAME 目标,以及相应的“可供认领”响应特征:
| 提供商 | CNAME 模式 | 接管特征 |
|---|---|---|
| GitHub Pages | *.github.io | There isn't a GitHub Pages site here. |
| Heroku | *.herokuapp.com | No such app |
| AWS S3 | *.s3*.amazonaws.com | NoSuchBucket |
| AWS CloudFront | *.cloudfront.net | 带有特定 X-Amz 错误的 Bad request |
| Azure(多个产品) | *.azurewebsites.net、*.blob.core.windows.net、*.cloudapp.net、*.trafficmanager.net | 各产品对应的不同 404 模式 |
| Shopify | shops.myshopify.com | Sorry, this shop is currently unavailable. |
| Squarespace | *.squarespace.com | No Such Account |
| Tumblr | *.tumblr.com | Whatever you were looking for doesn't currently exist. |
| WordPress | *.wordpress.com | Do you want to register *.wordpress.com? |
| Fastly | 各种模式 | Fastly 专属 404 |
| Pantheon | *.pantheonsite.io | The gods are wise, but do not know of the site... |
| Surge.sh | *.surge.sh | project not found |
| Bitbucket Pages | *.bitbucket.io | 找不到存储库 |
| Tilda | *.tilda.ws | Please renew your subscription |
| Strikingly | *.s.strikinglydns.com | PAGE NOT FOUND |
| Smartling | *.smartling.com | 域名未配置 |
| Ngrok | *.ngrok.io | 找不到隧道 |
| Webflow | *.webflow.io | 找不到站点 |
| Zendesk | *.zendesk.com | Help Center Closed |
| Cargo | *.cargocollective.com | 带有 Cargo 品牌标识的 404 Not Found |
| Statuspage | *.statuspage.io | 未找到 |
| Intercom | *.intercom.help | 未找到 |
| Helpjuice | *.helpjuice.com | 未找到 |
| Helpscout | *.helpscoutdocs.com | 未找到 |
| Tictail | *.tictail.com | 未找到 |
| Brightcove | *.brightcovegallery.com | 未找到 |
| Smugmug | 各种模式 | 未找到 |
要获取各提供商的完整检测特征和边缘情况,请使用 SubdomainX,或针对最新获取的指纹数据库运行 Subzy/Subjack。
16.13 复制粘贴探测(curl 单行命令)
§16.1–16.12 中的每条探测路径都附有可运行的 curl 命令。默认参数:-sk(静默并忽略 TLS 错误)、-m 10(最长等待 10 秒)、-o /tmp/r(将响应正文写入磁盘)、-w '%{http_code}\n'(打印状态码)、-A "Mozilla/5.0"(UA——按不同身份特征进行修改)。
持续执行的 HTTP 检查(§16.5):
T="https://target.example"
# .git/config (CRITICAL)
curl -sk -m 10 "$T/.git/config" | grep -E '\[core\]|\[remote|repositoryformatversion'
# .git/HEAD (HIGH)
curl -sk -m 10 "$T/.git/HEAD" | grep -E '^ref:'
# .env (CRITICAL)
curl -sk -m 10 "$T/.env" | grep -E '^[[:space:]]*[A-Z_][A-Z0-9_]*[[:space:]]*='
# Apache /server-status (MEDIUM)
curl -sk -m 10 "$T/server-status" | grep -i 'Apache Server Status'
# Apache /server-info (MEDIUM)
curl -sk -m 10 "$T/server-info" | grep -i 'Apache Server Information'
# .DS_Store (LOW)
curl -sk -m 10 "$T/.DS_Store" -o /tmp/dsstore && file /tmp/dsstore | grep -i 'data'
# phpinfo.php (HIGH)
curl -sk -m 10 "$T/phpinfo.php" | grep -E 'phpinfo\(\)|PHP Version'
# info.php (HIGH)
curl -sk -m 10 "$T/info.php" | grep -E 'phpinfo\(\)|PHP Version'
# Spring Boot /actuator/env (CRITICAL)
curl -sk -m 10 "$T/actuator/env" | grep -E '"propertySources"|systemProperties|systemEnvironment'
# Spring Boot /actuator/heapdump (CRITICAL — saves binary; check size)
curl -sk -m 30 "$T/actuator/heapdump" -o /tmp/heap && file /tmp/heap | grep -i 'HPROF\|data'
# Elasticsearch open (HIGH)
curl -sk -m 10 "$T/_cat/indices?v"
# Jenkins script console (HIGH)
curl -sk -m 10 "$T/script" | grep -iE 'Jenkins|Script Console'
# Tomcat manager (HIGH)
curl -sk -m 10 "$T/manager/html" -w '%{http_code}\n' | tail -1 # 401 = present + auth-gated; 200 = no auth
# WordPress orphan installer (LOW)
curl -sk -m 10 "$T/wp-admin/install.php" | grep -i 'WordPress Installation'
# security.txt (INFO)
curl -sk -m 10 "$T/.well-known/security.txt"
SSO 子域名前缀(§16.7):
D="target.example"
for prefix in auth login sso idp iam identity accounts oauth; do
echo "=== ${prefix}.${D} ==="
curl -sk -m 10 "https://${prefix}.${D}/.well-known/openid-configuration" -o /dev/null -w '%{http_code}\n'
done
# Generic OIDC discovery on any host:
curl -sk -m 10 "https://${HOST}/.well-known/openid-configuration" | jq .
SAML 元数据路径(§16.6):
H="target.example.com"
for p in /saml/metadata \
/FederationMetadata/2007-06/FederationMetadata.xml \
/federationmetadata/2007-06/federationmetadata.xml \
/simplesaml/saml2/idp/metadata.php \
/auth/saml2/metadata; do
echo "=== $p ==="
curl -sk -m 10 "https://${H}${p}" -o /dev/null -w '%{http_code} %{size_download}\n'
done
云存储桶探测(§16.8):
B="candidate-bucket-name"
# S3 (us-east-1 first)
curl -sk -m 10 -I "https://${B}.s3.amazonaws.com/" -w 'STATUS:%{http_code}\n' | head -20
# If 200/301: list objects
curl -sk -m 10 "https://${B}.s3.amazonaws.com/?list-type=2" | head -50
# S3 region-specific
for r in us-east-1 us-west-2 eu-west-1 ap-southeast-1; do
curl -sk -m 10 -I "https://${B}.s3-${r}.amazonaws.com/" -w "${r}: %{http_code}\n"
done
# GCS
curl -sk -m 10 -I "https://${B}.storage.googleapis.com/"
curl -sk -m 10 "https://storage.googleapis.com/${B}/"
# Azure Blob
curl -sk -m 10 -I "https://${B}.blob.core.windows.net/"
curl -sk -m 10 "https://${B}.blob.core.windows.net/?comp=list"
GraphQL 内省 POST(§16.2):
H="https://target.example/graphql"
curl -sk -m 15 -X POST "$H" \
-H 'Content-Type: application/json' \
-d '{
"operationName":"IntrospectionQuery",
"query":"query IntrospectionQuery { __schema { types { name kind fields { name type { name kind } } } queryType { name } mutationType { name } subscriptionType { name } } }"
}' | jq '.data.__schema.types | length'
只读密钥验证器(§23):
# Postman PMAK
curl -sk -m 10 -H "X-Api-Key: PMAK-..." https://api.getpostman.com/me | jq .
# AWS (use boto3 instead of curl — pre-signing complexity)
python3 -c "import boto3; print(boto3.client('sts', aws_access_key_id='AKIA...', aws_secret_access_key='...').get_caller_identity())"
# GitHub PAT (note scope header)
curl -sk -m 10 -H "Authorization: token ghp_..." https://api.github.com/user -D /tmp/h | jq -r '.login,.email'
grep -i 'X-OAuth-Scopes' /tmp/h
# Slack
curl -sk -m 10 -H "Authorization: Bearer xoxb-..." -X POST https://slack.com/api/auth.test | jq .
# Anthropic (read-only validation)
curl -sk -m 10 -H "x-api-key: sk-ant-..." -H "anthropic-version: 2023-06-01" https://api.anthropic.com/v1/models | jq '.data | length'
# OpenAI
curl -sk -m 10 -H "Authorization: Bearer sk-..." https://api.openai.com/v1/models | jq '.data | length'
# npm
curl -sk -m 10 -H "Authorization: Bearer npm_..." https://registry.npmjs.org/-/whoami | jq .
# Atlassian (account)
curl -sk -m 10 -u "email:ATATT3xFfGF0_..." https://your-domain.atlassian.net/rest/api/3/myself | jq .
# DataDog (API + APP key both required)
curl -sk -m 10 -H "DD-API-KEY: ..." -H "DD-APPLICATION-KEY: ..." https://api.datadoghq.com/api/v1/validate | jq .
批量 Web 应用分流(httpx,比 curl 循环更快):
# Install: go install github.com/projectdiscovery/httpx/cmd/httpx@latest
echo "target.example" | httpx -sc -title -tech-detect -web-server -ip -cdn -follow-redirects
# With probe list
cat subdomains.txt | httpx -sc -title -tech-detect -path /actuator/env,/.git/config,/.env -mc 200,301,403
保存响应作为证据:
mkdir -p evidence/$(date -u +%Y%m%d)
T="https://target.example"
P="/actuator/env"
TS=$(date -u +%Y%m%dT%H%M%SZ)
SAFE_NAME=$(echo "${T}${P}" | tr '/:' '_')
curl -sk -m 10 "$T$P" -o "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.body" \
-D "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.headers"
sha256sum "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}".* > "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.sha256"
16.14 电子邮件安全分析(SPF/DMARC/DKIM/BIMI/MTA-STS/DNSSEC)
根据目标的电子邮件 DNS 信息,评估伪造可行性并推断 SaaS 租户。
SPF 查询与解析:
D="target.example"
dig +short TXT "$D" | grep -i 'v=spf1'
常见 SPF 解析检查清单:
- 以
-all(硬失败)结尾 → 策略严格;主要提供商会拒绝伪造邮件。 - 以
~all(软失败)结尾 → 伪造邮件会进入垃圾邮件文件夹。 - 以
?all结尾或没有all→ 策略宽松;伪造邮件很可能成功送达。 - 包含项(
include:)可揭示 SaaS 租户:include:_spf.google.com→ Google Workspace。include:spf.protection.outlook.com→ Microsoft 365。include:_spf.salesforce.com→ Salesforce。include:mail.zendesk.com→ Zendesk 客户。include:sendgrid.net→ SendGrid 客户。include:mailgun.org→ Mailgun 客户。include:_spf.atlassian.net→ Atlassian Cloud。include:amazonses.com→ AWS SES。include:mktomail.com→ Marketo。include:_spf.intuit.com→ Intuit(QuickBooks/Mailchimp)。include:spf.mandrillapp.com→ Mandrill。include:_spf.workday.com→ Workday。
如果 SPF 包含 ≥10 个机制(最大查询次数限制),SPF 评估就可能失败 → 伪造邮件可能通过。工具:spfquery、spftools(在线)、dig +trace。
DMARC 策略与对齐:
dig +short TXT "_dmarc.${D}"
解析以下内容:
p=→ 主策略(none、quarantine、reject)。sp=→ 子域策略(默认为p=)。aspf=/adkim=→ 对齐模式(r= 宽松,s= 严格)。pct=→ 策略适用的邮件百分比。rua=/ruf=→ 报告地址(通常会暴露 SaaS DMARC 供应商:dmarcian、valimail、Agari、easydmarc)。
严重程度:
p=none→ 可实施欺骗,信任度降低 → MEDIUM 级发现。p=quarantine pct<100→ 部分执行策略 → LOW 级。p=reject+aspf=s+adkim=s→ 安全状况良好 → 无发现。
DKIM 密钥发现:
DKIM 选择器并无通用命名;常见模式:
for selector in default google selector1 selector2 mail email k1 dkim s1 s2 mta1 mta2 \
amazonses 20240101 20230101 mailchimp sendgrid mxvault; do
echo "=== ${selector} ==="
dig +short TXT "${selector}._domainkey.${D}"
done
如果返回密钥:提取 p=<base64> 并检查密钥长度。RSA-1024 → MEDIUM(已弃用;应使用 2048 位或更长的密钥)。缺少密钥或很少轮换 → LOW 级发现。
BIMI(邮件品牌标识):
dig +short TXT "default._bimi.${D}"
如果已配置且 DMARC 为 p=reject → 可在收件箱界面防御品牌冒充。缺少此项仅为 LOW 级(属于运维问题,不可利用)。
MTA-STS(邮件传输代理严格传输安全):
dig +short TXT "_mta-sts.${D}"
curl -sk -m 10 "https://mta-sts.${D}/.well-known/mta-sts.txt"
如果两者均无响应 → 未强制执行 MX 服务器 TLS;可遭受中间人攻击。LOW 级发现。如果存在 mode=enforce,且策略文件匹配 → 安全状况良好。
TLS-RPT(TLS 报告):
dig +short TXT "_smtp._tls.${D}"
DNSSEC 验证:
dig +dnssec "${D}" SOA | grep -E 'flags|RRSIG'
delv "${D}" 2>&1 | grep -i 'fully validated\|insecur'
如果 delv 返回“insecure” → 未启用 DNSSEC(LOW 级发现;不会导致欺骗,但存在加固缺口)。
MX → IdP / 邮件主机推断:
dig +short MX "${D}"
| MX 模式 | IdP / 托管服务 |
|---|---|
aspmx.l.google.com、*.googlemail.com | Google Workspace |
*.mail.protection.outlook.com | Microsoft 365 |
*.mail.eo.outlook.com | Microsoft 365(旧版) |
*.zoho.com | Zoho Mail |
*.yandex.net | Yandex 360 |
*.fastmail.com | Fastmail |
*.proofpoint.com、*.pphosted.com | Proofpoint(使用 Proofpoint 入站服务的 M365 用户) |
*.mimecast.com、*.mimecast-eu.com | Mimecast |
*.barracudanetworks.com | Barracuda |
| 目标 ASN 中的自托管 IP | 本地邮件服务器(通常为 Exchange) |
DMARC 报告供应商推断(解析 rua= / ruf=):
| RUA/RUF 主机 | 供应商 | 含义 |
|---|---|---|
*.dmarcian.com | dmarcian | DMARC 报告客户 |
*.valimail.com、*.dmarc-rua.com | Valimail | DMARC 报告客户 |
*.kdmarc.com | Kratikal kDMARC | 印度 DMARC 供应商;常见于印度组织 |
*.agari.com | Agari (Fortra) | 邮件安全供应商 |
*.easydmarc.com | EasyDMARC | DMARC 报告客户 |
*.dmarcanalyzer.com | DMARC Analyzer | 报告客户 |
*.postmarkapp.com | Postmark | DMARC 报告附加服务 |
<addr>@<target-domain> | 自托管报告 | 内部邮箱;有时会泄露团队名称(itg@、secops@、dmarc@) |
记录供应商和内部 RUA 邮箱。两者都是信息泄露面(供应商遭入侵 = 绕过 DMARC;内部邮箱 = 网络钓鱼目标)。
整个 §16.14 审计的 Windows / PowerShell 对应方式:
PS 5.1 的 Resolve-DnsName 不接受 -Type CAA(请使用 PowerShell 7+ 或 nslookup -type=CAA <domain>)。其他情况:
$D = "target.example"
"=== SPF ==="; (Resolve-DnsName $D -Type TXT -EA SilentlyContinue | ? { $_.Strings -match 'v=spf1' }).Strings
"=== DMARC ==="; (Resolve-DnsName "_dmarc.$D" -Type TXT -EA SilentlyContinue).Strings
"=== MTA-STS ==="; (Resolve-DnsName "_mta-sts.$D" -Type TXT -EA SilentlyContinue).Strings
"=== TLS-RPT ==="; (Resolve-DnsName "_smtp._tls.$D" -Type TXT -EA SilentlyContinue).Strings
"=== BIMI ==="; (Resolve-DnsName "default._bimi.$D" -Type TXT -EA SilentlyContinue).Strings
"=== MX ==="; Resolve-DnsName $D -Type MX -EA SilentlyContinue | Select NameExchange,Preference
"=== DKIM common selectors ==="
foreach ($s in @("default","google","selector1","selector2","mail","email","k1","dkim","s1","s2","amazonses","mailchimp","sendgrid","mxvault","20240101","zoho","zmail","outlook","o365")) {
$r = Resolve-DnsName "$s._domainkey.$D" -Type TXT -EA SilentlyContinue
if ($r) { "${s}: FOUND" }
}
"=== CAA (PS 5.1 fallback) ==="; nslookup -type=CAA $D 2>$null
16.15 源站发现/CDN 绕过
如果目标位于 Cloudflare/Akamai/Fastly/CloudFront 之后,它们的 CDN IP 范围是明确定义的。查找不在这些范围内、但提供相同网站服务的 IP,即为源站。
Cloudflare IPv4 范围:
https://www.cloudflare.com/ips-v4
Akamai ASN: AS16625、AS20940、AS21342、AS21357。
Fastly: AS54113。
AWS CloudFront: 发布在 https://ip-ranges.amazonaws.com/ip-ranges.json 中,筛选 service:CLOUDFRONT。
通过 DNS 历史记录发现源站:
# SecurityTrails (paid)
curl -sk -H "APIKEY: ..." \
"https://api.securitytrails.com/v1/history/${D}/dns/a" | jq '.records[] | {ip:.values[].ip, first_seen, last_seen}'
免费替代方案:
# Validin
curl -sk "https://app.validin.com/api/axon/${D}/dns" | jq .
# RiskIQ Community (free tier; auth required)
curl -sk -u "user:apikey" "https://api.riskiq.net/pt/v2/dns/passive?query=${D}" | jq .
筛选结果:任何不在当前 CDN 范围内的历史 A 记录 IP 都是源站候选。
通过证书 SAN 透视发现源站(Censys):
# Censys (free 250 queries/month with key)
censys search "services.tls.certificates.leaf_data.subject.common_name:${D} AND NOT services.tls.certificates.leaf_data.issuer.common_name:'Cloudflare'"
或者通过 crt.sh + 手动检查 IP:
curl -sk "https://crt.sh/?q=%25.${D}&output=json" | jq -r '.[].name_value' | sort -u
通过 favicon 哈希发现源站(Shodan):
# Compute favicon mmh3
python3 -c "
import urllib.request, codecs, mmh3
data = urllib.request.urlopen('https://target.example/favicon.ico').read()
b64 = codecs.encode(data, 'base64')
print(mmh3.hash(b64))"
# Search Shodan
shodan search "http.favicon.hash:<computed-hash>" --fields ip_str,port,org
与 CDN 范围交叉比对;非 CDN 匹配项即为源站候选。
通过 JARM 发现源站:
# Compute JARM
python3 -c "
import jarm
print(jarm.scan('target.example'))
" 2>/dev/null || echo "Install: pip install pyjarm"
# Search Shodan for matching JARM
shodan search "ssl.jarm:<jarm-hash>" --fields ip_str,port
通过 Host 标头探测源站(验证候选项):
CANDIDATE_IP="203.0.113.42"
curl -sk -m 10 -H "Host: target.example.com" "https://${CANDIDATE_IP}/" -o /tmp/candidate.html
diff <(curl -sk -m 10 https://target.example.com/) /tmp/candidate.html | head -50
如果差异很小或没有差异,即可确认是源站。记录 detectability=low。
通过辅助子域名发现源站(通常会绕过 CDN):
for sub in mail smtp ftp sftp cpanel webmail direct origin direct-connect noproxy \
dev staging stg uat preprod sandbox preview origin-www old-www legacy \
server srv host1 host2 vps server1; do
echo "=== ${sub}.${D} ==="
dig +short A "${sub}.${D}"
done | grep -vE '^(===|$)' | sort -u
将任何返回的 IP 与 CDN 范围交叉比对。
通过邮件标头退信发现源站:
从一个伪装账号向 <random>@${D} 发送邮件。退信通常包含显示入站邮件服务器实际 IP 的 Received: 标头——有时该服务器与 Web 源站位于同一位置。
通过配置错误的 CDN 错误页面发现源站:
有些 CDN 的 5xx 错误页面过去会泄露上游详细信息。触发错误并检查:
# Trigger CDN-side 5xx (oversized request, malformed Host)
curl -sk -m 10 -H "Host: " "https://target.example/" -o /tmp/err.html
curl -sk -m 10 -H "X-Forwarded-For: $(python3 -c 'print("a"*8000)')" "https://target.example/"
grep -iE 'origin|upstream|server|backend|cf-ray' /tmp/err.html
16.16 厂商产品指纹
目标外围常见的边缘设备/产品,其指纹路径及常见 CVE 说明。
| 产品 | 指纹路径 | 说明 |
|---|---|---|
| Citrix Netscaler / Gateway | /vpn/index.html、/logon/LogonPoint/tmindex.html、/citrix/ | HTML 中包含版本信息;CVE-2023-3519(RCE)、CVE-2019-19781(路径遍历 RCE)——均已列入 KEV。 |
| F5 BIG-IP TMUI | /tmui/login.jsp、/mgmt/tm/sys/ | 横幅会显示版本;CVE-2022-1388(身份验证绕过)、CVE-2023-46747——已列入 KEV。 |
| Cisco ASA / AnyConnect | /+CSCOE+/、/CSCOE/index.html、/webvpn.html、/+CSCOE+/portal.html | CVE-2020-3452(文件读取)、CVE-2018-0101(RCE)。 |
| Pulse Secure / Ivanti Connect | /dana-na/、/dana-na/auth/url_default/welcome.cgi、/api/v1/ | CVE-2024-21887(KEV)、CVE-2023-46805(KEV)——可串联实现命令注入。 |
| FortiGate / FortiOS | /remote/login、/remote/info、/api/v2/ | CVE-2022-42475(RCE,KEV)、CVE-2024-21762(RCE,KEV)。 |
| PaloAlto GlobalProtect | /global-protect/、/global-protect/portal/css/login.css、/api/?type=keygen | CVE-2024-3400(RCE,KEV)、CVE-2019-1579。 |
| VMware Horizon | /portal/info.jsp、/broker/xml、/login.jsp | 存在 log4shell 风险(CVE-2021-44228,KEV)。 |
| VMware vCenter | /sdk、/ui/、/vsphere-client/、/websso/SAML2/ | CVE-2021-21972(RCE,KEV)、CVE-2021-22005。 |
| VMware ESXi | /sdk、/ui/、/folder | CVE-2021-21974(堆溢出 → ESXiArgs 勒索软件,KEV)。 |
| Microsoft Exchange OWA | /owa/、/ews/exchange.asmx、/ecp/ | ProxyShell(CVE-2021-34473)、ProxyLogon(CVE-2021-26855)、ProxyNotShell(CVE-2022-41040)——均已列入 KEV。 |
| WatchGuard Firebox | /auth/、/wgcgi.cgi | CVE-2022-26318(CGI)。 |
| SonicWall SMA | /cgi-bin/welcome、/__api__/v1/、/diagnostics/ | CVE-2021-20016、CVE-2024-40766(KEV)。 |
| Sophos UTM/XG/XGS | /userportal/、/webconsole/、/cgi-bin/ | CVE-2022-1040(RCE,KEV)。 |
| Check Point R80/R81 | /sslvpn/portal/、/clients/ | CVE-2024-24919(KEV)。 |
| Zoho ManageEngine | /RestAPI/Login、/api/json/v2/ | 存在多个 RCE CVE;请检查版本。 |
| Atlassian Confluence | /confluence/、/login.action、/rest/api/space | CVE-2022-26134(OGNL RCE,KEV)、CVE-2023-22515(KEV)。 |
| Atlassian Jira | /secure/Dashboard.jspa、/rest/api/2/serverInfo | 存在多个 CVE;请检查版本。 |
| GitLab 自托管 | /users/sign_in、/-/oauth/applications、/help | HTML 页脚中包含版本信息;CVE-2021-22205(RCE,KEV)。 |
| Telerik UI | /Telerik.Web.UI.WebResource.axd?type=rau | CVE-2017-9248、CVE-2019-18935——虽然较旧,但仍能发现。 |
| ConnectWise ScreenConnect | /SetupWizard.aspx、/Bin/SetupWizard.aspx | CVE-2024-1709(身份验证绕过,KEV)。 |
| SolarWinds Orion | /Orion/Login.aspx | SUNBURST 供应链攻击(CVE-2020-10148)。 |
| Kaseya VSA | /dl.asp、/userFilterTableRpt.asp | CVE-2021-30116(REvil 供应链攻击)。 |
| Microsoft IIS / OWA 杂项 | Server: Microsoft-IIS/<version> | 旧版本可能存在旧 CVE;请检查。 |
| Cisco Smart Install | 4786 端口开放 | CVE-2018-0171(smart install 客户端模式 RCE)。 |
各厂商探测模式:
T="https://target.example"
# Citrix
curl -sk -m 10 "$T/vpn/index.html" -o /tmp/c1 -w '%{http_code}\n'
grep -iE 'NetScaler|Citrix|version' /tmp/c1
# F5
curl -sk -m 10 "$T/tmui/login.jsp" -o /tmp/c2 -w '%{http_code}\n'
grep -iE 'BIG-IP|version' /tmp/c2
# (etc — repeat per product)
使用 Nuclei 自动识别指纹:
nuclei -u $T -t http/technologies/ -severity info,low,medium,high,critical
nuclei -u $T -t http/cves/ -severity high,critical -etags fuzz
16.17 云原生服务指纹
现代应用会部署在无服务器 / 托管服务上。根据 URL 模式识别平台。
| 提供商 | URL 模式 | 说明 |
|---|---|---|
| AWS Lambda Function URL | *.lambda-url.<region>.on.aws | 直接调用;检查 IAM 身份验证配置。 |
| AWS App Runner | *.<region>.awsapprunner.com | 托管容器;通常位于身份验证之后。 |
| AWS API Gateway | *.execute-api.<region>.amazonaws.com | REST/HTTP/WebSocket;检查授权器配置。 |
| AWS CloudFront | d{14}\.cloudfront\.net | 分发服务;后面是源站(参见 §16.15)。 |
| AWS ALB / ELB | *.elb.<region>.amazonaws.com | 后端为 EC2 / ECS。 |
| AWS Amplify | *.amplifyapp.com | 静态内容 + Lambda 后端。 |
| Google Cloud Run | *.run.app(以及 *.<region>.run.app) | 容器;检查是否公开访问或需要 IAM 身份验证。 |
| Google Cloud Functions | *.cloudfunctions.net、*.<region>-<project>.cloudfunctions.net | 无服务器。 |
| Google App Engine | *.appspot.com | 较早期的无服务器服务。 |
| Azure Functions | *.azurewebsites.net(也用于 App Service) | Function App 使用相同的域名模式。 |
| Azure Container Apps | *.azurecontainerapps.io | 容器。 |
| Azure Static Web Apps | *.azurestaticapps.net | 静态内容 + Functions。 |
| Vercel | *.vercel.app、*.now.sh(旧版) | 前端 + 无服务器。 |
| Netlify | *.netlify.app、*.netlify.com | 前端 + 函数。 |
| Cloudflare Workers | *.workers.dev | 边缘函数。 |
| Cloudflare Pages | *.pages.dev | 静态内容 + 函数。 |
| Heroku | *.herokuapp.com | Dynos。 |
| Render | *.onrender.com | 容器 / 静态内容。 |
| Fly.io | *.fly.dev | 边缘容器。 |
| Railway | *.railway.app | 应用平台。 |
| DigitalOcean App Platform | *.ondigitalocean.app | 静态内容 + 容器。 |
针对每种模式:
- 确认是否公开访问或需要身份验证(HEAD / GET)。
- 检查 CORS 配置。
- 对于 Lambda Function URLs / Cloud Run / Cloud Functions:检查是否强制执行 IAM 身份验证(允许匿名调用 = 高风险发现)。
- 对于静态内容 + 函数混合服务(Vercel/Netlify/Cloudflare Pages):函数路径通常为
/api/*;通过提取 JS 内容进行枚举。
16.18 容器与 Kubernetes 暴露
这种情况越来越常见;位于 NAT 后方时往往容易被忽略。
| 目标 | 端口 | 探测方式 | 暴露后的严重程度 |
|---|---|---|---|
| Docker API(未加密) | 2375 | curl -sk -m 5 http://${IP}:2375/v1.40/info | 严重(容器/主机失陷) |
| Docker API(TLS) | 2376 | curl -sk -m 5 https://${IP}:2376/v1.40/info | 高(可能绕过证书验证) |
| Kubernetes API 服务器 | 6443 / 8443 | curl -sk -m 5 https://${IP}:6443/api | 若 system:anonymous 返回非 403,则为高 |
| Kubernetes Dashboard | 8001 / 9090 / 30000+ | curl -sk -m 5 http://${IP}:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard | 若可访问,则为高 |
| kubelet | 10250(HTTPS),10255(HTTP,已弃用) | curl -sk -m 5 https://${IP}:10250/pods | 严重(无身份验证即可执行 Pod) |
| etcd | 2379(客户端),2380(对等节点) | curl -sk -m 5 https://${IP}:2379/v2/keys/(v2)或 etcdctl --endpoints=${IP}:2379 get /(v3) | 严重(集群状态与机密) |
| kube-proxy | 10256 | curl http://${IP}:10256/healthz | 信息 |
| kube-controller-manager | 10257 | curl https://${IP}:10257/metrics | 中 |
| kube-scheduler | 10259 | curl https://${IP}:10259/metrics | 中 |
| cAdvisor | 4194(已弃用) | curl http://${IP}:4194/metrics | 低(资源指标) |
| Helm Tiller(Helm 2——已弃用但仍可发现) | 44134 | helm --host ${IP}:44134 list | 高(Tiller 拥有集群管理员权限) |
检查是否有泄露的公共容器镜像仓库:
| 镜像仓库 | 搜索模式 |
|---|---|
| Docker Hub | https://hub.docker.com/search?q=<target-keyword>&type=image |
| Quay(Red Hat) | https://quay.io/search?q=<target-keyword> |
| GitHub Container Registry (GHCR) | 可通过 GitHub API 枚举:https://api.github.com/orgs/<org>/packages?package_type=container |
| Amazon ECR Public | https://gallery.ecr.aws/?searchTerm=<keyword> |
| Azure Container Registry(公共) | 不一;检查 *.azurecr.io |
| Google Container Registry(公共) | https://console.cloud.google.com/gcr/images/<project>?project=<project> |
逐个镜像扫描工作流:
docker pull <registry>/<image>:<tag>(或使用skopeo inspect)。docker save <image> -o /tmp/img.tar。- 提取各层;使用机密目录(§17)进行扫描。
- 检查
Dockerfile历史记录(docker history <image>)——有时会暴露构建参数或复制机密的操作。
16.19 CI/CD 平台暴露
| 平台 | 常见暴露路径 | 探测方式 |
|---|---|---|
| Jenkins | /script(Groovy 控制台 = 未启用身份验证时可实现 RCE)、/asynchPeople/、/jnlpJars/jenkins-cli.jar、/computer/、/job/<name>/api/json | curl -sk -m 10 "${T}/script" 和 curl -sk -m 10 "${T}/asynchPeople/api/json" |
| GitLab self-hosted | /users/sign_in(HTML 中包含版本信息)、/-/oauth/applications(需要身份验证)、/api/v4/version、/-/snippets/<id>/raw | curl -sk -m 10 "${T}/api/v4/version" |
| GitHub Actions 工作流文件 | 任意公开仓库中的 .github/workflows/*.yml | 使用 GitHub 代码搜索:path:.github/workflows extension:yml secrets |
| CircleCI 配置 | 任意仓库中的 .circleci/config.yml | 搜索:path:.circleci/config.yml |
| TeamCity | /login.html、/agent.html?agentId=*、/admin/admin.html | curl -sk -m 10 "${T}/login.html" | grep -i 'TeamCity' — 会泄露版本信息。CVE-2024-27198(KEV)。 |
| Bamboo (Atlassian) | /userlogin.action、/rest/api/latest/info | curl -sk -m 10 "${T}/rest/api/latest/info" |
| Drone CI | /api/info、/login | curl -sk -m 10 "${T}/api/info" |
| Travis CI (legacy) | 仓库中的 .travis.yml;https://api.travis-ci.com/repos/<owner>/<repo> | API 通常会暴露构建环境。 |
| Argo CD | /api/version、/applications | curl -sk -m 10 "${T}/api/version"。检查匿名身份验证配置。 |
| Tekton | /apis/tekton.dev/v1beta1/pipelineruns(K8s 原生) | 通过 K8s API 枚举。 |
| Spinnaker | /gate/info、/applications | curl -sk -m 10 "${T}/gate/info" |
| Buildkite | 各组织的仪表板;通常需要身份验证。 | 检查公开的 Agent 页面。 |
在工作流中查找 GitHub Actions 密钥泄露模式:
# Anti-pattern: secret echoed to log
run: echo "${{ secrets.MY_API_KEY }}"
# Anti-pattern: secret in environment without mask
env:
KEY: ${{ secrets.MY_API_KEY }}
run: ./deploy.sh # script may echo $KEY
# Anti-pattern: pull_request_target with checkout of fork code (CVE class)
on: pull_request_target
jobs:
test:
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }} # checks out fork code with secrets in env
16.20 文档 / Wiki 泄露路径
协作平台上的公开分享功能经常导致信息泄露。
| 平台 | URL 模式 | 暴露内容 |
|---|---|---|
| Notion (publish page) | *.notion.site/<slug> 或 notion.so/<workspace>/<page-id> | 公开页面;有时整个工作区会因误操作而公开。 |
| Confluence Cloud (anonymous) | <target>.atlassian.net/wiki/spaces/ | 公开空间;检查 /wiki/display/<SPACE>/。 |
| Atlassian Service Desk | <target>.atlassian.net/servicedesk/customer/portal/<N> | 有时会列出所有内部请求类型。 |
| Trello board | https://trello.com/b/<id>/<slug> | 包含卡片的公开看板;通过 Google 检查:site:trello.com "${target}"。 |
| Asana public project | https://app.asana.com/0/<id>/<id> | 公开项目视图。 |
| ReadTheDocs | <project>.readthedocs.io | 托管的文档;“private builds” 有时默认设为公开。 |
| GitBook | <workspace>.gitbook.io/<book>/ | 已发布的文档;有时包含内部 SOP。 |
| MkDocs / Docusaurus on subdomain | docs.<target> | 通常包含内部架构图和设置说明。 |
| Slab | <workspace>.slab.com/posts/<id> | 已发布的帖子。 |
| Coda | coda.io/d/<doc-id> | 公开文档。 |
| Miro | https://miro.com/app/board/<id>/ | 公开看板(通常包含架构图)。 |
| Lucidchart | https://lucid.app/lucidchart/<id>/view | 公开图表。 |
| Figma | https://www.figma.com/file/<key>/ | 公开设计文件;有时会泄露产品规格。 |
| GitHub Wiki | github.com/<org>/<repo>/wiki | 公开 Wiki;检查过时的 Wiki。 |
| Linear | linear.app/<workspace>/issue/<id> | 公开问题(很少见,但确实会发生)。 |
| Confluence anonymous server | <target>/confluence/、<target>/wiki/(self-hosted) | 有时会遗留允许匿名读取的设置。 |
| Monday.com | view.monday.com/<id> | 共享看板。 |
| Wrike | app.wrike.com/external/<id> | 对外共享的空间。 |
通过搜索语法发现目标:
site:notion.site "{target}"
site:notion.so "{target}"
site:atlassian.net "{target}"
site:trello.com "{target}"
site:miro.com "{target}"
site:lucid.app "{target}"
site:figma.com "{target}"
site:asana.com "{target}"
site:gitbook.io "{target}"
site:readthedocs.io "{target}"
16.21 WHOIS / RDAP / 历史记录
WHOIS 提供当前注册人信息;RDAP 是结构化的替代方案;历史 WHOIS 是关联分析的黄金资源。
当前 WHOIS:
whois target.example # standard CLI
curl -sk -m 10 "https://www.whois.com/whois/${D}" # web fallback
RDAP(RFC 7480,结构化 JSON):
# IANA bootstrap → returns the registry RDAP server
curl -sk "https://rdap.org/domain/${D}" | jq .
curl -sk "https://www.iana.org/rdap" | jq . # bootstrap registry
从 WHOIS / RDAP 中提取的信息:
- 注册人:姓名、组织、电子邮件、电话、地址(GDPR 实施后通常会被隐藏,但非欧盟注册人并非总是如此)。
- 注册商:可用于关联域名的注册商账户关联分析。
- 创建 / 更新 / 到期日期:批量注册的模式可表明注册人为同一人。
- 名称服务器:可用于名称服务器复用关联分析。
- 状态标志(
clientHold、clientTransferProhibited等)=安全态势指标。 - 滥用行为联系信息:有助于负责任地披露漏洞(§30)。
历史 WHOIS:
GDPR 实施前的记录通常包含未隐藏的联系信息。数据源:
| 数据源 | 说明 |
|---|---|
| DomainTools | 付费;行业黄金标准;完整 WHOIS 历史记录。 |
| WhoisXML API | 付费;支持批量查询和历史记录。 |
| SecurityTrails | 付费;WHOIS 和 DNS 历史记录。 |
| viewdns.info | 免费 WHOIS 历史记录(有限)。 |
| whoisology.com | 付费;按注册人电子邮件进行反向 WHOIS 查询。 |
反向 WHOIS 关联分析:
如果你有注册人的电子邮件,搜索“此电子邮件注册的所有域名”:
# DomainTools (paid)
curl -sk -H "X-API-Username: ..." -H "X-API-Key: ..." \
"https://api.domaintools.com/v1/reverse-whois/[email protected]"
这可以找到关联的企业资产(子公司域名、品牌变体、使用公司电子邮件的员工个人项目)。
16.22 DNS 记录目录(TXT 验证令牌、MX → IdP)
对于每个目标域名,导出所有常见记录类型:
D="target.example"
for rtype in A AAAA MX TXT NS SOA CAA SRV CNAME PTR; do
echo "=== ${rtype} ==="
dig +short "${D}" "${rtype}"
done
TXT 记录验证令牌目录(每个令牌都能揭示一个 SaaS 租户):
| TXT 模式 | SaaS / 服务 | 含义 |
|---|---|---|
google-site-verification=<token> | Google Workspace / Search Console / Analytics | 属于 Google 租户。 |
MS=ms<digits> | Microsoft 365(旧版) | 属于 M365 租户。 |
apple-domain-verification=<token> | Apple Business Manager / iCloud Calendar | 属于 Apple 生态系统。 |
atlassian-domain-verification=<token> | Atlassian Cloud(Jira/Confluence 等) | Atlassian 客户。 |
facebook-domain-verification=<token> | Facebook Business / Pixel | FB Business。 |
adobe-idp-site-verification=<token> | Adobe Sign / Creative Cloud | Adobe 客户。 |
docusign=<token> | DocuSign | DocuSign 客户。 |
dropbox-domain-verification=<token> | Dropbox Business | Dropbox 客户。 |
box-verification=<token> | Box | Box 客户。 |
webexdomainverification.<id> | Webex | Cisco Webex。 |
zoom_verify_<id> | Zoom | Zoom 客户(管理员域名)。 |
notion=<token>(少见) | Notion 工作区 | Notion 企业客户。 |
slack-domain-verification=<token> | Slack Enterprise Grid | Slack EG。 |
asana-domain-verification=<token> | Asana Enterprise | Asana 客户。 |
mongodb-site-verification=<token> | MongoDB Atlas | 数据库租户。 |
_dnsauth.<token> | 多种 ACME / Let's Encrypt CA | DNS-01 验证进行中。 |
pinterest-site-verification=<token> | Pinterest Business | 营销平台。 |
cisco-ci-domain-verification=<token> | Cisco Spark / Webex | Cisco。 |
_globalsign-domain-verification=<token> | GlobalSign 证书颁发机构 | 证书提供商。 |
mailru-verification:<token> | Mail.ru | 在俄罗斯开展业务。 |
yandex-verification:<token> | Yandex 服务 | 在俄罗斯开展业务。 |
zscaler-verification-<id>-<date>-<random> | Zscaler(ZIA / ZPA / ZDX) | Web SSE / SASE 客户;日期后缀是验证签发日期。 |
cloudflare-verify=<token> | Cloudflare(Zero Trust / Access / WARP) | Cloudflare 组织级客户。 |
autosect-site-verification=<token> | AutoSect(安全工具) | 租户中存在安全供应商。 |
cisco-site-verification=<token> | Cisco(各种产品) | Cisco 供应商。 |
mscid=<token> | Microsoft(新版 M365 验证) | 属于 M365 租户(新版格式)。 |
_amazonses=<token> | AWS SES 发件人验证 | SES 发件人。 |
salesforce-domain-verification=<token> | Salesforce | SF 客户。 |
workday-domain-verification=<token> | Workday | Workday 客户(人力资源和财务)。 |
shopify-domain-verification=<token> | Shopify | 电商客户。 |
klaviyo-domain-verification=<token> | Klaviyo | 营销自动化。 |
mailchimp-domain-verification=<token> | Mailchimp | 营销邮件。 |
hubspot-domain-verification=<token> | HubSpot | CRM / 营销。 |
zendesk-verification=<token> | Zendesk | 支持服务租户(另见 §43)。 |
freshworks-verification=<token> | Freshworks | 支持服务 / CRM 客户。 |
intercom-verification=<token> | Intercom | 消息服务租户。 |
loom-site-verification=<token> | Loom | 视频。 |
miro-site-verification=<token> | Miro | 白板租户。 |
gitlab-domain-verification=<token> | GitLab | 自托管或云端验证。 |
每个发现的租户都是独立的攻击面(拥有自己的凭据、MFA 安全状态和数据)。
通过 Autodiscover 确认的模式:
autodiscover.<domain> 解析到 Microsoft IP 地址段(40.96.0.0/13、52.96.0.0/14、13.107.0.0/16),即可确凿证明存在 M365 Exchange Online 租户——即使 MX 记录被 Mimecast/Proofpoint/Barracuda 入站过滤隐藏。探测:
Resolve-DnsName "autodiscover.$D" -Type A | Select Name,IPAddress
如果 IP 位于 Microsoft 地址段内 → M365_CONFIRMED。与 getuserrealm.srf(§22.1)交叉核对以提取租户 GUID。
CAA 记录:
dig +short CAA "${D}"
列出允许签发证书的 CA。缺少记录 = 低风险发现(任何 CA 都可能错误签发证书)。存在记录且列表具有限制性 = 良好的安全状态。
SOA 序列号模式分析:
dig +short SOA "${D}"
序列格式 YYYYMMDDNN 可揭示最后编辑日期。多个区域中出现的相同模式可能有助于关联归属。
16.23 Wayback CDX 深度用法
Wayback Machine 提供结构化查询 API。
基本 CDX 查询:
D="target.example"
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*&output=json&fl=timestamp,original&limit=10000"
返回 [timestamp, original_url] 元组组成的 JSON 数组。
实用筛选条件:
&from=20200101&to=20231231— 日期范围。&filter=mimetype:application/json— 仅 JSON 响应(通常为 API)。&filter=mimetype:application/javascript— JS 包。&filter=statuscode:200— 仅成功抓取的内容。&filter=urlkey:.*api.*— 仅包含 "api" 的 URL。&collapse=urlkey— 按 URL 去重。&collapse=digest— 按内容去重(可捕获重新存档的相同页面)。
获取特定快照:
TS="20231215120000"
URL="https://target.example/admin/dashboard"
curl -sk "https://web.archive.org/web/${TS}/${URL}"
对比快照与实时页面:
LIVE=$(curl -sk -m 10 "${URL}")
ARCHIVED=$(curl -sk -m 10 "https://web.archive.org/web/${TS}/${URL}")
diff <(echo "$LIVE") <(echo "$ARCHIVED") | head -100
保存当前页面:
curl -sk -X POST "https://pragma.archivelab.org/" \
-H 'Content-Type: application/json' \
-d '{"url":"https://target.example/admin"}'
查找每个归档的 JS 文件:
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.js&output=json&fl=timestamp,original&filter=statuscode:200" | \
jq -r '.[1:][] | "\(.[0]) \(.[1])"'
对每个文件,获取归档的 JS 并运行密钥目录(§17)。旧 JS 中通常包含后来被移除的硬编码密钥。
传统应用切入点(当 *.js 返回空结果时):
静态宣传型网站(较老的企业网站,尤其是 2015 年以前的网站)通常没有任何归档的 JS,因为前端是由服务器渲染的。可转而查找传统文件扩展名:
# ASP / ASP.NET classic
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.asp&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=500"
# PHP
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.php&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=500"
# JSP / .NET aspx / CGI / Coldfusion
for ext in aspx jsp cgi cfm; do
echo "=== .$ext ==="
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.${ext}&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=200"
done
# JSON / XML config (sometimes leaks endpoints + creds)
for ext in json xml yml yaml ini conf; do
echo "=== .$ext ==="
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.${ext}&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=100"
done
# Anything indexed (broad sweep — useful for legacy enumeration)
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=10000"
传统的 .asp / .cfm / .jsp URL 通常会暴露:被遗忘的管理面板、旧版用户枚举端点、传统身份验证流程、易受 SQL 注入攻击的参数。与当前 DNS 交叉比对——许多传统主机现在已返回 NXDOMAIN,但 URL 路径有时仍会保留在更名后的主机上。
16.24 常见前缀子域名扫描(主动、低可检测性)
根据实际情况:被动证书透明度枚举(crt.sh / VirusTotal / Subfinder)会漏掉 20–40% 的高价值子域名,原因包括:(a) 许多内部主机使用通配符证书,不会暴露 FQDN;(b) 某些主机从未颁发过公共证书(仅 HTTP 或自签名);(c) 最近配置的主机尚未同步到 CT 日志镜像。
务必将被动枚举与主动前缀探测配合使用。 可检测性:低(每台主机仅查询一条 A 记录;不进行端口扫描或 HTTP 请求)。
高命中率前缀列表(按真实测试中的命中率排序):
www, mail, webmail, smtp, imap, pop, owa, autodiscover, ftp, sftp,
vpn, sslvpn, gateway, gp, globalprotect, citrix, fortinet, anyconnect,
api, app, apps, mobile, m,
portal, login, sso, idp, iam, identity, accounts, oauth, auth, adfs,
admin, manage, console, dashboard, cp, cpanel,
intranet, internal, hr, payroll, finance, sap, erp, crm, helpdesk, servicedesk,
support, help, kb, status, monitoring, grafana, kibana, prometheus,
docs, wiki, confluence, jira, bitbucket, gitlab, jenkins, sonar, nexus,
git, svn, repo, code,
dev, test, staging, stg, qa, uat, sandbox, preprod, preview, demo,
careers, jobs, vacancies, recruit, eapps,
shop, store, ecommerce, checkout, payments, pay, billing,
old, legacy, archive, backup, beta, v1, v2, classic,
cdn, static, assets, media, img, files, downloads, public,
ns, ns1, ns2, dns, mx, mx1, mx2,
zoom, teams, slack, lync, sip, voice, meet,
sclepro, tender, tenders, suppliers, vendor, vendors, procurement, purchase
单行命令(PowerShell):
$D = "target.example"
$prefixes = @("www","mail","webmail","owa","autodiscover","ftp","vpn","sslvpn","gateway","api","app","portal","login","sso","idp","iam","identity","accounts","oauth","auth","adfs","admin","intranet","hr","sap","erp","crm","support","help","status","grafana","kibana","docs","wiki","jira","jenkins","gitlab","dev","test","staging","stg","qa","uat","sandbox","preprod","preview","careers","jobs","eapps","old","legacy","beta","tender","suppliers","procurement")
foreach ($p in $prefixes) {
$r = Resolve-DnsName "$p.$D" -Type A -ErrorAction SilentlyContinue
if ($r) {
$ips = ($r | ? {$_.IPAddress}).IPAddress -join ","
"$p.$D -> $ips"
}
}
单行命令(bash + dig):
D="target.example"
for p in www mail webmail owa autodiscover ftp vpn sslvpn gateway api app portal login sso idp iam identity accounts oauth auth adfs admin intranet hr sap erp crm support help status grafana kibana docs wiki jira jenkins gitlab dev test staging stg qa uat sandbox preprod preview careers jobs eapps old legacy beta tender suppliers procurement; do
IP=$(dig +short A "$p.$D" | head -1)
[ -n "$IP" ] && echo "$p.$D -> $IP"
done
批量 DNS 方案(适用于较大的前缀列表,速度更快):
# Generate candidate FQDNs from a wordlist; resolve in parallel via puredns
puredns resolve <(awk -v d="$D" '{print $1"."d}' assetnote-best-dns-wordlist.txt) -r resolvers.txt
从每个命中项中提取的信息:
- IP / IP 段 → ASN 查询(§28.1)→ 确认目标归属或由其他方托管。
- 对于
vpn.*/gateway.*/gp.*/globalprotect.*/citrix.*→ 在单独的测试范围内标记,以便主动进行供应商指纹识别(§16.16)。 - 对于
api.*/app.*→ 作为 §16.1–16.10 Web 应用探测的起点。 - 对于
staging.*/dev.*/uat.*→ 作为 §16.5 持续 HTTP 检查的起点(通常身份验证较弱,并带有调试端点)。 - 对于
intranet.*/eapps.*/sclepro.*→ 可公开访问的内网发现项(通常为 MEDIUM;参见 §40)。
真实测试验证:在一次内部冒烟测试中,前缀扫描发现了 vpn.、api.、intranet.、staging.、support.、eapps.、sclepro.、autodiscover.,而 crt.sh 均未发现(或返回 502)。应将被动与主动方法视为互补手段,而非替代方案。
17. 密钥模式目录 — 80 种模式(29 种基础模式 + 19 种现代模式 + 32 种供应商扩展)
该目录可用于检查任何文本来源:GitHub 代码、Postman 工作区、JS 正文、sourcesContent 数据块、移动应用字符串、Wayback HTML、粘贴站点、Stack Exchange 代码块。顺序很重要:先放最具体的模式,以免通用模式先行匹配,抢先匹配到类型明确的内容。
| # | 名称 | 正则表达式 | 严重级别 | 类别 |
|---|---|---|---|---|
| 1 | AWS 访问密钥 | \b(AKIA|ASIA)[0-9A-Z]{16}\b | CRITICAL | aws |
| 2 | AWS 密钥(明确类型) | (?i)aws[_\-]?secret[_\-]?access[_\-]?key['"\s:=]+([A-Za-z0-9/+=]{40}) | CRITICAL | aws |
| 3 | AWS 密钥(宽松匹配) | (?i)aws(.{0,20})?(secret|sk)["'=: ]+([0-9a-z/+=]{40}) | HIGH | aws |
| 4 | GCP 服务账号 JSON | "type"\s*:\s*"service_account" | CRITICAL | gcp |
| 5 | Google API 密钥 | \bAIza[0-9A-Za-z_\-]{35}\b | HIGH | gcp |
| 6 | GitHub 经典 PAT | \bghp_[A-Za-z0-9]{36}\b | CRITICAL | github |
| 7 | GitHub 细粒度 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 服务端到服务端 | \bgh[usr]_[A-Za-z0-9]{36,}\b | HIGH | github |
| 10 | Stripe 实时密钥 | \bsk_live_[0-9A-Za-z]{24,}\b | CRITICAL | stripe |
| 11 | Stripe 测试密钥 | \bsk_test_[0-9A-Za-z]{24,}\b | LOW | stripe |
| 12 | Slack 令牌 | \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 密钥 | \bSG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}\b | HIGH | email_svc |
| 15 | Mailgun 密钥(v1) | \bkey-[0-9a-zA-Z]{32}\b | HIGH | email_svc |
| 16 | Mailgun 密钥(宽松匹配) | \bkey-[0-9a-f]{32}\b | HIGH | email_svc |
| 17 | Twilio API 密钥 | \bSK[0-9a-fA-F]{32}\b | HIGH | twilio |
| 18 | Twilio 账号 SID | \bAC[a-f0-9]{32}\b | MEDIUM | twilio |
| 19 | Twilio 身份验证令牌 | (?i)twilio(.{0,20})?(auth|token)["'=: ]+([a-f0-9]{32}) | HIGH | twilio |
| 20 | Heroku API 密钥 | (?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(任意) | \beyJ[A-Za-z0-9_\-]{10,}\.eyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b | MEDIUM | jwt |
| 23 | Bearer 令牌赋值 | (?i)authorization["'=: ]+bearer\s+[A-Za-z0-9._\-]{20,} | MEDIUM | bearer |
| 24 | URL 中的 Basic 身份验证 | https?://[^/\s:@]+:[^/\s:@]+@[^/\s]+ | MEDIUM | basic_auth |
| 25 | RSA 私钥 | -----BEGIN RSA PRIVATE KEY----- | CRITICAL | private_key |
| 26 | EC 私钥 | -----BEGIN EC PRIVATE KEY----- | CRITICAL | private_key |
| 27 | OpenSSH 私钥 | -----BEGIN OPENSSH PRIVATE KEY----- | CRITICAL | private_key |
| 28 | 通用私钥 | -----BEGIN (DSA |PGP |)PRIVATE KEY----- | CRITICAL | private_key |
| 29 | 通用 API 密钥 | (?i)(?:api[_\-]?key|apikey|api_secret|access_token|secret[_\-]?token)['"\s:=]+["']([A-Za-z0-9+/=_\-]{24,})["'] | MEDIUM | generic |
| 30 | Anthropic API 密钥 | \bsk-ant-(?:api03|admin01)-[A-Za-z0-9_\-]{93,}\b | CRITICAL | ai_api |
| 31 | OpenAI API 密钥(旧版) | \bsk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}\b | CRITICAL | ai_api |
| 32 | OpenAI 项目密钥 | \bsk-proj-[A-Za-z0-9_\-]{40,}T3BlbkFJ[A-Za-z0-9_\-]{40,}\b | CRITICAL | ai_api |
| 33 | OpenAI 用户会话 | \bsess-[A-Za-z0-9]{40}\b | HIGH | ai_api |
| 34 | HuggingFace 令牌 | \bhf_[A-Za-z0-9]{30,}\b | HIGH | ai_api |
| 35 | Cloudflare API 令牌 | \b[A-Za-z0-9_\-]{40}\b(与 (?i)cloudflare/X-Auth-Key 上下文配对时) | HIGH | infra_api |
| 36 | Cloudflare 全局 API 密钥 | (?i)cf[_\-]?api[_\-]?key['"\s:=]+([a-f0-9]{37}) | CRITICAL | infra_api |
| 37 | DigitalOcean 令牌 | \bdop_v1_[a-f0-9]{64}\b | HIGH | infra_api |
| 38 | npm 令牌(新版) | \bnpm_[A-Za-z0-9]{36}\b | HIGH | package_registry |
| 39 | PyPI 令牌 | \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 令牌 | \bATATT3xFfGF0[A-Za-z0-9_\-]{180,}\b | HIGH | saas_api |
| 42 | New Relic 许可证密钥 | \b(?:NRAA|NRAK|NRBR)-[A-F0-9]{27}\b | MEDIUM | observability |
| 43 | DataDog API 密钥(在 DD_API_KEY 上下文中) | (?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 身份验证令牌 | \b[12][A-Za-z0-9]{26}_[A-Za-z0-9]{32,}\b(在 (?i)ngrok 上下文中) | MEDIUM | tunneling |
| 46 | Linear API 密钥 | \blin_api_[A-Za-z0-9]{40}\b | MEDIUM | saas_api |
| 47 | Discord 机器人令牌 | \b[MN][A-Za-z\d]{23}\.[\w\-]{6}\.[\w\-]{27}\b | HIGH | bot_token |
| 48 | Telegram 机器人令牌 | \b\d{8,10}:[A-Za-z0-9_\-]{35}\b | HIGH | bot_token |
提供商扩展(v2.2,#49–80)。 第 49 行(Postman PMAK)直接依据参考实现中的 modules/secrets_beyond_github.py::_RE_PMAK 编写——这是一个真实存在的缺口,因为 §23.1 已记录 PMAK 验证器,但目录中一直没有对应的检测正则。第 50–80 行补充了第 1–48 行未覆盖的提供商所使用的知名、前缀独特或依赖上下文锚定的令牌格式,并遵循同样的可靠性标准:仅当厂商自有前缀足够独特、不会发生冲突时,才独立检测(glpat-、sq0atp-、shpat_、dapi、.atlasv1.、GOCSPX-、ya29.、EAA、rubygems_、AKCp、SSWS 、xapp-1-、sl.、dp.pt.、hvs.、AAAA…:);凡是厂商自有令牌没有固定格式的情况,则依赖上下文锚定(沿用 §17 #35 中 Cloudflare 的方法),包括 PagerDuty、Asana、Fastly、Algolia、Segment、Airtable 旧版密钥、Azure/Entra 客户端密钥和 Okta 通用令牌。 | ||||
| # | 名称 | 正则表达式 | 严重性 | 类别 |
| --- | --- | --- | --- | --- |
| 49 | Postman API 密钥(PMAK) | \bPMAK-[A-Za-z0-9]{24,64}\b | 严重 | postman |
| 50 | GitLab 个人访问令牌 | \bglpat-[A-Za-z0-9_\-]{20}\b | 高 | gitlab |
| 51 | Square 访问令牌 | \bsq0atp-[0-9A-Za-z\-_]{22}\b | 严重 | square |
| 52 | Square OAuth 密钥 | \bsq0csp-[0-9A-Za-z\-_]{43}\b | 高 | square |
| 53 | Shopify 访问令牌 | \bshpat_[a-fA-F0-9]{32}\b | 高 | shopify |
| 54 | Shopify 共享密钥 | \bshpss_[a-fA-F0-9]{32}\b | 高 | shopify |
| 55 | Mailchimp API 密钥 | \b[0-9a-f]{32}-us[0-9]{1,2}\b | 高 | email_svc |
| 56 | PagerDuty API 密钥 | (?i)pagerduty(.{0,20})?(api|token|key)['"\s:=]+([A-Za-z0-9+_\-]{20,32}) | 中 | saas_api |
| 57 | Asana 个人访问令牌 | (?i)asana(.{0,20})?(token|pat)['"\s:=]+([0-9]{1,10}/[0-9]{10,20}:[a-f0-9]{32}) | 中 | saas_api |
| 58 | Databricks 个人访问令牌 | \bdapi[0-9a-f]{32}(?:-\d)?\b | 高 | saas_api |
| 59 | Grafana API 密钥(旧版) | \beyJrIjoi[A-Za-z0-9+/=]{40,}\b | 中 | observability |
| 60 | Grafana Cloud 访问策略令牌 | \bglc_[A-Za-z0-9+/]{32,}={0,2}\b | 中 | observability |
| 61 | Terraform Cloud/Enterprise 令牌 | \b[A-Za-z0-9]{14}\.atlasv1\.[A-Za-z0-9_\-=]{60,70}\b | 严重 | infra_api |
| 62 | Fastly API 令牌 | (?i)fastly(.{0,20})?(api|token)['"\s:=]+([A-Za-z0-9_\-]{32}) | 高 | infra_api |
| 63 | Algolia 管理 API 密钥 | (?i)algolia(.{0,20})?(admin|api)[_\-]?key['"\s:=]+([A-Za-z0-9]{32}) | 高 | saas_api |
| 64 | Segment 写入密钥 | (?i)segment(.{0,20})?(write)?[_\-]?key['"\s:=]+([A-Za-z0-9]{20,32}) | 低 | saas_api |
| 65 | Airtable API 密钥(旧版) | (?i)airtable(.{0,20})?(api)?[_\-]?key['"\s:=]+(key[A-Za-z0-9]{14}) | 中 | saas_api |
| 66 | Airtable 个人访问令牌 | \bpat[A-Za-z0-9]{14}\.[a-f0-9]{64}\b | 高 | saas_api |
| 67 | GCP OAuth 客户端密钥 | \bGOCSPX-[A-Za-z0-9_\-]{28}\b | 高 | gcp |
| 68 | Google OAuth 访问令牌 | \bya29\.[0-9A-Za-z_\-]{20,}\b | 高 | gcp |
| 69 | Google OAuth 客户端 ID | \b[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com\b | 低 | gcp |
| 70 | Azure AD / Entra 客户端密钥 | (?i)(?:azure|entra)[_\-]?(?:client|app)[_\-]?secret['"\s:=]+([A-Za-z0-9_~.\-]{34,40}) | 高 | azure |
| 71 | Facebook Graph API 访问令牌 | \bEAA[A-Za-z0-9]{90,}\b | 高 | oauth |
| 72 | RubyGems API 密钥 | \brubygems_[a-f0-9]{48}\b | 高 | package_registry |
| 73 | JFrog Artifactory API 密钥 | \bAKCp[A-Za-z0-9]{50,70}\b | 高 | infra_api |
| 74 | Okta SSWS 令牌 | \bSSWS\s+[0-9a-zA-Z_\-]{40}\b | 严重 | identity |
| 75 | Okta API 令牌 | (?i)okta(.{0,20})?(api)?[_\-]?token['"\s:=]+([0-9a-zA-Z_\-]{40}) | 高 | identity |
| 76 | Slack 应用级令牌 | \bxapp-1-[A-Za-z0-9\-]{20,}\b | 高 | slack |
| 77 | Dropbox 短期令牌 | \bsl\.[A-Za-z0-9_\-]{130,140}\b | 中 | oauth |
| 78 | Doppler 个人令牌 | \bdp\.pt\.[A-Za-z0-9]{40,44}\b | 严重 | secrets_mgmt |
| 79 | HashiCorp Vault 令牌 | \bhvs\.[A-Za-z0-9_\-]{90,100}\b | 严重 | secrets_mgmt |
| 80 | Firebase Cloud Messaging 服务器密钥(旧版) | \bAAAA[A-Za-z0-9_\-]{7}:[A-Za-z0-9_\-]{140,}\b | 高 | firebase |
误报说明:
- 模式 22(JWT)、23(Bearer)、29(通用)经常会在测试/示例数据中触发。务必查看上下文——
README.md示例代码块中的 JWT ≠ 生产.env文件中的 JWT。 - 模式 16(Mailgun 宽松模式)和模式 11(Stripe 测试模式)本来就容易产生误报;因此严重性设为低。
- 模式 24(URL 中的 Basic 身份验证)会捕获监控工具 URL 和 CI 调试 URL,也会捕获真实凭据——发出告警前请先核实。
- 对于 GitHub 的 Fine-grained PAT(模式 7),长度为
82是 GitHub 规范所定——如果匹配项明显长于或短于此长度,请持怀疑态度。 - 模式 56(PagerDuty)、57(Asana)、62(Fastly)、63(Algolia)、64(Segment)、65(Airtable 旧版)、70(Azure/Entra)、75(Okta 通用)采用上下文锚定,因为供应商令牌本身没有固定格式——请像处理模式 35(Cloudflare)一样谨慎。命中表示“同一行中出现供应商名称 + 符合密钥格式的值”,并不表示匹配项具有密码学上的独特性;升级处理前请先核实。
- 在仍会生成
eyJrIjoi…样式令牌的旧版自托管实例中,即使 URL 带有 Cloud 标识,模式 59(Grafana 旧版)和 60(Grafana Cloud)也可能同时命中同一密钥——将其视为一个发现,而非两个。 - 模式 69(Google OAuth Client ID)默认严重性为低:根据 OAuth 规范,客户端 ID 是公开标识符,而非秘密——此发现意味着配置/租户信息泄露,而非凭据泄露。若没有配对的客户端密钥(模式 67)或刷新令牌,请勿升级处理。
- 模式 80(FCM Server Key)可向该应用的所有已安装实例注入推送通知(大规模推送钓鱼内容/恶意软件),而非读取数据——请参阅 §21.1,了解这类问题通常出现的移动端静态分析背景。
18. 搜索引擎语料 — 80 多个模板,9 个类别
将 {domain} 替换为目标域名(例如 example.com),将 {company} 替换为公司名称(例如 Acme Corporation)。通过 Google、Bing、Brave、DuckDuckGo、Yandex、Baidu 运行——不同搜索引擎会呈现不同结果。
18.1 文件
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:properties
18.2 管理/登录面板
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:phpinfo
18.3 秘密/凭据泄露
"{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 云/CI/影子 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 文档/情报挖掘
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 漏洞指标
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-includes
18.7 内部工具暴露
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 备份/转储文件扩展名
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:dmp
18.9 特定行业(医疗保健/金融/政府)
# 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 结果分类
运行后,按 URL 特征 → 标题提示 → 摘要正则表达式对每个结果进行评分:
- 严重级别 URL 特征:
.pem、.p12、.pfx、.key扩展名;id_rsa文件名。 - 高严重级别 URL 特征:
/.env、/.git/、数据库转储、wp-config.bak、/phpmyadmin、/jenkins、/phpinfo.php。 - 中严重级别 URL 特征:
/admin、/login、/swagger、.log、/backup、.DS_Store。 - 只有在摘要内容(例如摘要中命中秘密信息正则表达式)的严重级别更高时,才会覆盖 URL 特征。
- 置信度:仅摘要匹配 = 暂定(操作员必须访问 URL 进行确认;标记 detectability=medium)。
19. 针对目标的 GitHub 代码搜索 Dork — 13 个
将每个模板应用于 {target}(根域名词干,例如 acme)、{domain}(完整根域名,例如 acme.com),以及可选的 {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 context
要求: GitHub personal access token(任意范围;建议使用具有只读仓库访问权限的 fine-grained PAT)。每个令牌都有速率限制;并发数上限 ≤5。
对于每个结果:
- 通过 GitHub Contents API 获取文件(或相关片段)。
- 运行秘密信息目录(§17)。
- 如果命中秘密信息 → 生成
SECRET_LEAK发现,严重级别采用目录中的设置;证据 = 仓库 URL + 文件路径 + 匹配的秘密信息(截断,仅保留末尾 4 个字符)。 - 可选:将仓库克隆到临时目录,运行
trufflehog/gitleaks扫描完整历史。
20. 端点兴趣评分——0–100 评分标准
对于每个已分类的端点(方法论技能中的 §22),应用此评分标准:
| 信号 | 分值 | 条件 |
|---|---|---|
| 未认证写入 | +40 | POST/PUT/DELETE/PATCH 端点匿名访问时返回 200/201/202/204。 |
| 开放的 GraphQL 内省 | +35 | 匿名执行 __schema 查询时返回完整类型列表。 |
| 动词篡改绕过 | +30 | OPTIONS 揭示未记录的方法;该方法可访问。 |
| 反射式 CORS + 凭据 | +25 | Access-Control-Allow-Origin 反射请求的 Origin,且 Access-Control-Allow-Credentials: true。 |
| 路径中包含敏感关键词 | +20 | 路径匹配以下任一项:admin、internal、debug、user、password、token、key、export、upload、backup、config、secret、private、delete、purge、wipe。 |
| 错误中泄露架构信息 | +20 | 响应正文包含堆栈跟踪、ORM 错误类或框架特征(例如 ActiveRecord::RecordNotFound、org.hibernate.exception.*、django.db.utils.IntegrityError)。 |
| URL 中包含 API 密钥 | +15 | 路径或查询字符串包含 api_key=、apikey=、token=、access_token=。 |
| 通配符 CORS | +10 | Access-Control-Allow-Origin: *。 |
| 缺少速率限制标头 | +10 | 没有 RateLimit-* / X-RateLimit-* 标头;快速连续请求后没有 Retry-After。 |
阈值:
| 分数 | 严重性 |
|---|---|
| ≥ 90 | 严重 |
| 70–89 | 高 |
| 50–69 | 中 |
| 25–49 | 低 |
| < 25 | 信息 |
分数 ≥ 70 时,在证据中附加 attack_path_hint(参见 §29)。
21. 移动应用归属置信度——0–100 评分标准
在运行深入的 APK 静态分析之前,评估发现的应用是否确实属于目标。阈值:≥70 = 接受。
| 信号 | 分值 |
|---|---|
软件包反向 DNS 与目标域名匹配(例如,com.acme.android ⟂ acme.com) | +40 |
开发者电子邮件为 <anything>@<target-domain> | +25 |
| 开发者网站 URL 是目标域名(或已确认的关联品牌域名) | +20 |
| 应用名称包含运营者提供的品牌列表中的关键词 | +10 |
| 应用评分评论数达到最低阈值(默认 20 条评论) | +5 |
低于阈值的应用会标记为 mobile_review_pending 并显示,但不进行分析。运营者可以使用 --mobile-ownership-threshold 50 重新评分,以进行更宽泛的采集。
21.1 APK 静态分析流水线
应用通过 §21 的归属门槛后,运行此流水线。仅进行被动静态分析——不使用 Frida/模拟器进行插桩,不让应用访问实时后端,也不重放捕获的应用流量。使用 §23 的只读验证器确认泄露的密钥是否有效;使用 §16.8/§16.17 确认开放的云服务面(Firebase、S3、GCS)——这些是单独且明确的步骤,不会刻意合并到此流程中。
A. 获取
| 来源 | 方法 | 说明 |
|---|---|---|
| Google Play | 使用 pip install google-play-scraper(§46.9)获取元数据 | Play 的公开界面不会分发二进制文件本身 |
| APKPure | 抓取下载页面 HTML,提取 .apk 链接 | 无需登录;友好的速率限制;主要的自动化来源 |
| APKMirror | 通过浏览器手动下载 | 反自动化措施比 APKPure 更严格;仅作备用 |
| iOS IPA | 由运营者提供,放入本地 ipa_uploads/ 目录 | 绝不自动下载 .ipa——出于 DMCA 考量;若运营者将其纳入范围,则在原位置进行分析 |
curl -s "https://apkpure.net/$(echo com.acme.android | tr . -)/com.acme.android/download" \
| grep -oE 'https://[^"]+\.apk[^"]*' | head -1
B. 反编译工具链
# apktool — resources + manifest to readable XML (not raw AXML)
apktool d app.apk -o out/
# aapt2 (Android SDK build-tools) — manifest dump without full unpack
aapt2 dump badging app.apk
aapt2 dump xmltree app.apk --file AndroidManifest.xml
# jadx — Java source recovery from classes.dex (for logic review, not just strings)
jadx -d out_src/ app.apk
Windows:使用 apktool.bat;aapt2.exe 位于 %LOCALAPPDATA%\Android\Sdk\build-tools\<ver>\aapt2.exe 下(通过 Android Studio SDK Manager 或 sdkmanager --install "build-tools;34.0.0" 安装);使用便携版 jadx 压缩包中的 jadx.bat,或使用 jadx-gui.exe 进行交互式审查。
无工具链替代方案——纯 Python,参考实现自身的 mobile_attack_surface.py 所用方案(不依赖 apktool/jadx):
pip install androguard
from androguard.core.apk import APK
a = APK("app.apk")
print(a.get_package(), a.get_effective_target_sdk_version())
print(a.get_permissions())
manifest_xml = a.get_android_manifest_axml().get_xml() # decoded AndroidManifest.xml
C. 解析 AndroidManifest.xml
- 导出组件测试(这是大多数人工审查容易忽略的细节):如果
android:exported="true",或者未设置exported且声明了<intent-filter>,则该组件实际上已导出。不要只用 grep 搜索exported="true"。 <application>上的android:debuggable="true"— 生产环境中的调试攻击面。android:allowBackup— 如果完全未设置此属性,默认值为"true"。 大多数清单都不会设置它,因此缺少该属性并不意味着没有风险。android:usesCleartextTraffic— 显式设置为"true"会允许整个应用使用未加密的 HTTP(API ≥28 默认值为false,因此显式设置为"true"是有意覆盖默认值的操作,应重点标记)。- 自定义
<permission>声明 — 检查android:protectionLevel。normal或dangerous表示任何已安装的应用都可以持有此权限;保护已导出组件 IPC 的敏感自定义权限应设为signature。 <application>上的android:networkSecurityConfig引用 — 转到下方步骤 G。
D. 深层链接 / intent-filter 提取
遍历每个 activity / activity-alias / service / receiver 的 <intent-filter><data android:scheme=… android:host=…/></intent-filter>。对于每一组 scheme://host:
- 标记组件名称或主机包含
auth、token、reset、callback、oauth、sso或login的处理程序 — 这些深层链接值得利用(攻击者可控的查询参数会传入身份验证 / 令牌流程)。 - 区分 App Links(
https://scheme +android:autoVerify="true"+ 主机上存在匹配的.well-known/assetlinks.json)与自定义 scheme(myapp://)。只有自定义 scheme 可被注册相同 scheme 的第二个应用劫持 — App Links 由操作系统通过域名验证。
E. Firebase / GCP 配置提取
google-services.json→project_info.project_id,以及每个client[].api_key[].current_key(项目的默认 Google API 密钥,通常权限范围过宽)。GoogleService-Info.plist(iOS 包)→PROJECT_ID、API_KEY、GCM_SENDER_ID。- 此处的提取仅读取 APK。参考实现自身的流水线会更进一步,使用提取出的
project_id探测规范的 Firebase 端点(RTDB/.json、Firestore、Storage 列表)——这是对实时后端的检查,而非静态分析;请通过 §16.8 中云存储桶式的工作流,将其作为单独且明确的步骤执行,不要在此流程中悄悄进行。
F. 嵌入式密钥 — 复用 §17
提取每个文本块,并通过 scripts/secret_scan.py(§48)或 §17 原始表格进行扫描:
# Unpack once, scan everything under it in one pass
unzip -o app.apk -d out/
python3 scripts/secret_scan.py out/
# Strings out of native libs (classes.dex string-pool is already covered by
# apktool's baksmali output / jadx's decompiled source under out_src/)
find out/lib -name '*.so' -exec strings {} \; | python3 scripts/secret_scan.py
# assets/ specifically — bundled credential files, not just string hits
find out/assets -type f \( -iname '*.pem' -o -iname '*.p12' -o -iname '*.jks' \
-o -iname '*.keystore' -o -iname '*.env' -o -iname 'google-services.json' \)
FCM Server Key(§17 #80)和 GCP/Firebase 系列(§17 #4、#5、#67–69)是这里最可能触发的条目 — 它们正是为这种移动端侦察场景添加的。
G. 网络安全配置
res/xml/<name>.xml,由清单的 android:networkSecurityConfig 属性引用(已在步骤 C 中记录)。参考实现自身的流水线只会记录此引用作为证书固定标记,不会解析该文件。请手动提取(使用步骤 B 中 apktool/aapt2 的输出),并检查:
<base-config>级别的cleartextTrafficPermitted="true"— 对其覆盖的域名而言,这会覆盖清单中usesCleartextTraffic="false"的设置。<trust-anchors><certificates src="user"/></trust-anchors>— 接受用户安装的 CA,这意味着无需绕过即可信任代理 CA(Burp/mitmproxy)。这是实践中应用“本该启用证书固定却没有”的最常见原因 — 虽然声明了 pin-set,但宽松的信任锚仍会让 MITM 代理通过;这种带有测试配置的构建意外发布到生产环境的情况并不少见。<pin-set>条目 — 注意expiration日期;pin-set 过期后会悄无声息地停止强制执行。
H. 发现项 + 严重性
| 发现项 | 严重级别 |
|---|---|
android:debuggable="true" | 严重 |
| 内嵌密钥(按 §17 目录中的严重级别) | 按 §17 |
| 敏感深层链接处理程序(包含 auth/token/reset 关键词) | 高 |
android:allowBackup="true"(包括未设置/默认值) | 中 |
android:usesCleartextTraffic="true" | 中 |
| 未受保护的导出组件(无权限) | 中 |
| 持有高风险权限(RECORD_AUDIO、READ_SMS、BIND_ACCESSIBILITY_SERVICE 等) | 中 |
| 其他敏感权限 | 低 |
| 缺少证书固定/用户信任锚设置过于宽松 | 低 |
每一行的完整示例和理由见 §40(搜索“android”/“deep-link”/“exported”)——本表用于快速查阅,§40 提供详细说明。
交叉引用: §21(先运行归属门控——切勿对无关应用进行深入分析)、§17/§48(密钥目录和扫描器可原样用于反编译文本)、§23(对这里提取的任何看起来有效的内容使用只读验证器)、§40(严重级别的详细示例)、§46.9(工具安装命令)。
22. 身份体系 — 具体端点
方法论见配套的 osint-methodology 技能 §11。本文提供 URL/载荷参考。
22.1 Microsoft Entra(Azure AD)
OIDC 元数据 + 租户 GUID 提取:
GET https://login.microsoftonline.com/{tenant-or-domain}/.well-known/openid-configuration
响应字段 issuer 包含租户 GUID。GUID 正则表达式:
\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}\b
可检测性:低。
getuserrealm.srf — 托管与联合探测:
GET https://login.microsoftonline.com/getuserrealm.srf?login=<probe-user>@<domain>
响应:包含 NameSpaceType 字段(Managed / Federated / Unknown)的 JSON。联合模式还包含 FederationBrandName 和 AuthURL(上游 IdP 的 URL)。可检测性:低。
Autodiscover v2:
POST https://autodiscover-s.outlook.com/autodiscover/metadata/json/1
Body: {"Email": "<probe-user>@<domain>"}
返回用户的协议端点;若存在,则表明用户属于该租户。可检测性:低。
Autodiscover IP 关联(被动确认 M365):
解析 autodiscover.<domain>,并检查它是否指向 Microsoft Exchange Online 的 IP 地址范围。即使 MX 记录被 Mimecast/Proofpoint/Barracuda 入站过滤服务代理,这种方法仍然有效;在这种情况下,仅凭 MX 无法揭示底层邮件平台。
dig +short A autodiscover.target.example
Resolve-DnsName "autodiscover.$D" -Type A | Select Name,IPAddress
Microsoft Exchange Online IP(常见网段的截取列表):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。完整列表:Office 365 URL 和 IP 地址范围。
如果 autodiscover.<domain> 指向该地址范围 → 即使没有其他迹象,也可确认 M365_CONFIRMED。可检测性:低(被动 DNS)。
GetCredentialType — 用户枚举(仅深度模式):
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
}
响应字段 IfExistsResult 表示用户是否存在:0 = 存在,1 = 不存在,5 = 用户存在于联合租户中。可检测性:中(会记录在租户审计日志中)。每个租户最多尝试 20 次。
22.2 Okta
**组织 slug 推导:**从发现的子域名词干和根域名词干开始。探测 <slug>.okta.com 和 <slug>.oktapreview.com。Slug 正则表达式:
[a-z0-9][a-z0-9-]{1,40}\.okta(?:preview)?\.com
OIDC 指纹识别:
GET https://<slug>.okta.com/.well-known/openid-configuration
/api/v1/authn 用户枚举(深度模式):
POST https://<slug>.okta.com/api/v1/authn
Content-Type: application/json
Body: {"username": "<email>", "password": "invalid_password_for_enum"}
响应可区分用户是否存在:
400且包含errorCode: E0000004→ 用户不存在(某些配置中也可能是通用密码错误)。401且状态为PASSWORD_WARN/LOCKED_OUT/MFA_REQUIRED→ 用户存在。 可检测性:中(每次尝试都会记录在审计日志中)。每个租户最多尝试 20 次。
22.3 ADFS
被动指纹识别:
GET https://{domain}/adfs/idpinitiatedsignon.aspx
如果 200 OK 响应的 HTML 中包含 urn:com:microsoft:ADFS: 引用,则表明使用了 ADFS。可在 HTML 资源引用中搜索版本字符串。
Mex 端点(深度模式):
GET https://{domain}/adfs/Services/Trust/mex
返回 SOAP 联合元数据,包括端点 URL、签名证书和受支持的声明类型。
22.4 Google Workspace
OIDC 发现:
GET https://{domain}/.well-known/openid-configuration
由 Google Workspace 托管的域客户会公开具有特征性 issuer URI(https://accounts.google.com)和 JWKS URI 的发现端点。指向 aspmx.l.google.com 的 MX 记录是佐证信号。
22.5 通用 OIDC(Keycloak / Auth0 / Ping / OneLogin / Duo)
**发现:**在每个存活的子域名上探测 /.well-known/openid-configuration。issuer 和 authorization_endpoint 字段中的 URL 可用于识别产品:
| 产品 | issuer 中的 URL 模式 |
|---|---|
| Auth0 | https://*.auth0.com |
| OneLogin | https://*.onelogin.com |
| Ping | https://*.pingone.com、https://*.pingidentity.com |
| Duo | https://*.duosecurity.com |
| Keycloak | URL 包含 /realms/<realm> |
| OneLogin | https://*.onelogin.com |
22.6 SAML 元数据
参见 §16.6。
22.7 AWS 账户 ID 提取
S3 存储桶区域标头(被动):
HEAD https://<known-bucket>.s3.amazonaws.com/
响应中包含 x-amz-bucket-region。结合存储桶名称的熵值和已知模式进行交叉比对,以确定账户范围。
ARN 正则表达式(适用于任何 JSON / HTML / JS 响应):
arn:aws:[a-z0-9\-]+:[a-z0-9\-]*:([0-9]{12}):
捕获组:12 位 AWS 账户 ID。
AccountId 属性模式:
(?i)["']?account[_\-]?id["']?\s*[:=]\s*["']([0-9]{12})["']
Google OAuth client_id:
\b\d{8,}-[a-z0-9]{10,40}\.apps\.googleusercontent\.com\b
MSAL / Microsoft client_id(GUID 属性):
(?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 作用域提取:
(?i)["']?scope["']?\s*[:=]\s*["']([^"']+)["']
22.8 Microsoft 365 深度枚举(Teams / SharePoint / OneDrive / OAuth)
Teams 联邦状态:
# 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 子域名探测:
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'
done
正确解读结果:这些探测返回 HTTP 200 表示租户存在(Microsoft 会提供通用的重定向到身份验证页面),并不表示匿名用户可以访问租户内容。请区分:
- 200 → 租户已配置(INFO)。
- 200 + 通过 dork 发现的自定义匿名共享 URL(
/sites/<x>/Lists/<y>/AllItems.aspx?guestaccesstoken=...)→ HIGH(数据暴露)。 - 401/403 → 租户存在,但需要身份验证(INFO)。
- 404 / NXDOMAIN → 此前缀下未配置租户(或使用了自定义名称 — 检查证书透明度数据中的已知前缀)。
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 个人站点探测(适用于已知邮箱 [email protected]):
USER_TOKEN=$(echo "[email protected]" | 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 provisioned
在 JS 中发现 M365 OAuth client_id:
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}'
设备代码钓鱼目标检查(在 OIDC 元数据中查找 device_authorization_endpoint):
curl -sk -m 10 "https://login.microsoftonline.com/${TARGET_DOMAIN}/v2.0/.well-known/openid-configuration" | \
jq '.device_authorization_endpoint'
如果该值非空且租户未限制设备代码:发现 MEDIUM(可实施设备代码钓鱼)。
要检查的 Power Platform / Dynamics URL:
*.crm.dynamics.com(按区域划分:crm、crm2-crm15、crm.dynamics.com)。*.api.crm.dynamics.com(Web API)。make.powerapps.com/flow.microsoft.com(需要身份验证的仪表板)。
严重性:
- 发现 SharePoint/OneDrive 租户 → INFO(仅为资产)。
- SharePoint 匿名共享链接 → HIGH(数据暴露)。
- 租户启用了
device_authorization_endpoint→ MEDIUM(运营风险)。 - 目标发布了具有广泛 Graph 作用域的多租户 OAuth 应用 → HIGH。
22.9 GraphQL 字段建议枚举(禁用内省时)
当标准内省查询(§16.2)返回 "errors":[{"message":"GraphQL introspection is disabled"}] 时,改用字段建议枚举。Apollo 和大多数 GraphQL 库默认启用“你是不是想找”建议。
检测探测:
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.
字段建议探测(故意拼错字段名以触发建议):
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\"?"
遍历候选字段词表(使用 SecLists 的 Discovery/Web-Content/graphql.txt 或 clairvoyance 库的种子列表)。每条建议都会揭示真实字段名。持续探测,直到不再出现新建议。
工具:
- Clairvoyance(
pip install clairvoyance)——自动化字段建议枚举器。clairvoyance -w wordlist.txt -o schema.json https://target.example/graphql。 - GraphQL-Cop ——用于探测内省、批处理、深度限制和建议配置的审计工具。
pip install graphql-cop。 - InQL(Burp 扩展)——用于分析 GraphQL 端点的 Burp Suite 扩展。
- GraphQL Voyager ——重建架构后用于可视化。
禁用内省时的其他 GraphQL 技术:
-
基于别名的查询批处理(限速/绕过身份验证攻击面):
{ "query": "{ a:user(id:1){name} b:user(id:2){name} c:user(id:3){name} ... }" }许多 API 按请求限速,而不是按别名限速。每个请求测试 100 个以上的别名。
-
绕过查询深度限制(DoS/绕过内省):
{ "query": "{ user { friends { friends { friends { friends { id } } } } } }" }如果服务端允许任意深度 → DoS 攻击面;如果限制了深度,但不剥离嵌套的
__type/__schema→ 可通过深度绕过内省。 -
通过 WebSocket 枚举订阅:
wscat -c "wss://target.example/graphql" -s graphql-ws > {"type":"connection_init"} > {"id":"1","type":"start","payload":{"query":"subscription { __schema { types { name } } }"}} -
绕过批处理查询限制(某些服务端会处理批次中的所有查询,即使第一个查询失败):
[ {"query":"{ __schema { types { name } } }"}, {"query":"{ user(id:1) { name } }"} ]
严重性:
- 字段建议枚举成功(可恢复 50 个以上字段)→ MEDIUM
MISCONFIG。 - 别名批处理未限速 → MEDIUM(绕过限速攻击面)。
- 订阅端点无需身份验证即可访问 → MEDIUM(常用于实时数据窃取)。
23. 只读密钥验证器
使用这些工具确认发现的凭据是否有效。只读,绝不执行破坏性操作。 每次验证都标记 detectability 和 checked_at(UTC)。
23.1 Postman API Key(PMAK-*)
检测正则:§17 #49(\bPMAK-[A-Za-z0-9]{24,64}\b,CRITICAL)。使用以下方式验证命中项:
GET https://api.getpostman.com/me
Header: X-Api-Key: PMAK-<key>
200→ 有效;响应包含{user: {id, username, email}}。401→ 无效。- 范围:完全读取用户的 Postman 账户(集合、环境变量、历史记录)。
- 可检测性:低。
23.2 AWS Access Key
sts:GetCallerIdentity
使用 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']
- 有效 → 返回账户 ID、ARN 和 UserId。
- 无效 →
InvalidClientTokenId或SignatureDoesNotMatch。 - ARN 范围:
:user/表示 IAM 用户(范围广),:assumed-role/表示临时角色(范围窄),:root表示账户根用户(请勿验证发现的根用户密钥)。 - 可检测性:中(CloudTrail 会在账户
<found>中记录GetCallerIdentity)。
23.3 GitHub PAT
GET https://api.github.com/user
Header: Authorization: token <ghp_*>
200→ 有效;响应包含login、id、name、email(如果公开)。- 响应头
X-OAuth-Scopes列出令牌权限范围。repo权限范围 = 可写入所有可访问的仓库;admin:org= 组织管理员。 401→ 无效。- 可检测性:低。
23.4 Slack Token
POST https://slack.com/api/auth.test
Header: Authorization: Bearer <xox*-*>
- 返回
{"ok": true}的200→ 有效;响应包含team、team_id、user、user_id。 - 返回
{"ok": false, "error": "invalid_auth"}的200→ 无效。 - 可检测性:低。
23.5 Anthropic API Key
GET https://api.anthropic.com/v1/models
Headers:
x-api-key: sk-ant-api03-...
anthropic-version: 2023-06-01
200→ 有效;响应列出可用模型。401→ 无效。- 返回 org_disabled 的
403→ 密钥有效,但组织已禁用。 - 可检测性:低;工作区所有者可在 Anthropic Console 中查看用量。
23.6 OpenAI API Key
GET https://api.openai.com/v1/models
Header: Authorization: Bearer sk-...
200→ 有效;列出模型(可能包括组织专属微调模型)。401→ 无效。429→ 有效,但配额已用尽。- 可检测性:低;用量可在 OpenAI 控制面板中查看。
23.7 npm Token
GET https://registry.npmjs.org/-/whoami
Header: Authorization: Bearer npm_<token>
200,且返回{"username": "<user>"}→ 有效。401→ 无效。- 检查权限范围:
GET /-/npm/v1/tokens返回令牌的权限(读取/发布)。 - 可检测性:低。
23.8 Atlassian API Token
GET https://<workspace>.atlassian.net/rest/api/3/myself
Auth: Basic <base64(email:ATATT3xFfGF0_...)>
200→ 有效;返回账户资料和电子邮件。401→ 无效。- 需要工作区 — 从泄露的仓库 URL 或 Atlassian dork 搜索结果中提取。
- 可检测性:低。
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→ 两个密钥均有效。403→ 至少一个密钥无效。- URL 因区域而异:
api.datadoghq.eu、api.us3.datadoghq.com等。 - 可检测性:低;会出现在 DataDog 审计日志中。
23.10 验证器输出架构
{
"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 硬性规则
- 仅使用只读端点。
- 绝不要使用已验证的凭据创建、修改、删除或发送任何内容。
- 为每次验证标记可检测性。
- 记录
checked_at(UTC)。 - 如果 RoE 禁止验证 →
validation_skipped_by_policy,停止并记录。 - 对于 AWS 根密钥、具有基础设施写入权限的 GitHub PAT,或 Slack 管理员令牌 — 标记并交由操作人员决定。
23.12 发现后的枚举工作流
确认密钥有效后,通常需要枚举它能执行哪些操作。请保持只读。
AWS 访问密钥 — IAM 枚举:
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 — 仓库枚举:
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="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 — 完整分流工作流:
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 API
Postman PMAK — 工作区枚举:
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="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 budget
OpenAI API 密钥 — 用量枚举:
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 .
通用密钥 — 来源枚举:
- 找到使用该密钥的域(该密钥出现在 JS bundle 的什么位置?该 bundle 由哪个 URL 提供?)。
- 查看推断出的服务的 API 文档。
- 如果密钥符合已知正则表达式,查询供应商专属的权限范围检查方法。
- 如果服务未知,在 GitHub 上搜索密钥前缀(
gh search code "<prefix>" --type=code)。 - 验证前先确定权限范围;某些密钥首次使用时就具有广泛的写入权限。
24. Postman 公共工作区通用搜索
Postman 的公共搜索端点无需身份验证,并会索引所有设为公开的工作区。
已验证的端点格式(2025 年年中起):
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[]'
该端点通过 Postman Web 应用代理到其内部搜索服务。通过 from 分页(0、100、200……)。
如果代理格式发生变化(历史上曾发生过):从 Postman Web UI 检查实际的搜索请求:
- 在浏览器中打开
https://www.postman.com/explore。 - 打开 DevTools → Network 选项卡。
- 搜索任意词语。
- 找到
_api/...请求 — 复制为 cURL — 并据此调整。
逐个工作区遍历:
对于每个匹配的工作区 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[]'
所有权评分信号:
- 创建者/团队名称提及目标域或品牌 → 强。
- 工作区名称/描述提及目标 → 强。
- 请求 URL 中包含
*.target.com→ 最强信号(该工作区正主动用于调用目标的 API)。
对提取出的所有文本块运行机密目录(§17),包括请求、环境变量、预请求脚本和测试脚本中的内容。
25. Stack Exchange OSINT 扫描
Stack Exchange 及其姊妹站点收集开发者粘贴的代码 — 其中许多包含机密、内部主机名和专有代码片段。
要查询的网站(信号最强的 8 个):
stackoverflow.com
serverfault.com
dba.stackexchange.com
devops.stackexchange.com
security.stackexchange.com
superuser.com
sharepoint.stackexchange.com
salesforce.stackexchange.com
API:
GET https://api.stackexchange.com/2.3/search/advanced
?site=<site>
&q=<target>
&filter=withbody
&pagesize=100
代码块提取正则表达式:
<pre><code>([\s\S]*?)</code></pre>
(Stack Exchange 使用 <pre><code> HTML 包装代码。)
工作流:
- 在每个站点上搜索目标名称、品牌和根域名。
- 从
bodyHTML 中提取代码块。 - 对每个代码块运行机密目录(§17)。
- 将帖子作者的电子邮件(个人资料中公开时)与 email_osint 发现结果交叉比对 — 确认员工发布了目标的内部代码。
- 从代码块中提取主机名 → 更新或插入
subdomain资产。
配额: Stack Exchange API 在没有密钥时每天允许 30 次请求;使用免费密钥时每天允许 10,000 次。每次调用至少间隔 2 秒。
26. 公共 SaaS 协作平台
许多 SaaS 协作工具都支持公开分享。像使用搜索引擎一样,用搜索语法查找它们。
事故率较高的平台:
trello.com
notion.so / notion.site
*.atlassian.net (Jira / Confluence)
miro.com
asana.com
clickup.com
airtable.com
搜索语法模板:
site:{platform} "{target-keyword}"
通过搜索引擎适配器运行(默认使用 DDG;Bing / Brave / Yandex / SerpAPI 可选)。适用与 §18.7 相同的分类逻辑。
常见发现:
- 公开的 Trello 看板,其卡片标题或附加配置文件中包含凭据。
- 公开的 Notion 页面,其中包含内部 SOP、代码块中的 API 密钥和客户数据。
- 公开的 Confluence 空间,其中的入职文档包含种子凭据。
- 公开的 Miro 看板,其中的架构图暴露了内部主机名。
27. 子域名来源堆栈(被动)
实用参考:列出“在 2026 年实际能返回有用数据的来源”,并按召回率排序:
| 来源 | 层级 | 备注 |
|---|---|---|
| crt.sh | 免费 | 单一来源中,基于证书的子域名数据最全面;高峰时段经常返回 502 — 参见下方备用链。 |
| VirusTotal | 免费增值 | 域名 → 被动 DNS 历史记录。 |
| AlienVault OTX | 免费 | 被动 DNS + URL 数据。 |
| Shodan | 付费(低阶) | 通过 domain: 过滤器枚举子域名。 |
| BinaryEdge | 付费 | 与 Shodan 类似。 |
| FOFA | 免费增值 | 中国地区覆盖率高。 |
| ZoomEye | 免费增值 | 与 Shodan 类似;中国地区覆盖率高。 |
| Netlas | 付费 | 大规模 HTTP/DNS/证书关联查询。 |
| SecurityTrails | 付费 | 被动 DNS + 资产发现。 |
| RapidDNS | 免费 | 公开的被动 DNS。 |
| Subfinder bundled | 免费 | 通过一个 CLI 汇总 30 多个免费来源。 |
| Amass | 免费 | 功能类似,覆盖更全面,但速度更慢。 |
| Recon-ng | 免费 | 模块化框架;内置许多免费数据源。 |
**DNS AXFR 机会利用:**对发现的每台名称服务器尝试区域传送:
dig @<ns-host> <target-domain> AXFR
大多数 NS 会拒绝;未拒绝的意味着完整区域信息泄露(严重)。
**暴力破解层级:**使用 Subfinder/Subbrute 对 assetnote.io 字典进行扫描(整理质量最高的公开字典来源)。
27.0.1 crt.sh 故障?备用链(按顺序尝试)
crt.sh 在一台繁忙的 Postgres 前运行着单个 nginx;高峰时段出现 502 / 503 / 超时是常见情况。不要循环重试——改用其他来源:
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 '.[]'
带重试功能并回退到 Subfinder 的 PowerShell crt.sh 封装:
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 子域名与内容暴力枚举词表来源
| 来源 | URL | 备注 |
|---|---|---|
| Assetnote Wordlists | https://wordlists.assetnote.io/ | 精心整理,定期更新。子域名 top-N(1k、10k、100k、1M、10M);按 CMS/框架分类的内容路径;按供应商分类(AWS、Azure、GitLab 等)。 |
| SecLists | https://github.com/danielmiessler/SecLists | 庞大的集合。子域名:Discovery/DNS/subdomains-top1million-110000.txt。内容:Discovery/Web-Content/。 |
| jhaddix all.txt | https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056 | 长期维护的精选词表。 |
| OneListForAll | https://github.com/six2dez/OneListForAll | 汇总型词表,规模很大(数百万条)。 |
| dirsearch wordlists | https://github.com/maurosoria/dirsearch | 随工具打包。 |
| raft-large-words.txt | SecLists 中的 Discovery/Web-Content/raft-large-words.txt | 经受时间检验的内容词表。 |
| bo0om wordlist | https://github.com/bo0om/wordlists | 适配俄语。 |
| commonspeak2 | https://github.com/assetnote/commonspeak2-wordlists | 根据 BigQuery 提交数据生成。 |
| fuzzdb | https://github.com/fuzzdb-project/fuzzdb | 模糊测试载荷与词表。 |
| PayloadsAllTheThings | https://github.com/swisskyrepo/PayloadsAllTheThings | 按漏洞类别整理的载荷(较少用于枚举,更多用于后续测试)。 |
| 按目标定制 | n/a | 最佳实践:根据目标自身内容生成自定义词表(从其公开网站、LinkedIn 和招聘页面提取所有词语 → 去重 → 用作种子词表)。 |
规模指南:
- <10k 条 → 快速检查子域名(1–2 分钟);用于机会式补充或被动枚举补充。
- 10k–100k 条 → 标准深度(10–30 分钟);用作默认暴力枚举规模。
- 100k–1M 条 → 全面枚举;适用于已知价值很高的目标(1–4 小时)。
- >1M 条 → 穷举;仅用于持续一周的测试项目;预计会遇到速率限制。
工具:
# 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. 基础设施与攻击面 OSINT
- Shodan、Censys — 搜索互联网设备与证书。
- GreyNoise — 区分背景噪声与定向扫描。
- SecurityTrails — 被动 DNS 与资产发现。
- SpiderFoot — 自动化侦察与关联分析。
- theHarvester — 子域名、电子邮件与元数据。
- Recon-ng — Web 侦察框架。
- Amass / Subfinder — 被动子域名枚举。
- BuiltWith — 技术栈枚举。
- Netlas — 大规模 HTTP/DNS/证书关联查询。
- BinaryEdge / FOFA / ZoomEye — 可补充 Shodan/Censys。
- RiskIQ PassiveTotal — 被动 DNS/证书/主机关联查询。
- Spur — IP 查询。
- Robtex — 被动 DNS 与基础设施查询。
28.1 ASN/BGP 与互联网测量
批量 IP → ASN — 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 ([email protected])" "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 .
注意事项:
bgpview.ioAPI 有严格且未公开的速率限制(约 1 req/min/IP);不适合批量查询。bgp.he.net没有公开 API;只能抓取 HTML,容易失效。PeeringDB用于查询设施/IX 信息,不适合按 IP 查询 ASN。- 批量查询(>50 个 IP):使用上文的 Cymru 批量格式;它支持在一个 TCP 会话中提交数百个 IP。
28.2 证书与 CT 监控
- crt.sh、Censys Certificates、CertStream(实时 CT WebSocket)、Rapid7 Open Data、Cert Spotter(免费增值)。
- **Favicon mmh3 哈希:**跨主机对基础设施进行聚类;结合 Shodan/Censys 的 favicon 搜索,发现共享基础设施。
28.3 Web 技术 / TLS / 指纹识别
- httpx(ProjectDiscovery) — 兼容 Wappalyzer 的约 600 种签名、JARM、favicon mmh3、TLS 证书 SHA256、安全标头、截图。推荐用作一次性探测封装工具,探测数千台主机。
- JARM — TLS 握手哈希;在每种服务器配置下保持稳定;可用于聚类。
- 用于技术枚举的 Wappalyzer 浏览器扩展或 CLI。
28.4 TLS 深度审计
除了证书 SAN 和 JARM,还要检查密码套件、协议和配置质量。
sslyze(最全面):
pip install sslyze
sslyze --regular target.example:443
sslyze --json_out=tls.json target.example:443
报告内容:支持的协议(TLS 1.0/1.1/1.2/1.3)、每种协议的密码套件、证书链、OCSP、密钥信息、robot/heartbleed/lucky13/poodle/freak/logjam/drown/ccs/ticketbleed。
testssl.sh(全面且输出易读):
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:443
nmap 脚本替代方案(较轻量):
nmap --script ssl-enum-ciphers,ssl-cert -p 443 target.example
检查以下问题:
| 问题 | 严重程度 | 检查内容 |
|---|---|---|
| 支持 TLS 1.0 / 1.1 | MEDIUM | 已弃用;PCI-DSS 禁止使用 TLS 1.0。 |
| 支持 SSL 3.0 / 2.0 | HIGH | 已严重弃用。 |
| 弱密码(RC4、3DES、CBC 模式) | MEDIUM | RC4 = NOMORE 攻击;3DES = SWEET32。 |
| 匿名 DH | HIGH | 无身份验证。 |
| 生产环境使用自签名证书 | MEDIUM | 信任失败。 |
| 证书已过期 | MEDIUM | 运维与信任失败。 |
| 证书有效期过长(>397 天) | LOW | 自 2020 年起浏览器会发出警告。 |
| 通配符证书覆盖关键主机 | INFO | 私钥泄露时存在运维风险。 |
| 密钥长度弱(<2048 RSA、<256 ECDSA) | HIGH | 密码学强度不足。 |
| Heartbleed(CVE-2014-0160) | CRITICAL | 内存泄露。 |
| ROBOT(CVE-2017-13099) | HIGH | Bleichenbacher 攻击。 |
| CCS 注入(CVE-2014-0224) | HIGH | 特定于 OpenSSL。 |
| Ticketbleed(CVE-2016-9244) | HIGH | 特定于 F5 的内存泄露。 |
| 未设置 HSTS(§16.4 已涵盖) | MEDIUM | 标头审计。 |
JA3 / JA4 参考数据库:
- ja3er.com — 社区整理的 JA3 → 客户端软件映射。
- TLS Fingerprint DB — 研究资料汇总。
- 对于服务器 JARM:搜索 Shodan
ssl.jarm:<hash>,查找共享基础设施 / 可能的源站(参见 §16.15)。
28.5 反向 DNS 扫描与 IPv6 枚举
当目标拥有 IP 范围(其 ASN)时,对其进行枚举。
反向 DNS 扫描(在范围内):
# 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"'
大规模 DNS 方法(更适合大型范围):
# zdns: install via go install github.com/zmap/zdns/cmd/zdns@latest
prips 203.0.113.0/22 | zdns PTR
仅扫描 Banner(无需 DNS 往返):
# masscan + banner-grab
sudo masscan -p80,443 203.0.113.0/22 --rate=1000 --banners -oX masscan.xml
IPv6 枚举:
IPv6 的枚举实践较少(巨大的地址空间使暴力枚举不可行),但 AAAA 记录和已知分配前缀仍然有用。
# 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 prefix
BGP 路由观测:
- RouteViews —
http://archive.routeviews.org/(免费;历史 BGP 路由表快照)。 - RIPE RIS —
https://ris.ripe.net/(免费;路由收集器)。 - 使用这些资源检测针对目标前缀的路由劫持(防御性情报;有时可作为 IOC)。
从第三方 IP 进行反向 DNS Pivot:
如果第三方在 PTR 记录中显示了目标域名(例如,托管服务提供商的某个 IP 的 PTR 记录为 customer-acme.example.com.hostingprovider.net),这可以作为 Pivot,查找同一提供商 / 数据中心的相邻客户基础设施。
29. 威胁情报与 IOC
- 厂商 / CERT 公告:CISA/NSA/CSA 联合公告、CERT-EU、NCSC-UK、JPCERT/CC、CERT-UA。
- MISP Project 和公开的 MISP 信息源。
- OpenCTI — CTI 知识图谱。
- Malpedia — 恶意软件家族、YARA、参考资料。
- ThreatFox、URLHaus、SSLBL。
- MalwareBazaar — 基于哈希的样本共享。
- PhishTank、OpenPhish。
29.1 恶意软件分析与沙箱
- 静态分析:pefile、FLOSS、capa。
- 相似度:SSDEEP、TLSH。
- 沙箱:ANY.RUN、Hybrid Analysis、CAPE、Tria.ge。
- 情报:Intezer(代码复用)、VirusTotal — 注意:上传的内容会公开。
- TLS:JA3、JA4。
29.2 漏洞优先级排序数据源
方法论见配套技能 §28。此处列出具体数据源。
| 来源 | URL | 可提供的信息 |
|---|---|---|
| NVD | https://nvd.nist.gov/vuln/search(或 API services.nvd.nist.gov/rest/json/cves/2.0) | 基础 CVE 目录,包含 CVSS v2/v3 评分。 |
| EPSS | https://www.first.org/epss/(CSV 文件位于 https://epss.cyentia.com/epss_scores-current.csv.gz) | 未来 30 天内遭利用的概率,范围为 0.0-1.0。每日更新。 |
| CISA KEV | https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | 已证实在实际环境中遭利用的 CVE,以及联邦机构的截止日期。 |
| ExploitDB | https://www.exploit-db.com/;可通过 searchsploit 使用离线数据库 | 是否存在 POC 代码(Metasploit、Python、shell)。 |
| Metasploit 模块目录 | https://www.rapid7.com/db/modules/(或 msfconsole > search cve:CVE-2024-XXXX) | 是否可通过自动化方式利用。 |
| InTheWild.io | https://inthewild.io/ | 社区整理的“正在遭利用”追踪信息。 |
| OpenCVE | https://www.opencve.io/ | 时间线 + 关注列表 + 警报。 |
| Trickest CVE → POC 映射 | https://github.com/trickest/cve | 自动生成的 CVE → 公开 POC 仓库链接。 |
| GitHub 安全公告 | https://github.com/advisories | 按语言 / 生态系统划分的公告。 |
| MITRE CVE 列表 | https://cve.mitre.org/cve/ | 官方 CVE 注册表。 |
| VulnDB | https://vulndb.cyberriskanalytics.com/ | 付费;商业化信息补充。 |
| OSV.dev | https://osv.dev/ | 开源漏洞数据库;JSON API。 |
| Vulncheck KEV | https://vulncheck.com/kev | 扩展版 KEV 信息源(覆盖范围超过 CISA)。 |
| Tenable Research | https://www.tenable.com/research | Tenable 的 CVE 详情补充信息。 |
| Qualys ThreatPROTECT | https://threatprotect.qualys.com/ | Qualys 的威胁背景补充信息。 |
工作流:
# 1. Get EPSS score for a CVE
curl -sk "https://api.first.org/data/v1/epss?cve=CVE-2024-3400" | jq '.data[0]'
# 2. Check if in CISA KEV
curl -sk https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
jq '.vulnerabilities[] | select(.cveID == "CVE-2024-3400")'
# 3. Check ExploitDB
searchsploit cve 2024-3400
# 4. Check Metasploit
msfconsole -q -x "search cve:2024-3400; exit"
批量优先级排序(给定包含 N 个 CVE 的 Nuclei 扫描输出):
# Extract CVEs from nuclei JSON output
jq -r '.info.classification.["cve-id"][]?' nuclei-results.json | sort -u > cves.txt
# Annotate each with EPSS + KEV
while IFS= read -r CVE; do
EPSS=$(curl -sk "https://api.first.org/data/v1/epss?cve=$CVE" | jq -r '.data[0].epss // "N/A"')
KEV=$(curl -sk https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
jq --arg c "$CVE" '.vulnerabilities[] | select(.cveID == $c) | .vulnerabilityName // empty')
KEV_FLAG=$([ -n "$KEV" ] && echo "KEV" || echo "")
echo "$CVE | EPSS:$EPSS | $KEV_FLAG"
done < cves.txt | sort -t: -k2 -nr
29.3 HackerOne 已披露报告参考
使用 skills/offensive-osint/scripts/h1_reference.py(无需 API 密钥,使用公开的 GraphQL)在测试时获取经社区验证的发现作为参考。在会话开始时运行该脚本,查询目标的技术栈或攻击类型。
主要模式:
# Top voted community reports — best validated techniques
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --limit 25
# Highest bounty reports — business-impact framing reference
python3 skills/offensive-osint/scripts/h1_reference.py --top-bounty --limit 10
# Keyword search across pages (50 results/page)
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "SSRF" --pages 10
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "auth bypass|OAuth|OIDC" --pages 5
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "open redirect" --pages 5
# Filter by severity (client-side)
python3 skills/offensive-osint/scripts/h1_reference.py --top-bounty --severity critical high --pages 3
# Program-specific disclosures (requires program handle)
python3 skills/offensive-osint/scripts/h1_reference.py --program gitlab --pages 5
python3 skills/offensive-osint/scripts/h1_reference.py --lookup-program gitlab # resolve handle → team ID
# JSON output for piping / jq
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "XSS" --pages 5 --json | jq '.[].report.url'
运行时机:
- 会话开始时:使用
--top-voted加载高信号基线 - 确认目标的技术栈后:使用
--query "<tech>" --pages 10 - 探测特定攻击类别前:使用
--query "SSRF|XXE|SSTI" --pages 5 - 撰写报告时:使用
--query "<vuln type>" --top-bounty查找严重程度/赏金相近的案例
H1 GraphQL 注意事项(已记录):
- 每页最多返回 50 条结果,与
first:的值无关;使用--pages扩大查询范围 disclosed_at字段与子状态筛选器结合时会导致 H1 服务崩溃,因此已省略- 排序与子状态筛选器组合使用时会导致服务崩溃;脚本会自动绕开此问题
30. 加密货币 OSINT
30.1 区块链浏览器
| 链 | 浏览器 |
|---|---|
| Bitcoin | Blockchain.com、Blockchair |
| Ethereum | Etherscan |
| BNB Chain | BSCScan |
| Polygon PoS | PolygonScan |
| Solana | Solscan |
| 多链 | OKLink(免费增值)、Cielo |
30.2 L2/Rollup 浏览器
| L2 | 浏览器 | 备注 |
|---|---|---|
| Arbitrum | Arbiscan | Optimistic rollup;7 天挑战期。 |
| Optimism | Optimistic Etherscan | Optimistic rollup;7 天挑战期。 |
| Base | BaseScan | OP Stack。 |
| Blast | Blastscan | OP Stack 衍生项目。 |
| Scroll | Scrollscan | zkEVM。 |
| zkSync Era | zkSync Era Block Explorer | zkRollup;最终确认速度更快。 |
| Polygon zkEVM | PolygonScan zkEVM | zkEVM。 |
| StarkNet | Voyager、StarkScan | Cairo VM;地址派生方式不同。 |
| 跨 L2 | L2Beat | 风险框架 + TVL 对比。 |
30.3 交易追踪与分析
- Arkham — 多链、实体标签、图表、警报。
- TRM — 地址/交易图表。
- MetaSleuth — 可视化资金流。
- Breadcrumbs(免费增值)— 可视化图表 + 标签。
- Bubblemaps — 持有者集中度。
- Whale Alert — 大额交易监控。
- Chainalysis/Crystal Blockchain — 专业分析。
- GraphSense — 开源加密货币分析。
- Nansen — Smart Money 标签(付费)。
- Dune — 自定义查询。
- Token Sniffer — 貔貅盘/诈骗检测。
30.4 NFT/交易所/跨链桥
31. 媒体情报
31.1 反向图像搜索与人脸搜索
- Google Images、TinEye、Yandex Images(擅长俄语/东欧地区)、PimEyes、FaceCheck。
31.2 图像取证
31.3 视频分析
31.4 媒体浏览器扩展
- Fake News Debunker (InVID & WeVerify)。
- RevEye Reverse Image Search。
- EXIF Viewer Pro。
- Wayback Machine Extension。
- Search by Image。
32. 地理空间情报
32.1 卫星与制图
- Google Maps、Bing Maps。
- Sentinel Hub EO Browser、NASA Worldview、Zoom Earth。
- Wayback Imagery — 历史卫星影像。
- NASA FIRMS、Open Infrastructure Map、Windy。
32.2 地理定位工具
街景: Google Street View、Apple Maps、Yandex Maps、Baidu Maps。
32.3 航班 OSINT
- FlightRadar24、FlightAware、RadarBox。
- ADSBExchange — 未过滤。
- Planespotters — 机队/机身历史。
- AirFrames、JetPhotos。
32.4 海事 OSINT
- MarineTraffic、VesselFinder、FleetMon。
- Global Fishing Watch — 船舶行为 + AIS 信号间隙分析。
33. AI 辅助 OSINT
**警告:**切勿将 PII、敏感 IOC 或独特的关联线索粘贴到云端大模型中。它们会记录输入内容,并可能将其用于训练。敏感分析请使用本地模型。
| 工具 | 优势 |
|---|---|
| ChatGPT(付费) | 日志解析、数据集分析、用于 CSV/JSON 的 Code Interpreter、视觉 OCR。 |
| Claude(付费) | 200K token 上下文,可处理大量文档并综合生成报告。 |
| Gemini | 长上下文;Deep Research 模式支持引用来源。 |
| Perplexity Pro(付费) | 实时网页搜索 + 推理。 |
本地/保护隐私:Ollama、LM Studio、GPT4All。
33.1 商业 AI OSINT 平台
- Cylect — 实体提取 + 关联分析。
- Fivecast Matrix — 面向社交媒体数据集的生成式 AI 分类。
- Recorded Future — AI 驱动的威胁情报。
- DarkOwl Vision — 暗网数据分析。
33.2 深度伪造与合成媒体检测
34. 归档与证据保全
- archive.today — 单页归档器 + 截图。
- URLScan.io — 网页扫描 + 资源映射。
- ArchiveBox — 可自托管(HTML、PDF、截图、媒体)。
- Hunchly — 调查人员证据采集(付费)。
- Wayback SavePageNow API v3 — 按需归档并生成作业 ID。
- SingleFileZ — 用于离线 HTML 的浏览器扩展。
- Kasm Workspaces — 基于容器的 OSINT 浏览器隔离。
证据处理: URL + UTC 时间戳 + PNG + WARC/SingleFileZ 归档;对所有下载内容计算 SHA-256 哈希;每个案件使用单独的工作配置文件;证据以只读方式存储;JSONL 运行日志记录 run_id + 工具版本。
35. 自动化与工作流
- n8n — 可自托管的工作流自动化(RSS → 抓取 → 告警流水线)。
- Huginn — 基于 Agent 的监控/抓取/告警。
- Playwright — 搭配隐身插件的无头浏览器自动化。
- Browsertrix Crawler — 支持导出 WARC 的归档爬取。
- Prefect / Apache Airflow — 工作流编排。
36. 跨模块 Sidecar 协调
运行多模块侦察时,后续到达的输出需要传递给已在运行的模块。采用以下模式:
- 每个模块完成后,将 Sidecar JSON 写入已知位置:
<scan>/mobile_endpoints.json— 从 APK 静态分析中提取的端点 + 主机名。<scan>/secrets_sidecar.json— secrets-beyond-github 扫描中发现的主机名 + 端点 + Firebase 项目 ID。<scan>/sso_tenants.json— 为泄露关联分析发现的 IdP 租户。
- 下游模块启动时检查 Sidecar;若存在,则将其载入。
- 交叉传递:API 发现模块同时使用
mobile_endpoints.json和secrets_sidecar.json;SSO×泄露关联分析使用sso_tenants.json和泄露数据库。
Sidecar 结构(mobile_endpoints.json 示例):
{
"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"]
}
实现临时的多工具侦察(无平台)时,请使用 tmpdir + JSON sidecars + a one-line manifest 模式。该模式可组合、易于调试且可重放。
37. 区域搜索引擎
- 俄罗斯 / 独联体: Yandex、Mail.ru Search。
- 中国: Baidu、Sogou、360 Search。
- 俄罗斯社交平台: VK、OK.ru。
- 中国社交平台: Weibo、Bilibili、Zhihu、Douyin。
38. Telegram 与消息情报
- TGStat — 频道分析与搜索。
- Telemetr — 频道增长、重叠情况和转发数据。
- Combot — 群组分析(部分功能需付费)。
- TelegramDB Search Bot — 基础 Telegram OSINT。
- TGScope — 根据频道数字 ID 估算频道创建日期/年龄(查询工具);还支持按含义以任意语言搜索公开频道。
- Discord ID — 基础 Discord 账户信息。
- 搜狗微信搜索 — 微信公众号。
- 查看公开 Telegram 频道:
https://t.me/s/<channel>。
39. 攻击路径提示模式
报告 HIGH/CRITICAL 级 API 端点发现(评分 ≥ 70)时,请在证据中包含一句 attack_path_hint,以便操作人员了解从何处开始利用。模板:
| 触发条件 | 攻击路径提示 |
|---|---|
| 未认证的 POST / PUT / DELETE | *"未认证的 {method} {path} — 尝试 IDOR + 权限提升;检查数字 ID 是否连续或可猜测。" * |
| 开放的 GraphQL 内省 | *"{path} 上开放 GraphQL 内省 — 枚举 mutations,查找名称类似 createUser、setRole、transferFunds 的操作;转而利用认证缺陷或业务逻辑漏洞。" * |
| 反射型 CORS + 凭据 | *"{path} 上的反射型 CORS 支持凭据 — 在攻击者控制的源上托管 CSRF 页面;受害者的浏览器会泄露 {sensitive-data-hint}。" * |
| 通配符 CORS + 敏感数据 | *"{path} 上的通配符 CORS 会返回与用户关联的数据,且无需凭据 — 从受害者访问的任意页面发起跨源 fetch 以窃取数据。" * |
| HTTP 方法篡改 | *"HTTP 方法篡改:仅允许 {visible-method} 的文档化端点却允许 {hidden-method} → 可能存在缺少方法检查的授权缺陷;尝试使用有效身份验证执行 {hidden-method} {path}。" * |
| URL 中的 API 密钥 | *"URL 中的 API 密钥:?{param}=... — 令牌会泄露到访问日志、浏览器历史记录、Referer 标头和第三方 CDN。检查 Wayback / Google 中是否有缓存副本。" * |
| 错误信息泄露架构 | *"错误响应泄露架构 — 暴露了框架特征 {framework};映射已知的 {framework} 漏洞并构造有针对性的载荷。" * |
| 敏感关键词 | *"路径包含“{keyword}” — 检查是否存在直接对象引用、批量赋值或隐藏的管理员功能。" * |
| 开放的 RTDB Firebase | *"开放的 Firebase RTDB:位于 https://{project}.firebaseio.com/.json — 读取全部数据,然后使用 PUT 在 /<random-key>.json 上测试写入,以判断 ACL 范围。" * |
| 可列举的云存储桶 | *"可列举的 {provider} 存储桶 {bucket} — 递归列出对象并分析 content-type;查找备份、日志、客户数据以及 JSON 配置中的 AWS 密钥。" * |
| 暴露的 .git | *"{host} 上暴露了 .git/config — 使用 git-dumper 或 githacker 重建仓库;可获取完整源代码历史。" * |
| 暴露的 .env | *"{host} 上暴露了 .env — 搜索 _KEY、_SECRET、_TOKEN、_PASSWORD;使用 §23 验证器以只读方式验证所有凭据。" * |
| /actuator/env | *"Spring Boot 的 /actuator/env 已暴露 — 转储环境变量;查找 spring.datasource.password、JWT 密钥和云凭据。" * |
| /actuator/heapdump | *"Spring Boot 的 /actuator/heapdump 已暴露 — 下载 HPROF,运行 jhat 或 VisualVM,在堆字符串中搜索明文密钥。" * |
| 开放的 Elasticsearch | *"{host}:9200 上开放的 Elasticsearch — 使用 /_cat/indices?v 获取索引列表;从每个高价值索引中抽取示例文档;向 /test-idx/_doc 测试写入以判断 ACL。" * |
| 开放的 Redis | *"{host}:6379 上开放的 Redis — 执行 INFO、KEYS * 并抽样读取;通过 CONFIG SET 然后执行 BGSAVE 写入 authorized_keys,检查是否有写入权限。" * |
| 开放的 MongoDB | *"{host}:27017 上开放的 MongoDB — 执行 show dbs、show collections 和示例 find 查询;检查用户集合中是否有密码哈希。" * |
| 子域名接管 | *"{host} 的 CNAME 指向未被认领的 {provider} 资源 → 在 {provider} 上注册 {takeover-target},即可从 {host} 提供内容;进一步在受信任域名上实施钓鱼或内容注入。" * |
| 开放的 kubelet | *"{host}:10250 上开放的 kubelet — 使用 GET /pods 列出 Pod;使用 POST /run/<ns>/<pod>/<container> 在容器内执行命令,无需 K8s API 身份验证。" * |
| 开放的 etcd | *"{host}:2379 上开放的 etcd — 使用 etcdctl get / --prefix --keys-only 获取完整集群状态;存储的密钥位于 /registry/secrets/ 下。" * |
| K8s API 允许匿名访问 | *"{host}:6443 上的 Kubernetes API 启用了匿名身份验证 — 执行 kubectl --server=https://{host}:6443 --insecure-skip-tls-verify get pods --all-namespaces。" * |
| 未修补的 Citrix | *"{host} 上的 Citrix NetScaler 版本 {ver} 易受 CVE-{cve} 影响(已列入 KEV);参阅厂商公告;不要利用漏洞,但应标记并提醒客户端立即修补。" * |
| 暴露的 F5 BIG-IP TMUI | *"{host} 上的 F5 BIG-IP TMUI 可访问;适用 KEV 中的 CVE-2022-1388 / CVE-2023-46747;建议立即安装厂商发布的热修复程序。" * |
| 可访问的 VMware vCenter | *"{host} 上的 vCenter 无需 VPN 即可访问;如果未修补,则易受 CVE-2021-21972 RCE 影响;检查版本标识。" * |
| 未经身份验证的云函数 URL | *"AWS Lambda Function URL 可通过 {url} 匿名访问 — 检查 IAM 身份验证配置;如果设计上无需身份验证,应严格审计输入验证。" * |
| npm 拼写抢注候选包 | *"包名 {candidate} 尚未注册,且与目标发布的 {official} 相似 — 存在拼写抢注风险;建议客户端采取防御措施进行注册。" * |
| 缺少或宽松的 DMARC | *"{domain} 上的 DMARC 为 p=none — {anything}@{domain} 的伪造邮件可送达收件人;观察报告后,建议将策略升级为 p=quarantine 或 p=reject。" * |
| 有效的 AI API 密钥(Anthropic/OpenAI) | *"已验证可访问模型的 sk-{provider}-... 密钥 — 配额费用可能被盗用;立即轮换密钥,并在提供商控制台中审计使用日志。" * |
| 公开的 Slack 邀请链接 | *"可通过搜索引擎发现 Slack 工作区邀请链接 — 任何人都可以加入工作区,无需审批;可轻易访问内部频道。" * |
| 开放的 Docker 注册表 | *"{host} 上的 Docker 注册表公开可访问 — GET /v2/_catalog 可列出镜像;拉取镜像并扫描各层中的嵌入式密钥。" * |
| 有效的 Telegram 机器人令牌 | *"已验证 Telegram 机器人令牌 — getUpdates 会暴露机器人的接收方(管理员聊天);如果 getMe 显示机器人位于频道中,则可完整读取消息。" * |
含有 sourcesContent[] 的 Sourcemap | *"{host} 上的 Sourcemap 包含嵌入的原始源代码 — 可重建完整前端代码;搜索内联密钥和内部主机名。" * |
40. 严重性决策矩阵——示例讲解
如有疑问,请参考这些示例(均来自真实项目):
| 发现 | 严重性 | 原因 |
|---|---|---|
生产 Web 应用可访问 /.git/config | 严重 | 完整源代码泄露;可还原秘密历史记录。 |
生产 Web 应用可访问 /.env | 严重 | 明文凭据(数据库、云、API)。 |
| 开放的 Firebase RTDB 可返回数据 | 严重 | 所有应用数据均可读取;通常也可写入。 |
| 可列出包含 PII 的 S3 存储桶 | 严重 | 可直接窃取数据。 |
| 可列出仅包含日志的 S3 存储桶 | 高 | 日志中的内部主机名和路径可用于进一步渗透。 |
暴露了 Spring Boot /actuator/env | 严重 | 环境变量中包含数据库凭据、JWT 密钥和云密钥。 |
暴露了 Spring Boot /actuator/heapdump | 严重 | 堆内存中以字符串形式包含实时密钥。 |
开放的 Elasticsearch(/_cat/indices 可返回结果) | 严重 | 可读取全部数据;通常也可写入。 |
| 开放的 MongoDB(无身份验证) | 严重 | 可读取全部数据和密码哈希集合。 |
| 开放的 Redis(无 AUTH) | 严重 | 写入 authorized_keys → 获得 SSH 立足点。 |
| 开放的 Docker API(端口 2375) | 严重 | 可接管容器和主机。 |
| 公开的 PMAK 已验证可用且权限范围广 | 严重 | 可完全控制 Postman 账户及所有团队工作区。 |
| 公开的 AWS root 访问密钥已验证可用 | 严重 | 可完全控制账户。 |
| 在 GitHub 上发现可用的 AWS IAM 用户密钥 | 高 | 权限范围有限(取决于 IAM 策略);通常可进一步提升权限。 |
| 在 JS 包中发现可用的 GitHub PAT | 高 | 可写入仓库(取决于权限范围)。 |
| 在 pastebin 中发现可用的 Slack 令牌 | 高 | 可访问工作区数据和历史记录;有时还能在频道中发帖。 |
生产环境中可访问源码映射文件(.js.map) | 高 | 前端源代码泄露。 |
| 生产环境开放了 GraphQL introspection | 高 | 可获取完整 schema → 发现 mutations 和业务逻辑。 |
| 存在子域名接管风险(Heroku / GitHub Pages / 等) | 高 | 接管后可在受信任域名上实施钓鱼。 |
/api/billing 上的 CORS 会反射来源并允许凭据 | 高 | 可通过 CORS 对账单数据实施 CSRF。 |
| HTTP 方法篡改:仅记录为允许 GET 的端点也允许 DELETE | 高 | 绕过授权;可能造成破坏。 |
生产环境可访问 phpinfo.php | 高 | 泄露路径、环境变量和模块 → 可据此寻找易受攻击的版本。 |
可访问 Tomcat /manager/html | 高 | 通常存在默认凭据;上传 WAR = RCE。 |
| 可访问 Jenkins 脚本控制台 | 高 | 执行 Groovy 脚本 = RCE。 |
/login 缺少 HSTS | 高(从中升级) | 登录页面必须强制使用 HSTS。 |
| 普通页面缺少 HSTS | 中 | 加固措施存在缺口。 |
| 缺少 CSP | 中 | 无法缓解 XSS 影响。 |
| JS 中包含内部 IP / K8s 服务 DNS | 中 | 内部拓扑信息泄露。 |
可访问 Apache /server-status | 中 | 可查看实时请求。 |
生产应用启用了 android:debuggable=true | 严重 | 生产版本为调试构建 → 客户端可被完全攻破。 |
android:allowBackup=true(未设置白名单) | 中 | 可通过 adb backup 窃取应用数据。 |
android:usesCleartextTraffic=true | 中 | 在不可信网络上可遭受 MITM 攻击。 |
敏感深层链接处理程序(myapp://reset-password) | 高 | 其他应用可触发敏感流程。 |
| 导出的 Android 组件未设置权限 | 中 | 存在 IPC 攻击面。 |
| Slack webhook URL 泄露 | 中 | 可向频道发送消息;也可用于社会工程攻击。 |
| Twilio Account SID 泄露(无身份验证令牌) | 中 | 泄露了一半凭据;还可枚举账户。 |
| 返回数据的 API 使用通配符 CORS | 中 | 风险低于反射来源并允许凭据的情况,但仍可窃取数据。 |
缺少 X-Frame-Options | 低 | 可能遭受点击劫持。 |
暴露了 .DS_Store | 低 | 可列出开发者机器上的目录。 |
| Stripe 测试密钥泄露 | 低 | 不存在真实资金风险。 |
| Firebase URL 暴露(未开放 RTDB) | 低 | 仅泄露项目 ID。 |
| 移动应用未启用证书固定 | 低 | 在不可信网络上可能遭受 MITM 攻击。 |
| 检测到过时的 WordPress 安装 | 低 | 尚待确认 CVE。 |
缺少 Referrer-Policy / Permissions-Policy | 信息 | 属于加固问题,并非信息暴露。 |
发现 /.well-known/security.txt | 信息 | 仅包含有用的联系方式。 |
| 域名出现在泄露数据中,但没有具名账户 | 信息 | 仅供参考。 |
| 存在私有存储桶(HEAD 返回 403) | 信息 | 仅为资产,不构成发现项。 |
| 10250 端口上的 kubelet 开放 | 严重 | 无需 K8s API 身份验证即可执行 Pod 命令。 |
| 2379 端口上的 etcd 开放 | 严重 | 可访问集群状态和密钥。 |
| 6443 端口上的 K8s API 启用了匿名身份验证 | 高 | 可侦察集群;有时可执行 Pod 命令。 |
| K8s dashboard 未经身份验证即暴露 | 高 | 可访问集群管理界面。 |
| Helm Tiller(Helm 2)位于 44134 端口 | 高 | 拥有集群管理员权限。 |
| Citrix Netscaler 存在 KEV CVE | 严重 | 立即修补;漏洞正遭到积极利用。 |
| 可访问 F5 BIG-IP TMUI | 高 | TMUI 是管理面板;未修补时,CVE-2022-1388 可导致严重后果。 |
| Pulse Secure 存在 CVE-2024-21887 | 严重 | KEV;可通过命令注入链利用。 |
| FortiGate 存在 CVE-2024-21762 | 严重 | KEV;可绕过身份验证并实现 RCE。 |
| PaloAlto GlobalProtect 存在 CVE-2024-3400 | 严重 | KEV;可在预身份验证阶段实现 RCE。 |
| VMware vCenter 存在 CVE-2021-21972 | 严重 | KEV;可在预身份验证阶段实现 RCE。 |
| VMware ESXi 未经 VPN 保护即暴露 | 高 | 存在多个 CVE(ESXiArgs 勒索软件攻击途径)。 |
| MS Exchange 未修补 ProxyShell/Logon/NotShell 漏洞 | 严重 | KEV 漏洞链;可实现 RCE 并转储邮箱。 |
| AWS Lambda Function URL 允许匿名访问 | 高 | 可直接调用;检查 IAM 身份验证配置。 |
| 公共 Cloud Run / Cloud Function 无需身份验证 | 高 | 同上。 |
| 公共 Docker registry(匿名 catalog) | 中 | 可枚举镜像并在镜像层中搜寻密钥。 |
| GitHub Actions 密钥被回显到工作流日志中 | 高 | 密钥出现在日志中 = 密钥完全泄露。 |
GitHub Actions 的 pull_request_target 检出 fork 代码 | 高 | 属于一类安全问题;攻击者提交的 PR 可访问密钥。 |
| 自托管 GitLab 存在 CVE-2021-22205 | 严重 | KEV;ExifTool RCE。 |
Jenkins 存在等同于 pull_request_target 的错误配置 | 高 | PR 可访问构建密钥。 |
| 公开的 Notion 页面包含内部 SOP | 中 | 暴露运维情报;有时包含凭据。 |
| 公开的 Trello 看板卡片中包含凭据 | 高 | 通常包含明文 API 密钥。 |
| 公开的 Confluence 空间包含入职文档 | 中 | 暴露初始凭据和技术栈。 |
| 公开的 Miro 看板包含架构图 | 低 | 泄露内部主机信息。 |
生产邮件发送域的 DMARC 策略为 p=none | 中 | 可实施欺骗(因风险面较大,从低升级)。 |
SPF 使用 ~all(softfail)且未配置严格 DMARC | 中 | 伪造邮件会进入垃圾邮件箱,但仍能送达。 |
| MX 服务器允许开放中继(测试时向外部域的 RCPT TO 返回 250 OK) | 高 | 可发送垃圾邮件并实施邮件伪造。 |
| 可用的 Anthropic / OpenAI API 密钥权限范围广 | 严重 | 可能产生额度费用 + 过去的响应中可能包含 PII。 |
可用的 npm 令牌具有 publish 权限 | 严重 | 可危害所有受维护软件包的供应链。 |
| 可用的 PyPI / Docker Hub / GHCR 令牌具有发布权限 | 严重 | 可危害供应链。 |
| Atlassian 令牌具有管理员权限 | 高 | 可读取整个工作区;有时还可写入。 |
| 已确认存在可接管的子域名 | 高 | 可在受信任域名上实施钓鱼。 |
| 敏感 CI/CD 字词列表命中(公共仓库中的 Jenkinsfile、.gitlab-ci.yml) | 中 | 可获取构建脚本情报;其中通常会引用密钥名称。 |
| 公开的 Postman 工作区包含内部 API 端点 | 中 | 已映射 API 攻击面。 |
| WAF/CDN 可被轻易绕过(可通过 §16.15 发现源站) | 高 | 所有 WAF 保护均失效。 |
| 生产环境支持 TLS 1.0/1.1 | 中 | 存在合规缺口;PCI-DSS 禁止使用 TLS 1.0。 |
| 接受 RC4 / 3DES 密码套件 | 中 | 可能遭受 NOMORE / SWEET32 攻击。 |
| 证书即将过期(<30 天) | 低 | 存在运维风险,但不可利用。 |
| 生产环境使用自签名证书 | 中 | 用户无法信任证书。 |
| 检测到 Heartbleed(CVE-2014-0160) | 严重 | 可泄露内存内容,包括会话令牌和密钥。 |
| 可发现公开的 Slack 邀请链接 | 高 | 任何人都能加入工作区并访问全部私信和频道。 |
| 供应商 / 供货商 / 电子采购门户对外公开,且泄露数据集显示供应商账户已遭入侵 | 高 | 可冒充供应商并实施采购欺诈(BEC 攻击途径);如果涉及 PII / 支付数据,则存在监管风险。 |
| 求职 / 职业门户通过普通 HTTP(无 TLS)收集 PII | 高 | 大规模明文传输 PII;存在 GDPR / CCPA / India DPDP Act / LGPD 监管风险。 |
| 已停用的旧邮件服务(当前为 NXDOMAIN)+ 泄露数据集包含指向它的历史员工 URL + 通过 autodiscover IP 确认已迁移到云 SSO | 严重 | 被盗密码几乎肯定因重复使用而在迁移后仍然有效;无论旧主机是否已失效,SSO_EXPOSURE 都会升级。 |
对外公开的内网门户(intranet.<domain> 可解析且无需 VPN 即返回内容) | 中 | 内部员工门户暴露;通常会泄露组织结构、员工目录和内部应用。 |
| Staging / preprod / UAT / sandbox 子域名可公开解析 | 中 | 通常身份验证较弱,包含调试端点和测试凭据;有时会镜像生产数据。 |
vpn.<domain> 可解析,但供应商和版本未知(仅被动探测) | 信息 | 仅标记攻击面;主动指纹匹配到 KEV CVE 后升级为高至严重(§16.16)。 |
| DMARC RUA 指向第三方报告供应商(kdmarc / dmarcian / Valimail / Agari / EasyDMARC) | 信息 | 仅为租户信号;供应商遭入侵 = 其所有客户的 DMARC 均可被绕过。 |
41. LinkedIn 员工枚举
在外部红队工作中,LinkedIn 是员工枚举的高信号来源。可用于:生成目标列表、确定职位优先级、推导电子邮件格式、设计借口。
41.1 搜索技巧
免费 LinkedIn(无需 Sales Navigator):
- 按公司搜索人员:
https://www.linkedin.com/search/results/people/?currentCompany=["<company-id>"]。从公司的 LinkedIn URL 或个人资料 JSON 获取 company-id。 - 绕过联系人关系级别筛选:搜索结果默认只显示 1 度或 2 度联系人;改用 Google 搜索语法。
用于枚举 LinkedIn 员工的 Google 搜索语法:
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:/posts
Bing/DuckDuckGo 的等效搜索——有时会返回不同的结果集;合并不同搜索引擎的结果。
LinkedIn Sales Navigator(付费):
- 如果可用,这是效率最高的方式。按公司 × 职位 × 职级创建潜在客户列表。导出 CSV。
工具:
- 使用
-b linkedin来源的 theHarvester(通过搜索引擎驱动枚举)。 - CrossLinked —
https://github.com/m8r0wn/CrossLinked— 用于执行 LinkedIn 搜索语法查询的命令行工具。 - LinkedInDumper / Linkook — 开源枚举工具(请确认是否仍可用;它们经常失效)。
- PhantomBuster / Apollo.io / RocketReach / Hunter.io Email Finder — 付费 SaaS,可在一个工作流中完成枚举和电子邮件推导。
41.2 根据职位推断优先级
对于枚举出的每位员工,记录:
- 姓名(标准格式:名 姓;在匹配电子邮件格式时,去掉“PMP”“PhD”等后缀)。
- 职位名称(原始名称 + 归一化后的职位级别)。
- 任职年限(在公司的年数;通常任职时间越长,权限越高)。
- 所在地(城市 / 地区;可用于确定钓鱼的时段)。
- 近期活动(帖子、评论、文章——可用于设计借口)。
用于泄露信息查询和钓鱼目标列表的职位优先级:
| 职位级别 | 示例 | 原因 |
|---|---|---|
| P0 | CEO、CFO、CTO、CISO、CIO、COO、GC、CRO | 高管账户;具有商务电子邮件入侵(BEC)、财务和法律方面的权限。 |
| P1 | IT / 安全 / 工程 / 财务 / HR 部门的 VP / 总监 | 可访问特权工具;涉及重置工作流。 |
| P2 | DevOps、SRE、Platform、安全工程师、DBA | 可访问 GitHub / 云 / CI;账户中可能存有机密信息。 |
| P3 | 软件工程师、架构师、高级开发人员 | 可访问代码,偶尔可访问云环境。 |
| P4 | 销售、市场营销、HR、财务分析师、客户支持 | 可访问 SaaS(Salesforce、HubSpot、Workday);可协助实施 BEC。 |
| P5 | 普通个人贡献者、实习生、承包商 | 单个账户价值最低,但覆盖面仍很重要。 |
41.3 根据已确认姓名推导电子邮件格式
对于每个记录的姓名,使用 §11 中的模板推导候选电子邮件地址。与以下来源交叉比对:
- 使用 Hunter.io 的
domain-search确认格式。 - 搜索泄露数据集(HudsonRock + HIBP + DeHashed + IntelX),查找匹配项。
41.4 傀儡账号注意事项
- 切勿使用公司身份连接。 LinkedIn 会发送“查看了你的个人资料”通知。
- 使用傀儡账号,并为其建立可信的个人资料(至少积累 5 年历史,行业相近,并添加共同联系人以干扰关联分析)。工具:persona-builder 工作流。
- LinkedIn“隐身模式”(匿名浏览)——可在设置中切换;虽然能减少一种信号,但 Sales Navigator 仍可能显示匿名的“有人查看了你的个人资料”。
- **发送联系人邀请会留下痕迹。**侦察期间不要发送任何邀请。
- **如果一天内查看同一家公司的 100 多名员工,个人资料浏览记录会引起怀疑。**限制频率:每个傀儡账号每天少于 20 人。
41.5 输出
对于每位发现的员工:
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:
- [email protected] (TENTATIVE)
- [email protected] (TENTATIVE)
- [email protected] (TENTATIVE)
breach_hits:
- [email protected] (HudsonRock; cleartext password redacted; FIRM)
pretext_hooks:
- "DevOps tooling vendor evaluation" (recent posts)
- "Boston DevOps Days speaker" (conference activity)
42. 职位发布中的技术栈分析
职位发布能以惊人的精确度揭示目标的内部技术栈。内容免费、公开,而且会列出具体的供应商名称。
42.1 来源
| 平台 | URL | 备注 |
|---|---|---|
| LinkedIn Jobs | https://www.linkedin.com/jobs/search/?keywords=&f_C=<company-id> | 最新;需要 LI 账户。 |
| Indeed | https://www.indeed.com/cmp/<company> | 公司页面,包含职位动态。 |
| Glassdoor | https://www.glassdoor.com/Jobs/<company>-Jobs-E<id>.htm | 还提供薪资数据和员工评价。 |
| Lever(ATS) | https://jobs.lever.co/<company> | 直接来自 ATS,包含完整职位描述。 |
| Greenhouse(ATS) | https://boards.greenhouse.io/<company> | 直接来自 ATS。 |
| Workable(ATS) | https://apply.workable.com/<company>/ | 直接来自 ATS。 |
| AshbyHQ(ATS) | https://jobs.ashbyhq.com/<company> | 直接来自 ATS。 |
| AngelList / Wellfound | https://wellfound.com/company/<company>/jobs | 专注于初创公司。 |
| BuiltIn | https://builtin.com/companies/view/<company> | 专注于科技行业。 |
| Stack Overflow Jobs | (2022 年已弃用,但可查阅存档) | 历史技术栈数据。 |
| 公司招聘页面 | https://careers.<target>.com 或 https://<target>.com/careers | 直接来源;有时比 ATS 提供更多详情。 |
42.2 提取内容
对每则职位发布,收集:
- 必需技术(“必须有使用 X、Y、Z 的经验”)→ 已确认正在使用。
- 加分技术 → 可能正在使用,但也可能处于迁移过程中。
- 供应商名称(Workday、Salesforce、Snowflake、Databricks、Datadog 等)→ SaaS 租户。
- 内部工具 / 项目代号(常会不经意地出现在“你将参与 Aurora 项目”之类的描述中)→ 侦察词汇。
- 团队规模线索(“属于一个由 12 人组成的平台团队”)→ 组织架构情报。
- 办公地点(“每周 3 天在波士顿办公室办公”)→ 实地侦察。
- 云端与本地部署比例线索(“正从本地部署迁移至 AWS”)→ 环境情报。
- 提及的合规框架(SOC2、FedRAMP、HIPAA、PCI)→ 防御优先事项和报告背景。
42.3 工具
- scrapy / BeautifulSoup — 为各 ATS 编写自定义爬虫。
- theHarvester,搭配适当的数据源。
- GitHub 上的 JobScraper 脚本。
- 手动操作 — 对于小型目标,手动审查 20–30 则职位发布既快速又准确。
42.4 输出
对每个发现的技术提及:
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"
汇总成目标技术栈概况,以指导:
- 要查找哪些密钥模式(Snowflake 专用密钥、Databricks 令牌)。
- 要识别哪些 SaaS 租户(Snowflake 账户 URL 模式)。
- 要探测哪些供应商产品特征(JS 中的 Snowflake DSN 路径)。
43. Slack / Discord / Telegram 工作区发现
43.1 Slack
- 公开工作区搜索(范围有限;Slack 以前提供过此功能,但已弃用):
- Slofile(第三方):
https://slofile.com/— 社区 Slack 工作区目录。 - Slacklist / Slack Communities — 社区整理的列表。
- Slofile(第三方):
- 枚举邀请链接 — Slack 邀请 URL 的格式为
https://join.slack.com/t/<workspace-slug>/shared_invite/<token>。常见的发现方式:- Google:
site:join.slack.com "{target}"或inurl:slack.com inurl:shared_invite "{target}"。 - GitHub:
"join.slack.com/t/<target-stem>"filename:README。 - Twitter/X / Reddit:搜索分享的邀请链接。
- Google:
- 确认工作区是否存在:访问
https://<slug>.slack.com/api/auth.test(由已认证会话调用时会返回工作区元数据,但该页面本身会根据工作区是否存在而返回不同内容)。 - 高价值发现:任何可绕过目标常规成员审批流程的公开邀请链接 → 操作者无需授权即可加入工作区 → 中危 / 高危发现(视工作区中的内容而定)。
43.2 Discord
- Discord 服务发现难度较高(没有统一的公共目录)。
- DiscordServers.com — 第三方目录。
- Discord.me / Top.gg — 社区目录。
- Google:
site:discord.gg "{target}"或site:discord.com "{target}"。 - 确认服务:邀请 URL
https://discord.gg/<token>可通过https://discord.com/api/v9/invites/<token>?with_counts=true解析为 JSON。返回服务名称、ID、成员数和频道信息。 - 枚举机器人:如果找到机器人令牌(目录 §17 第 47 行),使用
getMe获取机器人身份和它加入的服务(只读检查)。
43.3 Telegram
已在 §38 中介绍。快速参考:
- TGStat — 频道分析与搜索。
- Telemetr — 频道增长情况与重合度。
- Combot — 群组分析。
- 查看公开频道:
https://t.me/s/<channel>。 - 枚举邀请链接:在 Google 搜索
site:t.me "{target}"。
43.4 Microsoft Teams(联合)
- 参见配套方法技能 §11.10。
- 通过 Microsoft Graph 检查联合状态(需要身份验证)。
- 默认开放联合 = 任何人都可以通过
<email>@<target>查询与目标用户聊天。
43.5 Mattermost / Rocket.Chat / 可自托管
https://mattermost.<target>.com或chat.<target>模式。- 检查是否开放注册:探测
/signup页面;如果无需邀请即可访问 → 任何人都能加入。 - 检查版本泄露(
/api/v4/system/ping),以发现已知 CVE。
44. 包注册表泄露排查
公共包注册表(npm、PyPI、RubyGems、Docker Hub 等)经常会在已发布的包中意外包含机密。
44.1 npm
-
按组织 / 作用域搜索包:
npm search "<target-keyword>" npm view @<scope>/<package-name> -
列出组织的包:
https://www.npmjs.com/org/<org>或https://registry.npmjs.org/-/org/<org>/package。 -
查看单个包的历史版本:
https://registry.npmjs.org/<package>— 包含所有版本的 JSON。 -
下载 tar 包进行扫描:
npm pack <package>@<version> tar -xzf package-version.tgz # Run secret catalog (§17) on extracted files -
常见泄露: 已发布的 tar 包中包含
.env文件;package.json的scripts引用了内部 CI 机密;dist/构建产物中硬编码了 API 密钥。
44.2 PyPI
-
搜索包:
https://pypi.org/search/?q=<target>。 -
查看单个包的元数据和历史记录:
https://pypi.org/pypi/<package>/json。 -
下载 wheel/sdist 进行扫描:
pip download <package>==<version> --no-deps -d /tmp/pkg unzip /tmp/pkg/*.whl -d /tmp/pkg/extracted # Run secret catalog -
常见泄露:
setup.py中包含硬编码 URL;测试夹具中嵌入真实凭据;意外包含.pypirc文件。
44.3 RubyGems
-
搜索:
https://rubygems.org/search?query=<target>。 -
查看单个 gem 的元数据:
https://rubygems.org/api/v1/gems/<gem-name>.json。 -
下载:
gem fetch <gem-name> gem unpack <gem-name>-<version>.gem
44.4 Cargo(Rust crate)
- 搜索:
https://crates.io/search?q=<target>。 - 查看单个 crate 的元数据:
https://crates.io/api/v1/crates/<crate-name>。
44.5 Packagist(PHP / Composer)
- 搜索:
https://packagist.org/search/?q=<target>。 - 查看单个包的元数据:
https://packagist.org/packages/<vendor>/<package>.json。
44.6 NuGet(.NET)
- 搜索:
https://www.nuget.org/packages?q=<target>。
44.7 Maven Central(Java)
- 搜索:
https://search.maven.org/?q=<target>。
44.8 Docker Hub / Quay / GHCR / ECR Public
已在 §16.18 中介绍;作为注册表扫描工作流的一部分,这里也值得一提。
44.9 工作流
对于每个注册表中的每个由目标拥有的候选包:
- 列出所有历史版本(通常
<package>@1.0.0是干净的,但<package>@0.9.0中可能泄露了密钥)。 - 下载每个版本的归档文件。
- 解压;对所有文件运行机密目录(§17)。
- 留意
.env、package.json/setup.py/Cargo.toml中的硬编码值。 - 对于 Docker 镜像:扫描每一层(使用
dive或skopeo+docker save+ 提取各层)。
44.10 拼写相似名称监控
对于目标拥有的每个已发布软件包,生成拼写相似名称候选项(相似名称、常见替换),并检查攻击者是否已注册这些名称(供应链攻击面)。
# 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
done
如果候选名称已由非目标方注册 → 中危发现(拼写相似名称,可能成为供应链攻击向量)。
45. 用卫星图像进行实体侦察
对于包含实体接触环节(门禁卡通行、尾随、翻找垃圾、现场网络)的测试任务,公开图像有助于侦察目标。
45.1 卫星图像来源
| 来源 | URL | 备注 |
|---|---|---|
| Google Earth Pro | 桌面应用 | 历史时间轴;主要城市的高分辨率图像(亚米级)。 |
| Google Maps | maps.google.com | 当前图像;卫星图层;有时可以查看建筑大厅内部的街景。 |
| Bing Maps Bird's Eye | bing.com/maps | 许多地区提供倾斜/45 度图像;有时比俯视图更能显示建筑立面。 |
| Apple Maps Look Around | (iOS / Mac) | 街道级图像;主要城市提供 3D 视图。 |
| Yandex Maps Panorama | yandex.com/maps | 覆盖俄罗斯及全球;街道级图像有时比 Google 分辨率更高。 |
| NearMap(付费) | nearmap.com | 分辨率最高的商业服务;覆盖地区(主要为 US/AU/NZ/CA)更新频繁。 |
| Maxar / Planet Labs(付费) | maxar.com / planet.com | 可按需拍摄并获取近期图像。 |
| Sentinel Hub EO Browser | apps.sentinel-hub.com | 免费提供 Sentinel-2(10m)图像;适合检测变化。 |
| NASA Worldview | worldview.earthdata.nasa.gov | 免费;提供多种传感器数据。 |
| Wayback ArcGIS | livingatlas.arcgis.com/wayback/ | 历史卫星图像。 |
| OpenStreetMap | openstreetmap.org | 众包地图数据,包含建筑轮廓。 |
45.2 实体侦察中要提取的信息
- 建筑入口数量和位置 — 主入口、员工入口、装卸区、消防出口。
- 停车场出入口 — 单一受控入口还是开放式停车场。
- 围栏线和摄像头位置 — 实体周界。
- 暖通空调/公用设施入口 — 屋顶通道、维修入口。
- 相邻租户 — 同一栋建筑/商务园区内的邻近租户。
- 停车场中的车辆类型 — 可作为高管出勤情况和员工人数的参考。
- 吸烟区位置 — 常见的社交工程伺机地点。
45.3 卫星图像以外的 OSINT 衍生实体情报
- LinkedIn 员工照片 — 在办公室拍摄的个人资料照片中,通常能看到门禁卡样式。
- Glassdoor “办公室参观”照片 — 员工会发布室内照片。
- Indeed / Glassdoor 评论 — 有时会描述安全文化(“门禁卡管理松散”“尾随很常见”)。
- 带有 Instagram 地理标签的照片 — 位于办公室地址的照片;可揭示室内布局、门禁卡样式、厨房/公共区域位置。
- 公开新闻稿 — 通常包含新办公室的“剪彩”照片,展示布局和高管面孔。
- IT/安全人员的会议演讲 — 有时会介绍实体安全设置。
- Meetup / 研讨会活动列表 — 活动在目标办公室举办时,可能会附带照片。
45.4 车辆/车队情报
- LinkedIn/Instagram 背景中的车牌 — 有时能关联到特定高管。
- 卫星图像中的公司品牌车辆 — 可了解车队数量和位置。
- 直升机停机坪/高管停车位 — 可作为高层管理人员日常行程的线索。
45.5 行为准则
- 记录图像和照片来自公开来源。
- 不要为了“验证”而擅自闯入 — OSINT 阶段的实体侦察只能观察。
- 标注图像日期 — 建筑情况会发生变化。
46. 工具快速安装
最常用外部侦察工具的一行安装命令。均假设使用 Linux/Mac,且已安装 go/python/git。
46.1 子域名枚举
# Subfinder (passive, fast)
go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
# Amass (thorough, slow)
go install github.com/owasp-amass/amass/v4/...@master
# Assetfinder
go install github.com/tomnomnom/assetfinder@latest
# DNSx (resolution + brute)
go install github.com/projectdiscovery/dnsx/cmd/dnsx@latest
# Puredns (brute-force with wildcard handling)
go install github.com/d3mondev/puredns/v2@latest
46.2 HTTP 探测与信息补充
# httpx (tech-detect, status, JARM, favicon)
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
# Gowitness (screenshots)
go install github.com/sensepost/gowitness@latest
# Aquatone (screenshots + clustering)
go install github.com/michenriksen/aquatone@latest
46.3 漏洞扫描
# Nuclei (template scanner)
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -ut # update templates
# Naabu (port scan)
go install github.com/projectdiscovery/naabu/v2/cmd/naabu@latest
# Masscan (fast port scan; requires sudo)
git clone https://github.com/robertdavidgraham/masscan && cd masscan && make
46.4 内容发现
# Ffuf (fuzzer / dirbuster)
go install github.com/ffuf/ffuf/v2@latest
# Gobuster
go install github.com/OJ/gobuster/v3@latest
# Feroxbuster (recursive content disco)
cargo install feroxbuster
46.5 JS/端点提取
# Katana (crawler)
go install github.com/projectdiscovery/katana/cmd/katana@latest
# GoSpider
go install github.com/jaeles-project/gospider@latest
# LinkFinder (JS endpoint regex)
git clone https://github.com/GerbenJavado/LinkFinder && cd LinkFinder && pip install -r requirements.txt
# Subjs (extract JS URLs from HTML)
go install github.com/lc/subjs@latest
46.6 Wayback / 存档
# gau (get all urls from Wayback + others)
go install github.com/lc/gau/v2/cmd/gau@latest
# Waybackurls
go install github.com/tomnomnom/waybackurls@latest
46.7 云 / AWS
# AWS CLI
pip install awscli
# or: brew install awscli
# Cloud_enum (S3/Azure/GCP enum)
git clone https://github.com/initstring/cloud_enum && cd cloud_enum && pip install -r requirements.txt
# S3Scanner
pip install s3scanner
# CloudSploit
git clone https://github.com/aquasecurity/cloudsploit && cd cloudsploit && npm install
46.8 身份 / SSO
# o365creeper / o365enum
git clone https://github.com/gremwell/o365enum
# CredMaster (per-protocol auth probe)
git clone https://github.com/knavesec/CredMaster
46.9 移动端
# google-play-scraper (Python)
pip install google-play-scraper
# androguard (APK static analysis — pure Python, no apktool/jadx needed; §21.1)
pip install androguard
# or: brew install androguard
# apkleaks (secret scan in APK)
pip install apkleaks
# apktool (decompile APK to readable resources + manifest; §21.1)
# macOS/Linux:
brew install apktool
# Windows: download apktool.jar + apktool.bat wrapper from
# https://apktool.org/ , or `choco install apktool`
# aapt2 (manifest/badging dump — ships with Android SDK build-tools)
sdkmanager --install "build-tools;34.0.0"
# Windows path: %LOCALAPPDATA%\Android\Sdk\build-tools\<ver>\aapt2.exe
# jadx (Java source recovery from classes.dex)
brew install jadx
# Windows: unzip the jadx release zip, run jadx.bat / jadx-gui.exe
46.10 TLS / 证书
# sslyze
pip install sslyze
# testssl.sh
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
# JARM
pip install pyjarm
# Cert-spotter / certgraph
go install github.com/lanrat/certgraph@latest
46.11 杂项工具
# Anew (line-dedup that streams)
go install github.com/tomnomnom/anew@latest
# Gf (regex-based grep templates)
go install github.com/tomnomnom/gf@latest
# Hakrawler (web crawler)
go install github.com/hakluke/hakrawler@latest
# Trufflehog (secret scanner)
go install github.com/trufflesecurity/trufflehog@latest
# Gitleaks
go install github.com/zricethezav/gitleaks/v8@latest
# jq (JSON parsing)
sudo apt install jq # or brew install jq
46.12 框架 / 编排
# ProjectDiscovery's "PDTM" (manages the full PD toolkit)
go install -v github.com/projectdiscovery/pdtm/cmd/pdtm@latest
pdtm -install-all
# reconftw (scripted recon framework)
git clone https://github.com/six2dez/reconftw && cd reconftw && ./install.sh
# Axiom (distributed recon on cloud nodes)
git clone https://github.com/pry0cc/axiom && cd axiom && ./interact/axiom-configure
47. 行业专项侦察说明
大多数侦察方法都适用于多个行业;但有些行业存在值得特别标记的独特攻击面元素。
47.1 医疗保健
- DICOM(医学影像)— 端口 11112,有时为 4242(测试)。
- HL7 v2(临床消息)— 端口 2575(TCP,通常为明文)。
- HL7 FHIR(现代 REST API)— 路径通常为
/fhir/R4/<resource>;OAuth / SMART-on-FHIR 身份验证机制差异很大。 - PACS / RIS / EHR 系统 — Epic(
*.epic.comSaaS)、Cerner/Oracle Health、Allscripts/Veradigm、Athenahealth、NextGen、Meditech、eClinicalWorks。每种系统都有已知的 CVE 历史。 - 搜索:
site:{domain} ("EHR" OR "PACS" OR "PHI" OR "HIPAA")、intitle:"Epic Systems" "{target}"。 - 严重性升级: 任何 PHI 泄露 → 严重(监管 + 声誉风险);未进行身份验证即可访问的 HL7/DICOM → 严重。
47.2 金融
- SWIFT 终端 — 通常仅限内部访问;如果面向外部,则为严重问题。查找 SWIFT Alliance Web Platform。
- FIX 协议(电子交易)— 端口 9876(常见);明文传输。
- Bloomberg 终端 — 通常使用 VDI;检查与
bloomberg.com相关的身份验证接口。 - 交易平台供应商 — Fidessa、Charles River、Eze Software、Aladdin(BlackRock)。
- 银行中间件 — Temenos T24、Finacle(Infosys)、FIS、Jack Henry、Fiserv。每种系统都有已知的 CVE 历史。
- 搜索:
site:{domain} ("PCI" OR "SOX" OR "GLBA" OR "MAS")、intitle:"Temenos" "{target}"。 - 严重性升级: 任何账户 / 余额数据泄露 → 严重;SWIFT 暴露 → 严重;交易执行接口暴露 → 严重。
47.3 ICS / SCADA / OT
注意: ICS/SCADA 资产通常运行在旧式系统上,即使被动扫描也可能造成中断。没有明确的规则约定(RoE)授权,且未经 OT 团队协调时,不要主动探测 ICS。
- Modbus — 端口 502(TCP)。
- BACnet — 端口 47808(UDP)。
- Siemens S7 — 端口 102(ISO-TSAP)。
- DNP3 — 端口 20000(TCP)。
- EtherNet/IP — 端口 44818(TCP)。
- Niagara Framework — 端口 1911、4911、5011、502。
- Honeywell EBI / Tridium — 各不相同。
- GE Proficy / iFIX — 各不相同。
- 常见发现: 未经身份验证即可读取(BACnet 点列表、读取 Modbus 寄存器)、HMI 面板使用默认凭据、工程工作站面向公网。
- 来源: Shodan ICS 专用筛选器(
port:502、tag:ics)、Censys、Onyphe。 - 可检测性: 中到高;ICS 网络的背景流量通常较低,且受到严格监控。
47.4 IoT / 消费级设备 / SOHO
- MQTT — 端口 1883(明文)、8883(TLS)。无需身份验证即可读取主题的情况很常见。
- CoAP — 端口 5683(UDP)。
- UPnP / SSDP — 端口 1900(UDP);通常会泄露内部设备映射。
- 常见路由器管理路径:
/cgi-bin/、/setup.cgi、/admin/index.html。默认凭据很常见。 - 摄像头 DVR / NVR — Hikvision、Dahua、Axis。存在多个 CVE。
- 智能家居中枢 — 暴露的 API 有时会泄露身份验证令牌。
47.5 政府
.gov和.mil域名要求严格遵守项目范围规定。- FedRAMP / FISMA / DoD CMMC — 防御态势通常高于基准水平。
- OSINT 数据来源: USAspending.gov、SAM.gov(系统奖项管理)、FBO.gov / sam.gov(采购)。
- 常见发现: 公开合同披露的登记供应商 → 可进一步转向关联供应商。
- 严重性: 与商业领域相同或更高;还叠加了政治敏感性和技术影响。
47.6 海事 / 航空 / 汽车
- 海事: AIS(自动识别系统)——船舶位置;工具包括 MarineTraffic、VesselFinder。发动机遥测数据有时会通过 VSAT 暴露。
- 航空: ADS-B(已在 §32.3 介绍);有时会暴露运营方 / 航空公司特定的 OPS 数据。
- 汽车: OEM 车联网后台(Tesla、GM OnStar 等)——通常需要身份验证,但 API 可能会通过逆向分析移动应用而泄露。
47.7 通用行业注意事项
大多数外部侦察技术普遍适用。 行业特定协议会增加攻击面;行业特定的合规制度会增加报告要求。不要假设“医疗 / 金融等行业有不同的 OSINT”——OSINT 本身相同,目标服务才有所不同。
48. 可运行的辅助工具 — secret_scan.py
即插即用的 Python 辅助工具,与 80 种模式目录(§17)相对应。仅使用标准库,无需依赖项。供操作人员针对捕获的文本使用。
#!/usr/bin/env python3
"""Stdlib-only secret scanner. Mirrors the 80-pattern catalog from
the `offensive-osint` skill (§17).
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, source, line}
Exit codes:
0 — completed (regardless of whether secrets found)
2 — invalid arguments
"""
import json
import os
import re
import sys
SEV_CRITICAL = "critical"
SEV_HIGH = "high"
SEV_MEDIUM = "medium"
SEV_LOW = "low"
# Order matters: most-specific patterns first so generic catches
# don't pre-empt typed ones.
PATTERNS = [
# AWS
("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})"),
# Google Cloud Platform
("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"),
# GitHub
("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
("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
("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]+"),
# Email service providers
("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
("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})"),
# PaaS
("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
("FIREBASE_URL", SEV_LOW, "firebase", r"\bhttps?://[a-z0-9\-]+\.firebaseio\.com\b"),
# Tokens / auth headers
("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]+"),
# Private keys
("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
("GENERIC_API_KEY", SEV_MEDIUM, "generic", r"(?i)(?:api[_\-]?key|apikey|api_secret|access_token|secret[_\-]?token)['\"\s:=]+[\"']([A-Za-z0-9+/=_\-]{24,})[\"']"),
# Modern AI APIs (v2.1)
("ANTHROPIC_API", SEV_CRITICAL, "ai_api", r"\bsk-ant-(?:api03|admin01)-[A-Za-z0-9_\-]{93,}\b"),
("OPENAI_LEGACY", SEV_CRITICAL, "ai_api", r"\bsk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}\b"),
("OPENAI_PROJECT", SEV_CRITICAL, "ai_api", r"\bsk-proj-[A-Za-z0-9_\-]{40,}T3BlbkFJ[A-Za-z0-9_\-]{40,}\b"),
("OPENAI_SESSION", SEV_HIGH, "ai_api", r"\bsess-[A-Za-z0-9]{40}\b"),
("HUGGINGFACE", SEV_HIGH, "ai_api", r"\bhf_[A-Za-z0-9]{30,}\b"),
# Cloud infra
# §17 #35 — Cloudflare API Token: a bare 40-char token is far too generic to match
# standalone (any base64/hex chunk collides), so it is anchored to cloudflare / X-Auth-Key
# context on the same line, exactly as §17 specifies ("when paired with context").
("CLOUDFLARE_API_TOKEN", SEV_HIGH, "infra_api", r"(?i)(?:cloudflare|x-auth-key)['\"\s:=]{1,20}([A-Za-z0-9_\-]{40})\b"),
("CLOUDFLARE_API", SEV_CRITICAL, "infra_api", r"(?i)cf[_\-]?api[_\-]?key['\"\s:=]+([a-f0-9]{37})"),
("DIGITALOCEAN", SEV_HIGH, "infra_api", r"\bdop_v1_[a-f0-9]{64}\b"),
# Package registries
("NPM_TOKEN", SEV_HIGH, "package_registry", r"\bnpm_[A-Za-z0-9]{36}\b"),
("PYPI_TOKEN", SEV_HIGH, "package_registry", r"\bpypi-AgENdGV[A-Za-z0-9_\-]+\b"),
("DOCKER_HUB_PAT", SEV_HIGH, "package_registry", r"\bdckr_pat_[A-Za-z0-9_\-]{27,}\b"),
# SaaS
("ATLASSIAN_TOKEN", SEV_HIGH, "saas_api", r"\bATATT3xFfGF0[A-Za-z0-9_\-]{180,}\b"),
("LINEAR_API", SEV_MEDIUM, "saas_api", r"\blin_api_[A-Za-z0-9]{40}\b"),
# Observability
("NEWRELIC_LICENSE", SEV_MEDIUM, "observability", r"\b(?:NRAA|NRAK|NRBR)-[A-F0-9]{27}\b"),
("DATADOG_API", SEV_HIGH, "observability", r"(?i)dd[_\-]?api[_\-]?key['\"\s:=]+([a-f0-9]{32})"),
("SENTRY_DSN", SEV_LOW, "observability", r"https://[a-f0-9]+@o[0-9]+\.ingest\.sentry\.io/[0-9]+"),
# Tunneling
("NGROK_AUTH", SEV_MEDIUM, "tunneling", r"\b[12][A-Za-z0-9]{26}_[A-Za-z0-9]{32,}\b"),
# Bot tokens
("DISCORD_BOT", SEV_HIGH, "bot_token", r"\b[MN][A-Za-z\d]{23}\.[\w\-]{6}\.[\w\-]{27}\b"),
("TELEGRAM_BOT", SEV_HIGH, "bot_token", r"\b\d{8,10}:[A-Za-z0-9_\-]{35}\b"),
# Provider expansion (v2.2) — §17 #49-80. A real-world Postman PMAK detector
# plus well-known, distinctive-prefix provider token formats not covered
# above. Every entry here is either a standalone distinctive-prefix regex or
# context-anchored exactly like CLOUDFLARE_API_TOKEN above, so a bare generic
# token can't FP-flood.
# Postman (real-world PMAK detection regex)
("POSTMAN_PMAK", SEV_CRITICAL, "postman", r"\bPMAK-[A-Za-z0-9]{24,64}\b"),
# GitLab
("GITLAB_PAT", SEV_HIGH, "gitlab", r"\bglpat-[A-Za-z0-9_\-]{20}\b"),
# Square
("SQUARE_ACCESS_TOKEN", SEV_CRITICAL, "square", r"\bsq0atp-[0-9A-Za-z\-_]{22}\b"),
("SQUARE_OAUTH_SECRET", SEV_HIGH, "square", r"\bsq0csp-[0-9A-Za-z\-_]{43}\b"),
# Shopify
("SHOPIFY_ACCESS_TOKEN", SEV_HIGH, "shopify", r"\bshpat_[a-fA-F0-9]{32}\b"),
("SHOPIFY_SHARED_SECRET",SEV_HIGH, "shopify", r"\bshpss_[a-fA-F0-9]{32}\b"),
# Mailchimp
("MAILCHIMP_API_KEY", SEV_HIGH, "email_svc", r"\b[0-9a-f]{32}-us[0-9]{1,2}\b"),
# PagerDuty / Asana / Databricks (§17 #56-58)
("PAGERDUTY_API_KEY", SEV_MEDIUM, "saas_api", r"(?i)pagerduty(.{0,20})?(api|token|key)['\"\s:=]+([A-Za-z0-9+_\-]{20,32})"),
("ASANA_PAT", SEV_MEDIUM, "saas_api", r"(?i)asana(.{0,20})?(token|pat)['\"\s:=]+([0-9]{1,10}/[0-9]{10,20}:[a-f0-9]{32})"),
("DATABRICKS_PAT", SEV_HIGH, "saas_api", r"\bdapi[0-9a-f]{32}(?:-\d)?\b"),
# Grafana
("GRAFANA_API_KEY", SEV_MEDIUM, "observability", r"\beyJrIjoi[A-Za-z0-9+/=]{40,}\b"),
("GRAFANA_CLOUD_TOKEN", SEV_MEDIUM, "observability", r"\bglc_[A-Za-z0-9+/]{32,}={0,2}\b"),
# Terraform Cloud / Enterprise
("TERRAFORM_CLOUD_TOKEN",SEV_CRITICAL, "infra_api", r"\b[A-Za-z0-9]{14}\.atlasv1\.[A-Za-z0-9_\-=]{60,70}\b"),
# Fastly
("FASTLY_API_TOKEN", SEV_HIGH, "infra_api", r"(?i)fastly(.{0,20})?(api|token)['\"\s:=]+([A-Za-z0-9_\-]{32})"),
# Algolia / Segment
("ALGOLIA_ADMIN_KEY", SEV_HIGH, "saas_api", r"(?i)algolia(.{0,20})?(admin|api)[_\-]?key['\"\s:=]+([A-Za-z0-9]{32})"),
("SEGMENT_WRITE_KEY", SEV_LOW, "saas_api", r"(?i)segment(.{0,20})?(write)?[_\-]?key['\"\s:=]+([A-Za-z0-9]{20,32})"),
# Airtable
("AIRTABLE_KEY_LEGACY", SEV_MEDIUM, "saas_api", r"(?i)airtable(.{0,20})?(api)?[_\-]?key['\"\s:=]+(key[A-Za-z0-9]{14})"),
("AIRTABLE_PAT", SEV_HIGH, "saas_api", r"\bpat[A-Za-z0-9]{14}\.[a-f0-9]{64}\b"),
# GCP / Google OAuth
("GCP_OAUTH_CLIENT_SECRET", SEV_HIGH, "gcp", r"\bGOCSPX-[A-Za-z0-9_\-]{28}\b"),
("GOOGLE_OAUTH_ACCESS_TOKEN", SEV_HIGH,"gcp", r"\bya29\.[0-9A-Za-z_\-]{20,}\b"),
("GOOGLE_OAUTH_CLIENT_ID",SEV_LOW, "gcp", r"\b[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com\b"),
# Azure AD / Entra
("AZURE_AD_CLIENT_SECRET",SEV_HIGH, "azure", r"(?i)(?:azure|entra)[_\-]?(?:client|app)[_\-]?secret['\"\s:=]+([A-Za-z0-9_~.\-]{34,40})"),
# Facebook OAuth
("FACEBOOK_ACCESS_TOKEN",SEV_HIGH, "oauth", r"\bEAA[A-Za-z0-9]{90,}\b"),
# Package registries (v2.2)
("RUBYGEMS_API_KEY", SEV_HIGH, "package_registry", r"\brubygems_[a-f0-9]{48}\b"),
# JFrog / Artifactory
("JFROG_API_KEY", SEV_HIGH, "infra_api", r"\bAKCp[A-Za-z0-9]{50,70}\b"),
# Okta
("OKTA_SSWS_TOKEN", SEV_CRITICAL, "identity", r"\bSSWS\s+[0-9a-zA-Z_\-]{40}\b"),
("OKTA_API_TOKEN", SEV_HIGH, "identity", r"(?i)okta(.{0,20})?(api)?[_\-]?token['\"\s:=]+([0-9a-zA-Z_\-]{40})"),
# Slack app-level (Socket Mode)
("SLACK_APP_LEVEL_TOKEN",SEV_HIGH, "slack", r"\bxapp-1-[A-Za-z0-9\-]{20,}\b"),
# Dropbox
("DROPBOX_SHORT_LIVED", SEV_MEDIUM, "oauth", r"\bsl\.[A-Za-z0-9_\-]{130,140}\b"),
# Secrets managers — Doppler / HashiCorp Vault
("DOPPLER_TOKEN", SEV_CRITICAL, "secrets_mgmt", r"\bdp\.pt\.[A-Za-z0-9]{40,44}\b"),
("VAULT_TOKEN", SEV_CRITICAL, "secrets_mgmt", r"\bhvs\.[A-Za-z0-9_\-]{90,100}\b"),
# Firebase Cloud Messaging legacy server key (mobile-recon relevant, §21.1)
("FCM_SERVER_KEY", SEV_HIGH, "firebase", r"\bAAAA[A-Za-z0-9_\-]{7}:[A-Za-z0-9_\-]{140,}\b"),
]
COMPILED = [(n, s, c, re.compile(p)) for (n, s, c, p) in PATTERNS]
def scan_text(text: str, source: str = "<stdin>"):
"""Scan a text blob; yield one dict per match."""
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):
"""Recursively scan a file or directory."""
if os.path.isdir(path):
for root, _, files in os.walk(path):
# Skip common noisy directories
if any(part in root for part in (".git", "node_modules", "__pycache__", ".venv", "venv", "dist", "build", ".cache")):
continue
for f in files:
p = os.path.join(root, f)
yield from scan_path(p)
return
try:
# Skip large binary files (>10MB)
if os.path.getsize(path) > 10 * 1024 * 1024:
return
with open(path, "r", errors="replace") as fh:
yield from scan_text(fh.read(), source=path)
except (OSError, IOError):
return
def main():
if len(sys.argv) > 1:
if sys.argv[1] in ("-h", "--help"):
print(__doc__)
sys.exit(0)
for arg in sys.argv[1:]:
for hit in scan_path(arg):
print(json.dumps(hit))
else:
# Read from stdin
try:
data = sys.stdin.read()
except KeyboardInterrupt:
sys.exit(0)
for hit in scan_text(data):
print(json.dumps(hit))
if __name__ == "__main__":
main()
保存为 secret_scan.py,然后:
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 stdin
输出为 JSONL——每行一条发现结果——可直接交给 jq 进行筛选,或直接存入发现结果存储库。
49. 技能自测
将这些提示词放入新的 Claude 会话中,以验证技能是否能正确加载。
- “要查找 Web 应用中的 Swagger 或 OpenAPI 规范,应探测哪些路径?” → §16.1。
- “请给我需要发送 POST 请求的 GraphQL introspection 查询。” → §16.2。
- “Shodan 扫描中有哪些高风险端口需要标记?” → §16.3。
- “展示秘密信息正则表达式目录。” → §17(80 个模式)+ §48(可运行的 Python)。
- “如何根据攻击兴趣度为 API 端点评分?” → §20。
- “如何验证泄露的 Postman API 密钥?使用哪个 URL?” → §23.1。
- “请给出针对目标的 pastebin/gist/ghostbin 泄露信息搜索语法。” → §18.3。
- “哪些端点可以识别 Microsoft Entra 租户?” → §22.1 + §22.8(深入检查 M365)。
- “如何评估发现的 Android 应用是否属于我的目标?” → §21。
- “如果我在
/api/users发现未认证的 POST 请求,有什么攻击路径提示?” → §39(第一行)。 - “测试
/actuator/env的单行 curl 命令。” → §16.13。 - “展示禁用 introspection 时 GraphQL 字段建议枚举的技巧。” → §22.9。
- “在 JS 中发现了硬编码 JWT。请带我完成完整的分诊流程。” → §23.12(JWT 工作流)。
- “为
Target生成云存储桶候选名称,子域名包括 api/billing/hr。” → §16.8。 - “如何查找 Microsoft 365 Teams 联邦状态和 SharePoint 子域名?” → §22.8。
- “探测 Citrix Netscaler / F5 BIG-IP / Pulse Secure 的路径。” → §16.16。
- “查找
target.example背后的 Cloudflare 源站。” → §16.15 + 配套方法 §27。 - “探测 Kubernetes/etcd/kubelet 暴露情况的端口/路径有哪些?” → §16.18。
- “审计
acme.com的 SPF/DMARC,判断是否可进行欺骗。” → §16.14。 - “列出子域名暴力破解和内容发现的字典来源。” → §27.1。
- “对目标拥有的 /22 网段执行反向 DNS 扫描。” → §28.5。
- “如何在不消耗配额的情况下验证 OpenAI API 密钥?” → §23.6 + §23.12。
- “查找目标在 npm/PyPI/Docker Hub 上泄露的秘密信息。” → §44。
- “如何枚举目标在 LinkedIn 上的员工,以制作钓鱼名单?” → §41。
- “Slack 邀请链接枚举技巧是什么?” → §43.1。
- “CVE-2024-3400 的 EPSS 评分和 KEV 状态是什么?” → §29.2。
- “哪些现代 AI API 密钥(Anthropic / OpenAI / HuggingFace / Cloudflare)符合目录中的模式?” → §17 第 30–48 行。
- “生产应用中的
android:debuggable=true严重性矩阵是什么?” → §40。 - “标准侦察工具包(subfinder/httpx/nuclei 等)的安装命令是什么?” → §46。
- “在医疗健康领域的安全评估中,还有哪些端口/协议值得关注?” → §47.1。
- “通过直接 API(不用 UI)获取
target.com的 HudsonRock 泄露数据集。” → §15.0.1。 - “在 Windows 机器上使用 PowerShell 运行完整的 §16.14 电子邮件安全审计。” → §16.14 PowerShell 并行。
- “crt.sh 刚刚返回 502。备用方案有哪些?” → §27.0.1。
- “批量查询 200 个 IP 对应的 ASN,且不耗尽 bgpview 速率限制。” → §28.1(Cymru 批量查询)。
- “对
target.example进行常见前缀子域名扫描,涵盖 vpn / api / staging / portal / intranet。” → §16.24。 - “旧邮件服务(
mail.<domain>)今天返回 NXDOMAIN,但泄露数据集中有员工 URL 指向它。该如何判定?” → §15.2 旧邮件服务已停用模式。 - “当 MX 记录由 Mimecast 代理(因此 MX 无法显示底层邮件平台)时,如何确认 M365 租户?” → §22.1 autodiscover IP 关联 + §16.22 使用 autodiscover 确认。
- “DMARC RUA 指向
kdmarc.com——这说明什么?” → §16.14 DMARC 报告服务商表。 - “SharePoint HEAD 探测返回 HTTP 200。这是否意味着已授予匿名访问权限?” → §22.8(否——这表示租户存在,不代表可匿名访问;两者需要区分)。
- “Wayback 的
*.js查询在宣传型网站上返回空结果。接下来该怎么查?” → §16.23 旧版应用转向(.asp / .php / .jsp / .cfm / .aspx)。 - “在代码仓库中发现泄露的 GitLab / Shopify / Databricks / Okta / Vault 令牌——目录涵盖这些令牌吗?” → §17 第 49–80 行(扩展服务商)+ §48。
- “请带我完成针对目标获取 Android APK 并进行静态分析的流程。” → §21.1(获取 → 反编译 → 提取 manifest/deep-link/Firebase → 使用 §17 进行秘密信息扫描 → 发现结果)。
50. Changelog
- v2.2 (2026-08-06) — §17 密钥目录从 48 种扩展至 80 种模式(#49–80),确保 §17、
scripts/secret_scan.py和 §48 三者保持一致。第 49 项(Postman PMAK)填补了一个实际缺口,其依据是参考实现中的modules/secrets_beyond_github.py::_RE_PMAK——§23.1 已验证 PMAK 密钥,但目录中一直没有对应的检测正则。第 50–80 项新增了供应商扩展层:GitLab、Square(2 种)、Shopify(2 种)、Mailchimp、PagerDuty、Asana、Databricks、Grafana(2 种)、Terraform Cloud、Fastly、Algolia、Segment、Airtable(2 种)、GCP/Google OAuth(3 种)、Azure AD/Entra、Facebook OAuth、RubyGems、JFrog/Artifactory、Okta(2 种)、Slack 应用级密钥、Dropbox、Doppler、HashiCorp Vault,以及 Firebase Cloud Messaging 旧版服务器密钥——每种模式要么使用独特前缀的独立正则,要么像现有 §17 #35 Cloudflare 模式一样锚定上下文,避免宽泛通用令牌造成大量误报。关于来源的说明:参考实现专用的dorking/secrets.py目录(33 种模式)原来是 v2.2 前已涵盖的 48 种模式的严格子集,因此它没有直接贡献任何全新的供应商;32 种新增模式是这些供应商广为人知的行业标准令牌格式特征,已通过自验证的合成样本验证(32/32 检测成功,对普通文本 0 误报),而不是为了凑整而强行添加。新增 §21.1 APK 静态分析流水线(「移动应用归属置信度」下的新小节),依据modules/mobile_attack_surface.py:获取 APK(Play/APKPure/APKMirror/手动 IPA)、使用 apktool/aapt2/jadx 反编译 + 无需工具链的 androguard 替代方案、解析 AndroidManifest(有效导出测试、debuggable/allowBackup 默认值为 true/usesCleartextTraffic、自定义权限 protectionLevel)、提取深层链接/intent-filter(App Links 与可被劫持的自定义 scheme)、提取 Firebase/GCP 配置(google-services.json / GoogleService-Info.plist),并明确说明实时后端确认是单独步骤(§16.8)、对反编译文本复用 §17/§48 的原样嵌入式密钥扫描,以及检查 Network Security Config(cleartextTrafficPermitted、可能悄然绕过证书固定的用户信任锚)——参考实现自身的流水线仅将此项作为参考记录,并未解析检查,因而这里补上了这一缺口。仅进行被动静态分析;不进行动态插桩。§46.9 工具列表新增 apktool/aapt2/jadx 安装命令(bash + Windows 路径)。§49 自测新增 #41(供应商扩展目录)和 #42(APK 流水线演练)。已验证:scripts/secret_scan.py可编译,--help退出码为 0,32 种新增模式均能在自验证合成样本中检测成功,普通文本中零命中,且 §17 行数、脚本PATTERNS数量和 §48 内嵌数量均为 80。 - v2.1.2 (2026-08-06) — 辅助程序/目录一致性修复。§48 可运行的
secret_scan.py出现了偏差:内嵌副本仅包含 29 种基础模式(文档字符串仍写着过时的「29-pattern catalog」),而 §17 记录了 48 种。已将 §48 重新同步为与发布版scripts/secret_scan.py逐字节一致,并实现此前缺失的一项目录条目——§17 #35 Cloudflare API Token——使用锚定上下文的正则((?i)(?:cloudflare|x-auth-key)…{40}),避免裸露的 40 字符令牌造成大量误报,使辅助程序真正达到 48/48。已验证:可编译,--help退出码为 0,所有模式均能在合成样本中检测成功,普通文本中零误报。 - v2.1.1 (2026-04-27) — 根据真实实战冒烟测试修复遗漏。新增:§15.0.1 HudsonRock Cavalier 直接 API 使用方案(curl + PowerShell、完整 JSON 结构、免费层脱敏注意事项、速率限制指南)。§15.2 扩展了旧版邮件停用后的升级处置模式(旧邮件 NXDOMAIN + 泄露语料库命中 + Autodiscover 确认已迁移至云端 → CRITICAL SSO_EXPOSURE)。§16.14 新增 DMARC 报告供应商表(Kratikal kdmarc / dmarcian / Valimail / Agari / EasyDMARC / DMARC Analyzer / Postmark)+ 完整的电子邮件安全审计 Windows/PowerShell 对应方案 + 注意事项:PS 5.1 的
Resolve-DnsName -Type CAA会报错(请使用 PS 7+ 或nslookup -type=CAA)。§16.22 扩展 TXT 验证令牌目录,新增 17 种令牌(zscaler-verification、cloudflare-verify、autosect、cisco-site-verification、mscid、_amazonses、salesforce-domain-verification、workday/shopify/klaviyo/mailchimp/hubspot/zendesk/freshworks/intercom/loom/miro/gitlab)+ 新增「Autodiscover 确认」模式:当 MX 记录由 Mimecast/Proofpoint/Barracuda 代理时,用于检测 M365。§22.1 新增被动 Autodiscover IP 关联模式,使用 Microsoft Exchange Online IP 范围。§22.8 新增说明:SharePoint HEAD HTTP 200 表示租户存在,并不表示已授予匿名访问(操作人员经常误读)。新增 §16.23 旧版应用转向搜索模块(对于 Wayback*.js未返回内容的展示型网站,转而搜索 .asp/.php/.jsp/.cfm/.aspx/.json/.xml/.yml/.ini/.conf,并附完整的广泛扫描单行命令)。新增 §16.24 常见前缀子域名扫描——系统化整理主动前缀探测技术,提供按顺序排列的 100 多个前缀列表、PowerShell + bash + puredns 方案及实战验证说明(被动枚举会漏掉 20–40% 的高价值子域名;务必配合主动前缀探测)。§27.0.1 新增 crt.sh 备用来源链(Censys、CertSpotter、Calidog、Subfinder、OTX、ThreatMiner、URLScan、Anubis-DB),并提供 PowerShell 封装程序:重试 crt.sh 3 次后转用 Subfinder。§28.1 新增批量 IP→ASN 查询方案(Cymru 批量 WHOIS、RIPEstat、bgp.tools、IPinfo Lite)+ 注意事项:bgpview.io API 的速率限制较严,不适合批量查询。§40 严重性矩阵新增 8 行:暴露的供应商采购门户 + 泄露语料库命中(HIGH)、通过普通 HTTP 收集 PII 的门户(HIGH)、已停用的旧版邮件 + 泄露 + 云端迁移(CRITICAL)、无 VPN 的公网内网门户(MEDIUM)、可通过公网 DNS 解析的预发布/预生产环境(MEDIUM)、vpn. 可解析但供应商未知(INFO;若匹配 KEV,则升级至 HIGH-CRITICAL)、DMARC RUA → 第三方供应商(INFO)。§49 自测从 30 个提示扩展至 40 个,覆盖所有新增内容。 - v2.1 (2026-04-27) — 根据 32 项测试的冒烟测试缺口分析进行全面扩展。新增:每项检查的可直接复制粘贴的 curl 探测命令(§16.13)、包含 SPF/DMARC/DKIM/BIMI/MTA-STS/DNSSEC 解析 + SaaS 租户推断的电子邮件安全分析(§16.14)、通过 DNS 历史记录 + 证书 SAN + favicon 哈希 + JARM + Host 标头探测发现源站/绕过 CDN(§16.15)、Citrix/F5/Pulse/Fortinet/PaloAlto/Cisco/VMware/Exchange 供应商产品指纹 + KEV CVE 关联(§16.16)、云原生服务 URL 指纹——Lambda Function URLs、Cloud Run、Cloud Functions、Azure Functions、Vercel、Netlify、Cloudflare Workers 等(§16.17)、容器和 Kubernetes 暴露面(kubelet、etcd、K8s API、仪表板、Helm Tiller、容器注册表)(§16.18)、CI/CD 平台暴露面(更深入的 Jenkins 检查、GitLab、GitHub Actions、CircleCI、TeamCity、Argo CD、Spinnaker)(§16.19)、文档/维基泄露路径(Notion、Confluence、Trello、Miro、Lucidchart、Figma、ReadTheDocs、GitBook、Slab、Coda 等)(§16.20)、WHOIS/RDAP/历史 WHOIS 方案 + 反向 WHOIS 转向搜索(§16.21)、含 TXT 验证令牌表的 DNS 记录目录 → SaaS 租户推断(§16.22)、包含所有筛选参数的 Wayback CDX 深度用法(§16.23)。扩展:§17 密钥目录从 29 种扩展至 48 种模式,新增现代 AI API 密钥(Anthropic、OpenAI 旧版 + 项目密钥、HuggingFace)、基础设施(Cloudflare、DigitalOcean)、软件包注册表(npm、PyPI、Docker Hub)、SaaS(Atlassian、Linear)、可观测性(New Relic、DataDog、Sentry DSN)、机器人令牌(Discord、Telegram)和 ngrok。§18 dork 语料库从 50 多条扩展至 80 多条,新增内部工具暴露项(Splunk/Grafana/Kibana/Argo CD/Sonarqube/Confluence/Jira/GitLab/Gitea)、备份文件扩展名和行业专用 dork(医疗/金融/政府)。新增 §22.8 Microsoft 365 深度枚举(Teams 联合、SharePoint 子域名探测、OneDrive 个人站点探测、OAuth client_id 发现、设备代码钓鱼目标检查、Power Platform)。新增 §22.9 GraphQL 字段建议枚举方案 + 别名批处理、查询深度绕过、订阅枚举、批量查询绕过。新增 §23.5–23.9 Anthropic、OpenAI、npm、Atlassian、DataDog 的只读验证器(新增 5 项)。新增 §23.12 发现后的枚举工作流(AWS IAM 枚举、GitHub PAT 范围/仓库枚举、Slack 工作区枚举、JWT 完整分类检查,包括算法混淆 + 暴力破解 + none 绕过、Postman PMAK 工作区枚举、Anthropic + OpenAI 用量枚举、通用密钥来源枚举)。固定 §24 Postman 搜索端点,并提供经过验证的响应结构 + DevTools 备用方案。新增 §27.1 字典来源(Assetnote、SecLists、jhaddix、OneListForAll、raft-large-words、fuzzdb 等)+ 大小选择指南。新增 §28.4 TLS 深度审计(sslyze + testssl.sh + nmap + JA3/JA4 + 密码套件/协议/证书检查)。新增 §28.5 反向 DNS 扫描 + IPv6 枚举 + BGP 路由观察。新增 §29.2 漏洞优先级排序数据源(NVD/EPSS/CISA KEV/ExploitDB/Metasploit/InTheWild/OpenCVE/Trickest CVE+POC 映射/OSV.dev/VulnCheck KEV)+ 批量优先级排序工作流。§39 攻击路径提示新增 15 个模板(开放的 kubelet/etcd、K8s API 匿名访问、未认证的 Citrix/F5/vCenter/Cloud Function、npm 拼写抢注、缺少 DMARC、有效 AI 密钥、Slack 邀请、含 sourcesContent 的源映射文件)。§40 严重性矩阵新增 30 个实战示例,涵盖 Kubernetes/容器、存在 KEV CVE 的供应商产品、M365/云原生、CI/CD 配置错误、文档泄露、电子邮件安全缺口、AI/软件包注册表凭据、TLS 问题。新增 §41 LinkedIn 员工枚举技巧(搜索技术 + 职位推断 + 邮件模式推导 + 虚假账号注意事项)。新增 §42 招聘信息技术栈分析(来源 + 提取 + 工具)。新增 §43 Slack/Discord/Telegram/Mattermost 工作区发现。新增 §44 软件包注册表泄露搜寻(npm/PyPI/RubyGems/Cargo/Packagist/NuGet/Maven Central + 工作流 + 拼写抢注监控)。新增 §45 用于实地侦察的卫星影像(来源 + 提取 + LinkedIn/Glassdoor/Instagram/会议情报 + 车辆/车队情报)。新增 §46 工具快速安装(子域名、HTTP 探测、漏洞扫描、内容发现、JS 提取、Wayback、云、身份、移动、TLS、实用工具、框架)。新增 §47 行业专用侦察说明(医疗 DICOM/HL7/FHIR/EHR + 金融 SWIFT/FIX/Bloomberg/银行中间件 + ICS-SCADA Modbus/BACnet/S7/DNP3 + IoT MQTT/CoAP/UPnP + 政府 FedRAMP/FISMA + 海事/航空/汽车)。将可运行的辅助程序重新编号为 §48,自测为 §49(已针对 v2.1 更新),变更日志为 §50。
- v2.0 (2026-04-27) — 为外部红队工作方式进行重大重写。新增:预构建字典(§16)、29 种模式的密钥目录(§17)、50 多条 dork 语料库(§18)、GitHub 代码搜索 dork(§19)、端点关注度评分(§20)、移动应用归属置信度(§21)、具体的身份体系端点(§22)、只读密钥验证器(§23)、Postman 工作区搜索(§24)、Stack Exchange 扫描(§25)、公共 SaaS dork(§26)、子域名来源组合(§27)、域级泄露严重性(§15.1)、L2 浏览器表(§30.2)、USCC + ICP 工作流(§14.2)、跨模块 sidecar 协调(§36)、攻击路径提示模式(§39)、严重性决策矩阵(§40)、可运行的密钥扫描辅助程序(§41)。强化:置信度级别(§2)、输出格式(§3)、禁止事项(§5)。保留原有工具表,并进行了少量重新整理。
- v1.x — 原始工具参考速查表。