私はscapyをtwistedと統合する作業をしていますが、私はOSX上でこの非常に奇妙なバグを見つけました。PythonのRawソケットとsendto
基本的に、rawソケットを介して有効なTCPパケット(IPヘッダーを含む)を送信できません。これは私がやっているものです:
import socket
from scapy.all import IP, TCP
pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP()
spkt1 = str(pkt)
outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
outs.sendto(spkt1, ('127.0.0.1', 0))
私はこれを実行すると、私は次のエラーを取得:あなたはそれをこれを使用しないでscapyを持っていない場合は
outs.sendto(spkt1, ('127.0.0.1', 0)) socket.error: [Errno 22] Invalid argument
を符号化されたパケットのbase64である:
import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")
非常に奇妙なことがほとんど同一であるパケットが正しく送信されるように見えることである。
spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")
これは、2つのパケットがどのように見えるかです:彼らは唯一のTCPの一部が異なるのwiresharkでそれらをチェックアウトすることで
SPKT1
0000 45 00 00 28 00 01 00 00 40 06 FB CE 00 00 00 00 E..([email protected]
0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........
0020 50 02 20 00 10 7E 00 00 P. ..~..
SPKT2
0000 45 00 40 00 05 B0 00 00 02 06 00 00 00 00 00 00 [email protected]
0010 7F 00 00 01 00 C8 03 84 00 00 00 00 00 00 00 00 ................
0020 B0 02 00 C8 00 7B 00 00 02 04 05 B4 01 03 03 01 .....{..........
0030 01 01 08 0A 4D CF 52 33 00 00 00 00 04 02 00 00 ....M.R3........
。
私は多くの異なる実験を行いましたが、最終的に特定の特定のTCPオプションを設定してパケットを送信することができましたが、そのようなパケットは機能しないはずです。
これはどうして起こっているのでしょうか?
EDIT:このパケットは表示されない
が動作するように:
pkt = IP(len=16384, src='0.0.0.0', dst='127.0.0.1',
id=RandShort(), ttl=2)/TCP(sport=255,
dport=900, flags="S", window=200,
options=[('MSS', 1460), ('WScale', 2)])
spkt = bytes(pkt)
spkt += '\x00'*20
あなたがゼロを追加しない場合、それは動作しません。
最初のコードスニペットで 'import'を修正できますか? (また、あなたがあなたの質問の要求を読んでいる間、funの事実:あなたは '' ... '' .decode( "base64")と '' ... "(' 'import base64'の代わりに.encode(" base64 ")' 'を使うことができます) 。 OK、申し訳ありませんが、この1つを助けることはできません。しかし、あなたは私のアップヴォートを持っています。 –
はい、インポートを修正しました。 –
FWIW、あなたのコードで同じエラーが発生しています。 –