Mise à jour (31/07/2011) : Ajout de l’option -c | –without-color permettant d’enlever les caractères d’échappement ANSI de la sortie.
Voici mon premier script en Python, qui utilise Scapy, qui au passage, est génial, ndp_dump.py permet d’afficher d’une manière claire et simple, les paquets ndp, et plus particulièrement, les paquets de type Advertisement sur lesquels les flags R et O sont à 1.
Voici un petit aperçu :
Les paquets ayant le flag R (router) à 1 seront surlignés en rouge, et ceux ayant le flag O (override) à 1 seront soulignés.
Voici la syntaxe :
python ndp_dump.py [-h | –help] [-a | –only-adv] [-t | –display-time] [-c | –without-color] <interface>
Les différentes options disponibles sont :
- -a ou –only-adv qui permet d’afficher uniquement les paquets ndp Advertisement
- -t ou –display-time qui permet d’afficher le temps actuel avant chaque ligne.
- -c ou –without-color permet d’enlever de la sortie les caractères d’échappement ANSI.
interface sert bien entendu à paramétrer l’interface sur laquelle on souhaite observer les paquets.
Scapy est bien entendu requis, avec pour version minimum 2.1.0.
Voici le script :
#! /usr/bin/env python ############################################################################# ## ## ## ndp_dump.py --- Display NDP packets in a human readable way ## ## ## ## Copyright (C) 2011 : Benjamin Bachelart ## ## http://blog.bashy.eu/ ## ## ## ## This program is free software. ## ## ## ## Type ndp_dump.py --help for syntax ## ## Version : 1.0.1 (31/07/2011) ## ## ## ############################################################################# from scapy.all import * import sys, getopt def usage(): print "Usage: python ndp_dump.py [-h | --help] [-a | --only-adv] [-t | --display-time] [-c | --without-color] <interface>" try: opts, args = getopt.getopt(sys.argv[1:], "hatc", ["help", "only-adv", "display-time", "without-color"]) except getopt.GetoptError, err: print str(err) usage() exit(1) onlyAdv = False displayTime = False withoutColor = False for opt, arg in opts: if opt in ('-h', '--help'): usage() print "Using [-c | --without-color] option prevent any ANSI escape code to be displayed in output." exit() elif opt in ('-a', '--only-adv'): onlyAdv = True elif opt in ('-t', '--display-time'): displayTime = True elif opt in ('-c', '--without-color'): withoutColor = True if len(args) > 1: print 'Cannot define several interfaces.' usage() exit(1) if len(args) == 0: print 'Interface must be defined.' usage() exit(1) else: if args[0] not in get_if_list(): print 'This interface does not exist.' exit(1) else: interface = args[0] def ndp_monitor_callback(pkt): if(displayTime): txtTime = "%pkt.time% " else: txtTime = '' txtStyle = '' txtColor = '\033[1;37m' endStyle = '\033[0m' lineCol = '' if ICMPv6ND_NA in pkt: if pkt[ICMPv6ND_NA].R == 1L: txtStyle = '\033[1;41m' lineCol = txtColor if pkt[ICMPv6ND_NA].O == 1L: txtStyle += '\033[4m' lineCol = txtColor if withoutColor: lineCol = '' txtStyle = '' endStyle = '' return pkt.sprintf(txtTime + lineCol + txtStyle + "." + endStyle + lineCol + " Adv %IPv6.src% [%Ether.src%] -> %IPv6.dst% [%Ether.dst%] - " + endStyle + lineCol + txtStyle + "R=%ICMPv6ND_NA.R% S=%ICMPv6ND_NA.S% O=%ICMPv6ND_NA.O% tgt=%ICMPv6ND_NA.tgt%" + endStyle) elif ICMPv6ND_NS in pkt and not onlyAdv: return pkt.sprintf(txtTime + " Sol %IPv6.src% [%Ether.src%] -> %IPv6.dst% [%Ether.dst%] - tgt=%ICMPv6ND_NS.tgt%") sniff(prn=ndp_monitor_callback, filter="icmp6", store=0, iface=interface) |
En cas de problème, vous pouvez télécharger ndp_dump.zip, archive dans laquelle vous trouverez ndp_dump.py.