Добавить префикс длины к DNS-запросу, используя TCP и Scapy

В RFC 1035 про DNS написано:

4.2.2. Использование TCP

Сообщения, отправляемые по TCP-соединениям, используют порт сервера 53 (десятичный). Сообщение имеет префикс с двухбайтовым полем длины, которое дает длину сообщения, исключая двухбайтовое поле длины. Это поле длины позволяет низкоуровневой обработке собрать полное сообщение перед тем, как начать его анализ.

Я хочу отправить запрос DNS с TCP, но я не знаю, как добавить эти два байта до запроса DNS. Я пытаюсь с этим кодом:

from scapy.all import *

ip=IP(dst="216.239.32.10")

request = DNS(rd=1, qd=DNSQR(qname = "google.be", qtype="A")) #size = 27(dec) = 1b (hex)
twoBytesRequestSize = "\x1b\x00" 
completeRequest = str(request) + twoBytesRequestSize

SYN=ip/TCP(sport=RandNum(1024,65535), dport=53, flags="S", seq=42)
SYNACK=sr1(SYN)

ACK=ip/TCP(sport=SYNACK.dport, dport=53, flags="A", seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ACK)

DNSRequest = ip/TCP(sport=SYNACK.dport, dport=53, flags="PA", seq=SYNACK.ack, ack=SYNACK.seq + 1) / completeRequest
DNSReply = sr1(DNSRequest, timeout = 1)

Но мой пакет интерпретируется как простой пакет TCP без уровня DNS.

У вас есть идея добавить эти два байта префикса перед запросом DNS?

Спасибо!

1 ответ

Решение

В решении используется запись с прямым порядком байтов. \x00\x1b вместо \x1b\x00, Но остальная часть кода выше верна. Спасибо Армин.

Другие вопросы по тегам