TLS 证书 SAN 与虚拟主机发现
同一个 IP 上可能跑多个站点,Web 服务会根据 Host 头或 TLS SNI 返回不同内容。靶场里如果直接访问 IP 只看到 400 Bad Request、默认页、空白页,就要优先检查虚拟主机。
快速判断
常见信号:
- HTTPS 证书里出现多个 DNS 名称。
- 直接访问 IP 返回
400 Bad Request。 - Nmap 结果出现
Subject Alternative Name。 - 首页、robots 或源码里出现类似
*.local、dev.*、test.*的域名。
从证书提取域名
nmap -sC -sV -p 443 192.168.1.111
重点看:
ssl-cert:
Subject: commonName=earth.local
Subject Alternative Name: DNS:earth.local, DNS:terratest.earth.local
也可以直接用 OpenSSL:
openssl s_client -connect 192.168.1.111:443 -servername earth.local </dev/null 2>/dev/null \
| openssl x509 -noout -text | grep -A1 'Subject Alternative Name'
不改 hosts 的访问方式
临时验证时推荐 curl --resolve,不会污染系统 hosts:
curl -sk --resolve earth.local:443:192.168.1.111 https://earth.local/
curl -sk --resolve terratest.earth.local:443:192.168.1.111 https://terratest.earth.local/
如果是 HTTP,可以直接改 Host 头:
curl -s -H 'Host: earth.local' http://192.168.1.111/
批量 VHost 枚举
证书只会暴露一部分名字,继续用字典爆破:
gobuster vhost \
-u https://earth.local \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-k \
--append-domain
如果没有本地 DNS 解析,可以先写 hosts:
echo '192.168.1.111 earth.local' | sudo tee -a /etc/hosts
结果判断
不要只看状态码,重点比较响应差异:
| 信号 | 说明 |
|---|---|
| 页面标题不同 | 大概率是不同 vhost |
| 响应长度明显不同 | 值得继续看内容 |
| 一个站点是测试站 | 优先查泄露文件、备份、robots |
| 一个站点需要认证 | 查认证文件、日志和服务侧配置 |
常见防坑
- HTTPS 场景里,
Host头和 SNI 都可能影响结果,--resolve比单独-H 'Host:'更稳。 -k只是不校验证书,不代表会自动设置正确域名。- 虚拟主机枚举前先确认是否有通配响应,避免把所有子域都当成命中。
来源案例
- The Planets: Earth:从 TLS 证书 SAN 发现
earth.local和terratest.earth.local,测试站继续泄露testingnotes.txt。