使用 Scapy 解析 TCP DNS 请求

parsing of TCP DNS Request using Scapy

需要使用 Scapy 解析 TCP DNS 请求的教程。

这是我剖析传入的 UDP DNS 请求的方式:

In [1]: from scapy.all import *
In [10]: udp_request=b' \xaa\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03cnn\x03com\x00\x00\x10\x00\x01'
In [11]: DNS(udp_request).qd
Out[11]: <DNSQR  qname='cnn.com.' qtype=TXT qclass=IN |>

太美了!但是,我正在努力查看使用 TCP 的传入 DNS 请求。

In [12]: tcp_request = b'\x00\x19\x83\xec\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03cnn\x03com\x00\x00\x10\x00\x01'
In [13]: DNS(tcp_request)
Out[13]: <DNS  id=25 qr=1 opcode=QUERY aa=0 tc=1 rd=1 ra=1 z=1 ad=1 cd=0 rcode=12 qdcount=256 ancount=1 nscount=0 arcount=0 qd='' an=<DNSRR  rrname='.' type=MD rclass=25454 ttl=1845715823 rdata='' |> ns=None ar=None |>
In [14]: DNS(tcp_request).qd
Out[14]: b''

注意,它显示的是空白输出。我一直在搜索,显然这是可能的(参考:https://github.com/secdev/scapy/issues/819 等)。我怎样才能让它发挥作用?

我想通了。根据 rfc1035,TCP 消息的前两个字节字段包含消息其余部分的长度。这次签出:

In [18]: tcp_request
Out[18]: b'\x00\x19\x83\xec\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03cnn\x03com\x00\x00\x10\x00\x01'

In [19]: len(_)
Out[19]: 27

In [20]: tcp_request[0] << 8 | tcp_request[1]
Out[20]: 25

所以我真正需要做的就是让 scapy 剩下的有效负载,这是实际的 DNS 消息:

In [21]: DNS(tcp_request[2:])
Out[21]: <DNS  id=33772 qr=0 opcode=QUERY aa=0 tc=0 rd=1 ra=0 z=0 ad=0 cd=0 rcode=ok qdcount=1 ancount=0 nscount=0 arcount=0 qd=<DNSQR  qname='cnn.com.' qtype=TXT qclass=IN |> an=None ns=None ar=None |>