查一个域名的域名查询子域名,最直接的域名查询办法不是猜,而是域名查询看公开的证书日志。crt.sh 这个网站记录了几乎所有 HTTPS 证书的域名查询签发信息,你在搜索框里敲进 example.com,域名查询回车,域名查询底下会哗啦啦列出一堆类似 mail.example.com、域名查询vpn.example.com、域名查询dev-api.example.com 的域名查询条目。去年我帮朋友查一个做跨境电商的域名查询小站,主站看起来平平无奇,域名查询但证书日志里冒出来一个 staging.example.com,域名查询打开一看,域名查询后台登录页连验证码都没加。域名查询这就是域名查询子域名查询的日常——你永远不知道下一个冒出来的是什么。
子域名查询本质上是在做信息收集。一个公司可能只对外宣传 www 和 m 站,但内部用的 gitlab、jira、grafana、测试环境的 api 网关,往往都挂在同一个主域名下面。这些子域名不一定有公开入口,但 DNS 记录是实打实存在的。查它们,就是在摸一个组织的数字资产边界。
证书日志是覆盖面最广的免费来源,缺点是只覆盖发过 HTTPS 证书的子域名。有些内部服务用 HTTP 或者自签证书,就不会出现在 crt.sh 里。这时候得换别的路子。
DNS 爆破算是一种笨办法但有效。拿一份常见子域名字典,比如 subdomains-top1million-5000.txt,配合 dnsx 或者 gobuster 跑一遍。速度快的话几分钟能扫完几千个候选词。我习惯先用小字典探路,看到有意思的再换大字典深挖。有一次扫一个教育机构的域名,字典里带了“zhaosheng”这个拼音,结果真扫出来一个 zhaosheng.example.edu.cn,页面是旧的招生报名系统,数据库连接字符串还写在前端 JS 里。
被动 DNS 数据库也值得一看。SecurityTrails、VirusTotal、AlienVault OTX 都提供历史 DNS 记录查询。有些子域名曾经解析过,后来下线了,但历史记录还在。这种“幽灵子域名”有时候能指向已经废弃但没彻底删除的服务,安全性往往更差。
搜索引擎的 site 语法也能用。site:example.com -www 在 Google 或 Bing 里搜一下,偶尔能捡到几个没做 robots.txt 屏蔽的二级域名。不过这几年搜索引擎对 site 语法的结果做了不少限制,效果不如从前。
拿到一份子域名列表,第一步是筛选。把那些明显是 CDN 或者云服务默认分配的域名去掉,比如 xxx.cloudfront.net、xxx.azurewebsites.net。剩下的逐个解析 IP,看哪些指向内网地址或者非标准端口。接着对每个存活的主机做一次 HTTP 探测,记录状态码、标题、favicon 哈希。favicon 哈希可以用来聚类,同一套系统部署在不同子域名上,favicon 往往一样。
有个细节容易被忽略:子域名之间的 CNAME 记录。如果 dev.example.com 的 CNAME 指向一个已经释放的 AWS S3 桶或者 GitHub Pages 地址,那就存在子域名接管的风险。攻击者可以抢注那个被释放的资源,从而控制 dev.example.com。这种案例每年都有,Tesla、Shopify 都中过招。
别只盯着主域名。有些公司把业务拆到不同顶级域名下,比如 example.com 和 example.net 同时在用,子域名查询的时候两个都得查。还有,查到子域名之后别急着扫端口,先看看有没有公开的 API 文档或者 Swagger UI,那里面往往藏着更多路径和参数信息。
工具方面,我常用的一套组合是:crt.sh 拿初始列表,dnsx 做批量解析,httpx 做存活探测,最后用 aquatone 或者 gowitness 截图。整个流程跑下来,一个中等规模的目标大概能拿到几十到几百个子域名。真正有价值的往往就那么几个—— staging、admin、internal、jenkins、gitlab。看到这些词,就知道该重点看什么了。
子域名查询不是什么高深技术,但它需要耐心和一点直觉。同样的工具,不同的人跑出来的结果可能差很多。差别在于字典的选择、对返回信息的敏感度,以及愿不愿意多翻几页证书日志。