使用 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 |>
需要使用 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 |>