接到一个授权测试目标之后,我做的第一件事往往不是打开浏览器去看官网,而是先花一个晚上把目标的所有子域名摸一遍。这个习惯源于一次真实经历:主站 WAF 严严实实,连目录扫描都要小心谨慎,结果一个类似 test.example.com 的老测试子域直接裸奔着后台,登录框连验证码都没做。子域名收集在渗透测试里属于信息收集阶段的核心动作,子域名越多,意味着攻击面越大,拿到权限的概率也越高。这篇文章会把我在 Kali 下常用的 7 种子域名批量抓取技巧完整整理出来,从被动数据源到主动爆破,每一条都附上实际命令和踩坑记录,适合刚接触 Kali 但对信息收集还没有体系概念的读者,也适合想把自己的子域名收集流程补全的同行参考。
1. 子域名收集到底在收集什么:攻击面逻辑与7种技巧总览
1.1 为什么子域名往往比主域名更值得投入时间
很多新人会困惑:目标不就是 example.com 一个域名吗,直接开扫不就行了?这是对资产理解还不够。大型企业的数字资产通常分散在几十上百个子域里,主站由安全团队重点防守,WAF、CDN、风控体系一套套;但子域名往往是不同业务线、不同时期、不同外包团队留下的,管理水平参差不齐。
我见过不少目标,官网是 example.com,但还有 old.example.com、test.example.com、api-dev.example.com 这类子域挂着老旧版本的管理后台、接口文档甚至数据库管理面板。子域名的存在说明这个域名下的 HTTP 服务更多、解析记录更复杂、暴露的端口和中间件更多。从红队角度看,子域名的数量基本决定了攻击面的上限;从蓝队角度看,这也是资产测绘和收敛的第一步。
所以子域名收集的核心价值不是"把名字找齐",而是把目标组织的数字资产脉络梳理出来。收集到的子域名清单,后续还要配合 DNS 解析、IP 归属、端口探测、指纹识别继续往下走,形成完整的攻击面地图。
1.2 被动收集与主动爆破的分野
子域名收集方法虽然多,但本质上只有两大流派。
被动收集不直接向目标发送请求,靠的是证书透明日志、搜索引擎、第三方情报库这些公开数据源。优点是不接触目标,不会触发目标侧的任何告警,几乎没有法律风险;缺点是覆盖面有限,过时或隐藏较深的子域可能看不到。
主动爆破则会向目标 DNS 服务器发送大量解析请求,或者直接对候选子域发起 HTTP 探测。优点是结果更全,能发现很多第三方数据源里没有收录的内网映射记录;缺点是有流量特征,可能触发目标的 DNS 监控或 WAF 告警,而且速度太快的话容易被封 IP。
真正成熟的流程,从来不是"二选一",而是先用被动方式把底子铺好,再用主动方式做扩展。下面这 7 种技巧里,前四种偏被动,后面三种偏主动,正好对应这条思路。
1.3 七种技巧总览
| 顺序 | 技巧 | 类型 | 特点与速度 | 适合场景 |
|---|---|---|---|---|
| 1 | 证书透明日志(crt.sh) | 被动 | 稳定,数据质量高 | 第一手信息,通用 |
| 2 | 搜索引擎语法 | 被动 | 比较随缘,反爬严重 | 补充发现,遗漏排查 |
| 3 | Sublist3r | 被动 | 聚合多源搜索引擎结果 | 快速粗筛 |
| 4 | assetfinder | 被动 | 来源广,输出快到离谱 | 大规模资产初步摸底 |
| 5 | Amass | 被动+主动 | 数据源最多,深度玩法 | 重点目标深挖 |
| 6 | ffuf 子域爆破 | 主动 | 高度可控,过滤器强大 | 有字典后的定向爆破 |
| 7 | massdns + dnsx | 主动 | 量级大,速度极快 | 超大规模子域枚举 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技巧一、二:证书透明日志与搜索引擎的被动收集
2.1 crt.sh:把证书日志当作子域名数据库
证书透明日志(Certificate Transparency)是一个公开的日志系统,所有公开签发的 TLS 证书都会被记录在里面。每张证书的 SAN(主题备用名称)字段会列出该证书覆盖的所有域名,所以只要查一下 CT 日志,就能把一个域名下所有出现在证书里的子域名捞出来。这个思路是我最常用的第一招,因为它完全不需要接触目标服务器,只需要向公开接口发一次查询。
crt.sh 是最常用的 CT 日志查询接口,Kali 下直接用 curl 结合 jq 就能解析:
bash复制curl -s "https://crt.sh/?q=%25.example.com&output=json" \
-A "Mozilla/5.0" \
--max-time 60 | \
jq -r '.[].name_value' | \
sed 's/\*\.//g' | \
sort -u > crtsh_subs.txt
这里有几个细节值得说明。%25.example.com 中的 %25 是 * 的 URL 编码,意思是查询所有以 .example.com 结尾的证书域名,包括通配符证书。jq 提取 name_value 字段后,sed 负责把形如 *.dev.example.com 的通配符前缀去掉。最后 sort -u 去重,得到一个干净的列表。
实际使用中 crt.sh 有两个小毛病:一是查询量大的时候响应很慢,所以我习惯加 --max-time 60 做超时保护,避免命令卡死;二是偶尔会返回重复数据或者过期证书的数据,不过只要最后一步做统一去重,问题不大。如果你觉得 crt.sh 的 JSON 解析太麻烦,也可以用 CertSpotter 的公开 API,命令形式类似。
