第2章 阶段1:准备
本篇定位:子域名挖掘流程的第一阶段。在开始被动发现或主动探测之前,把三件事准备好------范围、字典、环境。准备做不好,后面全白费:范围错了挖到不相关的域名,字典差了命中率极低,环境没配好会被 DNS 服务器封禁。
阅读建议:如果你已经做过子域名收集,可以直接看 2.4 阶段输出,确认准备阶段的产出是否完整。如果是新手,从头读------准备阶段决定了后续所有步骤的起点。
2.0 方法论框架
准备阶段在全局流程里的位置:
目标根域名 ──→ 【阶段1:准备】 ──→ 阶段2:被动发现
│
├── 范围界定 → 根域名列表
├── 字典选择 → 字典文件
└── 环境配置 → 环境参数
准备阶段做三件事:界定范围、选字典、配环境。这三件事的产出是后续所有阶段的输入------根域名列表决定你挖什么,字典决定你怎么挖,环境配置决定你能不能持续挖。
#mermaid-svg-9lV9VUyzhnmjfq3A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9lV9VUyzhnmjfq3A .error-icon{fill:#552222;}#mermaid-svg-9lV9VUyzhnmjfq3A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9lV9VUyzhnmjfq3A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9lV9VUyzhnmjfq3A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9lV9VUyzhnmjfq3A .marker.cross{stroke:#333333;}#mermaid-svg-9lV9VUyzhnmjfq3A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9lV9VUyzhnmjfq3A p{margin:0;}#mermaid-svg-9lV9VUyzhnmjfq3A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster-label text{fill:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster-label span{color:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster-label span p{background-color:transparent;}#mermaid-svg-9lV9VUyzhnmjfq3A .label text,#mermaid-svg-9lV9VUyzhnmjfq3A span{fill:#333;color:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A .node rect,#mermaid-svg-9lV9VUyzhnmjfq3A .node circle,#mermaid-svg-9lV9VUyzhnmjfq3A .node ellipse,#mermaid-svg-9lV9VUyzhnmjfq3A .node polygon,#mermaid-svg-9lV9VUyzhnmjfq3A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9lV9VUyzhnmjfq3A .rough-node .label text,#mermaid-svg-9lV9VUyzhnmjfq3A .node .label text,#mermaid-svg-9lV9VUyzhnmjfq3A .image-shape .label,#mermaid-svg-9lV9VUyzhnmjfq3A .icon-shape .label{text-anchor:middle;}#mermaid-svg-9lV9VUyzhnmjfq3A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9lV9VUyzhnmjfq3A .rough-node .label,#mermaid-svg-9lV9VUyzhnmjfq3A .node .label,#mermaid-svg-9lV9VUyzhnmjfq3A .image-shape .label,#mermaid-svg-9lV9VUyzhnmjfq3A .icon-shape .label{text-align:center;}#mermaid-svg-9lV9VUyzhnmjfq3A .node.clickable{cursor:pointer;}#mermaid-svg-9lV9VUyzhnmjfq3A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9lV9VUyzhnmjfq3A .arrowheadPath{fill:#333333;}#mermaid-svg-9lV9VUyzhnmjfq3A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9lV9VUyzhnmjfq3A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9lV9VUyzhnmjfq3A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9lV9VUyzhnmjfq3A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9lV9VUyzhnmjfq3A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9lV9VUyzhnmjfq3A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster text{fill:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A .cluster span{color:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9lV9VUyzhnmjfq3A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9lV9VUyzhnmjfq3A rect.text{fill:none;stroke-width:0;}#mermaid-svg-9lV9VUyzhnmjfq3A .icon-shape,#mermaid-svg-9lV9VUyzhnmjfq3A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9lV9VUyzhnmjfq3A .icon-shape p,#mermaid-svg-9lV9VUyzhnmjfq3A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9lV9VUyzhnmjfq3A .icon-shape .label rect,#mermaid-svg-9lV9VUyzhnmjfq3A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9lV9VUyzhnmjfq3A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9lV9VUyzhnmjfq3A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9lV9VUyzhnmjfq3A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出
准备工作
输入
流向阶段2
流向阶段3
全局使用
目标信息
公司名、主域名
业务知识
行业、产品线
DNS 资源
解析器、带宽
范围界定
字典选择
环境配置
根域名列表
字典文件
环境配置参数
阶段2:被动发现
阶段3:主动探测
关键认知:准备不是一次性动作。进阶发现阶段(阶段4)发现新的根域名时,要回到这里重新界定范围、调整字典。流程是循环的,准备阶段每次循环都会更新。
2.1 范围界定
是什么
确定哪些根域名在挖掘范围内。一个目标公司可能拥有多个根域名------主品牌、子公司、收购来的产品、历史遗留域名------范围界定就是把它们全部找出来。
为什么
没有范围界定,会出现两类问题:挖到不相关的域名(浪费时间),或者遗漏关联域名(漏掉资产)。更严重的是超授权挖掘------挖到了不该碰的域名,涉及法律风险。
授权范围确认:在开始之前,确认哪些根域名在授权范围内、哪些不能碰、授权时效到什么时候。合规问题集中在第8章踩坑实录里讲,这里只强调一点------先确认授权,再开始挖。
怎么做
第一步:根域名确认
主域名是什么,有哪些。一个公司通常不只有一个根域名:
| 来源 | 说明 | 例子 |
|---|---|---|
| 直接给定 | 授权方提供的域名 | example.com |
| WHOIS 查询 | 用注册信息反查同主体域名 | 查 example.com 的 registrant,反查该 registrant 下的其他域名 |
| 备案信息 | 国内目标查 ICP 备案,同备案主体下的域名 | 备案号 京ICP证XXXX号 下的所有域名 |
| 收购历史 | 目标公司收购了哪些产品,这些产品的域名 | startup.com 被 example.com 收购,startup.com 也在范围内 |
| 关联公司 | 子公司、母公司、合资公司的域名 | example-group.com 是集团域名,旗下各子公司域名都在范围内 |
第二步:资产边界
哪些子公司、哪些业务线、哪些关联域名在范围内:
| 边界类型 | 要确认的 | 容易漏的 |
|---|---|---|
| 子公司边界 | 全资子公司、控股子公司 | 刚收购还没整合的、持股比例低的 |
| 业务线边界 | 主营业务、新业务、测试环境 | 已下线的旧业务、内部工具域名 |
| 关联域名 | 集团域名、品牌域名 | 短链接服务、邮件服务、图片 CDN |
第三步:授权范围
确认哪些能挖、哪些不能碰、授权时效到什么时候。这一步不展开,指向第8章踩坑实录的"子域名接管法律边界"。
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| WHOIS 反查 | 查目标域名的注册人邮箱,反查该邮箱下的其他域名 | 发现未公开的关联域名 |
| 备案反查 | 国内目标查 ICP 备案主体,反查同主体下的域名 | 发现同公司不同品牌的域名 |
| 收购历史排查 | 查目标公司的收购记录,纳入被收购方的域名 | 发现未整合的旧资产 |
| LinkedIn / GitHub | 查目标公司的员工,从邮箱后缀发现关联域名 | 发现内部使用的域名 |
注意事项
| 事项 | 说明 |
|---|---|
| 范围越界 | 挖到不属于目标的域名,特别是共享主机或托管服务 |
| 授权过期 | 授权有时效,过期后继续挖等于未授权 |
| 忘记纳入新收购子公司 | 公司刚收购的子公司域名容易漏,要持续跟踪 |
| 历史遗留域名 | 公司改名的旧域名、废弃产品的域名,可能仍解析到内部资产 |
2.2 字典选择
是什么
用于主动爆破的子域名候选列表。字典里每一行是一个子域名前缀(如 dev、staging、api),爆破时把这些前缀拼到根域名上(如 dev.example.com),查 DNS 看是否存在。
为什么
字典质量直接决定爆破命中率。通用字典能覆盖常见子域名,但每个目标有自己的命名习惯------用 dev 还是 develop,用 staging 还是 stage 还是 stg,用 api 还是 apiv1 还是 apiv123。只用通用字典,会漏掉目标特有的子域名。
怎么做
第一步:通用字典
通用字典收录了最常见的子域名词汇,适用于所有目标:
| 字典类型 | 内容 | 典型词汇 |
|---|---|---|
| 常规服务 | 常见的服务命名 | www、mail、ftp、ssh、vpn |
| 开发环境 | 常见的开发命名 | dev、test、staging、qa、uat |
| 管理后台 | 常见的管理命名 | admin、manage、console、panel、dashboard |
| API 相关 | 常见的 API 命名 | api、graphql、rest、swagger |
| 内部服务 | 常见的内部命名 | internal、intranet、office、oa |
第二步:定制字典
基于目标业务特征和行业关键词定制:
| 定制维度 | 做法 | 例子 |
|---|---|---|
| 公司名 | 加入公司名、品牌名、产品名的变体 | 目标是 tencent → 加入 qq、weixin、wx |
| 行业词 | 加入行业特有词汇 | 金融目标 → trade、pay、risk、fund |
| 技术栈 | 加入目标使用的技术栈相关词 | 目标用 K8s → k8s、kube、prometheus、grafana |
| 地域词 | 加入地域相关词 | 跨国目标 → us、eu、cn、jp、sg |
第三步:多级字典
子域名爆破不只是爆破二级子域,还要爆破三级、四级:
| 层级 | 示例 | 字典策略 |
|---|---|---|
| 二级子域 | dev.example.com |
通用字典 + 定制字典 |
| 三级子域 | api.dev.example.com |
基于已发现的 dev.example.com,用小字典爆破 |
| 四级子域 | v2.api.dev.example.com |
通常不爆破,靠被动发现或网页爬取 |
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| 词根提取 | 从被动发现阶段已发现的子域里提取词根,加入字典 | 命中率最高的定制字典 |
| 合并去重 | 多个通用字典合并后去重,减少无效查询 | 节省爆破时间 |
| 按目标行业定制 | 同行业的目标命名习惯相似,维护行业字典 | 跨项目复用 |
| 字典分层 | 高频词字典先跑、低频词字典后跑 | 先拿高命中、再补长尾 |
注意事项
| 事项 | 说明 |
|---|---|
| 字典过大 | 几万行的字典爆破耗时极长,先跑高频词再跑长尾词 |
| 字典过时 | 旧的通用字典收录了已不常见的词汇,定期更新 |
| 通用字典不够 | 只用通用字典命中率有限,必须定制 |
| 多级爆破深度 | 三级以上的子域不靠爆破,靠被动发现或网页爬取 |
2.3 环境配置
是什么
DNS 解析器、并发参数、限速策略的配置。这些参数决定了你能不能持续、稳定地跑批量 DNS 查询。
为什么
批量 DNS 解析时,如果你用单一 DNS 服务器、高并发、无限速,很快会被 DNS 服务器限速或封禁。封了之后所有查询返回空结果,你以为没这个子域,其实是被限速了------假阴性。
怎么做
第一步:DNS 解析器
| 配置项 | 推荐做法 | 说明 |
|---|---|---|
| 不要用系统默认 DNS | 系统 DNS(如 127.0.0.1 或路由器 DNS)有缓存污染 |
系统 DNS 会缓存结果,影响判断 |
| 用公共 DNS | 1.1.1.1(Cloudflare)、8.8.8.8(Google)、9.9.9.9(Quad9) |
响应快、稳定、有 EDNS 支持 |
| 多 DNS 轮询 | 配置多个 DNS 服务器,轮询查询 | 分散压力,单个被封不影响全局 |
| 避免用目标 DNS | 不要直接查目标的权威 DNS | 查目标权威 DNS = 直接接触目标,有风险 |
第二步:并发参数
| 参数 | 参考范围 | 说明 |
|---|---|---|
| 并发数 | 50-200 | 太低 → 慢;太高 → 触发限速 |
| 超时 | 3-5 秒 | 太短 → 慢响应被误判为不存在;太长 → 卡住 |
| 重试次数 | 2-3 次 | 首次超时不代表不存在,重试避免假阴性 |
第三步:限速策略
| 策略 | 做法 | 说明 |
|---|---|---|
| QPS 控制 | 每秒查询数控制在 10-50 | 公共 DNS 的限速阈值通常在 50-100 QPS |
| Jitter 随机延迟 | 每个查询之间加 50-200ms 随机延迟 | 避免固定间隔被识别为扫描 |
| 自适应限速 | 遇到超时增多时自动降速 | 防止被限速后继续打导致封禁 |
技巧
| 技巧 | 做法 | 价值 |
|---|---|---|
| 多 DNS 轮询 | 配 5-10 个公共 DNS,轮询查询 | 单个被封不影响全局 |
| 超时降级 | 首次用 UDP 查,超时后用 TCP 重查 | UDP 可能被丢包,TCP 更可靠 |
| 分批查询 | 字典分批,每批之间暂停几秒 | 避免持续高并发触发防护 |
| 监控成功率 | 实时统计查询成功率,低于 90% 自动降速 | 早期发现限速,避免大面积假阴性 |
注意事项
| 事项 | 说明 |
|---|---|
| 单 DNS 被封 | 只用一个 DNS 服务器,被封后全部查询失败 |
| 并发过高 | 并发拉到几百上千,瞬间触发限速 |
| 系统 DNS 缓存污染 | 系统 DNS 缓存了旧结果,影响判断准确性 |
| 忽视 Jitter | 固定间隔的查询模式容易被识别为扫描 |
关键认知:环境配置的核心不是"调到最快",而是"调到最稳"。慢一点但全程稳定跑完,比快一下然后被封要高效得多。
2.4 阶段输出
准备阶段结束时,你应该有三样东西:
输出1:根域名列表
| 字段 | 说明 | 示例 |
|---|---|---|
| 根域名 | 要挖掘的根域名 | example.com |
| 来源 | 这个根域名是怎么发现的 | 授权方给定 / WHOIS 反查 / 备案反查 |
| 关联类型 | 和主目标的关系 | 主品牌 / 子公司 / 收购产品 / 关联域名 |
| 授权状态 | 是否在授权范围内 | 已授权 / 未授权 |
| 备注 | 补充信息 | 新收购,尚未整合 |
输出2:字典文件
| 字段 | 说明 | 示例 |
|---|---|---|
| 字典名 | 字典标识 | 通用-高频 / 定制-金融 / 定制-tencent |
| 词条数 | 字典行数 | 5000 |
| 来源 | 字典怎么来的 | 开源字典合并 / 从已发现子域提取 / 行业定制 |
| 用途 | 用于哪个阶段 | 阶段3主动爆破 / 阶段4排列扫描 |
| 优先级 | 先跑还是后跑 | 高(先跑高频词)/ 低(后跑长尾词) |
输出3:环境配置参数
| 字段 | 说明 | 示例 |
|---|---|---|
| DNS 服务器列表 | 配置了哪些 DNS | 1.1.1.1, 8.8.8.8, 9.9.9.9 |
| 并发数 | 配置的并发 | 100 |
| 超时 | 配置的超时 | 3s |
| 重试次数 | 配置的重试 | 2 |
| QPS 限制 | 配置的 QPS | 30 |
| Jitter | 随机延迟范围 | 50-200ms |
2.5 与其他阶段的衔接
输出流向
根域名列表 ──→ 阶段2:被动发现(作为挖掘的起点)
──→ 阶段4:进阶发现(递归时扩展范围)
字典文件 ──→ 阶段3:主动探测(爆破时使用)
──→ 阶段4:进阶发现(排列扫描生成变体时使用)
环境配置 ──→ 全局使用(所有阶段都依赖这些参数)
准备做不好会怎样
| 准备没做好 | 影响的后续阶段 | 后果 |
|---|---|---|
| 范围错了 | 全局 | 挖到不相关域名、超授权挖掘 |
| 漏了关联域名 | 阶段2-4 | 漏掉整个资产段 |
| 字典太差 | 阶段3 | 主动爆破命中率极低 |
| 字典太大 | 阶段3 | 耗时极长、被限速 |
| DNS 被封 | 阶段3、5 | 查询返回空结果,假阴性 |
| 并发过高 | 阶段3、5 | 触发限速,大面积假阴性 |
| 没配 Jitter | 阶段3 | 被识别为扫描,触发防护 |
递归时回到准备
进阶发现阶段(阶段4)发现新的根域名时,要回到这里重新做三件事:
| 重新做的 | 为什么 | 怎么调整 |
|---|---|---|
| 范围界定 | 新发现的根域名可能要纳入范围 | 确认关联关系,决定是否纳入 |
| 字典选择 | 新子域的命名习惯可能和主域不同 | 从新根域名已发现的子域提取词根,定制新字典 |
| 环境配置 | 通常不用改 | 如果新根域名的 DNS 服务器不同,可能要调参数 |
关键认知:准备阶段不是"做完就完了"。每次发现新的根域名,都要回到这里更新范围和字典。流程是循环的,准备阶段每次循环都会更贴近目标的真实全貌。
下一篇:第3章------被动发现,从零接触目标的信息收集开始。