使用TCP和Scapy为DNS请求添加长度前缀

时间:2013-03-26 13:20:16

标签: python tcp dns scapy rfc1035

在关于DNS的RFC 1035中,写了:

  

4.2.2。 TCP使用

     

通过TCP连接发送的消息使用服务器端口53(十进制)。该   消息以两个字节长度字段为前缀,给出了   消息长度,不包括两个字节长度字段。这个长度   字段允许低级处理组合完整的消息   在开始解析之前。

我想用TCP发送DNS请求,但我不知道如何在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)

但我的paquet被解释为没有DNS层的简单TCP数据包。

您是否有意在DNS请求之前添加这两个字节前缀?

谢谢!

1 个答案:

答案 0 :(得分:0)

该解决方案使用Big endian表示法。 \x00\x1b代替\x1b\x00。但上面的其余代码是正确的。谢谢Armin。