Scapy TCP下的DNS请求格式错误

3 投票
1 回答
2531 浏览
提问于 2025-04-17 20:01

我用scapy和python来构建我的DNS请求。对于UDP请求没问题,但当我想用TCP(用的请求和UDP完全一样)时,Wireshark却说我的DNS请求格式不对。

这是我的python代码:

from scapy.all import *
ip=IP(dst="130.104.254.1")
dns = DNS(rd=1, qd=DNSQR(qname = "google.be", qtype="A"))


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) / dns
DNSReply = sr1(DNSRequest, timeout = 1)

在我发送请求之前,三次握手已经完全完成。

这是我在wireshark上看到的错误

非常感谢!

1 个回答

3

经过进一步研究,我在RFC 1035中发现了以下内容:

4.2.2. TCP的使用

通过TCP连接发送的消息使用服务器的53号端口(十进制)。消息前面有一个两字节的长度字段,表示消息的长度,但不包括这个长度字段本身。这个长度字段的作用是帮助底层处理在开始解析消息之前,先把完整的消息组装好。

所以解决方案在下面的代码中:

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 = "\x00\x1b" #BIG ENDIAN
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)

撰写回答