需要使用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等)。我该如何运作?
答案 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 |>