DNS 是渗透前期信息收集里性价比最高的一环:域名背后挂着 IP、邮件服务器、子域、内部主机名、第三方服务令牌,甚至能暴露网络的拓扑与边界。本篇把侦察中最常用的三个命令——pingnslookupdig——拆开讲透:每个命令能拿到什么、拿不到什么、参数怎么用、输出怎么读,最后串成一条可落地的 DNS 侦察流程。

三个工具都来自 dnsutils(Kali 默认自带;若缺则 sudo apt install -y dnsutils,新版本包名为 bind9-dnsutilsdignslookup 一并装上)。

先补 30 秒 DNS 基础

不理解记录类型和「权威 / 递归」的区别,后面三个命令的输出会读不懂。

常见记录类型

类型含义侦察价值
A域名 → IPv4拿到目标真实/出口 IP
AAAA域名 → IPv6补全 IPv6 攻击面
CNAME别名指向暴露托管/CDN/第三方服务(如 *.herokuapp.com
MX邮件交换服务器定位邮件基础设施,配合钓鱼/邮件头分析
NS该域的权威域名服务器枚举权威 NS,逐个试区域传送
TXT文本记录挖 SPF / DMARC / DKIM / 域名归属验证 token
SOA起始授权(主 NS、序列号、联系邮箱)判断主从、zone 是否更新
PTRIP → 域名(反向)由 IP 反查主机名,识别服务/归属

递归 vs 迭代、权威 vs 递归解析器

  • 递归解析器(如 8.8.8.8、运营商 DNS、本机 stub):你问它,它替你跑完整条链,把最终答案(或缓存)给你。它给的答案通常标 Non-authoritative(非权威,来自缓存/代查)。
  • 权威解析器(该域的 NS):手里有这个 zone 的真实数据,直接答,答案带 authoritativedig 里是 aa 标志)。
侦察要点

同一个域名问公共递归解析器和问它的权威 NS,结果可能不一样——内网记录、灰度/分割视图(split-horizon)只在权威或内网解析器上才看得见。

ping:存活探测 + 一次正向解析

ping 本质是发 ICMP echo 测存活,但它在发包前会先做一次 DNS 正向解析,所以顺带能拿到解析结果。它是「这个域名能不能解、解到哪个 IP、主机活不活」的最快验证,不是 DNS 枚举工具。

输出里能榨出的信息

1
ping -c 4 example.com
1
2
3
PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=180 ms
64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=179 ms

逐行读:

  • 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
2
3
4
5
6
7
ping -c 4 -W 2 example.com      # -c 发 4 个包后停;-W 每包超时 2 秒
ping -n example.com # 数值模式:不把回包 IP 反查成主机名(更快,且不再触发额外 DNS)
ping -4 example.com # 强制 IPv4(只看 A)
ping -6 example.com # 强制 IPv6(只看 AAAA,顺便验证 IPv6 是否通)
ping -I eth0 10.0.0.1 # 指定出口网卡(多网卡/打内网时有用)
ping -t 8 example.com # 设置出向 TTL(traceroute 思路的手动版,少见)
ping -s 1400 -M do example.com # 指定包大小 + 禁止分片,探 MTU

-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
2
3
4
5
6
Server:		127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: example.com
Address: 93.184.216.34

读法:

  • Server / Address回答你的是哪个解析器(这里是本机 stub 127.0.0.53)。侦察时一定要盯这行——它决定你看到的是缓存/递归结果还是权威数据。
  • Non-authoritative answer:说明这是递归解析器代查/缓存来的,不是 zone 自己的 NS 直接给的。

指定记录类型用 -type=(或交互里的 set type=):

1
2
3
4
5
6
nslookup -type=MX   example.com     # 邮件服务器
nslookup -type=NS example.com # 权威域名服务器
nslookup -type=TXT example.com # 文本记录(SPF 等)
nslookup -type=SOA example.com # 起始授权
nslookup -type=AAAA example.com # IPv6
nslookup -type=ANY example.com # 慎用,见下
关于

-type=ANY ANY 已被 RFC 8482 劝退,很多服务器对 ANY 返回 HINFO 占位或直接 REFUSED,结果不可靠;要枚举记录请按需逐类查,别依赖 ANY。

反向解析(PTR)直接给 IP 即可:

1
nslookup 93.184.216.34

指定解析器:发现分割视图/内网记录

把要查询的服务器放在最后作为参数,就能绕开本机默认解析器:

1
2
3
4
5
# 问公共递归解析器
nslookup example.com 8.8.8.8

# 问该域的权威 NS(拿到 authoritative 答案)
nslookup example.com ns1.example.com

两者结果对比:若权威 NS 上多出某些主机名/IP、而公共解析器上看不到,往往就是只对内网/特定视图开放的记录——这是侦察的金矿。注意 nslookup 直接问权威 NS 时,输出会出现 Authoritative answers can be found from 或不再标 Non-authoritative。

交互模式

直接敲 nslookup 进入 > 提示符,可以连续查询、随时切类型/服务器:

1
2
3
4
5
6
7
8
9
10
$ nslookup
> server 8.8.8.8 # 把默认解析器换成 8.8.8.8
> set type=MX # 之后查询都按 MX(也可写 set q=MX)
> example.com
> set type=TXT
> example.com
> set debug # 打开详细输出,能看到更多报文细节
> example.com
> ls -d example.com # 尝试列出/区域传送——现代服务器大多 REFUSED
> exit

交互里两个切服务器的命令别混: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:紧跟在域名后的位置参数,如 MXNSTXTSOAAAAAAXFR;不写默认 A
1
2
3
4
5
dig example.com                 # 默认 A
dig example.com MX # 查 MX
dig @8.8.8.8 example.com # 指定公共解析器
dig @ns1.example.com example.com NS # 直接问权威 NS
dig -x 93.184.216.34 # 反向解析(PTR)的简写

输出长这样,逐段读

1
dig example.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
; <<>> DiG 9.18.x <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com. IN A

;; ANSWER SECTION:
example.com. 300 IN A 93.184.216.34

;; AUTHORITY SECTION:
example.com. 86400 IN NS a.iana-servers.net.
example.com. 86400 IN NS b.iana-servers.net.

;; ADDITIONAL SECTION:
a.iana-servers.net. ... IN A ...
...

;; Query time: 38 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Jul 27 14:00:00 CST 2026
;; MSG SIZE rcvd: 188

四段 + 头:

  • HEADER / flagsstatusNOERROR(名字存在)、NXDOMAIN(名字不存在)、SERVFAILREFUSED 等;flags 见下表,是侦察判断的关键。
  • QUESTION SECTION:你问了什么(回显)。
  • ANSWER SECTION:直接答案,TTL 类型 值 的格式。
  • AUTHORITY SECTION:该 zone 的 NS(或在 NXDOMAIN 时给 SOA,含否定缓存 TTL)。
  • ADDITIONAL SECTION:胶水记录(NS 对应的 A/AAAA)+ OPT 伪记录(EDNS、UDP 负载大小)。
  • 末尾 SERVER 行:谁答的你、走 UDP 还是 TCP——和 nslookupServer: 一样要盯。

flags 速查

标志含义侦察含义
qr这是一条应答
aaauthoritative,应答者是该 zone 的权威 NS看到 aa 说明拿到的是 zone 一手数据,而非缓存
tctruncated,UDP 装不下+tcp 重查或做 AXFR
rdrecursion desired,你请求了递归
rarecursion available,该服务器支持递归纯权威服务器通常没有 ra
adauthenticated data,DNSSEC 校验通过判断是否启用 DNSSEC
cdchecking disabled较少关注

判断「我查的是不是权威」小技巧:直接 dig @ns1.example.com example.com,回包里aa = 权威一手数据;问公共递归解析器则一般没有 aa

高频选项

1
2
3
4
5
6
7
8
dig example.com +short                 # 只给答案数据,最适合脚本/管道
dig example.com MX +noall +answer # 只看 ANSWER 段,干净
dig example.com +trace # 从根迭代追踪整条解析链(神器)
dig @8.8.8.8 example.com +norecurse # 发非递归查询,看缓存/委派而非代查结果
dig example.com +tcp # 强制 TCP(截断响应 / AXFR 需要)
dig example.com +time=2 +tries=1 # 超时与重试,批量时防爆卡
dig -x 93.184.216.34 +short # 反查 PTR
dig @ns1.example.com example.com AXFR # 区域传送(需对方允许,经典子域收集)

+short 与脚本化

+short 把输出压成纯数据,配合命令替换/管道做枚举最舒服:

1
2
3
4
5
6
7
# 拿到所有权威 NS 的主机名
dig example.com NS +short

# 拿到 MX 主机再各解一次 A
for mx in $(dig example.com MX +short | awk '{print $2}'); do
dig +short "$mx"
done

+trace:把解析链画出来

1
dig example.com +trace

它会从根 . 开始,打印每一级委派(根 → .com 的 NS → example.com 的 NS → 最终 A),让你看清真实的权威服务器集合和每一跳。排查「为什么我查到的和浏览器不一样」「委派是否损坏/悬挂」时非常有用。

+norecurse:测权威/递归、看委派

向某服务器发 +norecurserd=0):

  • 递归解析器:它只返回自己缓存里有的,或一段 AUTHORITY 委派,不会替你跑全链——可借此判断它是不是递归器、缓存里有没有这条。
  • 权威 NS:直接给权威答案(带 aa)。

AXFR:区域传送枚举子域

1
dig @ns1.example.com example.com AXFR

如果该 NS 对你的来源 IP 开放了区域传送,会把整个 zone 的记录整段 dump 出来——子域、内网主机名一览无余,是子域收集里最「白嫖」的手段。现实中多数 NS 已对未授权来源返回 REFUSED,但配置失误的仍偶有,值得一试(仅限授权目标)。AXFR 走 TCP,dig 会自动切;响应大被截断时也加 +tcp

实战组合(按侦察思路排)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1) 权威 NS 列表
dig example.com NS +short

# 2) 对每个 NS 试区域传送(能成则直接拿全表)
for ns in $(dig example.com NS +short | sed 's/\.$//'); do
echo "=== $ns ==="; dig @"$ns" example.com AXFR +short
done

# 3) +trace 看委派链 / 确认真实权威
dig example.com +trace | tail -n 20

# 4) 公共递归 vs 权威:找分割视图/内网记录
dig @8.8.8.8 internal.example.com +short
dig @ns1.example.com internal.example.com +short

# 5) 邮件相关:MX + 发件域校验三件套
dig example.com MX +short
dig example.com TXT +short # SPF
dig _dmarc.example.com TXT +short # DMARC
dig selector._domainkey.example.com TXT +short # DKIM(selector 名需另查/爆破)

# 6) 反查已得 IP 的主机名
dig -x 93.184.216.34 +short

子域爆破时记得先探泛解析:查一个随机不存在的前缀(如 dig $(head -c 8 /dev/urandom | xxd -p).example.com),若返回 NOERROR 且有 A,说明配了泛解析 *.example.com,此时「有应答」不等于子域真实存在,需结合应答 IP/通配特征去重过滤,否则全是假阳性。

三个命令对比

维度pingnslookupdig
本职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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
T=example.com

# ① ping 验活 + 拿首个 IP + TTL 指纹(加 -n 不做反查)
ping -c 3 -n "$T"

# ② nslookup 快速看 MX/NS,并对比公共解析器与权威 NS
nslookup -type=MX "$T"
nslookup "$T" 8.8.8.8
nslookup "$T" $(dig "$T" NS +short | head -1 | sed 's/\.$//')

# ③ dig 深挖:权威 NS → 逐个试 AXFR → TXT/SPF/DMARC → +trace
dig "$T" NS +short
for ns in $(dig "$T" NS +short | sed 's/\.$//'); do dig @"$ns" "$T" AXFR +short; done
dig "$T" TXT +short; dig "_dmarc.$T" TXT +short
dig "$T" +trace | tail -n 15

# ④ 把收集到的 IP 反查主机名,补全视图
dig -x <上一步拿到的IP> +short

思路是层层递进: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 猜。