2013-03-23 28 views
3

我使用scapy和python來構建我的DNS請求。 UDP請求沒有問題,但是當我想要使用TCP(與我使用的UDP的請求完全相同)時,Wireshark說我的DNS請求格式不正確。Scapy DNS請求只能用TCP格式化

這裏我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

非常感謝您!

+0

我敢打賭,你想用傳送通過TCP UDP中格式的DNS請求。這是行不通的,因爲無法確定請求的長度。 (在UDP中,數據報大小會告訴你請求的長度,但TCP不保存應用程序消息的邊界,所以這將不起作用。) – 2013-03-23 00:31:05

+0

你贏了你的賭注!非常感謝大衛。 – Comtention 2013-03-26 14:58:33

回答

3

更多的研究後,我在RFC 1035中發現:

4.2.2。 TCP使用情況

通過TCP連接發送的消息使用服務器端口53(十進制)。 消息以2字節長度字段爲前綴,該字段給出消息長度 ,不包括兩個字節長度字段。該長度字段 允許低級處理在 開始解析它之前組裝完整的消息。

因此,解決辦法是在下面的代碼:

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)