host碰撞
字数 1035 2025-08-12 11:34:13
Hosts碰撞技术详解与实战指南
0x00 基本概念
Hosts碰撞是一种用于突破网络边界限制的技术,主要应用于以下场景:
- 搜集了大量IP资产,端口开放WEB服务但访问返回403/404/400错误
- 目录扫描无法获取有效信息
- 目标系统存在仅限内网访问的域名
技术原理:当直接访问IP返回4xx错误,但指定Host头为特定域名时访问正常,即可判断存在Hosts碰撞可能。这是由于服务器配置了域名绑定(如Nginx的default_server或Apache的ServerName),只有通过特定域名才能访问服务。
0x01 技术背景
HTTP/1.1开始,Host头成为必需请求头,格式如下:
GET /web-security HTTP/1.1
Host: example.net
当请求经过代理转发时,Host值可能在到达后端前被修改,导致Host头攻击可能。
0x02 利用流程
1. 信息收集阶段
收集指向目标内网IP的域名:
- 使用工具如OneForAll(https://github.com/shmilylty/OneForAll)收集子域名
- 筛选出指向内网IP的域名
- 可补充常见内网办公系统子域名(如oa.internal、mail.corp等)
收集目标IP资产:
- 使用Goby等工具探测Web服务
- 记录开放Web服务的IP地址
2. 碰撞测试
使用Hosts_scan工具(https://github.com/fofapro/Hosts_scan):
- 将域名列表放入hosts.txt
- 将IP列表放入ip.txt
- 运行工具,通过对比数据包大小和标题识别匹配成功的Host头与IP
替代方法:
- 对特定IP的Host头进行Fuzz测试
- 在Burp Proxy中配置Host头替换规则
- 通过浏览器设置Burp代理访问目标IP
0x03 环境搭建与演示
实验环境配置
使用Docker搭建测试环境:
docker pull vultarget/host_collision
docker run -it -p 3333:8080 --rm vultarget/host_collision
Nginx配置解析
反向代理服务器配置:
server {
listen 8080 default_server;
server_name _;
return 400;
}
server {
listen 8080;
server_name test.com;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header Host $host:$server_port;
root html;
index index.html index.htm;
}
}
- 第一个server:无Host头或无效Host时返回400
- 第二个server:Host为test.com时转发到127.0.0.1:80
业务服务器配置:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
复现过程
-
不带Host访问:
- 返回400错误
-
设置Host: test.com:
- 成功访问隐藏业务
0x04 防御建议
- 不将服务IP直接暴露在公网
- 限制仅能通过VPN访问内部系统
- 配置严格的Host头验证机制
- 对未授权Host请求实施更严格的访问控制