scripts/arpanoid
krempp f1d3de9de7 Initial revision
darcs-hash:20000521125243-92525-6092ab1d3efe6df9898549afb0aa3c7d43983e8b.gz
2000-05-21 14:52:43 +02:00

93 lines
2.9 KiB
Python
Executable file

#!/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,"")