“ 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
—
域名及解析过程
域名由一系列字母(a~z,不区分大小写)、数字(0~9)和连接符(-)组成以及点号分隔符组成,总长度不大于255,分隔符隔出的每段相当于一个层次的域名,级别低的在左,级别高的在右,每段长度不大于63。如域名dailyupdate.wangwang.taobao.com,三段域名分别为dailyupdate、wangwang、taobao、com,其中com的级别最高。
相应地,在DNS报文中,一个完整的域名是分成多段的,但没有使用点号分隔起来,而是使用长度域名的顺序,依次出现在数据中。
在报文中,一个域名的格式一般如下图所示:
如dailyupdate.wangwang.taobao.com这个域名,由4段组成,则报文中的格式为4个长度数据块,最后以0x00结束。
另外,在报文中,为节约资源,每段域名如果在之前有重复,会被缩写为两个字节,其中前两个比特位为11,之后14个比特位表示重复内容距离DNS协议报文头的距离,而重复的长度则为到0x00结束,这个特性很多人都没有注意到,导致很多的DNS解析错误或不被解析。
在一个捕包点的报文层面,一个域名到IP的解析总体可分为两步:
1、目标机向指定的域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;
2、域名服务器向目标机回应一个DNS响应报文,里面包含域名对应的IP地址。
从最后一节对dailyupdate.wangwang.taobao.com进行域名解析的报文中可明显看出这两步。当然,实际上一次DNS的查询经历了多个迭代查询的小步,每级域名服务器向上级域名服务器请求,最终得到结果向下级返回,这个过程在一个捕包点的报文解析中是无法体现的,协议分析过程中也不需要特地关心。
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。
请求:
DNS请求中含有一个被请求的域名:dailyupdate.wangwang.taobao.com。
响应:
使用Wireshark得到的分析如下:
基本所有的数据段都存在。
在这里,就包含了域名部分重复的例子:
图中红框所示即为使用0xC028代替之前出现的com段,但是dailyupdate.wangwang.taobao.com由于在该CNAME的前一部分,则没有被代替。
对DNS协议的分析就到这里了,DNS流量很常见,大家可以实地抓包分析试试,在Wireshark中全流量抓包后,使用过滤规则“dns”即可将所有DNS报文过滤出来。如果有需要,可以加我共同学习。
长按进行关注。