使用Wireshark进行DNS协议解析

DNS协议格式解析及说明。

DNS即域名系统(Domain Name System),是用来将域名与IP地址建立映射的协议,通过DNS协议,可以方便记忆。

DNS可基于TCP或UDP,使用53号端口,常见的是使用UDP承载,通常由其他应用层协议(如HTTP、SMTP等)使用,用来将主机名解析为IP地址,应用相当广泛。

所以,在协议还原的系统中,基本上所有的移动APP的分析都需要先分析DNS。

DNS包含一系列RFC标准,如RFC1034等。

本文对域名及解析过程、DNS报文格式进行说明,并通过Wireshark工具对DNS协议进行抓包分析展示,了解DNS协议报文的格式和解析方法,本文仅限于UDP承载的DNS,基于IPV4。

01

域名及解析过程

相应地,在DNS报文中,一个完整的域名是分成多段的,但没有使用点号分隔起来,而是使用长度域名的顺序,依次出现在数据中。

在报文中,一个域名的格式一般如下图所示:

另外,在报文中,为节约资源,每段域名如果在之前有重复,会被缩写为两个字节,其中前两个比特位为11,之后14个比特位表示重复内容距离DNS协议报文头的距离,而重复的长度则为到0x00结束,这个特性很多人都没有注意到,导致很多的DNS解析错误或不被解析。

在一个捕包点的报文层面,一个域名到IP的解析总体可分为两步:

1、目标机向指定的域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;

2、域名服务器向目标机回应一个DNS响应报文,里面包含域名对应的IP地址。

02

DNS协议报文格式

一次DNS过程包含一对请求报文和响应报文。请求和响应报文有统一的报文格式如下图:

一个DNS报文分成头部和正文两个部分。

头部的内容共14字节,包括三大类信息:

1、会话标识(2字节):是DNS报文的ID标识,用来确定请求报文和应答响应报文的配对关系,一对请求和应答报文的会话标识字段是相同的,四元组和会话标识一起,可以将DNS应答报文和请求报文一一对应。

2、标志(2字节):每位表示不同的标志含义,按位表示字段如下:

QR:查询/响应标志,1比特,0为查询,1为响应。

opcode:查询响应类型,4比特,0表示标准查询,1表示反向查询,2表示服务器状态请求。

AA:授权回答,1比特,表示该服务器是否为授权的有效服务器,在响应报文中有效,请求中无效。

TC:截断标志,1比特,1表示超过512字节并已被截断,0表示没有发生截断。

RD:期望递归回答标志,1比特,1表示期望。

RA:可用递归标志,1比特,响应报文中有效,1表示得到递归响应。

zero:全0保留字段,3比特,新版RFC中对后两位进行了使用,本文忽略。

rcode:返回码,4比特,0表示没有差错,1表示格式错误,32表示服务器错误,3表示域参照问题,4表示查询类型不支持,5表示被禁止,其它被保留。

3、数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域Queries、Answers、Authorities、Additional records的数目。

在头部之后,为正文的四大区域,分成两类:

1、Queries区域,包括数量不等的查询块,每块格式如下:

Name:查询名,长度不定,且不用填充字节,一般该字段表示要查询的域名(反向查询则为IP),格式见yum

域名的每一段之前都有一字节的长度,整个域名结束为0x00。

Type:查询类型,两字节,如A,NS,CNAME,PTR等。

Class:查询类,两字节,通常为IN(0x0001),表示internet数据。

2、资源记录(RR)区域,即Answers、Authorities、Additional records三个区域,每个区域均包括数量不等的查询块,每块格式如下:

Name:域名,相当于Queries区域的查询名字段,二者本质上是相同的,但由于资源记录区域在Queries区域之后,因此如果域名有重复的段,则该字段内的一段或若干段会使用2个字节的数值来代替,而不是原始的长度和字符串。

例如:

这个报文中的Answers区域,有Name字段与Queries区域的查询域名完全一致,因此,为两字节C00C(1100000000001100),最前面的两个高位是 11,之后的14个字节数值对应为12,刚好指向Queries区域的查询域名字段。

另外还有部分段重复的情况,可以自行分析,此处不做描述。

Type:查询类型,两字节,与Queries区域的查询类型含义相同。

Class:查询类,两字节,通常为IN(0x0001),表示internet数据。

TTL:生存时间,四字节,单位为秒,资源记录的生存周期,越大表明该资源记录越稳定。

Data Length:资源数据长度,两字节,表示后面的资源数据的长度。

Data:资源数据,长度由Data Length值确定。为按Queries区域的要求返回的相关资源记录的数据。可以是地址或者另一个域名等。

另外Authorities区域即为Wireshark中显示的Authoritative nameservers区域。

03

DNS报文例子

一次DNS请求的过程:

包括请求和响应,二者具备相同的ID。

请求:

响应:

使用Wireshark得到的分析如下:

基本所有的数据段都存在。

在这里,就包含了域名部分重复的例子:

对DNS协议的分析就到这里了,DNS流量很常见,大家可以实地抓包分析试试,在Wireshark中全流量抓包后,使用过滤规则“dns”即可将所有DNS报文过滤出来。如果有需要,可以加我共同学习。

长按进行关注。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226G06B9U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券