zoukankan      html  css  js  c++  java
  • 使用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

    域名及解析过程


    域名由一系列字母(a~z,不区分大小写)、数字(0~9)和连接符(-)组成以及点号分隔符组成,总长度不大于255,分隔符隔出的每段相当于一个层次的域名,级别低的在左,级别高的在右,每段长度不大于63。如域名dailyupdate.wangwang.taobao.com,三段域名分别为dailyupdate、wangwang、taobao、com,其中com的级别最高。


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

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

    640?wx_fmt=png

    如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过程包含一对请求报文和响应报文。请求和响应报文有统一的报文格式如下图:

    640?wx_fmt=png


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


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


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


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

    640?wx_fmt=png

    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区域,包括数量不等的查询块,每块格式如下:

    640?wx_fmt=png

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

    640?wx_fmt=png

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

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

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


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

    640?wx_fmt=png

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

    例如:

    640?wx_fmt=png

    这个报文中的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请求的过程:

    640?wx_fmt=png

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


    请求:

    640?wx_fmt=png

    DNS请求中含有一个被请求的域名:dailyupdate.wangwang.taobao.com。


    响应:

    640?wx_fmt=png

    使用Wireshark得到的分析如下:

    640?wx_fmt=png

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

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

    640?wx_fmt=png

    图中红框所示即为使用0xC028代替之前出现的com段,但是dailyupdate.wangwang.taobao.com由于在该CNAME的前一部分,则没有被代替。


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


    640?wx_fmt=jpeg

    长按进行关注。






  • 相关阅读:
    treap模板
    Codeforces Round #446 (Div. 2)
    BZOJ 1001: [BeiJing2006]狼抓兔子 (最小割)
    NOIP2017总结
    Python 操作 Mysql 模块
    poj 3660 Cow Contest (传递闭包)
    poj 1964 Cow Cycling(dp)
    poj 3671 Dining Cows (Dp)
    cogs 线型网络(状压dp)
    codevs 2800 送外卖(状压dp)
  • 原文地址:https://www.cnblogs.com/protosec/p/11673355.html
Copyright © 2011-2022 走看看