DNS 是渗透前期信息收集里性价比最高的一环:域名背后挂着 IP、邮件服务器、子域、内部主机名、第三方服务令牌,甚至能暴露网络的拓扑与边界。本篇把侦察中最常用的三个命令——ping、nslookup、dig——拆开讲透:每个命令能拿到什么、拿不到什么、参数怎么用、输出怎么读,最后串成一条可落地的 DNS 侦察流程。
三个工具都来自 dnsutils(Kali 默认自带;若缺则 sudo apt install -y dnsutils,新版本包名为 bind9-dnsutils,dig 与 nslookup 一并装上)。
先补 30 秒 DNS 基础
不理解记录类型和「权威 / 递归」的区别,后面三个命令的输出会读不懂。
常见记录类型
| 类型 | 含义 | 侦察价值 |
|---|---|---|
A | 域名 → IPv4 | 拿到目标真实/出口 IP |
AAAA | 域名 → IPv6 | 补全 IPv6 攻击面 |
CNAME | 别名指向 | 暴露托管/CDN/第三方服务(如 *.herokuapp.com) |
MX | 邮件交换服务器 | 定位邮件基础设施,配合钓鱼/邮件头分析 |
NS | 该域的权威域名服务器 | 枚举权威 NS,逐个试区域传送 |
TXT | 文本记录 | 挖 SPF / DMARC / DKIM / 域名归属验证 token |
SOA | 起始授权(主 NS、序列号、联系邮箱) | 判断主从、zone 是否更新 |
PTR | IP → 域名(反向) | 由 IP 反查主机名,识别服务/归属 |
递归 vs 迭代、权威 vs 递归解析器
- 递归解析器(如
8.8.8.8、运营商 DNS、本机 stub):你问它,它替你跑完整条链,把最终答案(或缓存)给你。它给的答案通常标 Non-authoritative(非权威,来自缓存/代查)。 - 权威解析器(该域的 NS):手里有这个 zone 的真实数据,直接答,答案带 authoritative(
dig里是aa标志)。
同一个域名问公共递归解析器和问它的权威 NS,结果可能不一样——内网记录、灰度/分割视图(split-horizon)只在权威或内网解析器上才看得见。
ping:存活探测 + 一次正向解析
ping 本质是发 ICMP echo 测存活,但它在发包前会先做一次 DNS 正向解析,所以顺带能拿到解析结果。它是「这个域名能不能解、解到哪个 IP、主机活不活」的最快验证,不是 DNS 枚举工具。
输出里能榨出的信息
1 | ping -c 4 example.com |
1 | PING example.com (93.184.216.34) 56(84) bytes of data. |
逐行读:
PING example.com (93.184.216.34):这一行就是正向解析结果——example.com解到93.184.216.34。域名解不出来会直接报ping: example.com: Name or service not known(≈ NXDOMAIN / 解析失败),这本身就是情报(域名不存在或未配置 A/AAAA)。ttl=56:回包的 TTL 可作 OS / 跳数指纹。常见初始 TTL 为 64(Linux/Unix)、128(Windows)、255(网络设备)。用初始值减去回包 TTL 粗估经过的跳数:若猜初始 64,则64-56=8跳。仅作线索,不可当真(TTL 可被改、链路不一)。time=180 ms:往返时延,给地理/链路质量一个粗印象。- 能否 ping 通:存活信号,但要警惕——很多主机/防火墙丢弃 ICMP,ping 不通不等于主机不存在或端口没开。
常用参数(iputils 版)
1 | ping -c 4 -W 2 example.com # -c 发 4 个包后停;-W 每包超时 2 秒 |
-n 在侦察里值得养成习惯:默认 ping 会把回包 IP 反向解析成主机名再显示,这又多一次 DNS 查询、还可能卡住;-n 关掉它,输出干净且快。
ping 的边界
- 只做一次正向解析,且只关心 A/AAAA,看不到 MX/NS/TXT/CNAME 链。
- 域名是 CNAME 时,
ping跟着解到最终 IP,你看不到中间的 CNAME 跳转(dig能看到完整链)。 - ICMP 被过滤时给的是假阴性,不能据此判断主机/服务下线。
- 不做任何枚举——你给它什么名字它才解什么。
一句话:ping 用来「验活 + 顺眼看一眼解到的 IP 和 TTL」,要查 DNS 记录请用下面两个。
nslookup:交互式查询的老牌工具
nslookup 的强项是交互模式和跨平台(Windows 自带),适合临时手敲切换记录类型/解析器。弱点是输出不够结构化、不能做解析链追踪、不好脚本化。
非交互模式(一行查询)
默认查 A,并告诉你「是谁答的」:
1 | nslookup example.com |
1 | Server: 127.0.0.53 |
读法:
Server / Address:回答你的是哪个解析器(这里是本机 stub127.0.0.53)。侦察时一定要盯这行——它决定你看到的是缓存/递归结果还是权威数据。Non-authoritative answer:说明这是递归解析器代查/缓存来的,不是 zone 自己的 NS 直接给的。
指定记录类型用 -type=(或交互里的 set type=):
1 | nslookup -type=MX example.com # 邮件服务器 |
-type=ANY ANY 已被 RFC 8482 劝退,很多服务器对 ANY 返回 HINFO 占位或直接 REFUSED,结果不可靠;要枚举记录请按需逐类查,别依赖 ANY。
反向解析(PTR)直接给 IP 即可:
1 | nslookup 93.184.216.34 |
指定解析器:发现分割视图/内网记录
把要查询的服务器放在最后作为参数,就能绕开本机默认解析器:
1 | # 问公共递归解析器 |
两者结果对比:若权威 NS 上多出某些主机名/IP、而公共解析器上看不到,往往就是只对内网/特定视图开放的记录——这是侦察的金矿。注意 nslookup 直接问权威 NS 时,输出会出现 Authoritative answers can be found from 或不再标 Non-authoritative。
交互模式
直接敲 nslookup 进入 > 提示符,可以连续查询、随时切类型/服务器:
1 | $ nslookup |
交互里两个切服务器的命令别混:server <addr> 会改变默认解析器;lserver <addr> 用指定服务器查这一次但不改默认。set norecurse 可发非递归查询,配合观察 AUTHORITY 段拿委派记录。
nslookup 的边界
- 不能像
dig +trace那样把从根到权威的解析链打印出来。 - 输出文本对脚本不友好,要批量解析得自己
awk。 - 不直接暴露
aa/rd/ra等标志位(要看标志得开set debug或换dig)。
定位:临时、交互、跨平台快速查;要做系统化侦察和脚本化枚举,上 dig。
dig:信息收集的主力
dig 是 DNS 侦察的事实标准:输出含完整报文四段 + 标志位 + 应答服务器 + 耗时,可脚本化、能追踪解析链、能跑区域传送。下面按「基础 → 选项 → 读输出 → 实战组合」走一遍。
基础语法
1 | dig [@server] name [type] [+options] |
@server:向谁查(不写则用系统解析器)。type:紧跟在域名后的位置参数,如MX、NS、TXT、SOA、AAAA、AXFR;不写默认A。
1 | dig example.com # 默认 A |
输出长这样,逐段读
1 | dig example.com |
1 | ; <<>> DiG 9.18.x <<>> example.com |
四段 + 头:
- HEADER / flags:
status是NOERROR(名字存在)、NXDOMAIN(名字不存在)、SERVFAIL、REFUSED等;flags见下表,是侦察判断的关键。 - QUESTION SECTION:你问了什么(回显)。
- ANSWER SECTION:直接答案,
TTL 类型 值的格式。 - AUTHORITY SECTION:该 zone 的 NS(或在
NXDOMAIN时给 SOA,含否定缓存 TTL)。 - ADDITIONAL SECTION:胶水记录(NS 对应的 A/AAAA)+
OPT伪记录(EDNS、UDP 负载大小)。 - 末尾
SERVER行:谁答的你、走 UDP 还是 TCP——和nslookup的Server:一样要盯。
flags 速查
| 标志 | 含义 | 侦察含义 |
|---|---|---|
qr | 这是一条应答 | — |
aa | authoritative,应答者是该 zone 的权威 NS | 看到 aa 说明拿到的是 zone 一手数据,而非缓存 |
tc | truncated,UDP 装不下 | 需 +tcp 重查或做 AXFR |
rd | recursion desired,你请求了递归 | — |
ra | recursion available,该服务器支持递归 | 纯权威服务器通常没有 ra |
ad | authenticated data,DNSSEC 校验通过 | 判断是否启用 DNSSEC |
cd | checking disabled | 较少关注 |
判断「我查的是不是权威」小技巧:直接 dig @ns1.example.com example.com,回包里有 aa = 权威一手数据;问公共递归解析器则一般没有 aa。
高频选项
1 | dig example.com +short # 只给答案数据,最适合脚本/管道 |
+short 与脚本化
+short 把输出压成纯数据,配合命令替换/管道做枚举最舒服:
1 | # 拿到所有权威 NS 的主机名 |
+trace:把解析链画出来
1 | dig example.com +trace |
它会从根 . 开始,打印每一级委派(根 → .com 的 NS → example.com 的 NS → 最终 A),让你看清真实的权威服务器集合和每一跳。排查「为什么我查到的和浏览器不一样」「委派是否损坏/悬挂」时非常有用。
+norecurse:测权威/递归、看委派
向某服务器发 +norecurse(rd=0):
- 问递归解析器:它只返回自己缓存里有的,或一段
AUTHORITY委派,不会替你跑全链——可借此判断它是不是递归器、缓存里有没有这条。 - 问权威 NS:直接给权威答案(带
aa)。
AXFR:区域传送枚举子域
1 | dig @ns1.example.com example.com AXFR |
如果该 NS 对你的来源 IP 开放了区域传送,会把整个 zone 的记录整段 dump 出来——子域、内网主机名一览无余,是子域收集里最「白嫖」的手段。现实中多数 NS 已对未授权来源返回 REFUSED,但配置失误的仍偶有,值得一试(仅限授权目标)。AXFR 走 TCP,dig 会自动切;响应大被截断时也加 +tcp。
实战组合(按侦察思路排)
1 | # 1) 权威 NS 列表 |
子域爆破时记得先探泛解析:查一个随机不存在的前缀(如 dig $(head -c 8 /dev/urandom | xxd -p).example.com),若返回 NOERROR 且有 A,说明配了泛解析 *.example.com,此时「有应答」不等于子域真实存在,需结合应答 IP/通配特征去重过滤,否则全是假阳性。
三个命令对比
| 维度 | ping | nslookup | dig |
|---|---|---|---|
| 本职 | ICMP 存活探测 | DNS 查询(交互友好) | DNS 查询(结构化/可脚本) |
| 顺带做的 DNS | 一次正向解析(A/AAAA) | 指定类型查询 | 任意类型 + 反查 + AXFR |
| 能否枚举/列记录 | 否 | 交互 ls(多被拒) | AXFR + 配合爆破 |
| 看得到权威标志 | 否 | 需 set debug | 直接看 aa/rd/ra 等 flags |
| 解析链追踪 | 否 | 否 | +trace |
| 输出可脚本化 | 一般 | 差 | 好(+short/+noall +answer) |
| 跨平台 | 全平台 | 全平台(Win 自带) | 类 Unix 为主 |
| 典型定位 | 验活 + 瞥一眼 IP/TTL | 临时手敲、切类型/解析器 | 系统侦察与自动化主力 |
串成一条 DNS 侦察流程
以 example.com 为例(演示用,实操只对你有授权的目标做):
1 | T=example.com |
思路是层层递进:ping 确认目标活着、记录入口 IP 与 TTL;nslookup 快速摸清邮件/权威服务器并做解析器对比;dig 负责把记录类型挖全、追踪委派链、尝试区域传送、反查补全。三者互补,不是替代关系。
合规与注意
授权红线
DNS 侦察虽属「低噪声」的被动/半被动行为,但只能针对你拥有书面授权的目标。AXFR、子域爆破会显著放大查询量,可能被记录、触发告警,部分合同/法规对未授权扫描有明确禁止。动手前确认授权范围(scope)、速率与允许的 techniques,保留授权凭证。
- 速率与礼貌:爆破子域时控制并发与速率,避免对目标 NS 造成压力或把自己 IP 送进黑名单。
- ANY 不可靠:别用
ANY当「一次拿全」,按需逐类查。 - 泛解析干扰:子域枚举前先探随机前缀,识别
*.zone泛解析,过滤假阳性。 - CDN/反代:A 记录可能落在 CDN 边缘节点而非源站,结合 CNAME、
ns归属、证书透明日志(CT)交叉判断真实源。 - 缓存与 TTL:递归解析器给的是缓存快照;要权威一手数据请直接
@该域 NS,并看aa标志。 - TCP/UDP:大响应与 AXFR 走 TCP;UDP 被截断(
tc)时加+tcp。
最后记一句分工口诀:ping 看活、nslookup 手查、dig 深挖——能用 dig 结构化拿到的情报,就别只靠 ping 猜。