Detectando intrusos en tu red

…con Home Assistant.

ladron de wifi

 

Hoy os voy a enseñar la forma de detectar intrusos en vuestra red.

 

Para ello, nos vamos a ayudar de un shellscript que ya usábamos antes en nuestra raspberry, y que ahora adaptaremos para usar con HA.

El 90% del trabajo sigue siendo nuestro script original, de modo, que solo os enseñare a integrarlo.

 

SPOILER : <SPAGUETTI CODE INSIDE> Los programadores puristas deben mantenerse alejados por el bien de su salud mental

Vamos con el script en cuestión :

#!/bin/bash
ARP=/usr/sbin/arp
FECHA=`date +'%F_%H-%M'`
NOMBRE=Intruso-$FECHA.txt
cd /home/homeassistant/.homeassistant/ShellScripts/

# Comprueba equipos que responden a ping y actualiza ARP
nmap -sP 192.168.0.1/24 -oG Host_IP_LOG.txt
# Cambia formato
cat Host_IP_LOG.txt | grep Host | cut -c 7-20 | tr -d "\()" > Host_IP1_LOG.txt

# Comprueba tablas ARP
$ARP
$ARP -a | cut -d" " -f1-4 | awk '{print $2 $4}' | tr "()" " " | awk '{print $1,$2 " "}' | tr " " "," | cut -d"," -f1-2 > Host_ARP_LOG.txt
# Eliminamos de las tablas ARP los que no responden a ping (no existen)
sed -i '/incomplete/d' Host_ARP_LOG.txt
# Eliminamos la IP de VPN
sed -i '/192.168.0.45/d' Host_ARP_LOG.txt
#creado por www.FresyMetal.com
# Adaptado y Modificado 20180131

# Cambia el modificador por la coma ,
OIFS=$IFS
IFS=,
cat Host_ARP_LOG.txt |
while read ip mac
do
echo "$p $ip $m $mac"
touch Host_OK_LOG.txt
# Listado de MAC validas
case $mac in
'78:23:8c:54:fd:09') echo "ROUTER-1";;
'00:b5:86:a4:45:0f') echo "ROUTER-2";;
'c4:66:b3:b3:a0:e3') echo "ROUTER-3";;
'00:00:00:00:00:00') echo "----------VIRTUAL MACHINES----------";;
'0b:0c:29:d5:62:a9') echo "NAS";;
'00:00:00:00:00:01') echo "----------DHCP R3 IoT----------";;
'b2:27:ea:44:90:e1') echo "HomeAssistant-RPI3";;
'ac:63:be:33:ad:1a') echo "DashButton1-DHCP-80";;
'ac:63:be:95:9a:ee') echo "DashButton2-DHCP-81";;
'00:00:00:00:00:02') echo "----------INVITADOS R1----------";;
'78:f8:82:af:29:18') echo "Movil_invitado-DHCP";;
'00:00:00:00:00:03') echo "----------OBSOLETAS-----------";;
'0c:bd:51:a3:a3:fc') echo "ALCATEL-MOVIL-DHCP";;
*)echo $ip $mac >> Host_OK_LOG.txt;;
esac
done
IFS=$OIFS

# Comprobamos que el archivo HOST_este vacio
if [ -s Host_OK_LOG.txt ]
  then
    MSG="Hay intrusos en la red, revisa los LOGS"
    cp "Host_OK_LOG.txt" "$NOMBRE"
    echo "Intrusos"
  else
    echo "OK"
fi
rm Host_OK_LOG.txt

# Funcion de envio
# Envio por consola
# echo $MSG
# Envio por Mali
# echo $MSG | mail TUMAIL@gmail.com
# Envio por Telegram
# cd /home/pi/SCRIPTS/MSG/
# ./telegramMSJ USERTELEGRAM "$MSG" #Para los curiosos esto era un script con expect que facilitaba el envio
# Como siempre acaba, no lo podemos comprobar con exit 0 o exit 1, hay que hacerlo por una cadena de cadena de texto
exit

Mostrar Código

 

Se explica bastante bien solo, además está comentado 😉 , pero básicamente comprueba que las entradas ARP sean las mismas que hay en la lista.

La ejecución del NMAP previa, es para asegurarse que todas las entradas ARP son recientes.

Luego se aplica un poco de magia linuxera para quedarnos solo con la info que nos interesa, y comprueba que las MAC’s que habitan nuestra red están todas en el listado que hemos definido, en caso contrario, las almacena en el archivo Host_OK_LOG.txt que no estará vacío.

Para ello nos valemos de unos archivos temporales, uno lo borraremos al finalizar el script y los otros los dejamos por simple pereza, porque se re-escriben cada vez…así que tampoco nos molestan mucho.

Este script, que como podéis ver en los comentarios no es mio, se encargaba de ejecutarse cada 10 minutos, luego añadí las lineas finales (ahora comentadas), en caso de encontrar algún intruso dejaba un LOG en un archivo (uno por cada detección), enviaba un mail, y/o te avisaba por telegram (haciendo uso de tg-cli)

Para ejecutarse cada 10 minutos, añadimos una entrada al cron con :

crontab -e

La línea en cuestión es

*/10 * * * * sh /home/pi/SCRIPTS/Equipos_Nmap.sh >/dev/null 2>&1

 

Y eso era todo, ahora vamos con las modificaciones que hemos realizado en HA, para implementarlo :

Por un lado, hemos movido el script a una de las carpetas de HA…por mera comodidad y por tenerlo todo localizado en el mismo sitio…es de lógica que esté en /home/homeassistant/.homeassistant/Shellscript/…y no en /home/pi/SCRIPTS/… (por ejemplo)

Ahora tenemos que ver, con la ejecución del script…si este arroja resultados positivos o negativos.

No quiero entrar mucho en como hacemos esto, porque esto será objeto de un artículo posterior, pero básicamente, tuve que modificar el script, para que al final nos dé el resultado de “OK” o de “Intrusos” (esas son las palabras clave que yo he elegido, cambiando el script y los .yaml, tú puede elegir otras)

Para monitorizar que resultados nos da el shellscript, creamos un sensor binario.

Nos aseguramos que en configuration.yaml incluya

binary_sensor: !include_dir_merge_list binary_sensors

Y en la carpeta binary_sensors dejamos el archivo equipos_nmap_cmd.yaml

### Sensor Intrusos Red
## Ejecuta el script para detectar intrusos comprobando la ultima linea, en funcion de el mensaje determina si hay intrusos o no
## https://home-assistant.io/components/binary_sensor.command_line/
# Estado script Intrusos en la red
- platform: command_line
  command: sudo /home/homeassistant/.homeassistant/ShellScripts/Equipos_Nmap.sh | tail -1
  name: 'equipos_nmap'
  device_class: safety # Determina el icono a usar
  payload_on: "Intrusos"
  payload_off: "OK"
# scan_interval : 120

Con esto nos aparecerá una pequeña bola, en nuestro HOME, que nos muestra un escudo y un tick si todo va bien.

Bolas y mensajes

¿Como lo hace?…fácil, el sensor ejecuta el script y se queda solo con la ultima línea (por eso el “| tail -1“), y en ese momento evalúa si es “OK” o es “Intrusos” como hemos indicado en el script, en función de eso cambia el estado del sensor de off a on.

Lo que antes hacíamos mediante el cron, ahora lo controlamos desde HA, se hace mediante scan_interval, que si lo omitimos, como yo, se queda en 60 segundos por defecto, de forma que ya no es necesaria la entrada en el cron.

Con esto ya tenemos un bonito indicador visual de si alguien ha entrado en nuestra red o no…pero claro, eso solo sirve mientras estamos mirando la pantalla de HA…

…todo buen home-asisstaner debe mirar la pantalla HOME al menos 12 horas al día, además se debe mantener el header en azul corporativo… del libro sagrado de la automatizaciones, capitulo 81, versículo 23

Pero si por lo que sea, no estamos delante de nuestra pantalla, mejor nos enviamos un mensaje el movil….

Para ello, nos aseguramos que el configuration.yaml incluya:

automation: !include_dir_merge_list automation

Y dejamos dentro de la carpeta automation el archivo intrusos_msj.yaml (o como tu quieras llamarlo) :

### Mensaje Intrusos
## Automation - Manda un telegram y crea una alerta en la pantalla de HA si el script de chequeo de intrusos cambia de estado.
# Aviso alerta intrusos en la red
- alias: Mensaje Intrusos en la red
  hide_entity: False
  trigger:
    platform: state
    entity_id: binary_sensor.equipos_nmap
    from: 'off'
    to: 'on'
  action:
    - service: notify.TUTELEGRAM
      data:
        message: "Hay intrusos en tu red"
    - service: persistent_notification.create
      data:
        message: "Se han detectado intrusos en la red, revisa los LOGs"
        title: "Alerta de intrusión"

Si antes nos dedicábamos a monitorizar el resultado que arrojaba el shellscript, ahora hacemos lo propio, pero con el sensor que hemos creado antes sensor.equipos_nmap (y con los ya clásicos on y off) vigilamos si cambia de estado.

En esta automatización, se generan 2 avisos, el de telegram que te aparecerá en el móvil, y además una caja de texto que aparecerá la primera en la web de HA, independientemente de cual sea el tab que estés visitando.

Mensaje alerta

Para finalizar

Este método de detección, al ser por MAC es inmune a los cambios de IP que manualmente o mediante DHCP se puedan realizar.

Como supondréis, esto supone que el archivo de script hay que mantenerlo actualizado cada vez que vayáis añadiendo aparatos nuevos a vuestra red…

El tema de los mensajes puede llegar a ser un poco pesado si le dais la contraseña del wifi a la suegra o al amigo que está un rato en vuestra casa…para ello, si no queréis actualizar el archivo, podéis deshabilitar momentáneamente los mensajes al móvil, porque con el automation se habrá generado un switch para poder apagarlos.

 

switch de automation

 

DISCLAIMER…

Este método de detección no es 100% seguro, se podría suplantar una MAC fácilmente o realizar un ataque de ARP spoofing y el script la tomaría como buena, así que en ningún caso sustituye a un buen IDS, pero dado que estamos en entornos caseros, puede ser una buena medida..sobre todo si tienes desactivado el filtrado por MAC en el wifi de tu router.

 

Os dejo archivo con el contenido del artículo Deteccion_intrusos

 

Recuerda, que el único ordenador seguro, es aquel que está desconectado de la red, apagado, enterrado en hormigón a unos cuantos metros de profundidad y custodiado por guardias armados y aún así…si quieren entrar, encontrarán la forma.

Como siempre si tienes cualquier duda, deja tu comentario o pregúntanos en el grupo de @Domology de  telegram

Solrack

 

También te podría gustar...

2 Respuestas

  1. RENE dice:

    En primer lugar agradecer la labor que hacéis dando la oportunidad de aprender a novatos como yo en este bonito campo de la domótica. Os llevo leyendo unos cuantos días e implementando en HA las rutinas, configuraciones, etc., que vais publicando, en este caso “Detectando intrusos en la red” al implementar con vuestro código y tutoríal no me funcionaba, por lo que revisando el código he visto que hay algunos errores mecanográficos que pueden ser la causa de los errores. Así por ejemplo, publicais “equipos_namp_cmd.yaml” cuando debería ser “equipos_nmap_cmd.yaml”, la carpeta “automation” creo que debería ser “automations”. Un saludo.

    • Gubenote dice:

      Muchas gracias por tu comentario.
      Tienes razón en lo del nombre del archivo equipos_nmap_cmd.yaml.
      En cuanto al nombre de la carpeta automations es indiferente como la llames, lo importante es que el nombre de la carpeta sea el mismo que el que declaras en el archivo configuration.yaml con automation: !include_dir_merge_list automation.

      Saludos!

Deja un comentario