Scapy DNS请求仅使用TCP格式错误

时间:2013-03-23 00:24:32

标签: 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), 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)

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

Here my wireshark error

非常感谢!

1 个答案:

答案 0 :(得分: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)