Detectando intrusos con Nmap y Python

El hace unos dias hablando con el señor Po, le comente que tenia un pequeño script de unas 15 lineas con nmap y Python para avisarme de si tenia algún equipo conectado que no conociera en la red y acordándome de los Post de Python con Nmap de Hacking Ético, (1,2,3) me puse a retocarlo, para que fuera mas ordenado y con las opciones mas claras, no como originalmente que era código espagueti

Así que vamos a ver como funciona y que opciones tiene para que cada uno puede hacer lo que quiera con el, lo podéis bajar de Github del grupo, al final lo pondremos con un cron para que cada X tiempo revise la red y nos avise

Cuando ya lo tenia casi y aprovechando que tenia un viaje en tren, me dio envidia la gestión de parámetros de Sqlmap así que decidió ver como los hacia y aprenderlos a realizar, los cuales explicaremos en otro post como programarlos.

Aquí os dejo la ayuda del programa para que nos sea fácil usarlo.

Parámetros básicos de uso

-h, --help show this help message and exit -r IP, --range=IP Secure network range --wl=WHITELIST_FILE, --whitelist=WHITELIST_FILE File have Mac whitelist -l, --log Log acctions script -v, --verbose Verbose acctions script

Opciones para la gestión de las macs con las que se controlan los equipos en la red

--ms, --macsearch Search machine Network --ma=MACADD, --macadd=MACADD Add mac to whitelist --mr=MACREMOVE, --macremove=MACREMOVE Remove mac from whitelist

Datos necesarios para el envío de emails

-u USER, --user=USER User mail server --pwd=PASSWORD, --password=PASSWORD Password mail server -s SERVER, --server=SERVER mail server -p PORT, --port=PORT Port mail server --et=EMAILTO, --emailto=EMAILTO Destination E-mail

Lo primero que vamos a hacer es buscar todas las macs de la red con los parametros --ms y -r X.X.X.X/Y

Como ya sabemos para que nmap pueda recopilar las macs tenemos que lanzarlos como root, así que realizaremos lo siguiente

sudo python DetectMachineLan.py --ms -r 192.168.8.0/24

Con lo que obtendremos:

192.168.8.1 --> 7C:XX:XX:XX:XX:XX 192.168.8.100 --> 9C:XX:XX:XX:XX:XX
192.168.8.102 --> Mac no detected

Ahora que ya sabemos que macs tenemos en la red vamos a añadirlas a nuestro Whitelist para tenerlas vigiladas con el parámetro --ma, podéis añadir tantas como queráis separadas por comas también podemos borrar macs con el parámetro --mr con la misma estructura

python DetectMachineLan.py --ma 7C:XX:XX:XX:XX:XX,9C:XX:XX:XX:XX:XX

Ahora que ya tenemos nuestras macs para controlar listas, vamos a empezar a buscar a nuestros intrusos, simplemente diciendo que rango quieres que vigile con el parámetro -r por defecto el programa no genera log ni muestra nada en pantalla si tu no se lo dices, dado que esta pensando para que se use como una clase de otro programa si fuera necesario, por lo que vamos a poner los parámetros -v y -l para tener verbosity y log.

sudo python DetectMachineLan.py -r 192.168.8.0/24 -v -l

Obteniendo lo siguiente en la salida de la consola como en el log.

[2016-01-11 11:59:01] Mac find 7C:XX:XX:XX:XX:XX Ip: 192.168.8.1 [2016-01-11 11:59:01] New mac detected 9C:XX:XX:XX:XX:XX Ip: 192.168.8.100 [2016-01-11 11:59:01] Mac not detected 192.168.8.102

Dado que tener que estar revisando la consola cada X tiempo o los logs es poco practico, tenemos la opción de enviarnos un email automáticamente cuando encuentre una nueva maquina en la red, quedando el comando de la siguiente manera

sudo python DetectMachineLan.py -r 192.168.8.0/24 -v -u usuario_login@example.com --pwd Password -s mail.server.com -p 587 --et=destinatario@example.com --log

En este caso todos los parámetros son obligatorios, debido a que python no tiene una función para el envío de emails sin servidor smtp o yo no encontré ninguna.

Recibiremos dos tipos de email, si tenemos nuestra red limpia o si se encontraron intrusos en ella.

No intrusos

Intrusos detectados

Por el momento no tenemos un parámetro para poner un tiempo de escaneo por lo que lo pondremos en un cron, para ello editaremos el cron como root y añadiremos

30 * * * * python DetectMachineLan.py -r 192.168.8.0/24 -v -u usuario_login@example.com --pwd Password -s mail.server.com -p 587 --et=destinatario@example.com --log

Con esto cada 30 minutos realizaremos una búsqueda y nos informara de los posibles intrusos.

Posibles mejoras de futuro:

  • Aviso mediante ventana con GTK
  • Parámetro de tiempos de escaneo, para evitar el cron
  • Consola de control remota
  • Lo que se nos ocurra entre todos

Espero que os guste el script y ahora ya solo queda que lo probéis para sacar posibles fallos y nos los reportéis para que podamos mejóralo :D