Content-Type: text/plain; charset=iso-8859-15-T9

Reimportation du script de surveillance du DHCP effac par Bijou.

darcs-hash:20060104115130-d1718-92467973f809550fd9d8bb81dba83e500d6f6c16.gz
This commit is contained in:
bernat 2006-01-04 12:51:30 +01:00
parent 3ed247c7b0
commit 69956e2458

84
surveillance/dhcp-detect.py Executable file
View file

@ -0,0 +1,84 @@
#! /usr/bin/env python
# -*- encoding: iso-8859-15 -*-
# Utilisation de scappy pour détecter un DHCP pirate.
import threading
import time
import sys
import smtplib
import os
sys.path.append("/usr/bin")
from scapy import Ether, sendp, sniff, BOOTP, IP, UDP
# Adresse MAC de egon
mac=os.popen(r"ifconfig | grep '^eth0' | awk '{print $(NF)}'").readline().strip()
# Paquet à envoyer pour détecter un DHCP (il a été capturé pour avoir la bonne tête)
tosend = Ether("\xff\xff\xff\xff\xff\xff\x00\x80\xc8\xc9\xab\x01\x08\x00E\x10\x01H\x00\x00\x00\x00@\x11y\x96\x00\x00\x00\x00\xff\xff\xff\xff\x00D\x00C\x014\x9aA\x01\x01\x06\x00\xb2\x87\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc8\xc9\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x012\x04R\xe1'67\x07\x01\x1c\x02\x03\x0f\x06\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
# On met à jour ce paquet
tosend.getlayer(Ether).src = mac
tosend.getlayer(IP).chksum = None
tosend.getlayer(UDP).chksum = None
tosend.getlayer(BOOTP).chaddr = ''.join(map(lambda x: chr(int(x,16)),mac.split(":")+['0']*10))
tosend = Ether(tosend.build())
dejavu = {} # Tableau associatif "mac" - "mailé pour la dernière fois"
print "Le paquet suivant va être envoyé à intervalles réguliers pour tester la présence de DHCP pirates."
print tosend.summary()
print
# Envoi par mail le paquet
def mail(paquet):
if (paquet.getlayer(Ether).src in globals()['dejavu'] and (time.time() - globals()['dejavu'][paquet.getlayer(Ether).src]) < 60*60):
pass
else:
globals()['dejavu'][paquet.getlayer(Ether).src] = time.time()
msg = "From: %s\r\nTo: %s\r\nSubject: DHCP pirate\r\n\r\n" % ("Vincent Bernat (dhcp) <bernat@crans.org>", "Disconnect team <disconnect@crans.org>")
msg = msg + """Un DHCP pirate a été découvert sur le réseau. Voici quelques renseignements mineurs à son sujet :
Son adresse Ethernet : %s
Son adresse IP : %s
Son TTL : %d
Merci de votre attention et à bientôt.""" % (paquet.getlayer(Ether).src, paquet.getlayer(IP).src, paquet.getlayer(IP).ttl)
server = smtplib.SMTP('localhost')
server.sendmail('bernat@crans.org', ('disconnect@crans.org',), msg)
server.quit()
# Reception d'une réponse
def recoit(paquet):
# On affiche
print paquet.summary()
# On verifie que c'est bien ce qu'on attend
if ((paquet.getlayer(Ether).dst.upper() == globals()['mac']) and (paquet.haslayer(BOOTP)) and (paquet.getlayer(BOOTP).op == 2) and (paquet.getlayer(IP).src != '138.231.136.6') and (paquet.getlayer(IP).src != '138.231.136.3')):
# DHCP pirate ?
print "DHCP pirate ? (%s)" % paquet.getlayer(Ether).src
mail(paquet)
# Envoi du paquet test
def send(pere):
while pere.isAlive():
time.sleep(60)
print tosend.summary()
sendp(tosend)
print "Fin des envois"
# Sniffer
def get(pere):
while pere.isAlive():
# On prend les paquets par 100, sinon, le process grossit beaucoup trop
a = sniff(iface="eth0", filter="port bootpc and ether dst %s" % globals()['mac'], prn=recoit, count=100)
print "Fin du sniff"
# On va démarrer le thread qui envoie régulièrement le paquet et celui qui sniffe régulièrement la réponse
threading.Thread(target=send, name="send", args=(threading.currentThread(),)).start()
threading.Thread(target=get, name="get", args=(threading.currentThread(),)).start()
while True:
time.sleep(10)