Niks2801/subenumx
GitHub: Niks2801/subenumx
SubEnumX 是一款基于 Python 的被动子域名枚举工具,支持 DNS 解析、HTTP 探测和同主机页面爬取,帮助安全人员在渗透测试前期快速梳理目标资产。
Stars: 0 | Forks: 0
## SubEnumX (子域名 + 页面枚举器)
SubEnumX 是一个小型的网络安全/OSINT 风格**子域名枚举器**,并附带针对每个发现子域名的可选**页面 (URL) 爬虫**。
## 什么是域名 / 子域名枚举?
在 Web 安全中,“目标”通常不是单个网页——而是一个**完整的域名生态系统**。
- **Domain (域名)**:诸如 `example.com` 的根名称。
- **Subdomain (子域名)**:该域名下的主机名,例如 `api.example.com`、`mail.example.com`、`dev.example.com`。
### 为什么枚举在网络安全中很重要
子域名枚举是侦察 中的核心步骤,因为:
- **攻击面发现**:组织通常在不同的子域名下托管多个应用程序(客户门户、管理门户、API、测试环境)。
- **错误配置检测**:被遗忘的测试站点、过时的应用程序、调试端点或暴露的管理面板通常存在于子域名上。
- **资产清单**:安全团队需要一份面向公众的资产列表以进行监控和保护。
### 被动与主动枚举(重要概念)
主要有两种方法:
- **Passive enumeration (被动枚举)**:从公共数据集 (OSINT) 收集子域名,无需暴力破解 DNS。
示例:证书透明度日志、被动 DNS 数据库、公共索引。
- **Active enumeration (主动枚举)**:生成猜测(字典)并查询 DNS 以查看哪些存在(暴力破解)。
这噪音更大且更有可能被封锁;也更容易跨越道德底线。
**SubEnumX 专注于被动枚举**(尽最大努力),然后可选择进行轻度验证(DNS 解析、HTTP 探测)和页面爬取。
## SubEnumX 的功能(流水线)
SubEnumX 分清晰的阶段运行:
1. **被动子域名收集 (OSINT)**
查询多个公共来源并合并结果。(不同来源可能宕机或受限,因此我们使用多个来源。)
2. **DNS 验证(可选)** 使用 `--resolve`
使用 DNS 记录查找检查每个子域名是否实际解析:
- A (IPv4)
- AAAA (IPv6)
- CNAME (别名)
3. **HTTP 探测(可选)** 使用 `--probe`
对于每个主机,尝试:
- `https:///`
- 然后 `http:///`
记录状态码(如 200/301/403)以及重定向后的最终 URL。
4. **页面枚举 / 爬取(可选)** 使用 `--crawl`
对于每个存活主机,爬虫获取 HTML 页面并提取保留在**同一主机**上的内部链接(``)。
它是**深度受限**(`--depth`)和**页面数量受限**(`--max-pages`)的,因此不会无限运行。
5. **报告生成与产物保存**
- `-o output.txt` 保存一个完整的报告文件
- `--out-dir results_name` 保存多个文件(推荐用于提交)
## 使用的技术栈(及原因)
- **语言**:Python 3
选择它是因为它在安全工具中很常见,原型制作快,且易于在演示中运行。
- **HTTP 客户端**:`requests`
用于可靠的 GET 请求(OSINT 来源、探测、爬取)。
- **HTML 解析**:`beautifulsoup4`
用于安全地解析 HTML 并提取链接以进行页面枚举。
- **DNS**:`dnspython`
当启用 `--resolve` 时,用于 DNS 记录查找 (A / AAAA / CNAME)。
- **并发**:`concurrent.futures.ThreadPoolExecutor`
用于加速 DNS/探测/爬取,并避免单个缓慢的 OSINT 来源阻塞所有操作。
## 安装
```
cd subenumx
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
### 使用方法
基本子域名枚举(仅被动 OSINT):
```
python -m subenumx -d example.com
```
DNS 解析 + HTTP 探测:
```
python -m subenumx -d example.com --resolve --probe
```
同时爬取页面(同主机)至深度 1:
```
python -m subenumx -d example.com --resolve --probe --crawl --depth 1 --max-pages 50
```
将输出保存到文本文件:
```
python -m subenumx -d example.com --resolve --probe --crawl -o output.txt
```
将**所有产物**保存到文件夹中(推荐用于提交):
```
python -m subenumx -d example.com --resolve --probe --crawl --out-dir results_example
```
如果来源缓慢/受限,增加超时时间:
```
python -m subenumx -d example.com --timeout 30 --crt-retries 4
```
## 输出文件(使用 `--out-dir` 时)
`--out-dir results_example` 会写入:
- `results_example/report.txt`(完整报告)
- `results_example/subdomains.txt`
- `results_example/resolved.txt`
- `results_example/probed.txt`
- `results_example/pages.txt`
## 如何在评估中展示(建议的演示流程)
使用您拥有的域名(最好)或安全的演示域名,如 `example.com`。
1. 运行被动枚举:
```
python -m subenumx -d example.com
```
2. 展示 DNS + HTTP 验证:
```
python -m subenumx -d example.com --resolve --probe
```
3. 保存所有内容用于报告:
```
python -m subenumx -d example.com --resolve --probe --crawl --out-dir results_example
```
然后打开 `results_example/report.txt` 并解释每个部分。
## 注意事项、局限性和道德使用
- **OSINT 来源可能失败**:公共端点可能受到速率限制、被您的网络阻止或暂时宕机。SubEnumX 会打印每个来源的计数,以便您查看哪些来源有效。
- **不是暴力破解器**:此工具不进行主动字典暴力破解;它有意更安全/噪音更小,适合演示。
- **爬取是保守的**:
- 仅限同主机(不会爬取整个互联网)
- 深度受限 + 最大页面数上限
- 仅跟随 HTML `` 中找到的链接
- **结果并非“地球上所有的子域名”**:没有工具能保证完全覆盖。侦察在于结合多种方法并验证结果。
## 项目结构(代码概述)
- `subenumx/cli.py`:参数解析 + 调度
- `subenumx/sources.py`:被动子域名来源 (OSINT)
- `subenumx/crawl.py`:简单的同主机爬虫
- `subenumx/util.py`:URL 辅助工具、DNS 解析、探测辅助工具、格式化
标签:CDN识别, DNS枚举, DNS查询, ESC4, GitHub, OSINT, Python, Snort++, SYN扫描, URL爬虫, 域名解析, 子域名枚举, 无后门, 漏洞挖掘辅助, 系统安全, 网络安全, 网络安全工具, 被动扫描, 证书透明日志, 资产测绘, 隐私保护