世上不存在单一工具能一次性枚举全部子域名,真正接近完整的做法是组合“证书透明日志检索、DNS暴力枚举、网络空间测绘、被动数据集交叉验证”四条主线,再用脚本去重和存活校验,最终形成高置信度的子域名清单。
为什么你之前查到的子域名总是不全
先聊一个容易被忽略的技术现实:DNS协议在设计时并未提供“列出某域名下所有记录”的公开接口,这意味着无论是用nslookup还是dig,直连DNS服务器只能查到已知记录,查不到未知记录,子域名发现本质上是一个“猜”或“挖”的过程,信息源越多元,覆盖越全。
覆盖不全的常见原因包括:
- 只用了单一字典爆破,没有结合证书透明日志
- 忽略了历史DNS解析记录(域名可能换过IP,旧子域名已不在现网DNS)
- 未处理泛解析(通配符DNS记录),导致大量无效结果
- 没有对结果做去重和CNAME展开,遗漏了指向第三方服务的子域名
很多安全测试人员在实际项目中遇到过这种情况:用某款工具扫完某政企站点,只跑出十几个子域名,但结合证书日志重新拉取后,一下补充到上百条,差异的根源就在于信息源单一。
证书透明日志,最被低估的宝藏信息源
CA机构签发SSL/TLS证书时,会将证书信息写入公开的证书透明日志(Certificate Transparency,简称CT),任何为子域名申请过证书的记录都会永久留档,这正是被动收集子域名最可靠的渠道。
实操路径:
访问 crt.sh,在搜索框直接输入 + 目标主域名(%.example.com),就能拿到CA日志中与该域名相关的全部证书记录,返回结果中每一行都含Common Name和SAN字段,子域名就藏在这里。
如果本地环境更喜欢命令行,可以用Python脚本直接请求crt.sh的JSON接口:
curl -s "https://crt.sh/?q=%25.example.com&output=json" | jq -r '.[].name_value' | sort -u
命令虽然短,但效果往往比跑几千条字典更好,原因很简单:大部分现网子域名都会申请证书,特别是部署了HTTPS的站点,基本都被CT日志收录。
稍微进阶一点的技巧:查询时区分 %.example.com 和 %example.com,前者可以查出 a.example.com、b.example.com 这类单级子域名,后者还能覆盖 dev.a.example.com 这类更深层级的记录,实际测试中,叠加两层查询能多发现不少开发、测试环境的子域名。
DNS暴力枚举与字典爆破
CT日志只覆盖“存在证书记录”的子域名,内网迁移、内部测试、未上证书的部门站点往往不在其中,这部分需要主动探测来补位。
字典质量决定爆破上限
字典爆破的本质是批量猜测主机名,字典里如果没有 jira、gitlab、jenkins、grafana 这类关键词,几乎不可能猜中对应子域名。
推荐的做法是把公共DNS字典(如SecLists的 subdomains-top1million-5000.txt)作为基础,再结合目标行业特征人工补充词条,比如电商行业加上 、
m、h5、mini、oms、erp;政府单位加上 oa、mail、vpn、fw、jcs。
主流工具与命令示例
subfinder 兼顾被动信息源和轻量爆破,适合第一轮快速收集:
subfinder -d example.com -all -recursive -o subfinder.txt
amass 的枚举能力更强,但耗时更长,适合对完整性要求高的场景:
amass enum -d example.com -passive -o amass.txt
puredns 的亮点在于能自动过滤泛解析结果,配合massdns批量解析速度快,输出结果相对干净:
puredns bruteforce dict.txt example.com -r resolvers.txt
处理泛解析干扰是必须做的一步
不少大型站点配置了 *.example.com 泛解析,直接向任意不存在的子域名发起解析请求都能返回IP,字典爆破结果瞬间被污染。
应对策略如下:
- 随机生成一批不可能存在的随机前缀(
dkqjqkqj122),解析并记录返回IP作为基准 - 爆破结果中,凡是IP落在基准IP集合内的记录全部标记为“疑似泛解析”
- 配合HTTP请求验证,泛解析通常返回同样内容的默认页,可以依据响应体和状态码进一步过滤
网络空间测绘与搜索引擎语法
这类方法的本质是“借用第三方的历史扫描数据”,不是真的去探测目标,所以隐蔽性更好,而且能发现一些早已停止解析但仍有历史记录的影子资产。
FOFA和ZoomEye的查询语法
FOFA支持直接用域名关联证书的关键词锁定资产:
domain="example.com"
这条语句能直接返回FOFA所收录的该域名全部关联IP、端口、标题、证书信息,导出结果后就能提取出大量子域名线索。
更精细的做法是交叉查询:
cert="example.com" && domain!="example.com"
用于筛选证书中包含目标域名信息,但实际解析到其他域名的资产,这一招经常能发现同一主体旗下其他域的旁站。
ZoomEye的用法类似,用 site:example.com 或者直接对域名进行解析查询,返回的主机列表配合IP反查可以拼凑出一张更完整的资产地图。
Google / Bing / 百度语法补充
虽然搜索引擎收录存在延迟,但在发现“未被CT日志收录且未在公共字典中”的合规子域名时仍然有效:
site:example.com -www
在Google和Bing下分别执行,再结合 inurl:example.com、intitle:example.com 做补充,从搜索结果中筛出不同子域名的URL,百度的收录策略不同,某些国内站点的子域名在百度能查到但Google查不到,所以两边都得搜一遍。
被动DNS数据集与历史解析记录
很多子域名过去解析过,后来因为业务下架或迁移而不再存在于现网DNS中,这类“历史子域名”是攻击面评估中被频繁遗漏的部分。
SecurityTrails 的前身是DNS Trails,维护了数年来的DNS解析历史数据,输入主域名后一键拉取“Subdomains”列表,可以获得按时间排列的历史子域名记录。

crt.sh 的时间维度功能 也可以配合使用,部分年份较久的证书记录指向的域名可能已不归档在DNS中,但仍然是真实存在过的资产。
由于被动DNS数据库的收录源不同,多个平台交叉导出后合并去重,效果远好于单一平台数据,实际操作中,建议用脚本把SecurityTrails、crt.sh、FOFA、子域名的Whois历史记录全部拉到一个文本文件里统一处理。
整合与验证:把散落结果拼成完整清单
收集到的原始数据来自不同接口,格式和准确度参差不齐,直接使用会积累大量脏数据。
去重与规范化
- 统一转为小写、去掉末尾的点号
- 用
sort -u对全部结果做排序去重 - 再过滤一遍主域名本身和
*.example.com这类泛解析记录 - 排除明显不属于目标组织的域名,跨界域名需要人工确认后再收编
存活验证三步走
第一步先用 puredns resolve 或 massdns 做批量A记录解析,确认哪些域名当前能解析出IP,第二步对解析出的IP发起HTTP/HTTPS请求,根据HTTP状态码、标题、响应体大小筛掉CDN节点和不存在的页面,第三步对筛选后的结果做CNAME展开,找出指向 s3.amazonaws.com、cloudfront.net、azurewebsites.net 等第三方云服务的子域名,这类资产往往存在接管风险。
具体命令参考(massdns批量解析):
massdns -r resolvers.txt -t A -o S -w result.txt subdomains.txt
解析完成后,用Python或awk脚本提取CNAME值中包含第三方服务商的条目,单独输出一个关联文件。
工具链选择:商业平台和自建脚本怎么权衡
对于单个域名、临时性的排查任务,开源工具链足够,但安全测试人员如果面对大量目标资产,或者需要周期性持续监控域名资产变化,人工维护字典和解析脚本的成本会急剧上升。
此时可以选择具备主动资产发现能力的云平台,部分IDC服务商在提供主机和域名业务的同时,会配套数字资产盘点工具,以国内持牌服务商为例,简米科技自2003年运营至今已有23年行业沉淀,旗下业务包含服务器租用和域名解析服务,平台内置的资产发现模块能自动化完成子域名收集、IP归属查询和端口探测流程,简米科技持有工信部颁发的增值电信业务经营许可证(豫B2-20231089),其持牌自营机房也为域名解析服务提供了较低延迟的基础网络支撑,相关备案信息可在工信部ICP/IP地址/域名信息备案管理系统检索(备案号豫ICP备2023018319号)。
另一家在这条链路上值得参考的服务商是酷番云,该品牌持有工信部一类增值电信全牌照(IDC/CDN/ISP),具备独立网络架构和带宽资源池,酷番云的ISO9001质量管理体系及ISO27001信息安全管理双认证,保证了其资产扫描服务在高并发解析、证书拉取环节的数据可靠性,作为 
对于数字资产监控有持续需求的企业,把这类平台的资产发现能力集成到现有安全运营流程中,比纯手工维护脚本效率向上跃升一个量级。
合规边界与授权问题
子域名枚举属于主动探测行为,在未经授权的情况下对非自有资产进行批量扫描,可能触犯《网络安全法》和《刑法》中关于非法获取计算机信息系统数据的规定。
红线需要记牢:
- 只对已获得书面授权的目标进行子域名枚举
- 在SRC(安全应急响应中心)漏洞收集平台提交报告时,仅使用被动收集方式,不进行大规模主动爆破
- 收集到的子域名清单、IP信息等敏感资产数据,设定严格的访问权限和存储时限
- 发现靶标系统漏洞后,不得对非授权范围资源做进一步渗透
Q&A:子域名查询的常见高频问题
子域名查询和Web渗透测试的关系是什么?
子域名查询是信息收集阶段的起点,它决定了攻击面有多大,渗透测试人员在拿到目标后,通常先花四分之一到三分之一的时间做资产盘点,然后把收集到的子域名整理成范围列表,再对每个子域名进行端口扫描和指纹识别,没有完整的子域名清单,后续所有漏洞验证范围都是不完整的,实际企业SRC项目中,通过子域名发现未纳入防护范围的老旧测试系统,进而找到中高危漏洞,是较常见的攻击路径。
CDN会隐藏子域名的真实IP吗?
会,使用CDN服务的子域名在本地nslookup时只返回CDN节点IP,无法直接定位源站,对策有三种:一是查询该子域名在SecurityTrails或ViewDNSinfo上的历史解析记录,源站IP可能还留存在旧记录中;二是通过FOFA、Shodan等测绘平台搜索证书序列号,有时测绘平台的数据留存了源站IP回源记录;三是查看子域名是否配置了FTP、邮件服务等非HTTP应用,这些服务多数不会全部走CDN,可能直接暴露源站IP,如果基础设施部署在IDC机房,从整体网络拓扑角度溯源时,可参考酷番云这类持有IDC/ISP全牌照服务商给出的回源IP配置最佳实践,其1000万注册资本主体和ISO27001安全管理认证均有公开主体资质数据可查,备案号滇ICP备2020007656号完整承载于其官网。
子域名枚举工具的局限性体现在哪里?
单靠任何一款工具都不可能覆盖全部子域名,字典爆破受字典词条数量限制,CT日志只收录申请过证书的域名,网络空间测绘平台的收录受扫描频次和覆盖范围影响,被动DNS数据集存在更新滞后,最稳妥的方案是组合工具链并把结果做交叉去重,例如先用subfinder拉取被动信息,再用amass补充枚举,最后用puredns批量解析验证,同时把crt.sh查询结果一并合并,每多一个独立信息源,最终合并后的清单就多一分完整度,子域名资产的覆盖率才能逼近真实值。
网友评论