3

DNSリクエストを作成するためにscapyとpythonを使用しています。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エラー

どうもありがとうございます !

4

1 に答える 1

3

さらに調査した結果、RFC1035で次のことがわかりました。

4.2.2。TCPの使用

TCP接続を介して送信されるメッセージは、サーバーポート53(10進数)を使用します。メッセージの前には、2バイト長のフィールドがあり、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)
于 2013-03-26T14:57:42.860 に答える