Python Scapy DNS请求格式错误,仅适用于TCP

Python Scapy DNS请求格式错误,仅适用于TCP,python,tcp,dns,scapy,Python,Tcp,Dns,Scapy,我使用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), d

我使用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)
在我发送请求之前,三方握手已完全完成


多谢各位

经过更多研究,我在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)

我敢打赌,您正在通过TCP以UDP格式发送DNS请求。这是行不通的,因为无法确定请求的长度。(在UDP中,数据报大小将告诉您请求的长度。但TCP不保留应用程序消息边界,因此这不起作用。)您赢了!非常感谢你,大卫。