парсинг TCP DNS-запроса с использованием Scapy - PullRequest
0 голосов
/ 19 сентября 2018

Нуждается в tutleage с разбором TCP DNS Request с использованием Scapy.

Вот как я анализирую входящий DNS-запрос UDP:

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 |>

Это просто замечательно!Тем не менее, я борюсь с поиском входящего запроса DNS, который использует TCP.

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 голосов
/ 20 сентября 2018

Я понял это.Для 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 |>
...