跳到主要内容

TLS 证书 SAN 与虚拟主机发现

同一个 IP 上可能跑多个站点,Web 服务会根据 Host 头或 TLS SNI 返回不同内容。靶场里如果直接访问 IP 只看到 400 Bad Request、默认页、空白页,就要优先检查虚拟主机。

快速判断

常见信号:

  • HTTPS 证书里出现多个 DNS 名称。
  • 直接访问 IP 返回 400 Bad Request
  • Nmap 结果出现 Subject Alternative Name
  • 首页、robots 或源码里出现类似 *.localdev.*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.localterratest.earth.local,测试站继续泄露 testingnotes.txt