93 lines
2.9 KiB
Python
Executable file
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,"")
|
|
|