es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“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.

Tags:  , , , ,

Answer

  1. Avatar for 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 socket SOCK_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.

Comments are closed.