使用Scapy解析TCP DNS请求

时间:2018-09-19 18:14:13

标签: sockets 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等)。我该如何运作?

1 个答案:

答案 0 :(得分:0)

我知道了。对于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

所以我真正需要做的就是让剩余的有效负载失效,这就是实际的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 |>