Wireshark抓包实战(dns)
一、WireShark界面介绍
如图 当我们使用'dig @223.5.5.5 baidu.com'指令获取百度的A记录时,采用Wireshark显示的内容如下
在Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为:
1) Frame: 物理层的数据帧概况
2)Ethernet II: 数据链路层以太网帧头部信息
3)Internet Protocol Version 4: 互联网层IP包头部信息
4.1若为tcp)Transmission Control Protocol: 传输层的数据段头部信息,TCP
4.2图为udp)User Datagram Protocol:用户数据报协议,此处为UDP
5)Domain Name System: 应用层的信息,此处是DNS协议
二、常见协议介绍
1. TCP/IP
三、DNS数据包的关键属性说明
DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。
上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。
整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。下面将详细地介绍每部分的内容及含义。
2.1 基础结构部分
DNS 报文的基础结构部分指的是报文首部,如图所示。
该部分中每个字段含义如下。
事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
标志:DNS 报文中的标志字段。
问题计数:DNS 查询请求的数目。
回答资源记录数:DNS 响应的数目。
权威名称服务器计数:权威名称服务器的数目。
附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
基础结构部分中的标志字段又分为若干个字段,如图所示。
为了能够更好地了解 DNS 数据包的基础结构部分,下面通过捕获的 DNS 数据包查看基础结构部分。
下面我们针对应用层(Domain Name System query)里面的参数进行详细解释。
Domain Name System (query) #dns请求报文
Transaction ID: 0x9ad0 #事务ID
Flags: 0x0000 Standard query #报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段, 值为0, 是一个请求包
(查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1)
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段, 值为0, 因为是标准查询
(0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。)
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段,0表示未被截断
(表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。)
.... ...0 .... .... = Recursion desired: Don't do query recursively
#RD字段,执行迭代查询
(递归查询的标志是通过`RD`(Recursion Desired)标志位来设置的。如果客户端在查询请求中设置`RD`为1,表示客户端期望DNS服务器进行递归解析。如果设置为0(或者不设置,因为默认值为0),则表示客户端不希望服务器进行递归解析,而是执行迭代查询)
.... .... .0.. .... = Z: reserved (0) #保留字段, 请求应答值都为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段, 值为0
(应答认证:应答/权限部分未由服务器进行认证,`0` 为应答服务器未验证了该查询相关的 DNSSEC 数字签名,`1` 为应答服务器已经验证了该查询相关的 DNSSEC 数字签名)
Questions: 1 #问题计数, 这里有1个问题
Answer RRs: 0 #回答资源记录数
Authority RRs: 0 #权威名称服务器计数
Additional RRs: 0 #附加资源记录数
在请求中 Questions 的值不可能为 0;Answer RRs,Authority RRs,Additional RRs 的值都为 0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。
特别的,当dig @223.5.5.5 www.baidu.com soa
查询soa记录时,Wireshark抓取的dns请求数据包中会出现AD标志位,同时会发送“additional records”(额外记录)如下图所示
AD位代表“Authenticated Data”(认证数据)。当 DNS 响应中的 AD 位被设置(即“set”,用1表示)时,它指示响应中的“Answer”(回答)和“Authority”(权威)部分的数据已经通过数字签名进行了认证,并且 DNS 客户端可以确信这些数据没有被篡改。
2.1.2 DNS 响应数据包基础结构部分
图中方框标注部分为响应包中基础结构部分,每个字段如下:
Domain Name System (response) #dns响应报文
Transaction ID: 0xf3c2 #事务ID
Flags: 0x8180 Standard query response, No error #报文中的标志字段
1... .... .... .... = Response: Message is a response
#QR字段, 值为1, 是一个响应包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段, 值为0, 是标准查询
(0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。)
.... .0.. .... .... = Authoritative: Server is not an authority for
domain #AA字段,不是权威服务器
(授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。)
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段,0表示未被截断
(表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。)
.... ...1 .... .... = Recursion desired: Do query recursively
#RD字段,1表执行迭代查询
(递归查询的标志是通过RD标志位来设置的。如果客户端在查询请求中设置`RD`为1,表示客户端期望DNS服务器进行递归解析。如果设置为0(或者不设置,因为默认值为0),则表示客户端不希望服务器进行递归解析,而是执行迭代查询)
.... .... 1... .... = Recursion available: Server can do recursive
queries #RA字段,可用递归
(可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询)
.... .... .0.. .... = Z: reserved (0) #保留字段, 请求应答值都为0
.... .... ..0. .... = Answer authenticated: Answer/authority portion
was not authenticated by the server #AA标志位
(授权应答,值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。)
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段, 值为0
(应答认证:应答/权限部分未由服务器进行认证,`0` 为应答服务器未验证了该查询相关的 DNSSEC 数字签名,`1` 为应答服务器已经验证了该查询相关的 DNSSEC 数字签名)
.... .... .... 0000 = Reply code: No error (0) #返回码字段
(当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。)
Questions: 1
Answer RRs: 2
Authority RRs: 5
Additional RRs: 5
三、Bind主从同步包的关键属性说明
3.1 环境说明
bind master:10.1.109.113
bind slave:10.1.109.114
bind version:9
通过Tcpdump抓取的数据包分析比较麻烦,要想很方便的分析数据包, 我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。
在slave运行抓包指令,并保存数据包为wireshark能识别的文件:
tcpdump -i ens33 -t -s 0 'not port 22 and src net 10.1.109.0/24' -w ./target.cap
AXFR
完全区域传输(Full zone transfer)或者称DNS全量更新协议,它传送的是整个区域的数据。
1) AXER slave向master发送请求报文
2) AXER master向slave发送响应报文
通过以上的测试,我们得出以下重要结论:
辅区的搭建比较简单,如果是多个master则类似这样配置 masters { 192.168.3.160; 192.168.3.180; };
辅区首次加载时slave发的是AXFR,即要做全量的区数据同步,从截图中能看到整个区的的数据内容,是明文的。抓包的过程能看到slave先请求SOA,然后通过建立TCP53端口建立连接传送区数据。
slave数据同步成功后,会在本地生成相关zone文件,但文件的内容是无法正常浏览的,类似二进制文件。管理员一定要做解析测试,确认数据同步和加载正常。
此后如果人为重启slave节点的named进程,并不会再触发区传输请求。而重启master时会立即触发。
四、常用抓包指令
抓取找到发出了请求,但是没有收到应答的 dns数据包以及DNS解析超过1秒
dns.time > 1 or (dns && (dns.flags.response == 0) && ! dns.response_in)
1.按照ip过滤
查看源IP为192.168.1.1的包,目标ip为223.5.5.5
ip.src 192.168.1.1 and ip.dst 223.5.5.5
查看ip为172.20.1.1的包
ip.addr == 172.20.1.1
2.按照mac地址过滤
查看源MAC为74-D8-3E-0B-F9-A0的包,目标MAC为74-D8-3E-0B-F9-A1
eth.src 74-D8-3E-0B-F9-A0 and eth.dst 74-D8-3E-0B-F9-A0
查看MAC为74-D8-3E-0B-F9-A0的包
eth.addr == 74-D8-3E-0B-F9-A0
3.按照端口号过滤
查看过滤tcp端口为1234的包
tcp.port == 1234
查看过滤源tcp端口为1234的包,目的tcp端口为8888的包
tcp.srcport 1234 and tcp.dstport 8888
4.按照协议类型过滤
只某台电脑的dhcp报文
dhcp and eth.addr == 74-D8-3E-0B-F9-A0
查看过滤源tcp端口为1234的包,目的tcp端口为8888的包
tcp.srcport 1234 and tcp.dstport 8888