Resumidamente analiza nuestra red Wifi 192.168.1.0/24 detectando direcciones MAC que no correspondan a ninguno de nuestros dispositivos y analizando los puertos que usan todas nuestras máquinas en busca de puertos que no correspondan a nuestra lista de puertos "seguros". El mayor trabajo lo hago usando el comando nmap, así que tenéis que tenerlo instalado antes de probarlo. Es muy fácil de configurar solo tenéis que rellenar la lista de las variables que se encuentran al principio con los datos correspondientes. Los datos de servidor smtp, email, contraseña... son para enviar alertas vía email a la dirección que indiquéis. Ademas de enviar alertas vía email lleva un registro en el fichero que indiquéis en fAlertas. Esto lo hago para llevar un control del programa en el caso de que si se ejecuta periódicamente con crontab por ejemplo. Poder ver en ese fichero histórico cuando se ha ejecutado, cuando ha finalizado, alertas que ha encontrado.
#!/usr/bin/env python import os from datetime import * import smtplib from email.mime.text import MIMEText //Zona config servSMTP='SMTP.SERVIDOR' fromEmail="ALERTAS@CORREO.COM" cClave="CONTRASEÑA" toEmail="DESTINO@ALERTA.COM" fAlertas="NombreFicheroAlertas" ipRPI="IP.DE.RAS.PI" myMACs = [ "RR:RR:RR:RR:RR:RR", "AA:AA:AA:AA:AA:AA", "BB:BB:BB:BB:BB:BB", "CC:CC:CC:CC:CC:CC", "DD:DD:DD:DD:DD:DD", "PI:PI:PI:PI:PI:PI", ] nameMACs = { "RR:RR:RR:RR:RR:RR":"RouterWifi", "AA:AA:AA:AA:AA:AA":"PC01", "BB:BB:BB:BB:BB:BB":"PC02", "CC:CC:CC:CC:CC:CC":"PHONE01", "DD:DD:DD:DD:DD:DD":"PHONE02", "PI:PI:PI:PI:PI:PI":"Raspberry Pi", } myPorts = [ 20,21, 22, 23, 25,587, 80,8080, 443, 53, 135, 139, 3128, ] def mail(mensaje): mailServer = smtplib.SMTP(servSMTP,25) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(fromEmail,cClave) mensaje = MIMEText(str(mensaje)) mensaje['From']= fromEmail mensaje['To']=toEmail mensaje['Subject']="Alerta Wifi" mailServer.sendmail(fromEmail,toEmail,mensaje.as_string()) mailServer.close() def registrar(texto): fm = open(fAlertas,"a") fm.write(texto) fm.close() def leer(fichero): contenido='' f = open(fichero, "r") while True: linea = f.readline() contenido = contenido + ' ' + linea if not linea: break f.close() os.system("rm "+fichero) return contenido def leer_simple(fichero): contenido='' f = open(fichero, "r") while True: linea = f.readline() if not linea: break contenido = linea f.close() os.system("rm "+fichero) return contenido def listar(fichero): contenido=leer(fichero) contenido=contenido.split() return contenido registrar("Iniciando chequeo "+str(datetime.today())+"\n") ip='' os.system("nmap -sP 192.168.1.0/24 | grep -o -E '([0-9]{1,3}\.){3}[0-9]+' > IPs.tmp ") ip=listar("IPs.tmp") for i in ip: port='' mac='' os.system("nmap "+str(i)+" | grep -oiE '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' > MACs.tmp") mac=leer_simple("MACs.tmp") if i != ipRPI and not mac[0:17] in myMACs and mac != "": print "INTRUSO!!!" registrar("INTRUSO DETECTADO IP: "+str(i)+" y su MAC: "+str(mac)+"\n") print i print mac mail("INTRUSO DETECTADO IP: "+str(i)+" y su MAC: "+str(mac)+" ") os.system("macfilter.py "+mac[0:17]+"\n") registrar("intruso bloqueado\n") os.system("nmap "+i+" | grep -oiE '([0-9]{1,6}/)' | grep -oiE '([0-9]{1,6})' > PORTs.tmp") port=listar("PORTs.tmp") for j in port: if not int(j) in myPorts and j != "": print "Puerto no seguro" print i print mac print j name="anonimo" if nameMACs.has_key(mac[0:17]): name=nameMACs[mac[0:17]] registrar("IP: "+str(i)+" PORT: "+str(j)+" MAC: "+str(mac[0:17])+" Name: "+str(name)+"\n") mail("IP: "+str(i)+" PORT: "+str(j)+" MAC: "+str(mac)+" Name: "+str(name)+"\n") registrar("Chequeo finalizado con exito "+str(datetime.today())+"\n")
Para terminar, en el caso de que se encuentre una MAC "intrusa" ejecuta el script macFiler.py. Por último en la configuración donde poner ipRPI hay que añadir la dirección IP de nuestra Raspberry Pi, debido a que la dirección MAC del equipo donde se ejecuta no la carga y si no hacemos que pase por alto la IP estatica que tengamos asignada a nuestra máquina, nos alertará siempre de un intruso. Si tenéis todo preparado para hacer una prueba ejecutamos
echo "Fichero Alertas RPI" > ficheroAlertas ./scanearRPI.py