“OSError: [WinError 10022] Se proporcionó un argumento no válido” al intentar enviar un paquete TCP SYN (python).
Actualmente estoy intentando hacer el proceso de handshake en Python utilizando sockets en bruto, pero por alguna razón no puedo enviar ningún paquete con el protocolo TCP y recibo OSError: [WinError 10022] Se ha suministrado un argumento no válido. Aquí está mi código:
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.sendto(packet, ('8.8.8.8', 80))
He intentado utilizar como paquete tanto el paquete TCP de Scapy, los bytes TCP recogidos por Wireshark después de envíos exitosos con otras bibliotecas como cadenas de bytes creadas manualmente. Aquí hay una función llamada chksum que calcula el checksum de un paquete:
def chksum(packet: bytes) -> int:
if len(packet) % 2 != 0:
packet += b'\0'
res = sum(array.array("H", packet))
res = (res >> 16) + (res & 0xffff)
res += res >> 16
return (~res) & 0xffff
Aquí hay una clase TCPPacket que crea un paquete TCP:
class TCPPacket:
def __init__(self,
src_host: str,
src_port: int,
dst_host: str,
dst_port: int,
flags: int = 0):
self.src_host = src_host
self.src_port = src_port
self.dst_host = dst_host
self.dst_port = dst_port
self.flags = flags
def build(self) -> bytes:
packet = struct.pack(
'!HHIIBBHHH',
self.src_port, # Número de puerto origen
self.dst_port, # Número de puerto de destino
0, # Número de secuencia
0, # Número de acuse de recibo
5 << 4, # Desplazamiento de datos
self.flags, # Indicadores
8192, # Ventana
0, # Suma de verificación (valor inicial)
0 # Puntero urgente
)
pseudo_hdr = struct.pack(
'!4s4sHH',
socket.inet_aton(self.src_host), # Dirección de origen
socket.inet_aton(self.dst_host), # Dirección de destino
socket.IPPROTO_TCP, # PTCL
len(packet) # Longitud de TCP
)
checksum = chksum(pseudo_hdr + packet)
packet = packet[:16] + struct.pack('!H', checksum) + packet[18:]
return packet
Básicamente, no tengo idea de por qué mi socket no está aceptando ningún paquete.
davy.ai
El error que estás recibiendo, “OSError: [WinError 10022] Se ha especificado un argumento no válido”, indica que hay un problema con los argumentos que se están pasando al socket.
Una posibilidad podría ser que la dirección y el puerto en la función
sendto()
sean incorrectos, lo que podría provocar que el socket falle. Otra posibilidad es que el formato de paquete que se esté utilizando no sea compatible con el tipo de socketSOCK_RAW
.Te sugiero que intentes depurar el problema añadiendo declaraciones de impresión para determinar si el paquete se está construyendo adecuadamente y si la dirección y el puerto son correctos. Además, podrías intentar usar un tipo de socket distinto, como
SOCK_STREAM
, para ver si el problema persiste.