0x03 DNS报文格式
以下是DNS的报文格式:
3.1 头部
- 会话标识(2字节): 是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应
-
| QR(1bit) | 查询/响应标志,0为查询,1为响应 | | :---: | :--- | | opcode(4bit) | 0表示标准查询,1表示反向查询,2表示服务器状态请求 | | AA(1bit) | 表示授权回答 | | TC(1bit) | 表示可截断的 | | RD(1bit) | 表示期望递归 | | RA(1bit) | 表示可用递归 | | rcode(4bit) | 表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure) |
数量字段(总共8字节):
Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量
3.2 正文
Queries区域
Name查询名:
长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名),一般的格式如下图所示。
Type查询类型:| 类型 | 助记符 | 说明 | | :---: | :---: | :--- | | 1 | A | 由域名获得IPv4地址 | | 2 | NS | 查询域名服务器 | | 5 | CNAME | 查询规范名称 | | 6 | SOA | 开始授权 | | 11 | WKS | 熟知服务 | | 12 | PTR | 把IP地址转换成域名 | | 13 | HINFO | 主机信息 | | 15 | MX | 邮件交换 | | 28 | AAAA | 由域名获得IPv6地址 | | 252 | AXFR | 传送整个区的请求 | | 255 | ANY | 对所有记录的请求 |
这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/
Class 查询类:通常为1,表明是Internet数据资源记录(RR)区域(包括回答区域,授权区域和附加区域)
该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域
Name 域名(2字节或不定长):它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C
(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。
Type 查询类型:表明资源纪录的类型,见1.2节的查询类型表格所示
Class 查询类:对于Internet信息,总是IN
TTL 生存时间(TTL):以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。
Data Length /Data 资源数据 :该字段是一个可变长字段,表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。
3. Wireshark分析DNS协议
下面给出wireshark抓包的记录,感兴趣的可以根据上面介绍的协议报文格式手动解析一下,相信会有很大收获。
3.1 请求报文
3.2 响应报文
DNS相关的命令小贴士:
- Windows环境下清空DNS缓存的命令是
ipconfig/flushdns
也可以通过重启DNS client 和 DHCP client 两项服务清空DNS缓存 - Windows环境下可以用命令
ipconfig /displaydns
来查看DNS缓存的内容 nslookup
命令可以用来查看域名对应的IP地址,比如nslookup jocent.me