Initial revision
darcs-hash:20000521125243-92525-6092ab1d3efe6df9898549afb0aa3c7d43983e8b.gz
This commit is contained in:
commit
f1d3de9de7
26 changed files with 621 additions and 0 deletions
93
arpanoid
Executable file
93
arpanoid
Executable file
|
@ -0,0 +1,93 @@
|
|||
#!/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,"")
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue