#!/usr/bin/python # Dis, emacs, c'est du -*- python -*-, ça ! # # C.Chépélov, 19 janvier 1999. Suite à discussion avec Olivier DALOY, et # des trucs louches dans ses logs. Merci, merci ARP !! import config import pickle,string,os # Phase 1 : lire les données théoriques, les retrier pour être exploitables. ZONEDB = pickle.load(open(config.CFG_FILE_ROOT+"Zone.db","r")) THicn_by_mac = {} # ip, comment, name by MAC (théorique) THncm_by_ip = {} # name, comment, MAC by IP (théorique) for name in ZONEDB.keys(): (IP,comment,MAC) = ZONEDB[name] THicn_by_mac[MAC] = (IP,comment,name) THncm_by_ip[IP] = (name,comment,MAC) # Phase 2 : Lire les données réelles, les mettres dans des dicos pour être # exploitables. arp = os.popen("arp -n","r") arp.readline() ip_by_mac = {} mac_by_ip = {} while 1: s = arp.readline() if not s: break sl = string.split(s) try: ip = sl[0] mac = "" if (sl[1] != "ether") or (sl[2] == "(incomplete)"): raise "incomplete" for c in string.lower(sl[2]): if c in "0123456789abcdef": mac = mac + c if not ip or not mac: break ip_by_mac[mac] = ip mac_by_ip[ip] = mac except: pass # Phase 3 : en fonction des gens qu'on a vus, faire une comparaison... # d'abord, par IP vues : try: problems = open("/var/log/arpanoid","r").readlines() except: problems = [] # la liste des problèmes. Sera triée par ordre alphabétique # et les problèmes rendus uniques. # note: on récupère les vieux problèmes, on génèrera le même message # plusieurs fois (pas grave, on virera les messages identiques) def log(s): s = s + '\n' if not s in problems: problems.append(s) for ip,mac in mac_by_ip.items(): if THicn_by_mac.has_key(mac): thIP,comment,name = THicn_by_mac[mac] if thIP == ip: pass # print name,' est clair (IP by MAC)' else: if THncm_by_ip.has_key(ip): victim,t1,t2 = THncm_by_ip[ip] else: victim = "(inconnu)" log("%s (%s) usurpe une adresse IP !!! (normal=%s,actuel=%s[%s])" % (name,comment,thIP,ip,victim)) else: log("MACHINE INCONNUE (intruse ?) MAC=%s !" % mac) if THncm_by_ip.has_key(ip): name,comment,thMAC = THncm_by_ip[ip] if thMAC == mac: pass # print name,' est clair (MAC by IP)' else: if THicn_by_mac.has_key(mac): t1,t2,name = THicn_by_mac[mac] else: victim = "(inconnu)" log("%s (%s) utilise une autre carte réseau !!! (normal=%s,actuel=%s[%s]" % (name,comment,thMAC,mac,victim)) else: diag = "(intruse ?)" if THicn_by_mac.has_key(mac): THip,comment,name = THicn_by_mac[mac] diag = "%s de %s" % (name,comment) log("MACHINE AVEC FAUX IP=%s (%s)!" % (ip,diag)) problems.sort() print string.join(problems,"")