Raw Sockets und Sendto in Python

Ich arbeite daran, scapy in twisted zu integrieren, aber ich bin auf diesen sehr seltsamen Fehler unter OSX gestoßen, den ich anscheinend nicht herausfinden kann.

Grundsätzlich kann ich kein gültiges TCP-Paket (einschließlich IP-Header) über einen Raw-Socket senden. Das mache ich:

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))

Wenn ich dies ausführe, erhalte ich die folgende Fehlermeldung:

outs.sendto(spkt1, ('127.0.0.1', 0)) socket.error: [Errno 22] Invalid argument

Falls Sie scapy nicht aktiviert haben und es nicht verwenden möchten, ist das Paket base64-codiert:

import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")

Das sehr seltsame ist, dass ein Paket, das fast identisch ist, ordnungsgemäß gesendet zu werden scheint:

spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")

So sehen die beiden Pakete aus:

SPKT1
0000   45 00 00 28 00 01 00 00  40 06 FB CE 00 00 00 00   E..(....@.......
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   E.@.............
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........

Durch das Auschecken in wireshark unterscheiden sie sich nur im TCP-Teil.

Ich habe viele verschiedene Experimente durchgeführt und am Ende bestimmte TCP-Optionen festgelegt, um das Paket zu senden, aber es macht keinen Sinn, dass ein solches Paket nicht funktionieren sollte.

Hat jemand eine Idee, warum das passieren könnte?

BEARBEITEN:

Dieses Paket scheint zu funktionieren:

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

Wenn Sie die Nullen nicht hinzufügen, funktioniert dies nicht.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage