miércoles, 13 de febrero de 2013

Detectar anomalías en la red Wifi con Raspberry Pi

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