识别DNS数据包

use*_*835 9 unix sockets dns networking

查看数据包字节代码时,如何识别dns数据包.IP报头的协议字段会告诉UDP帧,但在UDP帧内没有协议字段来指定接下来会发生什么,从我可以看到,帧内没有任何内容可以唯一地将其识别为dns数据包.

Aln*_*tak 12

除了它在53端口之外,还有一些你可以注意的事情可能会暗示你正在查看DNS流量.

我将在这里详细介绍RFC 1035的§4.1中使用的字段名称:

                                1  1  1  1  1  1
  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QDCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ANCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    NSCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ARCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Run Code Online (Sandbox Code Playgroud)

正如您在上面所看到的,标头长度为12个字节 - 一个2字节ID,2个字节的标志和4 x 2字节的计数.

在任何DNS数据包中,该QDCOUNT字段将完全为一(0x0001).从技术上讲,协议允许其他值,但实际上它们从未使用过.

在query(QR == 0)中,ANCOUNTNSCOUNT值将精确为零(0x0000),并且ARCOUNT通常为0,1或2,具体取决于是使用EDNS0 (RFC 2671)还是TSIG (RFC 2845). RCODE在查询中也将为零.

除非您正在观察对话的双方并且可以将每个响应与触发它的查询相关联,否则响应更难以识别.

显然该QR位将被设置,并且如上所述QDCOUNT应该仍然是一个.然而,其余的计数器将具有许多不同的排列.然而,它的极其不可能的,任何一个计数器会大于255,那么你应该能够依靠字节4,6,8和10全部为零.

在标题之后,您将开始查找资源记录,第一个是要求的实际问题(第4.1.2节).不幸的是,协议的设计者认为适合在两个固定字段(和)前面包含一个可变长度标签字段().QNAMEQTYPEQCLASS

[更复杂的是,标签可以被压缩,使用向后指针指向数据包中的其他位置.幸运的是,你几乎不会在问题部分看到压缩标签,因为根据定义你不能从那里倒退.从技术上讲,反常的实现者可以将压缩指针发送回头部,但这不应该发生.

因此,开始读取每个长度字节,然后跳过那么多字节,直到达到空字节,然后接下来的两个16位字将为QTYPEQCLASS.有极少数的合法值QCLASS,而且几乎所有的数据包将包含值1IN("互联网").您可能会偶尔看到3CH(混沌).

这就是现在 - 如果我想到其他任何事情,我会在以后添加它.