Hablando con zócalo C con Scapy

Tengo una conexión UDP y escucho en un puerto (localhost) y también estoy intentando enviar un paquete de Scapy desde localhost. Por alguna razón, mi código C nunca captura realmente el paquete, sin embargo, puedo ver que el paquete aparece en Wireshark muy bien. Ha pasado un tiempo desde que usé sockets, pero ¿hay algunas opciones especiales de socket que debo configurar o por qué podría ver el paquete en Wireshark bien pero no por el socket C?

Nota: pude capturar un paquete con éxito cuando escribí el código de socket correspondiente para enviar paquetes (de localhost), sin embargo, todavía no puedo obtener el código de escucha para detectar el paquete cuando se envía desde otra computadora.

He encontrado una pregunta similar, pero cuando probé su enfoque (utilizando UDP en lugar de TCP), todavía no pude hacer que netcat detectara el paquete Scapy.

Código C (condensado por razones de claridad)

int main() { int sock, dataLen, inLen; struct sockaddr_in inAddr; short listen_port = 8080; char buffer[2048]; if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) { printf("ERROR: unable to establish socket\n"); return -1; } // zero out address structure memset(&inAddr, 0, sizeof(inAddr)); inAddr.sin_family = AF_INET; inAddr.sin_addr.s_addr = htonl(INADDR_ANY); inAddr.sin_port = htons(listen_port); if (bind(sock, (struct sockaddr*)&inAddr, sizeof(inAddr)) < 0) { printf("ERROR: unable to bind\n"); return -1; } inLen = sizeof(inAddr); printf("Now listening on port %d\n", listen_port); while(1) { dataLen = recvfrom(sock, buffer, 1500, 0, (struct sockaddr*)&inAddr, &inLen); if (dataLen < 0) printf("Error receiving datagram\n"); else printf("Received packet of length %d\n", dataLen); } return 0; } 

Scapy Script

 # set interface conf.iface="lo0" # create IP packet ip_pkt = IP()/UDP() ip_pkt.payload = "payload test message" ip_pkt.dport = 8080 ip_pkt.dst = "127.0.0.1" ip_pkt.src = "127.0.0.1" # send out packet send(ip_pkt) 

Scapy debe configurarse de forma ligeramente diferente para funcionar en la interfaz Loopback, consulte http://www.secdev.org/projects/scapy/doc/troubleshooting.html bajo el encabezado ” No puedo hacer ping 127.0.0.1. Scapy no trabajar con 127.0.0.1 o en la interfaz de bucle invertido

Utilicé el código dado allí y envié un paquete scapy que recibió un Socket C, esto fue específicamente:

 from scapy.all import * conf.L3socket=L3RawSocket packet=IP()/UDP(dport=32000)/"HELLO WORLD" send(packet) 

Luego se recibió en un Socket UDP C enlazado a lo largo del puerto 32000 (el valor predeterminado de Scapy es enviar paquetes IP a través de la interfaz de bucle de retorno).

Tengo el mismo problema, udp socket no recibe el paquete scapy. Supongo que puede haber algo relacionado con esta publicación: Ayuda de Raw Socket: ¿Por qué los paquetes UDP creados por sockets sin procesar no son recibidos por el núcleo UDP? Y lo que me funciona es la opción socket.IP_HDRINCL . Aquí está el código de trabajo para ambos y el remitente.

remitente:

 import socket from scapy.all import * rawudp=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) rawudp.bind(('0.0.0.0',56789)) rawudp.setsockopt(socket.SOL_IP, socket.IP_HDRINCL,1) pkt = IP()/UDP(sport=56789, dport=7890)/'hello' rawudp.sendto(pkt.build(), ('127.0.0.1',7890)) 

receptor:

 import socket so = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) so.bind(('0.0.0.0',7890)) while True: print so.recv(1024) 

Verificado en Fedora 14, aunque no funciona en mi MBP …

Creo que el problema está en configurar un conjunto de interfaz, src y dst incompatibles.

Cuando el destino es loopback (127.0.0.1), la interfaz debe ser lo y las direcciones (asumiendo que el cliente y el servidor se ejecutan en el mismo host):

 ip_pkt.dst = "127.0.0.1" ip_pkt.src = "127.0.0.1" 

Otra forma es enviar a la dirección de Ethernet (asumiendo que 192.168.1.1 está configurado en eth0 y que el cliente y el servidor se ejecutan en el mismo host):

 ip_pkt.dst = "192.168.1.1" ip_pkt.src = "192.168.1.1" 

Si intentas diferentes hosts, entonces usar 127.0.0.1 y lo no es posible. Establezca src en la ip del equipo cliente y dst en la ip del servidor.