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, 子域名枚举, 实时处理, 密码管理, 应用安全, 数字取证, 系统安全, 自动化脚本, 运行时操纵