先通过多源信息收集扩大攻击面,再结合工具与人工验证去重,最后用字典爆破和证书透明度挖掘深层子域,同时将结果与IP、端口、Web指纹关联分析。这套流程能帮助安全人员、运维人员和红队工程师在短时间内摸清企业数字资产边界,避免因遗漏子域名导致安全事件。
子域名遍历前要理清的目标与边界
很多人在做子域名收集时上来就跑工具,结果收集到几百条记录,一半是死的,还有一部分是第三方托管平台,行业共识认为,高效的遍历不是追求数量,而是追求资产的准确归属和可用性。
在开始之前,先明确三个问题:
- 你要收集的子域名属于哪个根域名?是否包含多级子公司域名?
- 遍历后要交付什么?是纯域名列表,还是需要关联IP、CDN、端口和Web指纹?
- 是否有授权?未授权的子域名扫描可能触碰法律边界。
理清边界后,再决定采取哪条技术路线,常见路线包括证书透明度日志、DNS爆破、搜索引擎语法、被动威胁情报平台,以及爬虫解析JS文件,每一条路线都有盲区,所以高效遍历的秘诀是交叉验证。
如何利用证书透明度快速获取子域名
证书透明度(Certificate Transparency,CT)是目前性价比最高的子域名来源,任何机构申请SSL证书时,证书会被记录在公开日志中,攻击者和防御者都能查询,借助crt.sh、Censys和Google Transparency Report,能在几秒内拿到大量历史子域名。
实际操作路径:
- 访问crt.sh,输入
%.example.com,直接在网页里下载CSV结果。 - 使用命令行工具
certspotter或ctfr批量拉取,其中ctfr支持通过Python脚本指定域名输出纯域名列表。 - 将结果中
.example.com形式的通配符记录单独拎出来,它们往往代表泛解析或CDN网关。
需要注意,CT日志覆盖的是申请过证书的域名,内部系统如果只用IP访问或自签证书,就不会出现在日志里,所以CT只能作为第一步,不能替代DNS爆破。
子域名遍历工具哪个好:主流工具对比
网上可选的工具很多,但真正适合实战的并不多,按照使用频率和社区口碑,我把它们分为四档:
| 工具名称 | 核心特点 | 适合场景 | 短板 |
|---|---|---|---|
| Amass | 集成CT、DNS、搜索引擎、API接口,支持被动和主动模式 | 企业级全面资产测绘 | 配置复杂,依赖外部API密钥 |
| subfinder | 纯被动收集,速度快,适合红队前期 | 快速获取已公开的子域名 | 无法发现未公开的隐藏子域 |
| OneForAll | 国内团队开发,集成了多个被动源和主动爆破模块 | 中文资产收集,输出报告友好 | 依赖Python环境和第三方库 |
| massdns | 高速DNS爆破工具,配合字典可处理百万级域名 | 大规模域名爆破 | 容易被DNS服务器封IP,需调整速率 |
| dnsx | 用于验证和过滤已收集的域名,支持DNS解析和CDN识别 | 结果清洗与存活检测 | 单独使用价值有限 |
如果你问我“子域名遍历工具哪个好”,我的建议是不要迷信单一工具,用subfinder做被动收集,再用massdns或puredns做主动爆破,最后用dnsx验证存活,这套组合拳在多数场景下优于任何一款“全家桶”工具。
如何用Python编写子域名爆破脚本
很多情况下,现成工具不能满足定制需求,比如你只想爆破特定长度、特定关键词的子域名,或者需要把结果实时同步到数据库,这时有必要了解如何用Python写一个精简的爆破脚本。
核心逻辑很简单:
- 加载字典文件,逐行读取候选名称。
- 使用
socket.gethostbyname()或dnspython库发起DNS解析请求。 - 解析成功的域名记为存活,解析失败或返回NXDOMAIN则跳过。
- 设置超时和线程数,避免阻塞。
一个基础的脚本框架如下:
import dns.resolver
from concurrent.futures import ThreadPoolExecutor
def resolve(sub):
try:
answers = dns.resolver.resolve(f"{sub}.example.com", "A")
return sub, answers[0].address
except Exception:
return None, None
with open("dict.txt") as f:
subs = [line.strip() for line in f if line.strip()]
with ThreadPoolExecutor(max_workers=100) as ex:
results = ex.map(resolve, subs)
for sub, ip in results:
if sub:
print(f"{sub}.example.com -> {ip}")
这个脚本可以直接跑,但别忽略几个细节:
- 字典质量决定结果上限,推荐使用
SecLists的subdomains-top1million-5000.txt,再叠加企业专属命名习惯,比如dev-、test-、api-、grafana-。 - 线程数控制在50到200之间,太高容易被限流或触发防火墙告警。
- 泛解析问题:如果目标域名配置了泛解析,所有不存在的子域名都会解析到同一个IP,此时需要先解析一个随机字符串,记录泛解析IP,在结果中排除该IP。
子域名发现隐藏资产的方法:从DNS到Web指纹
拿到存活子域名列表后,真正的“隐藏资产”挖掘才刚刚开始,很多子域名本身不直接暴露在搜索引擎或CT日志中,但通过以下方法可以顺藤摸瓜。
利用DNS历史记录和被动数据库
有些子域名已经停止解析,但在历史DNS记录中仍然存在,通过SecurityTrails、DNSDumpster或微步在线,可以查询到过去一年甚至更久的解析记录,这些历史子域名可能指向旧服务器,而这些旧服务器往往安全防护薄弱,容易成为突破口。
从JavaScript和移动端提取子域名
现代Web应用的前端JS文件里藏着大量接口地址和内部域名,用爬虫抓取目标主站的JS文件,再用正则表达式匹配[a-z0-9-]+.target.com,经常能发现测试环境或后台管理系统,移动端App的反编译包中同样包含API基底地址,很多是独立子域名。
一条老练的评估路径是这样的:
- 先从CT和被动源得到基础子域集合。
- 对每个子域名发起HTTPS请求,获取响应头中的
Server字段和Set-Cookie字段。 - 使用
httpx或wappalyzer识别Web指纹,比如Shiro、Spring Boot、FastJSON、ThinkPHP。 - 对存在已知框架的子域名做目录扫描,重点寻找
/actuator、/api-docs、/.git等敏感路径。
这种思路把“子域名发现隐藏资产的方法”从单纯枚举升级到了关联分析,效果远好于拿一个工具跑完就收工。
企业如何做子域名资产梳理工具选型
企业安全团队往往需要定期梳理子域名资产,而不是打一次就完事,这时候要选型一款平台化工具,自动完成周期性扫描。
选型时重点看四方面:
- 数据源覆盖量:是否包含CT、被动DNS、搜索引擎、暗网监控等至少10个数据源。
- 存活验证与指纹识别能力:能否自动过滤死域名,能否识别CDN、云WAF和真实IP。
- 集成与自动化:是否提供API接口,能否对接SIEM或告警平台。
- 部署方式与价格:SaaS模式或私有化部署,按域名数量计费还是按年订阅。
据行业内公开信息,目前主流商业产品价格从每年几千元到几十万元不等,开源方案免费但需要自行维护,如果是中小企业,建议先用开源工具搭建流程,等资产规模超过1000个域名后再考虑商业平台。
遍历结果如何避免遗漏和误报
高效的遍历必须同时控制漏报和误报两道关口,漏报意味着没发现的资产,误报则浪费后续测试时间。
避免漏报的做法:
- 组合至少三个被动源加一个主动爆破,不要只用CT日志。
- 字典除了通用词,还要加入目标企业相关词,比如公司简称、项目代号、地理位置拼音。
- 尝试二级域名的多级子域,比如
dev.admin.example.com可能需要先枚举admin.example.com再枚举下一层。
消除误报的做法:
- 对所有解析成功的域名执行反向DNS查询,确认IP归属。
- 对泛解析IP做过滤。
- 对CDN上的子域单独分类,不要直接与源站IP混淆。
- 存活检测时,同时检查HTTP和HTTPS,避免只通443或只通80的情况。
常见的子域名遍历问题与应对策略
在实际操作中,你可能会遇到以下情况:
目标DNS服务器限流导致爆破中断。 这时可以降低并发,或者改用puredns的-r参数指定公共DNS服务器列表,轮询解析。
子域名解析到内网IP。 说明目标存在DNS拆分隧道,内部子域只在特定网络可见,此时需要结合SSL证书SAN字段或通过泄露的配置文件判断内网域名。
多个子域指向同一台服务器。 这是典型的一台服务器上托管多个虚拟主机的情况,遍历完后,对每个IP做端口扫描,再通过HTTP响应头的Host字段差异区分虚拟主机,往往能找到未备案的隐藏站点。
子域名挖掘与渗透测试怎么配合
对于渗透测试人员,子域名遍历不是终点,而是入口,挖到一个子域名后,需要立即判断它是否与主站共享同一套认证体系,如果子域使用独立认证,尝试弱口令或默认口令;如果子域引用了主域的Cookie,可能存在SSO绕过风险。
一个典型的红队流程是:
- 子域收集:被动+主动,得到所有存活的子域。
- 指纹识别:批量探测Web技术栈、中间件版本。
- 漏洞匹配:对识别出的框架版本比对公开漏洞库。
- 横向关联:将子域解析的IP段与主站所在网段比对,寻找内网暴露面。
这套流程中,子域名遍历的准确性直接决定渗透测试的上限,漏掉一个测试子域,可能就漏掉一次拿到权限的机会。
隐藏资产如何关联到真实IP
很多子域名挂在CDN后面,直接解析得到的是CDN节点IP,要发现隐藏资产的真实IP,可以尝试以下思路:
- 查找历史DNS记录,看看CDN接入前的源站IP。
- 利用子域名的SSL证书指纹,用
fofa或Shodan搜索该指纹,匹配其他开放了相同证书的IP。 - 尝试根域名或邮件服务器(如
mx.example.com)的IP,有时候源站和邮件服务器在同一台机器。
这里要提醒一点:不要在未授权情况下对真实IP发起端口扫描或漏洞利用,资产归属确认后,应当通过安全部门或漏洞报告渠道提交。
如何用Python和API实现子域名自动化巡检
如果你需要周期性检查子域名资产变化,可以写一个简单的巡检脚本,每天拉取CT日志并对比昨天的结果,新增的子域名自动推送告警。
具体步骤:
- 用
certspotter的API或crt.sh的接口拉取JSON格式域名列表。 - 统一解析为小写,去重后存入数据库。
- 用
diff对比上次结果,生成新增与下线列表。 - 通过企业微信或钉钉机器人推送变更通知。
这种方法可以及时发现新上线的系统,也能发现被恶意解析的子域名,属于子域名管理中的“持续监控”环节。
Q&A:关于子域名遍历和隐藏资产发现的常见问题
如何判断一个子域名是否属于目标企业?
解析子域名获得IP后,通过反查IP的PTR记录和该IP上托管的其他域名判断归属,再看页面的版权信息、备案号或隐私政策中的公司名称,如果页面直接跳转到其他企业域名,大概率是被弃用的子域或已转让资产。
子域名爆破时字典应该从哪里获取?
优先使用SecLists的subdomains-top1million-50000.txt,然后结合目标企业的命名习惯手动补充,如果目标公司有公开的员工姓名拼音、产品名、城市名,也可以批量生成变体,注意字典要定期更新,新出现的缩写词往往对应新业务线。
CDN上的子域名是否还需要单独记录?
需要,CDN上的子域名虽然真实IP隐藏,但它们可能单独配置了缓存规则或访问控制,存在解析源站漏洞,记录时应单独标记CDN来源,后续测试时采用不同的绕过策略。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/614682.html





