Ir atrás

Monitorización de la red local: IDS Snort en Raspberry-Pi

luishcr • 22 July, 2023

Portada del artículo
"TnVuY2EgcGFyZXMgZGUgYXByZW5kZXI="

Descripción.

La Raspberry-Pi es como un mini ordenador preparado para utilizarse en diversos campos como la domótica, róbotica, IoT, desarrollo de software y con la que podemos crear proyectos interesantes como por ejemplo los presentes en la página oficial de Raspberry Pi .

En esta ocasión, configuraremos este dispositivo para que funcione como un IDS (Intrusion Detection System) y nos alerte de posibles ataques o tráfico malicioso en nuestra red local con Snort.

 

Instalación de Ubuntu Server, conexión remota y actualización del firmware.

Resumen del procedimiento:

Raspbery Pi Imager

 

Raspbery Pi Imager select OS

 

  • Seleccionamos la tarjeta MicroSD conectada al lector de tarjetas del PC, le damos a "WRITE" y cuando termine la instalación, la insertamos en la ranura de la Raspi.

Raspbery Pi Imager storage

 

  • Encendemos y conectamos la Raspberry-Pi al router, modem o punto de acceso, mediante cable ethernet y averiguamos su dirección IP local asignada por DHCP desde la consola PowerShell o WSL, con el siguiente comando:
# PowerShell
arp -a | findstr "b8-27-eb dc-a6-32 e4-5f-01" 

# WSL
arp -na | grep -i  "b8:27:eb\|dc:a6:32\|e4:5f:01" 

 

  • Conexión remota por protocolo SSH con la dirección IP obtenida. La primera vez, nos pedirá la contraseña por defecto "ubuntu" y nos forzará a cambiarla:
ssh ubuntu@192.168.1.x

 

  • Si queremos cambiamos nombre del host ubuntu por raspi, por ejemplo:
sudo su
echo "raspi" > /etc/hostname
reboot

 

  • Creamos llave ssh para conexión remota sin contraseña. Abrimos otra consola PowerShell o WSL y escribimos:
ssh-keygen -t rsa -b 4096

 

  • Copiamos el contenido de la llave pública generada en "~/.ssh/id_rsa.pub", podemos cambiarle el nombre a uno más amigable, como por ejemplo: ssh_key_raspi_server.pub.
cd ~/.ssh
cat ./ssh_key_raspi_server.pub
[ctrl + c]

 

  • Pegamos el contenido de la llave ssh pública generada de la máquina windows o linux en la raspberry-pi (consola previamente conectada por ssh).
cd ~/.ssh/
nano ./authorized_keys
[ctrl + v]

 

  • Método alternativo, comando "scp" para copiar y pegar archivos entre máquina y servidor por ssh.
# Powershell
cat $env:USERPROFILE\.ssh\ssh_key_raspi_server.pub | ssh ubuntu@192.168.1.x "mkdir -p ~/.ssh/ && cat >> ~/.ssh/authorized_keys"```
```bash
# WSL
scp -r ~/.ssh/ssh_key_raspi_server.pub ubuntu@192.168.1.x:/home/ubuntu/.ssh/authorized_keys

 

  • Actualización de paquetes, como buena práctica:
sudo apt update
sudo apt upgrade

 

  • Raspberry Pi 4 Boot EEPROM, actualización manual opcional para modelos Pi 4, 400, Compute Module 4, que mejoran el rendimiento y arreglan bugs. Información detallada en la documentación y repositorio de github .
sudo rpi-eeprom-update -a
sudo reboot

¿Qué es Snort?.

  • Snort es un sistema de detección y prevención de intrusiones de código abierto (IDS/IPS) ampliamente utilizado en el ámbito de la seguridad informática. Fue desarrollado por Martin Roesch en 1998 y es mantenido por la empresa Cisco Talos. Snort es conocido por su eficacia en la detección de actividades maliciosas en redes, como intentos de intrusión, malware, ataques de denegación de servicio (DoS), escaneos de puertos y otros comportamientos sospechosos.

  • La principal función de Snort es analizar el tráfico de red en busca de patrones que coincidan con firmas predefinidas de ataques o comportamientos maliciosos. Esto se logra mediante el uso de reglas que describen las características de los ataques y cómo se pueden detectar en el tráfico de red. Cuando el tráfico coincide con una de estas reglas, Snort genera alertas para notificar a los administradores sobre la actividad sospechosa. Las alertas pueden variar en gravedad según la configuración de las reglas y el tipo de actividad detectada.

  • Además de su función de IDS (sistema de detección de intrusiones), Snort también puede funcionar como un IPS (sistema de prevención de intrusiones). En el modo IPS, no solo detecta los ataques, sino que también toma medidas activas para bloquear o mitigar la actividad maliciosa. Esto se logra manipulando las reglas y configuraciones para que Snort tome acciones como bloquear conexiones, agregar reglas de firewall o notificar a otros sistemas de seguridad.

  • Snort se utiliza en una variedad de escenarios para mejorar la seguridad de las redes y sistemas informáticos, incluyendo:

    1. Monitorización de tráfico en redes corporativas para detectar actividades maliciosas o no autorizadas.
    2. Protección de servidores y sistemas críticos contra ataques externos e internos.
    3. Investigación y análisis forense en caso de incidentes de seguridad.
    4. Análisis de tráfico de red para identificar patrones de ataque y tendencias.
    5. Integración con otros sistemas de seguridad, como firewalls y sistemas de gestión de seguridad de la información (SIEM).

 

Instalación de Snort.

  • Actualizamos la lista de paquetes e instalamos las dependencias necesarias:
sudo apt update
sudo apt install -y build-essential libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev ethtool

 

  • Descargamos una versión de Snort desde el sitio oficial:
wget https://www.snort.org/downloads/snort/snort-2.9.20.tar.gz

 

  • Diferencias principales entre las versiones de snort:
    1. Arquitectura y Rendimiento:

      • Snort 2.9: Utiliza una arquitectura basada en un solo hilo, lo que limita su capacidad para aprovechar múltiples núcleos de CPU en sistemas modernos. Esto puede afectar el rendimiento en entornos de alto tráfico.
      • Snort 3.0: Introduce una arquitectura multihilo, lo que le permite aprovechar eficientemente múltiples núcleos de CPU. Esto mejora significativamente su capacidad para manejar altos volúmenes de tráfico y aumenta su rendimiento general.
    2. Reglas y Capacidad de Detección:

      • Snort 2.9: Utiliza reglas basadas en patrones (firmas) para detectar actividades maliciosas en el tráfico de red. Aunque efectivas, las reglas de patrones pueden resultar menos eficientes para detectar ataques sofisticados o variantes de malware.
      • Snort 3.0: Introduce la detección basada en protocolos y flujos. Además de las reglas de patrones, Snort 3.0 puede analizar el comportamiento de los protocolos y las secuencias de acciones en un flujo de tráfico para detectar amenazas. Esto puede mejorar la capacidad de detección de ataques más evasivos y avanzados.
    3. Flexibilidad y Configuración:

      • Snort 2.9: Tiene una configuración monolítica que puede volverse compleja en implementaciones grandes. La configuración y el ajuste fino pueden requerir modificaciones directas en archivos de configuración y reglas.
      • Snort 3.0: Ofrece una configuración modularizada y más flexible. Esto facilita la configuración específica de módulos individuales y proporciona una mejor estructura para una administración más sencilla.
    4. Soporte de Protocolos:

      • Snort 2.9: Aunque es capaz de detectar una amplia gama de protocolos y ataques, en algunos casos, la detección de protocolos más modernos puede ser limitada.
      • Snort 3.0: Mejora el soporte de protocolos y la capacidad de análisis, lo que lo hace más adecuado para entornos donde los protocolos están en constante evolución.
    5. Desarrollo y Mantenimiento:

      • Snort 2.9: Aunque sigue siendo ampliamente utilizado y mantenido, su desarrollo ha sido más lento en términos de nuevas características y mejoras significativas.
      • Snort 3.0: Representa un paso adelante en términos de desarrollo activo y adopción de tecnologías modernas de seguridad.

 

  • Descomprimimos el archivo descargado:
tar -xvzf snort-2.9.20.tar.gz

 

  • Ingresa al directorio de Snort y configuramos compilación:
cd snort-2.9.20
./configure --enable-sourcefire

 

  • Si nos sale ERROR! daq_static library not found la descargamos:
wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz

 

  • Descomprimimos:
tar -xvzf daq-2.0.7.tar.gz

 

  • Accedemos y compilamos:
cd daq-2.0.7
./configure
make
sudo make install

 

  • Nos dirá: "Libraries have been installed in /usr/local/lib, /usr/local/lib/daq".

 

wget http://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz
tar -xvzf LuaJIT-2.1.0-beta3.tar.gz
cd LuaJIT-2.1.0-beta3
make
sudo make install

 

  • A continuación volvemos a ejecutar ./configure --enable-sourcefire en la directorio de Snort, si todo va bien compilamos:
make

 

  • Solución a errores tipo no se encuentra rpc/rpc.h y demás ficheros al intentar compilar:
sudo apt install libntirpc-dev
sudo cp /usr/include/ntirpc/rpc/* /usr/include/rpc/
sudo cp /usr/include/ntirpc/misc/* /usr/include/misc/
sudo cp /usr/include/ntirpc/netconfig.h /usr/include/
sudo cp /usr/include/ntirpc/intrinsic.h /usr/include/
sudo cp /usr/include/ntirpc/reentrant.h /usr/include/

 

  • Instalamos:
sudo make install

 

  • Creamos directorio de snort:
sudo mkdir -p /etc/snort/rules /var/log/snort
sudo install -D -m644 etc/{*.conf*,*.map} "/etc/snort/"

 

Configuración y prueba de Snort.

  • Para realizar la prueba de snort debemos comentar las siguientes línes del fichero de configuración snort.conf:
vim /etc/snort/snort.conf

 

  • Cambiar/indicar el valor de la variable HOME_NET que le corresponde a nuestra red:
ipvar HOME_NET 192.168.1.0/24

 

  • Comentar la línea que carga las reglas dinámicas, que tiene este aspecto:
# dynamicdetection directory /usr/local/lib/snort_dynamicrule

 

  • Comentar el preprocesador de reputación:
# Reputation preprocessor. For more information see README.reputation
#preprocessor reputation: \
#   memcap 500, \
#   priority whitelist, \
#   nested_ip inner, \
#   whitelist $WHITE_LIST_PATH/white_list.rules, \
#   blacklist $BLACK_LIST_PATH/black_list.rules

 

  • Comentar todas las reglas de la sección 7 "Customize your rule set". Un truco con vim es entrar en modo VISUAL LINE "ALT + SHIFT + v" seleccionar las lineas a comentar y ejecutar el comando de sustitución ":s/^/#/".

 

  • La prueba de snort es muy similar a la de tcpdump. Teniendo una interfaz por la que atraviese tráfico, hacemos que snort nos muestre los paquetes que la atraviesan con el comando:
sudo snort -q -v -A console -c /etc/snort/snort.conf -i eth0 
- sudo: Este comando se ejecuta con privilegios de superusuario. Requiere que el usuario tenga permisos administrativos para ejecutar Snort y realizar operaciones que involucren la captura y análisis de tráfico de red.
- snort: Es el propio ejecutable de Snort que se llama para iniciar el sistema de detección de intrusiones.
-q: Esta opción indica a Snort que funcione en modo silencioso, lo que significa que no se mostrarán mensajes innecesarios ni información adicional en la salida. Esto puede ser útil cuando se ejecuta Snort en segundo plano o cuando solo se desean ver alertas sin otros detalles.
-v: Habilita el modo de "verbose" (detallado) y muestra información más detallada sobre el proceso de detección y captura de tráfico.
-A console: Indica a Snort que envíe las alertas detectadas a la consola en lugar de escribirlas en un archivo de registro. Esto es útil para ver las alertas en tiempo real mientras se ejecuta Snort en la terminal.
-c /etc/snort/snort.conf: Indica la ubicación del archivo de configuración de Snort que se utilizará. En este caso, el archivo de configuración se encuentra en "/etc/snort/snort.conf".
-i eth0: Especifica la interfaz de red que Snort debe monitorear. En este caso, "enp0s3" es el nombre de la interfaz de red que Snort estará observando. Debes reemplazar "eth0" con el nombre de la interfaz de red de tu sistema.

 

  • Creación de una alerta:
alert udp any any -> any any (msg:"Paquete udp";sid: 1000000;)
De izquierda a derecha, la regla se compone de:
- Identificador de la regla, 'alert'
- Protocolo sobre el que detecta la regla (UDP)
- Dirección IP origen (`any` significa cualquier dirección)
- Puerto origen (`any` significa cualquier puerto)
- Sentido del paquete
- Dirección IP destino
- Puerto destino
- Opciones de la regla: Mensaje a mostrar e ID de la regla/firma (signature ID)

 

Si añadimos esa línea al final de nuestro fichero snort.conf, y hacemos pasar un paquete UDP por la interfaz que estamos monitorizando (por ejemplo, una petición DNS), debemos ver que Snort muestra una salida similar a la siguiente:

sudo snort -A console -c /etc/snort/snort.conf -i eth0
Commencing packet processing (pid=4503)
07/21-10:43:19.777996  [**] [1:1000000:0] Paquete udp [**] [Priority: 0] {UDP} 192.168.0.155:46302 -> 192.168.0.1:53
07/21-10:43:19.778012  [**] [1:1000000:0] Paquete udp [**] [Priority: 0] {UDP} 192.168.0.155:46302 -> 192.168.0.1:53
07/21-10:43:19.781162  [**] [1:1000000:0] Paquete udp [**] [Priority: 0] {UDP} 192.168.0.1:53 -> 192.168.0.155:46302
07/21-10:43:19.781178  [**] [1:1000000:0] Paquete udp [**] [Priority: 0] {UDP} 192.168.0.1:53 -> 192.168.0.155:46302

 

Utilización de reglas creadas por la comunidad y otros proveedores.

  • Descargamos las reglas de Emerging Threats para Snort 2.9.
wget https://rules.emergingthreats.net/open/snort-2.9.0/emerging.rules.tar.gz
tar -xvf emerging.rules.tar.gz
mv ./rules/* /etc/snort/rules

 

  • Realizamos un test incluyendo por ejemplo las reglas que alertan sobre paquetes ICMP en el fichero de configuración snort.conf.
include $RULE_PATH/emerging-icmp_info.rules

 

  • Probramos que el fichero de configuración de snort carga correctamente las reglas.
snort -T -c /etc/snort/snort.conf -i eth0
...

+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
14 Snort rules read
    14 detection rules
    0 decoder rules
    0 preprocessor rules
14 Option Chains linked into 1 Chain Headers
+++++++++++++++++++++++++++++++++++++++++++++++++++

...

Snort successfully validated the configuration!
Snort exiting

 

  • Iniciamos snort en modo IDS.
sudo snort -c /etc/snort/snort.conf -i eth0

 

  • Probramos hacer ping desde otra máquina y vemos que se crean una alerta y un log en /var/log/snort/.
cat /etc/var/snort/alert
[**] [1:2100366:8] GPL ICMP_INFO PING *NIX [**]
[Classification: Misc activity] [Priority: 3]
07/22-15:37:12.634646 192.168.1.45 -> 192.168.1.12
ICMP TTL:64 TOS:0x0 ID:58706 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:1   Seq:1  ECHO

[**] [1:2100366:8] GPL ICMP_INFO PING *NIX [**]
[Classification: Misc activity] [Priority: 3]
07/22-15:37:13.635971 192.168.1.45 -> 192.168.1.12
ICMP TTL:64 TOS:0x0 ID:58785 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:1   Seq:2  ECHO

 

sudo tcpdump -r snort.log.1692718613 -X
reading from file snort.log.1692718613, link-type EN10MB (Ethernet), snapshot length 1514
15:37:12.634646 IP uPLC.home > raspi.home: ICMP echo request, id 1, seq 1, length 64
        0x0000:  4500 0054 e552 4000 4001 d1cc c0a8 012d  E..T.R@.@......-
        0x0010:  c0a8 010c 0800 f266 0001 0001 28d6 e464  .......f....(..d
        0x0020:  0000 0000 3089 0900 0000 0000 1011 1213  ....0...........
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
        0x0050:  3435 3637                                4567
15:37:13.635971 IP uPLC.home > raspi.home: ICMP echo request, id 1, seq 2, length 64
        0x0000:  4500 0054 e5a1 4000 4001 d17d c0a8 012d  E..T..@.@..}...-
        0x0010:  c0a8 010c 0800 435f 0001 0002 29d6 e464  ......C_....)..d
        0x0020:  0000 0000 de8f 0900 0000 0000 1011 1213  ................
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
        0x0050:  3435 3637                                4567

 

  • Para incluir todas las reglas descargadas debemos copiar y pegar su ruta de la siguiente manera:
cd /etc/snort/rules
ls -L *.rules | sed 's|^|include $RULE_PATH/|'
#Pegamos el contenido debajo del apartado 7 del fihcero /etc/snort/snort.conf
include $RULE_PATH/3coresec.rules
include $RULE_PATH/emerging-activex.rules
include $RULE_PATH/emerging-attack_response.rules
include $RULE_PATH/emerging-botcc.portgrouped.rules
include $RULE_PATH/emerging-botcc.rules
include $RULE_PATH/emerging-chat.rules
include $RULE_PATH/emerging-ciarmy.rules
include $RULE_PATH/emerging-compromised.rules
include $RULE_PATH/emerging-current_events.rules
include $RULE_PATH/emerging-deleted.rules
include $RULE_PATH/emerging-dns.rules
include $RULE_PATH/emerging-dos.rules
include $RULE_PATH/emerging-drop.rules
include $RULE_PATH/emerging-dshield.rules
include $RULE_PATH/emerging-exploit.rules
include $RULE_PATH/emerging-ftp.rules
include $RULE_PATH/emerging-games.rules
include $RULE_PATH/emerging-icmp.rules
include $RULE_PATH/emerging-icmp_info.rules
include $RULE_PATH/emerging-imap.rules
include $RULE_PATH/emerging-inappropriate.rules
include $RULE_PATH/emerging-info.rules
include $RULE_PATH/emerging-malware.rules
include $RULE_PATH/emerging-misc.rules
include $RULE_PATH/emerging-mobile_malware.rules
include $RULE_PATH/emerging-netbios.rules
include $RULE_PATH/emerging-p2p.rules
include $RULE_PATH/emerging-policy.rules
include $RULE_PATH/emerging-pop3.rules
include $RULE_PATH/emerging-rpc.rules
include $RULE_PATH/emerging-scada.rules
include $RULE_PATH/emerging-scan.rules
include $RULE_PATH/emerging-shellcode.rules
include $RULE_PATH/emerging-smtp.rules
include $RULE_PATH/emerging-snmp.rules
include $RULE_PATH/emerging-sql.rules
include $RULE_PATH/emerging-telnet.rules
include $RULE_PATH/emerging-tftp.rules
include $RULE_PATH/emerging-tor.rules
include $RULE_PATH/emerging-trojan.rules
include $RULE_PATH/emerging-user_agents.rules
include $RULE_PATH/emerging-voip.rules
include $RULE_PATH/emerging-web_client.rules
include $RULE_PATH/emerging-web_server.rules
include $RULE_PATH/emerging-web_specific_apps.rules
include $RULE_PATH/emerging-worm.rules
include $RULE_PATH/threatview_CS_c2.rules

 

  • Testeamos nuevamente Snort con las nuevas reglas. Si nos sale algún error, podemos comentar la línea de la regla en cuestión o modificarla según lo que nos pida, por ejemplo:
"un error en la línea 105 del archivo 'emerging-dns.rules'. Indica que el uso de la palabra clave '!any' no está permitido y sugiere usar '![$SMTP_SERVERS,$DNS_SERVERS]' en su lugar"
snort -T -c /etc/snort/snort.conf -i eth0
...

+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
WARNING: /etc/snort/rules/3coresec.rules(39) threshold (in rule) is deprecated; use detection_filter instead.

34674 Snort rules read
    34674 detection rules
    0 decoder rules
    0 preprocessor rules
34674 Option Chains linked into 2001 Chain Headers
+++++++++++++++++++++++++++++++++++++++++++++++++++

...

Snort successfully validated the configuration!

 

Referencias.

Ir atrás
Ir arriba