Scapy ou "Je fais ce qu'il me plait; avec mes paquets"

Plus vraiment la peine de le présenter. Voila un outil qui saura ravir tout le monde tant par sa puissance que par sa (toute relative) simplicité de fonctionnement. Alors sans plus attendre une petite présentation de Scapy et des quelques découvertes que j'ai pu faire concernant l'usage de ce merveilleux outil.

Puisqu'il s'agit d'un incontournable en terme d'outil réseau et plus particulièrement manipulation de paquets; il apparaît important; voir crucial d'en toucher quelques mots. Pour le moment par manque de connaissances certaines je ne peux prétendre à la rédaction d'un réel tutoriel, mais je puis d'ors et déjà montrer quelques petites découvertes concernant ce superbe outil qu'est Scapy.

L'objectif (vous devez ici entendre: "ce que je voudrais parvenir à faire") est de réaliser un outil capable de répondre en temps réel à diverses requêtes réseaux en forgeant des paquets en adéquation avec les résultats de l'écoute.

Bien sûr; vous savez bien comment cela se passe dans ce genre de quête du Saint Graal : un navigateur web surchargé d'onglets pointant vers des pages plus ou moins en rapport avec le sujet initial; quelques bouts de codes glanés ça et là ;... Bref un joli p'tit bazar qu'il devient rapidement important de restructurer avant de tout oublier.

Et c'est le but de cet article. Plutôt que d'annoncer de grandes vérités, je vais noter mes quelques récentes découvertes histoire de ne pas repartir à chaque fois du début.

Capture des trames ICMP avec génération d'un log :

La même chose avec des requêtes ARP maintenant :

#!/usr/bin/env python
 
from scapy import *
 
def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
 
sniff(iface="lo", prn=arp_monitor_callback, store=0)

une petite amélioration du premier sniffer ICMP avec quelques options ajustables. (pour note: je ne suis pas parvenu à appliquer un filtre de capture et en même temps spécifier une interface réseau autre qu'eth0. Dès qu'un filtre est appliqué; l'interface en écoute devient systématiquement eth0 et ce même si la variable iface est explicitement renseignée.)

#!/usr/bin/env python
import sys,string
def help():
        print("Usage : " + sys.argv[0] + " -I=<selected_iface> ")
        print("Example : " + sys.argv[0] + " -I=eth0 ")
        print("-h : Show this help menu")
        print("-I : the interface you choose to sniff on")
        print("-v : enable verbose")
        sys.exit(0)
 
if len(sys.argv) is 1:
        print("Not enough argument")
        print("Usage : " + sys.argv[0] + " -I=<selected_iface> ")
        print("Example : " + sys.argv[0] + " -I=eth0 ")
        print("-I : the interface you choose to sniff on")
        sys.exit(0)
 
 
 
for i in range(len(sys.argv)):
        if string.find(sys.argv[i], "-h") is 0:
                print(help())
        elif string.find(sys.argv[i], "-I") is 0:
                globals()['interface_specified'] = sys.argv[i].split('=')[1]
        elif string.find(sys.argv[i], "-v") is 0:
                globals()['verbose'] = True
 
 
if vars().has_key('interface_specified') is False:
        print("Please provide the -I switch : give an interface to sniff on")
        sys.exit(0)
if vars().has_key('verbose') is True:
        print("encore plus d'infos")
 
from scapy import *
 
def icmp_monitor_callback(pkt):
    if ICMP in pkt and pkt[ICMP].type in (0,8): # icmp-request or icmp-reply
        return pkt.sprintf("%ICMP.type% provenant de %IP.src% avec l'adresse MAC suivante : %Ether.src% ")
 
sniff(iface=interface_specified, prn=icmp_monitor_callback, store=0)

Enfin un beau copier/coller tout droit sorti de la documentation en ligne de Scapy permettant de réaliser un pseudo Acces Point sur une interface Wifi supportant l'injection

Comme vous pouvez le constater; pour le moment nous ne parvenons qu'à afficher une information quand un paquet donné pointe le bout de son nez sur l'interface réseau.

On ne doit plus être très très loin de la manipulation en temps réel des paquets me semble-t-il. Bon d'un autre coté, je ne suis pas encore parvenu à m'orienter dans la documentation de Scapy et le travail offlline permet certes de se focaliser sur une seule et unique chose; mais sans doc; ça devient plus laborieux. Vous trouverez à la fin de cet article quelques liens donnés sans grande conviction mais introduisant quelques exemples d'utilisation.

Bref j'espère bientôt trouver les réponses à mes interrogations sur une réelle interaction entre les scripts et le trafic réseaux.

Liens connexes

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : http://blog.tools-fm.com/index.php?trackback/29

Fil des commentaires de ce billet