
Après la neige, et la pluie, un peu de soleil ce Vendredi soir, de retour de Fleurance.
Après la neige, et la pluie, un peu de soleil ce Vendredi soir, de retour de Fleurance.
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 matin, en ouvrant iTunes, je tombe sur le nouvel album de Hole (sorti le 30 Avril) :
– http://itunes.apple.com/fr/album/nobodys-daughter/id367017416
– http://open.spotify.com/album/0RILf0HVqGJlwKSlGXuWyY
1994 à 2010… ça fait donc… ah ouais, quand même, 16 ans depuis "Live Through This" !