2013-03-26 38 views
0

添加長度前綴DNS請求在RFC 1035 DNS左右,這是寫:使用TCP和Scapy的

4.2.2。 TCP使用情況

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

我想用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請求之前添加這兩個字節前綴嗎?

謝謝!

+0

你究竟在做什麼?只需查看DNS A記錄?如果是這樣,有更簡單的方法。 – 2013-03-26 13:58:37

+0

不確定它是否有幫助,但互聯網協議通常是大端,這意味着你需要'\ x00 \ x1b'而不是'\ x1b \ x00'。 – 2013-03-26 14:04:23

+0

John,我需要檢索DNS服務器的時間戳,並且我無法在SYNACK響應中獲取它,因爲某些SYNCOOKIES實現使用時間戳選項。 阿明,它的工作原理,你是這一天的人!我非常肯定,我已經嘗試過與大前鋒。謝謝。 – Comtention 2013-03-26 14:49:39

回答

0

該解決方案使用Big endian符號。 \x00\x1b而不是\x1b\x00。但上面的其他代碼是正確的。謝謝阿明。