Scapy

Vous êtes du genre à parler couramment SMTP, POP3, IMAP et HTTP en utilisant `nc' ou `telnet' ? Alors vous aimerez sûrement Scapy.

Scapy c'est un peu le `nc' pour les protocoles TCP, IP et Ethernet (en fait ça couvre tout le spectre des couches du modèle OSI). Avec lui vous pouvez donc, par exemple, construire à-la-main vos paquets TCP, mettre ça dans un paquet IP, et finalement envoyer le tout encapsulé en 802.3 sur votre interface réseau.

Qu'est-ce qu'on peut donc faire avec Scapy ?

Par exemple, une question qui me trotte dans la tête depuis un moment : sur un LAN, est-ce qu'il est possible de pinguer une machine distante sur son adresse de loopback `127.0.0.1' ? Après tout, il est possible de pinguer l'adresse IP d'une interface qui n'est sur ce LAN, alors pourquoi pas l'adresse de l'interface de loopback ?

D'abord, comment envoyer un ping `echo-request' classique.

Soit la machine A d'adresse IP `ip_A' et d'adresse mac `mac_A', et une machine cible B d'adresse IP `ip_B' et d'adresse mac `mac_B' :

>>> ip_A="192.168.1.101"
>>> ip_B="192.168.1.1"
>>> sendp(Ether()/IP(src=ip_A,dst=ip_B)/ICMP(type="echo-request",code=0,id=0x1))
.
Sent 1 packets.

Un coup de tcpdump en parallèle et on voit effectivement le `echo-request' partir, et un `echo-reply' en réponse. On peut aussi utiliser `srp()' à la place de `sendp()' pour que Scapy attende la réponse :

>>> srp(Ether()/IP(src=ip_A,dst=ip_B)/ICMP(type="echo-request",code=0,id=0x2))Begin emission:
Finished to send 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)

Bon, maintenant comment pinguer le `127.0.0.1' de cette machine B ?

On va envoyer un paquet ICMP à destination de l'IP `127.0.0.1' mais en forçant l'adresse MAC de destination à `mac_B' :

>>> ip_A="192.168.1.101"
>>> ip_B="127.0.0.1"
>>> mac_A="0:16:de:ad:be:ef"
>>> mac_B="0:18:ca:fe:ba:be"
>>> srp(Ether(dst=mac_B)/IP(src=ip_A,dst=ip_B)/ICMP(type="echo-request",code=0,id=0x3))
Begin emission:
Finished to send 1 packets.
..........................^C
Received 164 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

Un tcpdump sur la machine distante montre que le paquet est bien reçu, mais par contre aucune réponse n'est émise… Cela ne semble donc pas être possible, du moins avec un Linksys WRT54G exécutant OpenWRT.

Ce contenu a été publié dans regular. Vous pouvez le mettre en favoris avec ce permalien.