black5ugar/HostCollision
GitHub: black5ugar/HostCollision
一款基于 Go 的高性能虚拟主机碰撞与发现工具,通过自定义 Host 头对目标 IP 批量探测隐藏站点并智能过滤泛解析响应。
Stars: 6 | Forks: 0
# HostCollision
[🇨🇳 点击此处查看中文版](#中文版说明)
HostCollision 是一款高性能工具,它通过向同一个 IP 地址发送带有自定义 `Host` 头的 HTTP 请求来发现虚拟主机。
它通常用于渗透测试中,以检测反向代理、共享主机、CDN 环境、泛域名解析以及配置错误的 vhost 背后的网站。
此版本是基于原项目进行全面重构和模块化后的实现。
## ✨ 功能特点
- 🚀 由 goroutine worker pool 提供支持的**高速扫描**
- 🧠 **专用的基准探测**,用于过滤通用/泛解析/默认页面,且不占用真实的候选项
- 📝 **实时终端日志**,显示状态码、耗时和相似度
- 📄 **CSV 结果输出**,便于进行更好的数据分析
- ⚙️ **可配置的参数**(线程数、sleep、阈值、每个 IP 的最大命中数……)
- 🛡️ **更安全的 HTTP 处理**,具有重定向拦截、取消支持以及 10 MiB 的响应限制
- 🎨 **美观的 CLI banner**
## 📦 安装
需要 Go 1.18 或更高版本。
```
go build -o hostcollision ./cmd/hostcollision
```
运行测试:
```
go test ./...
```
## 🧪 使用示例
```
./hostcollision \
-i ip.txt \
-d host.txt \
-o output.csv \
-n 20 \
-s 0 \
-m 10 \
-r 85
```
## 🗂 命令行选项
| 选项 | 描述 |
| ------ | ------------------------------------------- |
| `-i` | IP 列表文件路径(必选) |
| `-d` | Host 字典文件路径(必选) |
| `-o` | 输出 CSV 文件路径(必选) |
| `-n` | goroutine 数量(默认 20) |
| `-s` | 请求之间的 sleep(毫秒,默认 1000) |
| `-m` | 每个 IP 最多保留的 Host 数(默认 50) |
| `-r` | 相似度阈值(0–100,默认 85) |
## 📤 输出
output.csv 将包含:
```
ip,host,status,length,similar
127.0.0.1,www.example.com,200,7648,32
```
`ip` – 目标 IP 地址
`host` – 测试的 Host 头
`status` – HTTP 状态码
`length` – 响应体长度(字节)
`similar` – 与该 IP 基准响应的相似度得分(0–100)
仅保留状态码在 200 到 399 之间且相似度低于配置阈值的响应。在扫描字典之前,HostCollision 会向每个 IP 发送 `Host: hostcollision-baseline.invalid`,并使用该响应作为默认页面的基准。基准探测在配置的并发限制下运行。
为了安全起见,不会跟随重定向,大于 10 MiB 的响应体会被拒绝,并且 `Ctrl+C` 可以取消未完成的请求。如果基准探测失败,该 IP 的候选项仍会被扫描,其相似度得分为 `0`。
## 🧪 最小本地测试设置
这是一种在您的机器上验证该工具端到端工作情况的简单方法。
1. **创建 `ip.txt`**
127.0.0.1
2. **创建** `host.txt`
www.aaa.com
www.bbb.com
www.ccc.com
3. **运行一个简单的 HTTP 服务器**(示例)
该代码库在 `testserver/` 中包含一个示例服务器。它监听 80 端口,可能需要提升权限:
go run ./testserver
您也可以使用任何根据 `Host` 头返回不同内容的 HTTP 服务器。目标条目可以包含端口,例如 `127.0.0.1:8080`。
4. **开始扫描**
./hostcollision -i ip.txt -d host.txt -o output.csv -n 3 -s 0 -m 10 -r 85
您将在终端中看到实时日志,并在 `output.csv` 中看到结构化的结果。
## 📚 项目结构
```
cmd/hostcollision # Main entry point (CLI)
internal/app # Application orchestration (read -> scan -> write)
internal/config # CLI configuration parsing and validation
internal/scanner # Core scanning logic (workers, HTTP, thresholds)
internal/similarity # Similarity engine for response body comparison
internal/iohelper # File reading/writing utilities
internal/banner # CLI banner (version, author, GitHub)
```
## ⚠️ 法律与道德免责声明
此工具**仅供授权的安全测试和研究**使用。
**请勿**在未经明确许可的情况下对目标使用此工具。
您需自行负责遵守所有适用的法律和法规。
# 中文版说明
[🇬🇧 English version click here](#HostCollision)
HostCollision 是一个通过自定义 `Host` 头,对目标 IP 进行批量请求,从而发现隐藏虚拟主机的高性能扫描工具。
常见使用场景包括:
- 反向代理 / 共享主机环境中的站点枚举
- CDN 场景下真实站点的探测
- 泛解析 / 默认站点识别
- Vhost 配置错误排查
当前版本对原项目进行了重构,结构更加清晰、模块化,便于维护和扩展。
## ✨ 功能特点
- 🚀 **高并发扫描**:基于 goroutine 的 worker pool
- 🧠 **响应相似度检测**:过滤统一错误页 / 默认页 / 泛解析内容
- 🎯 **独立基准探测**:使用专门的无效 Host 获取基准,不占用真实字典候选
- 📡 **终端实时日志**:显示 IP、Host、状态码、耗时、相似度、过滤原因
- 📄 **CSV 结果输出**:带表头,方便后续用 Excel / 脚本分析
- ⚙️ **可配置参数**:线程数、请求间隔、相似度阈值、每 IP 最大命中数等
- 🛡️ **安全的 HTTP 处理**:禁止跨目标重定向、支持取消,并限制响应体大小
## 📦 安装方式
需要 Go 1.18 或更高版本。
```
go build -o hostcollision ./cmd/hostcollision
```
运行测试:
```
go test ./...
```
## 🧪 使用示例
```
./hostcollision \
-i ip.txt \
-d host.txt \
-o output.csv \
-n 20 \
-s 1000 \
-m 50 \
-r 85
```
## 🗂 参数说明
| 参数 | 说明 |
| ---- | ------------------------------------------------------------ |
| `-i` | IP 列表文件路径(必选) |
| `-d` | Host 字典文件路径(必选) |
| `-o` | 输出 CSV 文件路径(必选) |
| `-n` | 并发 goroutine 数量(默认 `20`) |
| `-s` | 每次请求间的 sleep(毫秒,默认 `1000`) |
| `-m` | 单个 IP 最多保留的 Host 数(默认 `50`) |
| `-r` | 相似度阈值(0–100,默认 `85`,大于等于该值认为“过于相似”而被过滤) |
## 📤 输出说明
结果文件为 CSV 格式,包含表头:
```
ip,host,status,length,similar
127.0.0.1,www.example.com,200,7648,32
```
字段含义:
- `ip` – 被扫描的 IP
- `host` – 请求使用的 Host 头
- `status` – HTTP 状态码
- `length` – 响应 Body 长度(字节)
- `similar` – 与该 IP 基准响应的相似度(0–100)
程序仅保留状态码为 200–399 且相似度低于指定阈值的响应。扫描字典前,HostCollision 会向每个 IP 发送一次 `Host: hostcollision-baseline.invalid` 请求,以其响应作为默认页面基准;基准请求同样受并发数限制。
为避免请求离开扫描范围,程序不会跟随重定向;超过 10 MiB 的响应体会被拒绝,按 `Ctrl+C` 可取消尚未完成的请求。如果某个 IP 的基准请求失败,该 IP 仍会继续扫描,候选响应的相似度记为 `0`。
## 🧪 最小本地测试环境
1. **准备 `ip.txt`**
```
127.0.0.1
```
2. **准备 `host.txt`**
```
www.aaa.com
www.bbb.com
www.ccc.com
```
3. **启动本地 HTTP 服务**(参见 `testserver/`)
示例服务监听 80 端口,可能需要额外权限:
```
go run ./testserver
```
也可以使用其他根据 `Host` 头返回不同页面的 HTTP 服务。IP 列表支持携带端口,例如 `127.0.0.1:8080`。
4. **执行扫描**
```
./hostcollision -i ip.txt -d host.txt -o output.csv -n 3 -s 0 -m 10 -r 85
```
终端可以看到实时日志,结果会以 CSV 形式写入 `output.csv`。
## 📚 项目结构
```
cmd/hostcollision # 程序入口(main)
internal/app # 扫描流程编排:读入 -> 扫描 -> 写结果
internal/config # 命令行参数解析与配置校验
internal/scanner # 核心扫描逻辑(并发、HTTP、阈值控制)
internal/similarity # 相似度计算模块
internal/iohelper # 文件读写工具
internal/banner # 终端 Banner 展示
```
## ⚠️ 法律与合规声明
本工具仅供 **授权的安全测试与研究使用**。
请勿在未获得明确授权的前提下,对任何目标使用本工具。
使用本工具产生的一切后果由使用者自行承担。
标签:Go, Host碰撞, Ruby工具, Snort, 主机安全, 文档结构分析, 日志审计, 虚拟主机发现