Forbiddem/RootXshodan
GitHub: Forbiddem/RootXshodan
一款基于 Shodan API 的组织资产侦察工具,通过 ASN 所有权验证和多维度相关性评分,精准识别目标组织真实拥有的网络资产并剔除误报。
Stars: 0 | Forks: 0
# RootXshodan
**专注于 Shodan 的组织侦察。** 给定一个组织名称和/或域名 —— 它会
*并行*地通过大量相关的 dork 扫描 Shodan,然后**只保留
可证明属于你目标的资产**,并剔除无用信息。
Shodan 的常见问题:搜索 `org:"Acme"` 或 `ssl:acme.com` 会得到一堆
不相关的 host(共享 CDN、其他客户、巧合的证书字符串)。
RootXshodan 运行所有相关的 dork 家族,然后根据每个结果与你组织的
相关程度(hostname / SSL 证书 / org / ISP / ASN)进行评分,并
丢弃所有不符合条件的内容。
```
____ _ __ __ _ _
| _ \ ___ ___ | |_ \ \/ /___ | |__ ___ __| | __ _ _ __
| |_) / _ \ / _ \| __| \ // __|| '_ \ / _ \ / _` |/ _` | '_ \
| _ < (_) | (_) | |_ / \\__ \| | | | (_) | (_| | (_| | | | |
|_| \_\___/ \___/ \__| /_/\_\___/|_| |_|\___/ \__,_|\__,_|_| |_|
```
## 安装说明
只需要 `requests`(大多数系统都已安装)。它会直接调用 Shodan REST API
——你**不需要**安装 `shodan` pip 包。
```
pip install -r requirements.txt # just: requests
```
## API key
可以通过以下任意方式提供(按顺序检查):
```
python rootxshodan.py -t acme.com --api-key
export SHODAN_API_KEY= # then just run
python rootxshodan.py --api-key --save-key # store to ~/.config/rootxshodan/api_key (chmod 600)
```
如果没有提供 key,它将执行一次 **dry run**(演练),仅打印 dork 计划。
## 使用说明
```
# 最简单 — 单个 domain
python rootxshodan.py -t google.com
# org 和 domain 组合(逗号分隔即可);深入探索已发现的 ASN
python rootxshodan.py -t "Google inc, google.com" --deep --max-pages 3
# 显式指定字段 + 获取排名前 20 的主机的完整 per-host 服务列表
python rootxshodan.py --org "Acme Corp" --domain acme.com --host-detail 20
# 仅保留高置信度 assets(排除中等/低相关度项)
python rootxshodan.py -t tesla.com --min-score 3
# 保留所有内容,不进行过滤(查看原始 firehose)
python rootxshodan.py -t acme.com --no-filter
```
## 它的工作流程(4 个阶段)
1. **Discovery(发现)** — 使用 facets 调用 `/shodan/host/count`。映射组织的 ASN、port、
product、CVE 和国家。**消耗 0 个查询 credit。**
2. **Enumeration(枚举)** — 并行运行所有相关的 dork(受限于
Shodan 的 1 req/s 速率),然后应用相关性过滤器。这是消耗查询
credit 的地方(每个 dork 每 100 个结果消耗 1 个;可通过 `--max-pages` 调整)。
3. **DNS** — 从 Shodan 的 DNS DB 中提取子域名清单。
4. **Host detail(主机详情)** *(可选,`--host-detail N`)* — 为排名前 N 的 host 提供完整的
服务/漏洞列表。消耗 0 个查询 credit。
## 它运行的 dork(针对域名 `D` 和组织 `O`)
| 类别 | Dork |
|----------|------|
| hostname | `hostname:"D"` |
| ssl | `ssl:"D"`, `ssl.cert.subject.cn:"D"`, `ssl.cert.subject.cn:"*.D"` |
| ssl-org | `ssl.cert.subject.o:"O"` |
| org | `org:"O"` (+ 去除后缀的变体,例如 *Google inc* → *Google*) |
| http | `http.html:"D"`, `http.title:"O"` |
| vuln | `hostname:"D" has_vuln:true`, `org:"O" has_vuln:true` |
| asn | 针对阶段 1 发现的每个 ASN 使用 `asn:AS####` (使用 `--deep`) |
| custom | 你通过 `--dork '...'` 传入的任何内容(可重复) |
## 相关性及 ASN 所有权验证(“无冗余”引擎)
问题所在:对于一个知名的域名,**hostname 和反向 DNS 是可以伪造的**。
任何人都可以在自己的 OVH 服务器上设置 PTR 记录或自签名证书指向
`cache.google.com` —— 因此“hostname 匹配”并*不能*证明所有权。
RootXshodan 通过**验证每个 ASN 实际注册的所有者**来解决这个问题。
在发现阶段,它会为每个候选 ASN 运行免费的 `asn:ASxxxx` 计数(facet `org`),
并只保留注册组织与你目标匹配的 ASN。位于不相关网络(OVH、Amazon、Tencent 等)上
伪造 PTR 的 host 会被自动剔除。
随后,每个保留的结果都会被标记上一个**所有权(ownership)**层级:
| Ownership | 含义 |
|-----------|---------|
| **OWNED** | 位于经验证的、组织拥有的 ASN 上,**并且**有真实的 hostname/证书匹配 —— 确实是组织自己的服务 |
| **CLOUD-CUST** | 位于组织的云 ASN 上,但是是客户的 VM(客户反向 DNS,例如 `*.googleusercontent.com`)或者没有确凿的证据 —— 位于*他们*的网络上,但并非由他们运营 |
| **UNVERIFIED** | 声称拥有该组织的 hostname/证书,但**不**在经验证的组织 ASN 上 —— 伪造的反向 DNS / 自签名的冒充者(通常会被评分过滤器剔除) |
评分(层级 = HIGH ≥4 / MEDIUM 2–3 / LOW 1;默认保留 ≥ `--min-score` 2):
- **+3** 经验证的组织拥有 ASN · 受信任的证书 CN/SAN ∈ 你的域名
- **+2** hostname ∈ 你的域名且*位于拥有的 ASN 上* · org / cert-subject-O token 匹配
- **+1** hostname ∈ 你的域名但*不*在拥有的 ASN 上(可伪造) · 自签名证书 · ISP / http 提及
共享托管/CDN 组织名称(AWS、Cloudflare、Azure、Akamai 等)本身绝不算作
证据。使用 `--owned-only` 可以*仅*保留 OWNED + CLOUD-CUST
资产,并剔除所有未经验证的冒充者。
终端报告会优先显示 **★ GENUINELY ORG-OWNED & VULNERABLE** 部分,
以便你立即查看是否有任何*真实的*组织资产(非客户或冒充者)
处于暴露状态。
## 输出
终端报告**外加** `rootxshodan--/` 中的四个文件:
- `rootxshodan.json` — 包含所有内容,机器可读
- `hosts.csv` — 扁平化的 host/服务表格,适用于电子表格
- `report.html` — 独立的深色主题仪表板
- `report.md` — Markdown 报告
部分包括:摘要、ASN/组织概况、host 清单(包含置信度)、
**暴露的/有趣的服务**(数据库、RDP/VNC、Docker/K8s、IPMI、SMB 等)、
**漏洞(CVE)**、**泄露的内部 IP/host**(RFC1918 及从 banner 提取的
`.internal`/`.corp`/`.local`),以及发现的子域名清单。
## 关键 flag
| Flag | 含义 |
|------|---------|
| `--max-pages N` | 每个 dork 的结果页数(100/页,1 credit/页)。默认为 1 |
| `--min-score N` | 相关性阈值(默认为 2)。使用 3 仅保留高置信度结果 |
| `--owned-only` | 仅保留经验证的组织拥有 ASN 上的资产(剔除冒充者) |
| `--max-verify N` | 验证排名前 N 的候选 ASN 的所有权(默认为 30) |
| `--no-filter` | 保留所有结果(禁用相关性过滤器) |
| `--wide` | 添加嘈杂的 `http.html:domain` dork(任何嵌入了该域名的站点) |
| `--deep` | 同时扫描每一个**经验证的**组织 ASN |
| `--host-detail N` | 排名前 N 的 host 的完整服务列表 |
| `--workers N` | 并行 dork worker(默认为 4) |
| `--rate S` | API 调用之间的最小秒数(默认为 1.05) |
| `--dork '...'` | 添加原始自定义 dork(可重复) |
| `--no-vuln` / `--no-dns` | 跳过这些阶段(某些 plan 会阻止 `has_vuln`) |
## 注意事项 / 限制
- 遵守 Shodan 约 1 req/s 的限制。并行 worker 重叠了延迟,但调用是
由共享的速率限制器串行化的 —— 请谨慎调低 `--rate`。
- `has_vuln:` / `vuln:` 和某些 facets 需要付费的 Shodan plan;如果你的 plan
阻止了它们,工具会记录日志并继续执行。
- **仅限授权使用。** 适用于你自己的资产、目标在范围内的漏洞赏金计划,
或获得书面许可的测试任务。
标签:ESC4, OSINT, Python, 实时处理, 无后门, 聊天机器人, 资产测绘, 逆向工具