ndp_dump.py surveiller simplement les paquets ndp

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 :

Aperçu du programme ndp_dump.py

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.

Ce contenu a été publié dans Scripts, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *