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
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
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
Código: Seleccionar todo
nano intruso.sh
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
Código: Seleccionar todo
chmod 755 intruso.sh
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
Código: Seleccionar todo
sudo chmod 666 /var/log/intrusos.log
Recordad que el script se debe ejecutar como root:
Código: Seleccionar todo
sudo sh intruso.sh
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
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
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 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
---------------------------------------------------------------
Un saludo.