Estoy trabajando en la integración de scapy con twisted, pero me encontré con este error muy extraño en OSX que no puedo entender.Sockets raw y sendto en python
Básicamente no puedo enviar un paquete TCP válido (incluidos los encabezados de IP) a través de un socket sin formato. Esto es lo que estoy haciendo:
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))
Cuando ejecuto esto me sale el siguiente error:
outs.sendto(spkt1, ('127.0.0.1', 0)) socket.error: [Errno 22] Invalid argument
En caso de que no tiene en scapy no quieren usarlo de esta es el paquete codificado base 64:
import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")
lo extraño es que un paquete que es casi idéntica parece estar enviado correctamente:
spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")
Así es como los dos paquetes se ven como:
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........
Al marcar a cabo en Wireshark que sólo difieren en la parte TCP.
He hecho muchos experimentos diferentes y al final pude establecer ciertas opciones específicas de TCP para enviar el paquete, pero no tiene sentido que dicho paquete no funcione.
¿Alguien tiene una idea de por qué esto puede estar pasando?
EDIT:
parece este paquete a trabajar:
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
Si no agrega los ceros no funciona.
¿Podría corregir la 'importación' en su primer fragmento de código? (también, es un hecho divertido mientras leo la petición de su pregunta: puede usar '" ... ".decode (" base64 ")' y '" ... ".encode (" base64 ")' en lugar de 'import base64' . Ok, lo siento, no puedo ayudar con esto. Pero tienes mi voto positivo. –
sí, solucionó la importación. –
FWIW, estoy obteniendo el mismo error en su código. –