ryanmroth/subanalyzer
GitHub: ryanmroth/subanalyzer
将 subfinder、httpx 和 gowitness 串联为一条命令的被动侦察流水线,自动化完成子域名枚举、存活探测、.git 泄露检测和主机截图。
Stars: 0 | Forks: 0
# subanalyzer
一个被动侦察 pipeline,将 [subfinder](https://github.com/projectdiscovery/subfinder)、
[httpx](https://github.com/projectdiscovery/httpx) 和 [gowitness](https://github.com/sensepost/gowitness)
串联到一条命令中。它会枚举子域名,探测存活状态,检查
暴露的 `.git` 仓库,并对存活的主机进行截图。
## Pipeline
1. `subfinder` 枚举目标域名的子域名(被动来源)。
2. `httpx` 探测结果,并记录带有状态码和标题的存活主机。
3. `httpx` 请求每个存活主机的 `/.git/HEAD`,仅报告返回 `200` 且 body 中包含有效 git ref 的主机(内容经过验证,误报率低)。
4. `gowitness` 对每个存活主机进行截图。
## 前置条件
- `bash`。该脚本避免使用 bash 4 的特性,因此 macOS 自带的 bash (3.2) 以及 Linux 上的较新版本均可正常运行。
- 如果从源码安装工具,需要 Go 1.24 或更高版本。
- 以下三个工具需在你的 `PATH` 中:
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
go install github.com/sensepost/gowitness@latest
确保 `$(go env GOPATH)/bin` 已包含在你的 `PATH` 中。
- 截图阶段需要 Chrome 或 Chromium 浏览器。gowitness 会驱动一个真实的 headless 浏览器,但并不自带。在 Arch 上:`sudo pacman -S chromium`;在 Debian/Ubuntu 上:`sudo apt install chromium`(或安装 Google Chrome)。gowitness 默认会查找 `google-chrome` 二进制文件,因此当你使用 Chromium 时,脚本会自动检测并传入 `--chrome-path`。设置 `CHROME_PATH` 为完整的二进制文件路径可覆盖自动检测。如果未找到浏览器,脚本将跳过截图,但仍会生成其他输出结果。
## 安装说明
```
git clone https://github.com/ryanmroth/subanalyzer.git
cd subanalyzer
chmod +x subanalyzer.sh
```
你也可以将其符号链接到你的 `PATH` 中:
```
ln -s "$PWD/subanalyzer.sh" ~/.local/bin/subanalyzer
```
## 用法
```
./subanalyzer.sh [output-dir]
```
示例:
```
./subanalyzer.sh example.com
./subanalyzer.sh example.com ./engagements/example
```
如果未指定输出目录,结果将写入 `-results/` 目录。
### 环境变量覆盖
| 变量名 | 默认值 | 用途 |
|-----------------|---------|----------------------------------|
| `HTTPX_THREADS` | 50 | httpx 并发数(存活探测) |
| `HTTPX_TIMEOUT` | 10 | httpx 超时时间(秒) |
| `GIT_THREADS` | 30 | httpx 并发数(.git 检查) |
| `GIT_TIMEOUT` | 5 | httpx .git 检查超时时间 |
| `SHOT_X` | 1280 | 截图宽度(像素) |
| `SHOT_Y` | 720 | 截图高度(像素) |
| `CHROME_PATH` | 自动 | Chrome/Chromium 二进制文件的完整路径 |
```
HTTPX_THREADS=100 SHOT_X=1920 SHOT_Y=1080 ./subanalyzer.sh example.com
```
## 输出结果
| 文件名 | 内容 |
|-------------------------|-------------------------------------------|
| `subdomains.txt` | 所有枚举到的子域名 |
| `alive_subdomains.txt` | 包含状态码和标题的存活主机 |
| `clean_urls.txt` | 仅存活主机的 URL |
| `git_found.txt` | 已验证存在暴露 `.git` 的主机 |
| `screenshots/` | 存活主机的 PNG 截图 |
## 注意事项
- `.git` 检查要求 `/.git/HEAD` 返回字面量 `ref: refs/heads/`
字符串。如果仓库提供了一个没有该字符串的 packed-refs HEAD,则会被漏掉,因此统计数量可能会偏少。在脚本中去掉 `-mr` flag 以仅匹配 `200` 并进行手动分类排查。
- 配置了 API key 后,subfinder 的被动来源效果会显著提升。请查阅 subfinder 文档了解 provider config 文件的相关信息。
- 在 headless 服务器上,Chromium 需要字体才能渲染清晰的截图;纯净安装可能会导致文本显示为空白或方块。如果截图看起来是空白的,请安装字体包(Arch:`sudo pacman -S noto-fonts`)。如果你以 root 用户身份运行且 Chromium 因 sandbox 错误拒绝启动,请使用非 root 用户运行,或者查看 `gowitness scan file -h` 以了解相关的 Chrome flags。
## 法律声明
本工具仅供授权的安全测试使用。请仅在你拥有或获得明确书面授权的域名上使用。未经授权的扫描在你所在的司法管辖区可能属于违法行为。你必须对自己的使用行为负责。
## 许可证
MIT。详情请见 [LICENSE](LICENSE)。
标签:Bash, GitHub, 子域名枚举, 实时处理, 密码管理, 应用安全, 数字取证, 系统安全, 自动化脚本, 运行时操纵