Parler à la prise C avec Scapy

J’ai une connexion UDP et j’écoute sur un port (localhost) et j’essaie également d’envoyer un paquet Scapy à partir de localhost. Pour une raison quelconque, mon code C ne capture jamais réellement le paquet, mais je peux voir que le paquet apparaît dans Wireshark très bien. Cela fait longtemps que je n’ai pas utilisé de sockets, mais y a-t-il des options de socket particulières que je dois définir ou pourquoi devrais-je être en mesure de voir le paquet dans Wireshark très bien, mais pas par le socket C?

Remarque: j’ai réussi à attraper un paquet lorsque j’ai écrit le code de socket correspondant pour envoyer des paquets (à partir de localhost), mais je ne parviens toujours pas à obtenir le code d’écoute pour capturer le paquet lorsqu’il est envoyé depuis un autre ordinateur.

J’ai trouvé une question similaire mais quand j’ai essayé leur approche (en utilisant UDP au lieu de TCP), je ne pouvais toujours pas obtenir netcat pour attraper le paquet Scapy.

Code C (condensé pour plus de clarté)

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 doit être configuré légèrement différemment pour fonctionner sur l’interface Loopback, voir http://www.secdev.org/projects/scapy/doc/troubleshooting.html sous la rubrique ” Je ne peux pas cingler 127.0.0.1. Scapy ne le fait pas. travailler avec 127.0.0.1 ou sur l’interface de bouclage

    J’ai utilisé le code donné ici et envoyé un paquet scapy qui a été reçu par un socket C, c’était spécifiquement:

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

    Cela a ensuite été reçu sur un socket C UDP lié au port 32000 (Scapy envoie par défaut les paquets IP sur l’interface de bouclage).

    J’ai le même problème, socket udp ne reçoit pas de paquet scapy. Je suppose qu’il y a peut-être un lien avec ce message: Aide sur Raw Socket: Pourquoi les paquets UDP créés par des sockets bruts ne sont-ils pas reçus par le kernel UDP? Et ce qui fonctionne pour moi, c’est l’option socket.IP_HDRINCL . Voici le code de travail pour les deux et l’expéditeur.

    expéditeur:

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

    receveur:

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

    Vérifié sur Fedora 14, mais ne fonctionne pas sur mon MBP …

    Je pense que le problème réside dans la définition d’un ensemble incompatible d’interface, d’adresse src et dst.

    Lorsque la destination est en boucle (127.0.0.1), l’interface doit être lo et les adresses (en supposant que le client et le serveur s’exécutent sur le même hôte):

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

    Une autre méthode consiste à envoyer à l’adresse Ethernet (en supposant que 192.168.1.1 est configuré sur eth0 et que le client et le serveur s’exécutent sur le même hôte):

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

    Si vous essayez différents hôtes, l’utilisation de 127.0.0.1 et lo n’est pas possible. Définissez src sur l’ip de la machine cliente et dst sur l’ip de la machine serveur.