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

martes, 12 de febrero de 2013

Nivel de fragmentación del disco en linux

Haciendo mención sobre mi post anterior consola linux: desfragmentar el disco duro 
Algo que se debería hacer antes decidir si vas a desframentar tu disco en linux o no es ejecutar lo siguiente
fsck -nvf /dev/hda1
Escanea el disco duro e informa sobre el nivel de fragmentación.

consola linux: desfragmentar el disco duro

"en Linux no se fragmenta el disco duro", "no hay que desfragmentar el disco si usas linux"... y muchas otras frases del estilo. Tienen parte de verdad y parte de "mentira". Es cierto que en Windows es caótico la gestión que hace el sistema con los ficheros. Un sencillo consejo para no ser victima de dichos destrozos (usuarios de Windows) NO BORRAR ABSOLUTAMENTE NADA. Cierto no desinstalar programas, ni borrar ficheros temporales, cache... nada! de está forma evitamos en mayor medida que el disco se fragmente. En el momento que liberamos espacio.... entramos en peligro.... y con el tiempo empezamos a desfragmentar y desfragmentar y cada vez más y más... y muy cierto es que no es NADA recomendable desfragmentar el disco muy a menudo. Es más, si puedes evitarlo (usuario de Windows) mejor. Este proceso "desgasta", "trastorna" un poco al sistema operativo y al final no le hace ningún bien.

Bueno ahora hablamos enserio. En Linux cierto es que se gestiona mucho mejor el sistema de ficheros. Pero aun así se fragmenta, en menor medida, pero lo hace, y aunque no lo parezca y no sea necesario existen herramientas que te echan un cable para desfragmentar el disco duro. En el caso de Linux al menos hasta el día de hoy no he notado ningún desgaste ni trastorno con el tiempo por parte del sistema una vez que se desfragmenta, si no todo lo contrario.

Para empezar lo único que necesitamos es descargarnos el script Defrag.
wget http://ck.kolivas.org/apps/defrag/defrag-0.08/defrag
chmod +x defrag
./defrag
Desde la URL donde lo descargamos podremos bajarnos la nueva versión.

escanear todas las IPs V4 del mundo con NMAP

Cómo hacer un escaneo "rápido" a todas las IP's de internet

sudo nmap -sP -PN -R 1-255.0-255.0-255.0-255 > resultado

Almacenamos todas las IPs (desde 1.0.0.0 a 255.255.255.255) que estén en uso. No escanea puertos solo resuelve el nombre de la dirección si puede. Lo único que me queda por decir es que si pretendes ejecutarlo atento que el fichero resultado ocupará mucho.




lunes, 4 de febrero de 2013

micro consejos para programadores - parte5

Los micro consejos de hoy:
  1. Eliminar los datos innecesarios de las imágenes con smuht.it u otro ayuda mucho.
  2. Las pequeñas imágenes típicos iconos GIF es mejor vectorizarlos en un pequeño PNG.
  3. Las variables de nombres largos pueden ser muy claras pero consume menos sí tienen menos de 8 caracteres.

viernes, 1 de febrero de 2013

micro consejos para programadores - parte4

Los de hoy son:
  1. Comprimir todo el contenido web en gzip no es ninguna tontería. Usa las etiquetas apropiadas.
  2. Usar css sprites cuesta un poco al principio pero da buenos resultados ;)
  3. Cambia el PX por EM.