第4章 阶段3:主动探测
本篇定位:子域名挖掘流程的第三阶段。被动发现用公开数据覆盖了 60-80% 的子域,但剩下 20-40% 的盲区——内部子域、未收录子域、新上线子域、非标准命名的子域——被动方法覆盖不到。主动探测就是向目标的 DNS 服务器发查询,"敲门"发现这些子域。
阅读建议:如果你做过 DNS 爆破,可以跳到 4.3 排列扫描看变体生成方法。如果是新手,按顺序读——4.1 到 4.3 风险递增、方法递进,前面的概念是后面的基础。
4.0 方法论框架
主动探测在全局流程里的位置:
阶段2:被动发现(子域名列表,60-80% 覆盖) ──→ 【阶段3:主动探测】 ──→ 阶段4:进阶发现 │ ├── DNS 字典爆破 ├── DNS 域传送(AXFR) └── DNS 排列扫描什么是主动探测
主动探测(Active Probing),指的是直接向目标的 DNS 服务器发送查询请求,根据响应判断子域名是否存在。整个过程中,你的 IP 会出现在目标 DNS 服务器的查询日志里——目标知道有人在查。
为什么在被动后面
| 原因 | 说明 |
|---|---|
| 被动有盲区 | 内部子域、未收录、新上线——被动方法覆盖不到 |
| 风险后置 | 被动零风险先跑,主动有风险后跑 |
| 互补 | 被动覆盖大头,主动补盲区——两者结合覆盖率最高 |
主动探测的本质
主动探测是在三个维度之间做权衡:
| 维度 | 含义 | 矛盾 |
|---|---|---|
| 覆盖率 | 能发现多少子域 | 覆盖率高 → 字典大、查询多 |
| 速度 | 多快跑完 | 速度快 → 并发高 → 触发限速 |
| 隐蔽性 | 目标发现你的概率 | 隐蔽性高 → 并发低、限速严 → 速度慢 |
关键认知:主动探测没有"既要又要"——高覆盖率意味着大量查询,大量查询意味着高并发,高并发意味着容易被发现。你能做的是在三个维度之间找到适合当前目标的平衡点。
三个方法概览
主动探测的风险
主动探测和被动发现的根本区别:主动探测接触目标。
| 风险类型 | 说明 |
|---|---|
| 被检测 | 目标 DNS 服务器记录你的 IP 和查询模式 |
| 被封禁 | 高并发查询触发限速,IP 被临时或永久封禁 |
| 被限速 | 查询被降速处理,返回空结果(假阴性) |
| 法律风险 | 未授权的主动探测可能触犯法律 |
风险管理在 4.4 节单独讲,踩坑案例在第8章。
4.1 DNS 字典爆破
前置知识
暴力枚举(Brute Force)
暴力枚举是一种穷举策略——不依赖猜测或线索,把所有可能的候选值逐个尝试。在子域名挖掘里,暴力枚举的具体形式是"字典爆破":把字典里的每个前缀拼到根域名上,逐个查 DNS,看哪个存在。
DNS 查询基础回顾
基础知识02讲过 DNS 解析流程——你输入dev.example.com,DNS 服务器返回这个域名是否存在、对应的 IP 是什么。主动探测就是利用这个机制——你主动构造大量子域名查询,从 DNS 服务器的响应里判断哪些子域存在。
DNS 响应码语义
每次 DNS 查询,服务器会返回一个响应码(RCODE),告诉你查询结果的状态。和子域名挖掘相关的有三个:
| 响应码 | 名称 | 含义 | 判断 |
|---|---|---|---|
| NOERROR | 无错误 | 域名存在,有解析记录 | 子域可能存在 |
| NXDOMAIN | 域名不存在 | 域名在 DNS 里没有记录 | 子域不存在 |
| SERVFAIL | 服务器失败 | DNS 服务器处理出错或被限速 | 不确定,要重试 |
关键认知:NOERROR 不等于"子域一定存在"。通配符 DNS(基础知识04讲过)会让所有子域都返回 NOERROR——即使你查的子域根本不存在。判断通配符是阶段5 DNS 清洗的工作,这里只管"查询→收响应码"。
ANY 查询
基础知识04讲过 DNS 记录类型(A、CNAME、MX 等)。常规查询是"查一种记录"(如只查 A 记录)。ANY 查询是"查所有记录"——一次请求拿到 A、CNAME、MX、TXT 等所有记录。理论上 ANY 查询效率高,但实际上很多 DNS 服务器对 ANY 查询做了限制或返回不全。
是什么
用字典里的前缀拼到根域名上(如dev+example.com=dev.example.com),逐个向 DNS 服务器查询,根据响应码判断子域是否存在。
为什么
字典爆破能覆盖被动方法的盲区:
| 被动盲区 | 字典爆破怎么补 |
|---|---|
| 内部子域 | 字典里有internal、dev、test等常见内部命名 |
| 未收录子域 | 不依赖搜索引擎收录,直接查 DNS |
| 新上线子域 | 主动探测是实时的,不等收录 |
| 非标准命名 | 部分能通过定制字典覆盖(剩下的靠排列扫描) |
怎么做
第一步:字典选择
回顾阶段1(第2章)准备的字典。字典爆破的命中率取决于字典质量:
| 字典类型 | 特点 | 命中率 |
|---|---|---|
| 通用高频字典 | 常见子域名词汇 | 中等——大家都用,目标也都知道 |
| 通用全量字典 | 收录了大量词汇 | 低——大量无效查询 |
| 定制字典 | 基于目标业务特征定制 | 高——目标特有命名 |
第二步:查询方式
| 查询方式 | 查什么 | 特点 |
|---|---|---|
| A 记录查询 | 域名→IPv4 地址 | 最常用,响应快 |
| AAAA 记录查询 | 域名→IPv6 地址 | 补充 IPv6 子域 |
| CNAME 记录查询 | 域名→别名 | 暴露 CDN、第三方服务 |
| ANY 查询 | 所有记录 | 理论上一次拿全,实际常被限 |
第三步:并发与限速
回顾阶段1准备的环境配置参数。字典爆破是批量查询,并发和限速直接决定能不能跑完:
| 参数 | 作用 | 参考值 |
|---|---|---|
| 并发数 | 同时发多少个查询 | 50-200 |
| QPS | 每秒查询数 | 10-50 |
| 超时 | 单次查询等待时间 | 3-5 秒 |
| 重试 | 超时后重试次数 | 2-3 次 |
| Jitter | 查询间随机延迟 | 50-200ms |
第四步:多级爆破
| 层级 | 示例 | 字典策略 |
|---|---|---|
| 二级子域 | dev.example.com | 通用字典 + 定制字典 |
| 三级子域 | api.dev.example.com | 基于已发现的dev.example.com,用小字典爆破 |
| 四级子域 | v2.api.dev.example.com | 通常不爆破,靠网页爬取 |
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| 分层爆破 | 先跑二级子域,拿结果后再跑三级 | 避免对不存在的二级子域跑三级(浪费查询) |
| 高频词优先 | 字典按词频排序,高频词先跑 | 前面就能拿到大部分命中,后面是长尾 |
| 自适应并发 | 遇到超时增多时自动降并发 | 防止被限速后继续打导致封禁 |
| 重试策略 | NXDOMAIN 不重试,SERVFAIL 重试 | NXDOMAIN 是确定答案,SERVFAIL 是不确定 |
注意事项
| 事项 | 说明 |
|---|---|
| 通配符 DNS 干扰 | 通配符 DNS 会让所有子域返回 NOERROR——爆破前要先检测通配符 |
| DNS 限速/封禁 | 高并发查询会被 DNS 服务器限速或封禁 IP |
| 假阴性 | 被限速后返回空结果,你以为没这个子域,其实是被限了 |
| 字典过时 | 旧字典收录了已不常见的词汇,浪费时间 |
4.2 DNS 域传送(AXFR)
前置知识
Zone 文件
基础知识04讲过 Zone(区域)的概念——Zone 是 DNS 服务器管辖的一段域名空间。Zone 文件(Zone File)是记录这个 Zone 里所有 DNS 数据的文本文件。一个 Zone 文件长这样:
$ORIGIN example.com. ; 这个 Zone 管理的域名 $TTL 3600 ; 默认缓存时间(秒) ; SOA 记录:Zone 的元信息 @ IN SOA ns1.example.com. admin.example.com. ( 2026100401 ; 序列号 3600 ; 刷新时间 1800 ; 重试时间 604800 ; 过期时间 86400 ; 最小 TTL ) ; NS 记录:这个 Zone 的权威服务器 @ IN NS ns1.example.com. @ IN NS ns2.example.com. ; A 记录:域名→IPv4 @ IN A 1.2.3.4 www IN A 1.2.3.4 api IN A 1.2.3.5 dev IN A 10.0.0.5 ; CNAME 记录:别名 blog IN CNAME example.github.io.Zone 文件里的每一行就是一条 DNS 记录。如果一个 Zone 里有 200 个子域,Zone 文件就有 200 条记录——拿到 Zone 文件等于拿到全量子域名列表。
关键认知:Zone 文件是 DNS 服务器的"内部账本"。正常情况下,外部用户只能一条一条查记录(你查
www.example.com的 A 记录,服务器返回 IP)。AXFR 是一种特殊机制,让你一次性拿到整个"账本"。
AXFR(区域传送,Zone Transfer)
AXFR 是 DNS 协议的一个功能——允许从 DNS 服务器向主 DNS 服务器请求整个 Zone 文件的完整副本。它的设计初衷是主从同步:主 DNS 服务器(Master)更新了记录后,从 DNS 服务器(Slave)通过 AXFR 拉取最新 Zone 文件,保持数据一致。
为什么会有 AXFR
一个 Zone 通常有多台权威 DNS 服务器(如ns1.example.com和ns2.example.com)——一台主、多台从,做冗余。主服务器改了记录后,从服务器要知道改了什么。AXFR 就是"从服务器向主服务器拉取整个 Zone 文件"的机制。
AXFR 的安全风险
AXFR 的设计年代(1980 年代 DNS 早期)没有考虑安全——任何客户端都可以向 DNS 服务器发 AXFR 请求,拿到整个 Zone 文件。这意味着任何人都能一次性拿到目标的所有子域名列表。现代 DNS 服务器通常会配置 ACL(Access Control List,访问控制列表),只允许从服务器发 AXFR,拒绝其他客户端。但如果管理员配置错误(忘了限制或限制过宽),AXFR 就能成功——这就是它的挖掘价值。
是什么
向目标的权威 DNS 服务器发送 AXFR 请求,尝试一次性获取整个 Zone 文件——包含这个 Zone 里所有子域名的完整列表。
为什么
AXFR 是主动探测里"性价比最高"的方法——一次请求就能拿到全量子域名列表,不用跑字典爆破。但它有前提:目标 DNS 服务器必须配置错误(允许任意客户端传送 Zone)。
怎么做
第一步:识别权威 DNS 服务器
先查目标的 NS 记录,找到权威 DNS 服务器:
| 步骤 | 做法 | 说明 |
|---|---|---|
| 查 NS 记录 | dig NS example.com | 返回目标的权威 DNS 服务器列表 |
| 记录服务器 | 如ns1.example.com、ns2.example.com | 这些是 AXFR 要请求的目标 |
第二步:发送 AXFR 请求
向权威 DNS 服务器的 TCP 53 端口发送 AXFR 请求。AXFR 用 TCP 而不是 UDP——因为 Zone 文件可能很大,UDP 的 512 字节限制装不下,必须用 TCP。
第三步:解析返回的 Zone 文件
如果 AXFR 成功,服务器返回整个 Zone 文件。从 Zone 文件里提取所有记录的 owner 名称(如www、api、dev),拼上根域名就是子域名列表。
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| 多权威服务器都试 | NS 记录可能返回多个,每个都试 AXFR | 不同服务器配置可能不同,有的禁用了有的没禁用 |
| TCP 53 端口 | AXFR 必须用 TCP 53 | UDP 53 装不下 Zone 文件 |
| 工具辅助 | 用dig AXFR @ns1.example.com example.com | 手动构造 AXFR 请求复杂 |
| 查所有 Zone | 如果目标有多个 Zone(如example.com和internal.example.com) | 每个 Zone 都试 AXFR |
注意事项
| 事项 | 说明 |
|---|---|
| 大部分服务器已禁用 | 现代 DNS 服务器基本都配置了 ACL,拒绝外部 AXFR |
| 只对配置错误有效 | AXFR 成功意味着管理员忘了限制——是配置错误 |
| 不是常规方法 | AXFR 成功率低,不能作为主力方法,只能试一下碰运气 |
| 成功后数据可能过时 | Zone 文件是当前快照,不是实时的——子域可能已变更 |
4.3 DNS 排列扫描
前置知识
子域命名规律
开发者给子域名命名时,通常基于一定的规律——用缩写、加数字版本、加环境后缀、合并多个词。比如目标已有api.example.com,可能还有apiv1、apiv2、api-dev、api-staging、internal-api、api-internal。这些变体不在通用字典里,但如果从已发现子域里提取词根,就能生成这些变体。
排列组合生成(Permutation)
排列组合生成是指——基于已有的词根,通过插字符、换顺序、加数字、合并等操作,生成新的候选子域名。和字典爆破的区别:字典爆破用的是"固定词汇表"(通用字典 + 定制字典),排列扫描用的是"从已发现子域提取的词根"做组合生成。
是什么
基于已发现的子域名,提取词根,通过排列组合生成变体(如api→apiv1、api-dev、internal-api),再对变体做 DNS 查询验证。
为什么
字典爆破用的是通用词和定制词,但目标可能有自己的命名习惯——用dev还是develop,用staging还是stage还是stg,用api还是apiv1还是apiv123。这些命名习惯,只有从已发现的子域里才能看出规律。
| 方法 | 候选词来源 | 覆盖什么 |
|---|---|---|
| 字典爆破 | 通用字典 + 定制字典 | 常见命名 |
| 排列扫描 | 已发现子域提取的词根 | 目标特有命名变体 |
怎么做
第一步:提取词根
从被动发现和字典爆破已发现的子域里提取词根:
| 已发现子域 | 提取的词根 |
|---|---|
api.example.com | api |
api-dev.example.com | api、dev |
apiv2.example.com | api、v2 |
internal-api.example.com | internal、api |
第二步:生成变体
用排列组合规则生成新候选:
| 规则 | 做法 | 示例 |
|---|---|---|
| 加版本号 | 词根 + 数字 | api→api1、api2、api3 |
| 加环境后缀 | 词根 + 环境词 | api→api-dev、api-staging、api-test |
| 加前缀 | 环境词 + 词根 | api→internal-api、dev-api |
| 合并词根 | 词根 + 词根 | api+dev→apidev、devapi |
| 插字符 | 词根中间插字符 | api→a-pi、ap-i |
第三步:查询验证
对生成的变体做 DNS 查询,判断哪些存在。
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| 工具辅助 | 用 altdns / dnsgen / gotator 等工具自动生成变体 | 手动生成不现实,变体数量是指数级 |
| 多轮迭代 | 把第一轮排列扫描发现的新子域作为输入,再跑一轮 | 新子域可能又有新的词根 |
| 词根质量 | 只从确信存在的子域里提取词根 | 假阳性子域的词根会生成更多假阳性 |
| 限制变体数量 | 控制生成规则数量和词根数量 | 变体数量爆炸 → 查询量爆炸 → 被限速 |
注意事项
| 事项 | 说明 |
|---|---|
| 变体数量爆炸 | 几十个词根的排列组合可能生成几万到几十万个变体 |
| 命中率取决于词根质量 | 词根太少或太泛 → 变体大多不存在 |
| 仍受通配符干扰 | 和字典爆破一样,通配符 DNS 会让所有变体返回 NOERROR |
| 查询量大 | 排列扫描的查询量比字典爆破更大,限速风险更高 |
4.4 主动探测的风险管理
风险类型
| 风险 | 触发条件 | 后果 |
|---|---|---|
| 被检测 | 任何主动查询都会被目标 DNS 服务器记录 | 目标知道有人在侦察 |
| 被封禁 | 高并发、大量查询、固定模式 | IP 被临时或永久封禁 |
| 被限速 | 超过 DNS 服务器 QPS 限制 | 查询被降速,返回空结果(假阴性) |
| 法律风险 | 未授权的主动探测 | 可能触犯相关法律 |
控制原则
| 原则 | 做法 | 说明 |
|---|---|---|
| 先低并发试水 | 开始用低并发跑小字典,观察响应 | 摸清目标的限速阈值 |
| 监控成功率 | 实时统计查询成功率,低于 90% 自动降速 | 早期发现限速 |
| 遇阻降速 | 遇到超时增多、SERVFAIL 增多,立即降并发 | 防止从限速升级到封禁 |
| 合规授权 | 只在授权范围内做主动探测 | 法律风险控制 |
三个方法的风险等级
| 方法 | 风险等级 | 原因 |
|---|---|---|
| DNS 字典爆破 | 高 | 查询量大、模式明显(顺序查询容易被识别) |
| DNS 域传送(AXFR) | 低 | 一次请求,查询量极小 |
| DNS 排列扫描 | 高 | 变体数量大,查询量比字典爆破还大 |
关键认知:AXFR 风险最低(一次请求),但成功率也最低(大部分服务器已禁用)。字典爆破和排列扫描风险高,但覆盖率高。主动探测的风险管理,本质是"在覆盖率和隐蔽性之间找平衡"。
与第8章的区分
本章只讲风险类型和控制原则。具体的踩坑案例——通配符假阳性、DNS 静默丢包、IP 封禁、管道数据丢失——在第8章踩坑实录里讲。
4.5 阶段输出
输出1:新增子域名列表
| 字段 | 说明 | 示例 |
|---|---|---|
| 子域名 | 新发现的子域名 | internal-api.example.com |
| 发现方法 | 从哪个方法发现的 | 字典爆破 / AXFR / 排列扫描 |
| DNS 响应码 | 查询时的响应码 | NOERROR |
| 发现时间 | 什么时候发现的 | 2026-10-04 |
| 备注 | 补充信息 | AXFR 成功 / 排列扫描第二轮 |
输出2:与被动发现合并后的总列表
| 字段 | 说明 |
|---|---|
| 子域名 | 所有发现的子域名 |
| 发现阶段 | 被动 / 主动 |
| 发现方法 | 具体方法(CT、搜索引擎、字典爆破等) |
| 是否多源 | 多个方法都发现了吗 |
| 来源数 | 几个方法发现了它 |
输出3:覆盖率统计
| 阶段 | 发现数量 | 新增贡献 | 总覆盖率 |
|---|---|---|---|
| 被动发现 | 200 | — | 80% |
| 主动探测-字典爆破 | 30 | 10% | 92% |
| 主动探测-AXFR | 0 | 0% | 92% |
| 主动探测-排列扫描 | 15 | 6% | 98% |
| 合计 | 245 | 18% | 98% |
4.6 与其他阶段的衔接
输出流向
新增子域名列表 ──→ 阶段4:进阶发现(作为递归和排列扫描的种子) 合并总列表 ──→ 阶段5:DNS 清洗(做 DNS 验证和通配符过滤)主动探测补了什么盲区
| 被动盲区 | 主动探测补的 | 补的效果 |
|---|---|---|
| 内部子域 | 字典爆破的internal、dev、test | 部分覆盖 |
| 未收录子域 | 字典爆破不依赖收录 | 全覆盖 |
| 新上线子域 | 主动探测是实时的 | 全覆盖 |
| 非标准命名 | 排列扫描基于已发现子域生成变体 | 部分覆盖 |
递归时回到主动
进阶发现阶段(阶段4)发现新的根域名或新子域时,要回到这里重跑主动:
| 重新做的 | 为什么 |
|---|---|
| 重跑字典爆破 | 新根域名用新字典爆破 |
| 重跑排列扫描 | 新发现子域提供新词根,生成新变体 |
| 调整并发参数 | 新根域名的 DNS 服务器可能不同,限速阈值不同 |
关键认知:主动探测是"挖得深"的关键。被动发现覆盖广但浅——它找到的是"目标愿意公开的"子域。主动探测深入一层——它找到的是"目标没意识到暴露的"子域。但主动探测有成本——时间成本、风险成本。每次递归都要权衡"再跑一轮主动值不值"。
下一篇:第5章——进阶发现,以已发现的子域为跳板,递归扩大发现范围。