Script bash para vigilar posibles intrusos en la red local usando nmap

Sección Unicamente para Tutoriales y Guías
Responder
Sadrarin
Pi Alpha
Pi Alpha
Mensajes: 30
Registrado: 28 Jul 2017, 22:12
Agradecido: 0
Agradecimiento recibido: 0

Este script lo uso para monitorizar la red local para encontrar posibles intrusos, el funcionamiento es muy simple:

Primero instalamos la utilidad nmap, que será la encargada de hacer un mapa con todos los equipos conectados en la red local.

Código: Seleccionar todo

sudo apt-get install nmap
Lo siguiente será hacer una lista de los equipos de confianza, para ello hay que asegurarse de que están todos conectados a la red y encendidos para que puedan ser encontrados. Lo habitual en una red normal es que el router asigne ips a los equipos por DHCP (sobre todo los que se conectan por wifi), así que para identificarlos correctamente usaremos su MAC. Para los que no sepan lo que es, es una serie de número hexadecimales separados por dos puntos (Ej. 12:34:56:78:90:AB), es única para cada dispositivo (en teoría, ya que hay formas de cambiarla para realizar hacking en redes protegidas).
La lista la guardaremos en la carpeta personal o donde nos venga mejor, hay que recordar donde la guardamos para ponerlo en el script. Para crear la lista es importante hacerlo como root (con sudo basta) porque de lo contrario nmap no muestra las MAC:

Código: Seleccionar todo

sudo nmap -sP 192.168.0.1-255 | grep "MAC" | awk '{ print $3 }' > /home/pi/macs
sudo nmap -sP 192.168.0.1-255 <-- Aquí le decimos a nmap que escanee el rango de ips de la 1 a la 255 de nuestra red, si vuestra red tiene otro rango (192.168.1.1-255 por ejemplo) debeis cambiar los rangos.

grep "MAC" | awk '{ print $3 }' <-- Con grep buscamos las líneas donde están las MAC y con awk filtramos solo la tercera columna, que es donde nmap muestra la MAC del equipo.

> /home/pi/macs <-- Con > lo guardamos en un fichero en la carpeta home con el nombre macs, podeis guardarlo donde querais pero es importante que recordeis donde para modificar el script.

Nos quedaría un fichero tal que así:

Código: Seleccionar todo

cat /home/pi/macs
00:00:74:XX:XX:XX
00:20:6B:XX:XX:XX        
1E:A6:F7:XX:XX:XX
40:F3:08:XX:XX:XX
58:23:8C:XX:XX:XX
58:23:8C:XX:XX:XX
6C:F0:49:XX:XX:XX
Ahora creamos el script:

Código: Seleccionar todo

nano intruso.sh
y pegamos el codigo:

Código: Seleccionar todo

#!/bin/bash
# Almacenamos la fecha y hora para el log
fecha=`date +"%d/%m/%Y"-"%H:%M":`
# Ejecutamos nmap para que guarde un mapa de la red en un archivo que luego borraremos
nmap -sP 192.168.0.1-255 > /tmp/mapa.tmp
# Leemos el mapa de la red, aislamos las MAC y buscamos las que no estén en el listado de permitidas
for intruso in $(cat /tmp/mapa.tmp | grep "MAC" | awk '{ print $3 }' | grep -v -f /home/pi/macs);
do
# Si entra en el bucle FOR es porque ha encontrado una MAC que no está en el listado de MACS
# Buscamos la IP dentro del mapa realizado por nmap
 ip_intruso=$(cat /tmp/mapa.tmp | grep -B 2 "$intruso" | grep "for" | awk '{ print $5 }')
# Guardamos la hora, ip y mac en un registro
 echo "$fecha equipo no registrado: $intruso - IP: $ip_intruso" >> /var/log/intrusos.log
# Si tenemos configurado SMTP tambien podemos enviar un mail con el mapa y los datos del intruso
 cat /tmp/mapa.tmp | mail -s "$fecha equipo no registrado: $intruso - IP: $ip_intruso" destinatario@correo
done
# Borramos el fichero temporal del mapa
rm /tmp/mapa.tmp
exit
Salimos de nano con CTRL+X y guardamos los cambios con S. Después le damos permiso de ejecución al script:

Código: Seleccionar todo

chmod 755 intruso.sh
El funcionamiento es simple, creamos un mapa de la red y después con un bucle FOR cogemos las MACs que no están en la lista de permitidos, sacamos la ip y registramos al intruso en un fichero en la carpeta /var/log. Además si tenemos configurado el correo, mandamos un aviso con el mapa de la red, además de la ip y MAC del intruso, teneis que cambiar destinatario@correo por el correo de destino. Si no teneis el correo configurado teneis que poner una almohadilla # delante de la orden cat para comentarla y que no la ejecute.

Antes de ejecutar el script tenemos que crear el archivo /var/log/intrusos.log con

Código: Seleccionar todo

sudo touch /var/log/intrusos.log
y cambiarle los permisos para poder verlo sin necesidad de ser root:

Código: Seleccionar todo

sudo chmod 666 /var/log/intrusos.log
Para hacer la prueba, editad el fichero macs y borrar alguna línea, ejecutad el script y os avisará de que hay un equipo no permitido conectado a la red local.

Recordad que el script se debe ejecutar como root:

Código: Seleccionar todo

sudo sh intruso.sh
Yo lo tengo en el cron del usuario root para que busque cada hora posibles "amigos del wifi ajeno". (Se ejecuta cada hora en el minuto 15).

Código: Seleccionar todo

sudo crontab -e

Código: Seleccionar todo

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

15 * * * * /home/pi/intruso.sh >/dev/null 2>&1
Un ejemplo del archivo intrusos.log:

Código: Seleccionar todo

cat /var/log/intrusos.log
08/09/2017-18:24: equipo no registrado: 58:23:8C:XX:XX:XX - IP: 192.168.0.1
08/09/2017-21:55: equipo no registrado: 58:23:8C:XX:XX:XX - IP: 192.168.0.1
08/09/2017-21:55: equipo no registrado: 40:F3:08:XX:XX:XX - IP: 192.168.0.28
Sois libres de modificarlo a vuestro gusto, si necesitais ayuda para adaptarlo a vuestra red os ayudo encantado. Espero que le saqueis provecho, saludos.

ACTUALIZACIÓN

Esta noche la almohada me ha dado un par de ideas.
Aprovechando el potencial de nmap, además de detectar un posible intruso, vamos a realizar un escaner del "visitante" para sacarle toda la información que pueda sernos util.

El nuevo script quedaría de esta manera:

Código: Seleccionar todo

#!/bin/bash
# Almacenamos la fecha y hora para el log
fecha=`date +"%d/%m/%Y"-"%H:%M":`

# Creamos una variable de control para registrar si se ha encontrado un intruso
control=0

# Ejecutamos nmap para que guarde un mapa de la red en un archivo que luego borraremos
nmap -sP 192.168.0.1-255 > /tmp/mapa.tmp

# Leemos el mapa de la red, aislamos las MAC y buscamos las MAC que no estén en el listado de MACS permitidas
for intruso in $(cat /tmp/mapa.tmp | grep "MAC" | awk '{ print $3 }' | grep -v -f /home/pi/macs);
do

# Si entra en el bucle FOR es porque ha encontrado una MAC que no está en el listado de MACS

# Ponemos la variable de control a 1

 control=1

# Buscamos la IP dentro del mapa realizado por nmap

 ip_intruso=$(cat /tmp/mapa.tmp | grep -B 2 "$intruso" | grep "for" | awk '{ print $5 }')

# Creamos la entrada en el registro y procedemos a realizar un analisis del intruso

 echo "---------------------------------------------------------------" >> /var/log/intrusos.log
 echo "$fecha equipo no registrado: $intruso - IP: $ip_intruso" >> /var/log/intrusos.log
 nmap -sS -sV -O $ip_intruso >> /var/log/intrusos.log
 echo "---------------------------------------------------------------" >> /var/log/intrusos.log

done

# Si se ha encontado un intruso, enviamos el fichero de log por mail
if [ $control -eq 1 ];
then

 cat /var/log/intrusos.log | mail -s "$fecha equipo no registrado en la red" destinatario@correo.com

fi

# Borramos el fichero temporal del mapa
rm /tmp/mapa.tmp
exit
El funcionamiento es el mismo pero añadiendo el escaner del intruso, el resultado se guarda en el archivo de log y al final envía el log a nuestro correo para tener información del invitado.

El log quedaría de esta manera:

Código: Seleccionar todo

---------------------------------------------------------------
09/09/2017-12:25: equipo no registrado: 00:00:74:XX:XX:XX - IP: 192.168.0.8

Starting Nmap 6.47 ( http://nmap.org ) at 2017-09-09 12:25 CEST
Nmap scan report for 192.168.0.8
Host is up (0.00035s latency).
Not shown: 991 closed ports
PORT     STATE SERVICE             VERSION
21/tcp   open  ftp                 Ricoh Aficio MP 8000 ftpd 5.57
23/tcp   open  telnet              Ricoh maintenance telnetd
80/tcp   open  http                Web-Server httpd 3.0 (Ricoh Aficio printer web image monitor)
139/tcp  open  tcpwrapped
514/tcp  open  shell               Ricoh rshd
515/tcp  open  printer             lpd (error: Illegal service request)
631/tcp  open  ipp                 Web-Server httpd 3.0 (NRG copier or Ricoh Aficio printer http config)
7443/tcp open  ssl/oracleas-https?
9100/tcp open  jetdirect?
MAC Address: 00:00:74:XX:XX:XX (Ricoh Company)
OS details: NetBSD 1.4.2 - 1.5.2; Lanier LS232c, NRG DSc428, Ricoh Aficio 2020, Ricoh NRG MP 161, or Savin 8055 printer; or Panasonic Network Camera (BB-HCM331, BB-HCM381, BCL-30A, BL-C1CE, or BL-C10CE)
Network Distance: 1 hop
Service Info: Devices: print server, printer

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 103.16 seconds
---------------------------------------------------------------
---------------------------------------------------------------
Starting Nmap 6.47 ( http://nmap.org ) at 2017-09-09 15:20 CEST
Nmap scan report for 192.168.0.2
Host is up (0.00052s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE     VERSION
135/tcp open  msrpc       Microsoft Windows RPC
139/tcp open  netbios-ssn
445/tcp open  netbios-ssn
MAC Address: 6C:F0:49:XX:XX:XX (Giga-byte Technology Co.)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|phone
Running: Microsoft Windows 2008|7|Phone|Vista
OS CPE: cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_7::-:professional cpe:/o:microsoft:windows_8 cpe:/o:microsoft:windows cpe:/o:microsoft:windows_vista::- cpe:/o:microsoft:windows_vista::sp1
OS details: Windows Server 2008 R2, Microsoft Windows 7 Professional or Windows 8, Microsoft Windows Phone 7.5 or 8.0, Microsoft Windows Vista SP0 or SP1, Windows Server 2008 SP1, or Windows 7, Microsoft Windows Vista SP2, Windows 7 SP1, or Windows Server 2008
Network Distance: 1 hop
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 180.11 seconds
---------------------------------------------------------------
Los "intrusos" son una copiadora multifunción y mi ordenador, como veis el antivirus y el firewall bloquearon el escaneo de puertos, pero nos da algo de información como el sistema operativo.

Un saludo.
Última edición por Sadrarin el 09 Sep 2017, 15:31, editado 1 vez en total.
DaNi
Pi Newbie
Pi Newbie
Mensajes: 4
Registrado: 08 Ago 2016, 19:12
Agradecido: 1 vez
Agradecimiento recibido: 0

muy bueno :mrgreen:
Avatar de Usuario
tzinm
Pi Alpha
Pi Alpha
Mensajes: 19
Registrado: 25 Dic 2017, 22:08
Agradecido: 1 vez
Agradecimiento recibido: 0

Me lo guardo!
skonner87
Pi Newbie
Pi Newbie
Mensajes: 4
Registrado: 04 Jul 2017, 01:28
Agradecido: 0
Agradecimiento recibido: 0

Hola buenas tardes,
De primeras felicitarte por tu trabajo, una gran pasada!!!
De segundas tengo una duda, mira yo instale el ssmtp para enviar el email como está en esta web: https://stackoverflow.com/questions/383 ... mtp-server

Pero no me manda el email al correo, y he cambiado el codigo así:
cat /var/log/intrusos.log | ssmtp -s "$fecha equipo no registrado en la red" destinatario@correo.com
martigs
Pi Alpha
Pi Alpha
Mensajes: 14
Registrado: 03 Abr 2018, 12:22
Agradecido: 0
Agradecimiento recibido: 0

Este script se podría usar en una orangepi con dietpi? El sistema no tiene ni nmap ni la función mail instalada.

Entiendo que si se manda un mail con una IP dinámica siempre entrará en spam o no se mandara a según qué servidores de correo o me equivoco?
Sadrarin
Pi Alpha
Pi Alpha
Mensajes: 30
Registrado: 28 Jul 2017, 22:12
Agradecido: 0
Agradecimiento recibido: 0

Este script lo utilizo en un servidor HP con Debian y funciona sin problemas. Necesitas nmap para hacer el escaneo de red y los puertos, el mail no es necesario a no ser que quieras que te informe cuando encuentre algún intruso. Si no tienes el correo configurado, tendrás que revisar manualmente el fichero de log.

Para mandar los correos tienes que configurar una cuenta de correo, yo uso una de gmail, y no me ha dado problemas nunca. El caso es ir probando.

Por lo que he leído en el foro, DietPI se basa en Debian, así que debería funcionar siempre y cuando instales nmap.

Espero que te haya servido de ayuda. Un saludo.
martigs
Pi Alpha
Pi Alpha
Mensajes: 14
Registrado: 03 Abr 2018, 12:22
Agradecido: 0
Agradecimiento recibido: 0

Si en cuanto tenga un momento lo probaré haver si tengo suerte y para poder usar también el correo que necesitaría instalar con el dietpi no tengo entorno gráfico solo ssh ya que estaría muy bien poder recibirlo al correo así seria todo automatizado es una especie de fingbox y me encanta la idea y no tener que gastar un dineral para tener otro aparato en Red jeje
Responder