Implementar SOC: Instalación Suricata bajo Proxmox
En otras entradas hablamos de lo que es un SOC y lanzamos el reto de crear mediante diferentes herramientas de código abierto, un SOC OpenSource.
En esta entrada vamos a montar un componente de ese SOC, en este caso he elegido para montar un IDS (Sistema de detección de intrusiones) el proyecto de Suricata. Tenía dos opciones clara, utilizar Snort, que conozco hace años, o utilizar Suricata. No veo grandes diferencias entre el uno y el otro a día de hoy, y la verdad que me gusta la comunidad y los artículos que se genera alrededor de Suricata.
Os dejo alguna diferencia si estáis dudando entre uno u otro:
- Snort utiliza menos recursos, así que si tenéis limitación de RAM/CPU es una buena opción. Pero en cambio, Suricata parece que usa los recursos de una forma más eficiente, por si tenéis grandes volúmenes de tráfico
- Snort desde su versión 3.0 ya gestiona multiprocesos (multithreading), cosa que Suricata dispone de esa arquitectura. Por lo que, si utilizáis la versión integrada de alguno de ellos en vuestro firewall Pfsense u OPNSense, tenéis que tenerlo en cuenta, porque marca la diferencia en la gestión de mucho tráfico
- Suricata puede ser más escalable que Snort, gracias al uso que hace de los recursos
- Ambos se pueden implementar en varios sistemas operativos con relativa facilidad
- Suricata publica actualizaciones importantes cada unos 3 meses, y Snort actualizaciones menores cada 2-3 semanas
- Snort es mantenido por Cisco principalmente, y Suricata su principal desarrollador es la OISF (Open Information Security Foundation)
- Ambas herramientas son mantenidas por la comunidad, en cambio Snort es posible contratar personal para su soporte
¿Qué es un IDS?
Es la primera pieza que voy a montar en el SOC, ya que me permitirá analizar el tráfico de red para buscar datos maliciosos o sospechosos y aplicar reglas preconfiguradas. También nos puede dar datos como máquinas que se conectan a ciertas direcciones IPs, puertos específicos e incluso servidores.
Un IDS tiene dos tareas fundamentales:
- Prevención: escuchando el tráfico de red o un PC, mediante sensores e identificar ataques aplicando reglas, mediante reconocimiento de patrones de ataque.
- Reacción: detecta patrones de intrusión tanto en el comportamiento del sistema como en la red.
Este sistema complementa a por ejemplo un cortafuegos en el que abrimos un puerto 80 o 443 a un servidor web, ya que nos permite detectar de intrusiones en el sistema o vulnerabilidades.
Hay dos tipos de IDS por comportamiento:
- Pasivo: Genera entradas para registrar las intrusiones y manda alertas
- Activo: Hace lo mismo que un Pasivo, y a su vez es capaz de bloquear IPs o cerrar puertos de comunicación, por ejemplo.
A nivel funcional, también hay varios tipos de IDS según de donde recogen el dato:
- HIDS: Sistema de detección de intrusos, que recogen datos de usuarios y servicios de una máquina determinada
- IDPS: Sistema de detección de intrusos en red, que hacen una escucha en modo promiscuo en la red
- SIDS: Sistema de detección de intrusos basados en firmas
- Y los sistemas de detección de intrusos basados en anomalías
Ni que decir tiene, que un IDS es como un Antivirus, en cuanto a que debe estar actualizado al máximo posible, para poder combatir los posibles problemas de intrusión y las últimas vulnerabilidades detectadas por entidades como la CIAC, CERT…
Os dejo la documentación oficial:
La verdad que sólo os dejo unas pinceladas, porque como he dicho varias veces, no es mi campo la ciberseguridad…
Para montar Suricata, usaré mi laboratorio Proxmox, bajo un contenedor LXC de Ubuntu en su versión 22.04, aunque es posible que lo integre en el cortafuegos OPNsense más adelante, primero lo crearé de cero de esta forma.
Requerimientos de Suricata
La verdad que buscando una tabla de requerimientos de Suricata en la documentación oficial, no he encontrado unos datos concretos. El mínimo son 2 CPU´s.
Esto se debe a que depende del tráfico de red que vais a gestionar y lo que va a tener que trabajar Suricata. Si la empresa es grande, tendréis que dedicar muchos cores de CPU y abundante RAM para que Suricata no muera en el camino.
Para lo que voy a usar yo en mi laboratorio, donde voy a aislar la creación del SOC y sus componentes en una red controlada para hacer pruebas, con los siguientes recursos hardware me debería valer:
- Contenedor Ubuntu 22.04 LXC
- 2 vCPU
- 4 GB de RAM
- 32 GB de espacio en disco SSD
- Red dedicada del host Proxmox: vmbr1 con IP estática
- DNS será el firewall OPNSense que unirá mi laboratorio con la red de casa e Internet
Instalar Suricata en Ubuntu LXC Proxmox
Generamos el contenedor LXC con las características antes indicadas:
Arrancamos el contenedor y abrimos la sesión:
Agregamos el directorio para poder instalar Suricata:
1 2 |
root@SURICATA:~# apt install software-properties-common root@SURICATA:~# add-apt-repository ppa:oisf/suricata-stable |
Pulsamos ENTER:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
root@SURICATA:~# add-apt-repository ppa:oisf/suricata-stable Repository: 'deb https://ppa.launchpadcontent.net/oisf/suricata-stable/ubuntu/ jammy main' Description: Suricata IDS/IPS/NSM stable packages https://suricata.io/ https://oisf.net/ Suricata IDS/IPS/NSM - Suricata is a high performance Intrusion Detection and Prevention System and Network Security Monitoring engine. Open Source and owned by a community run non-profit foundation, the Open Information Security Foundation (OISF). Suricata is developed by the OISF, its supporting vendors and the community. This Engine supports: - Multi-Threading - provides for extremely fast and flexible operation on multicore systems. - Multi Tenancy - Per vlan/Per interface - Uses Rust for most protocol detection/parsing - TLS/SSL certificate matching/logging - JA3 TLS client fingerprinting - JA3S TLS server fingerprinting - IEEE 802.1ad (QinQ) and IEEE 802.1Q (VLAN) support - VXLAN support - All JSON output/logging capability - IDS runmode - IPS runmode - IDPS runmode - NSM runmode - eBPF/XDP - Automatic Protocol Detection and logging - IPv4/6, TCP, UDP, ICMP, HTTP, SMTP, TLS, SSH, FTP, SMB, DNS, NFS, TFTP, KRB5, DHCP, IKEv2, SNMP, SIP, RDP - SCADA automatic protocol detection - ENIP/DNP3/MODBUS - File Extraction HTTP/SMTP/FTP/NFS/SMB - over 4000 file types recognized and extracted from live traffic. - File MD5/SHA1/SHA256 matching - Gzip Decompression - Fast IP Matching - Datasets matching - Rustlang enabled protocol detection - Lua scripting and many more great features - https://suricata.io/features/all-features/ More info: https://launchpad.net/~oisf/+archive/ubuntu/suricata-stable Adding repository. Press [ENTER] to continue or Ctrl-c to cancel. Adding deb entry to /etc/apt/sources.list.d/oisf-ubuntu-suricata-stable-jammy.list Adding disabled deb-src entry to /etc/apt/sources.list.d/oisf-ubuntu-suricata-stable-jammy.list Adding key to /etc/apt/trusted.gpg.d/oisf-ubuntu-suricata-stable.gpg with fingerprint 9F6FC9DDB1324714B78062CBD7F87B2966EB736F Get:1 https://ppa.launchpadcontent.net/oisf/suricata-stable/ubuntu jammy InRelease [17.5 kB] Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease Get:3 https://ppa.launchpadcontent.net/oisf/suricata-stable/ubuntu jammy/main amd64 Packages [1372 B] Get:4 https://ppa.launchpadcontent.net/oisf/suricata-stable/ubuntu jammy/main Translation-en [1204 B] Hit:5 http://archive.ubuntu.com/ubuntu jammy-updates InRelease Hit:6 http://archive.ubuntu.com/ubuntu jammy-security InRelease Fetched 20.1 kB in 1s (31.2 kB/s) Reading package lists... Done |
Y lanzamos la instalación de Suricata:
1 |
root@SURICATA:~# apt-get install suricata |
Hacemos que el servicio arranque al inicio:
1 2 3 |
root@SURICATA:~# systemctl enable suricata suricata.service is not a native service, redirecting to systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable suricata |
Validamos que el servicio esté arrancado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@SURICATA:~# systemctl status suricata * suricata.service - LSB: Next Generation IDS/IPS Loaded: loaded (/etc/init.d/suricata; generated) Active: active (running) since Mon 2024-02-05 13:34:59 UTC; 4min 52s ago Docs: man:systemd-sysv-generator(8) Tasks: 8 (limit: 76811) Memory: 46.9M CPU: 1.879s CGroup: /system.slice/suricata.service `-2338 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid --af-packet -D -vvv Feb 04 13:34:59 SURICATA systemd[1]: Starting LSB: Next Generation IDS/IPS... Feb 04 13:34:59 SURICATA suricata[2329]: Starting suricata in IDS (af-packet) mode... done. Feb 04 13:34:59 SURICATA systemd[1]: Started LSB: Next Generation IDS/IPS. |
Con esto ya lo tenemos instalado, ahora vamos a parametrizarlo.
Configuración Suricata en Ubuntu 20.04 LXC de Proxmox
El fichero de configuración es el siguiente:
1 |
/etc/suricata/suricata.yaml |
Lo editaremos para modificar la siguiente línea:
1 |
root@SURICATA:~# nano /etc/suricata/suricata.yaml |
El valor “community-id” de “false” a “true” (esto facilitará la integración con ElasticSearch o OpenSearch):
Por otra parte, debemos identificar la tarjeta de red que vamos a monitorizar:
1 2 3 4 5 6 7 8 |
root@SURICATA:~# ip -j -p route show default [ { "dst": "default", "gateway": "10.0.0.1", "dev": "eth0", "protocol": "static", "flags": [ ] } ] |
Revisamos que en el fichero de configuración, donde pone paso 3 sale dicho interfaz:
1 |
root@SURICATA:~# nano /etc/suricata/suricata.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root@SURICATA:~# systemctl restart suricata root@SURICATA:~# systemctl status suricata * suricata.service - LSB: Next Generation IDS/IPS Loaded: loaded (/etc/init.d/suricata; generated) Active: active (running) since Mon 2024-02-05 13:54:23 UTC; 4s ago Docs: man:systemd-sysv-generator(8) Process: 2499 ExecStart=/etc/init.d/suricata start (code=exited, status=0/SUCCESS) Tasks: 8 (limit: 76811) Memory: 41.2M CPU: 79ms CGroup: /system.slice/suricata.service `-2504 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid --af-packet -D -vvv Feb 04 13:54:23 SURICATA systemd[1]: Starting LSB: Next Generation IDS/IPS... Feb 04 13:54:23 SURICATA suricata[2499]: Starting suricata in IDS (af-packet) mode... done. Feb 04 13:54:23 SURICATA systemd[1]: Started LSB: Next Generation IDS/IPS. |
Actualización de reglas en Suricata
Suricata está alimentado de reglas, así que lo primero que hay que hacer es actualizarlas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
root@SURICATA:~# suricata-update list-sources 4/2/2024 -- 13:56:23 - <Info> -- Using data-directory /var/lib/suricata. 4/2/2024 -- 13:56:23 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 4/2/2024 -- 13:56:23 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. 4/2/2024 -- 13:56:23 - <Info> -- Found Suricata version 7.0.2 at /usr/bin/suricata. 4/2/2024 -- 13:56:23 - <Warning> -- Source index does not exist, will use bundled one. 4/2/2024 -- 13:56:23 - <Warning> -- Please run suricata-update update-sources. Name: et/open Vendor: Proofpoint Summary: Emerging Threats Open Ruleset License: MIT Name: et/pro Vendor: Proofpoint Summary: Emerging Threats Pro Ruleset License: Commercial Replaces: et/open Parameters: secret-code Subscription: https://www.proofpoint.com/us/threat-insight/et-pro-ruleset Name: etnetera/aggressive Vendor: Etnetera a.s. Summary: Etnetera aggressive IP blacklist License: MIT Name: malsilo/win-malware Vendor: malsilo Summary: Commodity malware rules License: MIT Name: oisf/trafficid Vendor: OISF Summary: Suricata Traffic ID ruleset License: MIT Name: scwx/enhanced Vendor: Secureworks Summary: Secureworks suricata-enhanced ruleset License: Commercial Parameters: secret-code Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: scwx/malware Vendor: Secureworks Summary: Secureworks suricata-malware ruleset License: Commercial Parameters: secret-code Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: scwx/security Vendor: Secureworks Summary: Secureworks suricata-security ruleset License: Commercial Parameters: secret-code Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: sslbl/ja3-fingerprints Vendor: Abuse.ch Summary: Abuse.ch Suricata JA3 Fingerprint Ruleset License: Non-Commercial Name: sslbl/ssl-fp-blacklist Vendor: Abuse.ch Summary: Abuse.ch SSL Blacklist License: Non-Commercial Name: stamus/lateral Vendor: Stamus Networks Summary: Lateral movement rules License: GPL-3.0-only Name: tgreen/hunting Vendor: tgreen Summary: Threat hunting rules License: GPLv3 |
Como me aparece un warning, vuelvo a actualizar:
1 2 3 4 5 6 7 8 |
root@SURICATA:~# suricata-update update-sources 4/2/2024 -- 13:57:51 - <Info> -- Using data-directory /var/lib/suricata. 4/2/2024 -- 13:57:51 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 4/2/2024 -- 13:57:51 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. 4/2/2024 -- 13:57:51 - <Info> -- Found Suricata version 7.0.2 at /usr/bin/suricata. 4/2/2024 -- 13:57:51 - <Info> -- Downloading https://www.openinfosecfoundation.org/rules/index.yaml 4/2/2024 -- 13:57:52 - <Info> -- Adding all sources 4/2/2024 -- 13:57:52 - <Info> -- Saved /var/lib/suricata/update/cache/index.yaml |
Actualizamos las reglas con el siguiente comando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
root@SURICATA:~# suricata-update 4/2/2024 -- 14:05:03 - <Info> -- Using data-directory /var/lib/suricata. 4/2/2024 -- 14:05:03 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 4/2/2024 -- 14:05:03 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. 4/2/2024 -- 14:05:03 - <Info> -- Found Suricata version 7.0.2 at /usr/bin/suricata. 4/2/2024 -- 14:05:03 - <Info> -- Loading /etc/suricata/suricata.yaml 4/2/2024 -- 14:05:03 - <Info> -- Disabling rules for protocol pgsql 4/2/2024 -- 14:05:03 - <Info> -- Disabling rules for protocol modbus 4/2/2024 -- 14:05:03 - <Info> -- Disabling rules for protocol dnp3 4/2/2024 -- 14:05:03 - <Info> -- Disabling rules for protocol enip 4/2/2024 -- 14:05:03 - <Warning> -- Source is obsolete and will not be fetched: ptresearch/attackdetection: no longer exists 4/2/2024 -- 14:05:03 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-7.0.2/emerging.rules.tar.gz. 100% - 4228540/4228540 4/2/2024 -- 14:05:05 - <Info> -- Done. 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/app-layer-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/decoder-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/dhcp-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/dnp3-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/dns-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/files.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/http-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/ipsec-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/kerberos-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/modbus-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/nfs-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/ntp-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/smb-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/smtp-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/stream-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Loading distribution rule file /usr/share/suricata/rules/tls-events.rules 4/2/2024 -- 14:05:05 - <Info> -- Ignoring file rules/emerging-deleted.rules 4/2/2024 -- 14:05:06 - <Info> -- Loaded 47333 rules. 4/2/2024 -- 14:05:06 - <Info> -- Disabled 14 rules. 4/2/2024 -- 14:05:06 - <Info> -- Enabled 0 rules. 4/2/2024 -- 14:05:06 - <Info> -- Modified 0 rules. 4/2/2024 -- 14:05:06 - <Info> -- Dropped 0 rules. 4/2/2024 -- 14:05:06 - <Info> -- Enabled 133 rules for flowbit dependencies. 4/2/2024 -- 14:05:06 - <Info> -- Creating directory /var/lib/suricata/rules. 4/2/2024 -- 14:05:06 - <Info> -- Backing up current rules. 4/2/2024 -- 14:05:06 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 47333; enabled: 36576; added: 47333; removed 0; modified: 0 4/2/2024 -- 14:05:06 - <Info> -- Writing /var/lib/suricata/rules/classification.config 4/2/2024 -- 14:05:06 - <Info> -- Testing with suricata -T. 4/2/2024 -- 14:05:17 - <Info> -- Done. |
Este conjunto de reglas adicionales puede habilitarse o deshabilitarse si nos apetece, con el siguiente comando:
1 2 |
suricata-update enable-source <RULESET_NAME> suricata-update disable-source <RULESET_NAME> |
Listar:
1 2 |
suricata-update list-sources suricata-update list-sources --enabled |
Os dejo enlace a la documentación: https://suricata-update.readthedocs.io/en/latest/quickstart.html#list-enabled-sources
Comprobación configuración Suricata
Para validar nuestras configuraciones, en este primer momento casi por defecto, podemos usar:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@SURICATA:~# suricata -T -v -c /etc/suricata/suricata.yaml Notice: suricata: This is Suricata version 7.0.2 RELEASE running in SYSTEM mode Info: cpu: CPUs/cores online: 2 Info: suricata: Running suricata under test mode Info: suricata: Setting engine mode to IDS mode by default Info: exception-policy: master exception-policy set to: auto Info: logopenfile: fast output device (regular) initialized: fast.log Info: logopenfile: eve-log output device (regular) initialized: eve.json Info: logopenfile: stats output device (regular) initialized: stats.log Info: detect: 1 rule files processed. 36576 rules successfully loaded, 0 rules failed Info: threshold-config: Threshold config parsed: 0 rule(s) found Info: detect: 36579 signatures processed. 1204 are IP-only rules, 4944 are inspecting packet payload, 30219 inspect application layer, 108 are decoder event only Notice: suricata: Configuration provided was successfully loaded. Exiting. |
Crear usuarios y modificar permisos
Aunque os he mostrado la instalación directamente con root, es una buena recomendación, que para el uso de Suricata no lo hagamos con root directamente y utilicemos sudo en su defecto. Así que generaremos un grupo y un usuario específico al que daremos permisos en los directorios del software para gestionarlo a partir de realizar la instalación:
1 2 3 4 5 6 7 8 9 10 |
sudo useradd USUARIO sudo passwd USUARIO sudo groupadd suricata sudo chgrp -R suricata /etc/suricata sudo chgrp -R suricata /var/lib/suricata/rules sudo chgrp -R suricata /var/lib/suricata/update sudo chmod -R g+r /etc/suricata/ sudo chmod -R g+rw /var/lib/suricata/rules sudo chmod -R g+rw /var/lib/suricata/update sudo usermod -a -G suricata USUARIO |
Verificamos los permisos:
1 2 3 |
ls -al /etc/suricata ls -al /var/lib/suricata/rules ls -al /var/lib/suricata/update |
Pruebas funcionamiento Suricata
Para validar que recogemos datos, podemos instalar “curl” y “jq”:
1 |
suricata@SURICATA:~# sudo apt install curl jq |
Lanzar un testeo:
1 2 |
suricata@SURICATA:/$ curl http://testmynids.org/uid/index.html uid=0(root) gid=0(root) groups=0(root) |
Comprobamos en las siguientes rutas si funciona:
1 2 |
tail -f /var/log/suricata/fast.log tail -f /var/log/suricata/eve.json |
- fast.log: Recoge los eventos disparados por las reglas. Tiene como objetivo dar una impresión rápida y directa de los eventos.
- eve.json: Recoge, igual que el anterior, los eventos disparados por las reglas, pero lo hace en formato JSON, lo que permite que posteriormente pueda ser interpretado de forma mucho más fácil por programas externos
Encontramos un log como éste:
1 2 3 4 5 6 7 8 9 |
suricata@SURICATA:/$ tail /var/log/suricata/fast.log 02/04/2024-14:31:34.850124 [**] [1:2013028:7] ET POLICY curl User-Agent Outbound [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.0.0.10:52110 -> 18.154.22.65:80 02/04/2024-14:31:34.861975 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.154.22.65:80 -> 10.0.0.10:52110 02/04/2024-14:36:21.230843 [**] [1:2013028:7] ET POLICY curl User-Agent Outbound [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.0.0.10:48264 -> 18.154.22.65:80 02/04/2024-14:36:21.241928 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.154.22.65:80 -> 10.0.0.10:48264 02/04/2024-14:37:51.380096 [**] [1:2013028:7] ET POLICY curl User-Agent Outbound [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.0.0.10:57380 -> 18.154.22.70:80 02/04/2024-14:37:51.391678 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.154.22.70:80 -> 10.0.0.10:57380 02/04/2024-14:39:58.426248 [**] [1:2013028:7] ET POLICY curl User-Agent Outbound [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.0.0.10:51318 -> 18.154.22.96:80 02/04/2024-14:39:58.437996 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.154.22.96:80 -> 10.0.0.10:51318 |
Podemos filtrar el evento de la siguiente forma, por el ID “2013028”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
suricata@SURICATA:/$ jq 'select(.alert .signature_id==2013028)' /var/log/suricata/eve.json { "timestamp": "2024-02-04T14:31:34.850124+0000", "flow_id": 1862434390744517, "in_iface": "eth0", "event_type": "alert", "src_ip": "10.0.0.10", "src_port": 52110, "dest_ip": "18.154.22.65", "dest_port": 80, "proto": "TCP", "pkt_src": "wire/pcap", "community_id": "1:wuavlOzYd1ZxSXhcxwChCLZLFBU=", "tx_id": 0, "alert": { "action": "allowed", "gid": 1, "signature_id": 2013028, "rev": 7, "signature": "ET POLICY curl User-Agent Outbound", "category": "Attempted Information Leak", "severity": 2, "metadata": { "created_at": [ "2011_06_14" ], "updated_at": [ "2022_05_03" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.81.0", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 0 }, "app_proto": "http", "direction": "to_server", "flow": { "pkts_toserver": 4, "pkts_toclient": 3, "bytes_toserver": 364, "bytes_toclient": 705, "start": "2024-02-04T14:31:34.826847+0000", "src_ip": "10.0.0.10", "dest_ip": "18.154.22.65", "src_port": 52110, "dest_port": 80 } } { "timestamp": "2024-02-04T14:36:21.230843+0000", "flow_id": 1444477710704523, "in_iface": "eth0", "event_type": "alert", "src_ip": "10.0.0.10", "src_port": 48264, "dest_ip": "18.154.22.65", "dest_port": 80, "proto": "TCP", "pkt_src": "wire/pcap", "community_id": "1:xPJTZ1uCLRyu5C+/4j90lxCpM6o=", "tx_id": 0, "alert": { "action": "allowed", "gid": 1, "signature_id": 2013028, "rev": 7, "signature": "ET POLICY curl User-Agent Outbound", "category": "Attempted Information Leak", "severity": 2, "metadata": { "created_at": [ "2011_06_14" ], "updated_at": [ "2022_05_03" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.81.0", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 0 }, "app_proto": "http", "direction": "to_server", "flow": { "pkts_toserver": 4, "pkts_toclient": 3, "bytes_toserver": 364, "bytes_toclient": 705, "start": "2024-02-05T14:36:21.205246+0000", "src_ip": "10.0.0.10", "dest_ip": "18.154.22.65", "src_port": 48264, "dest_port": 80 } } { "timestamp": "2024-02-04T14:37:51.380096+0000", "flow_id": 2090072118765011, "in_iface": "eth0", "event_type": "alert", "src_ip": "10.0.0.10", "src_port": 57380, "dest_ip": "18.154.22.70", "dest_port": 80, "proto": "TCP", "pkt_src": "wire/pcap", "community_id": "1:jQ8+1ws8VXYisvMjeuEZN0OIbp4=", "tx_id": 0, "alert": { "action": "allowed", "gid": 1, "signature_id": 2013028, "rev": 7, "signature": "ET POLICY curl User-Agent Outbound", "category": "Attempted Information Leak", "severity": 2, "metadata": { "created_at": [ "2011_06_14" ], "updated_at": [ "2022_05_03" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.81.0", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 0 }, "app_proto": "http", "direction": "to_server", "flow": { "pkts_toserver": 4, "pkts_toclient": 3, "bytes_toserver": 364, "bytes_toclient": 705, "start": "2024-02-04T14:37:51.355560+0000", "src_ip": "10.0.0.10", "dest_ip": "18.154.22.70", "src_port": 57380, "dest_port": 80 } } { "timestamp": "2024-02-04T14:39:58.426248+0000", "flow_id": 1725073084031039, "in_iface": "eth0", "event_type": "alert", "src_ip": "10.0.0.10", "src_port": 51318, "dest_ip": "18.154.22.96", "dest_port": 80, "proto": "TCP", "pkt_src": "wire/pcap", "community_id": "1:kGkeEtYCuctzV15fueqqIofIsTc=", "tx_id": 0, "alert": { "action": "allowed", "gid": 1, "signature_id": 2013028, "rev": 7, "signature": "ET POLICY curl User-Agent Outbound", "category": "Attempted Information Leak", "severity": 2, "metadata": { "created_at": [ "2011_06_14" ], "updated_at": [ "2022_05_03" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.81.0", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 0 }, "app_proto": "http", "direction": "to_server", "flow": { "pkts_toserver": 4, "pkts_toclient": 3, "bytes_toserver": 364, "bytes_toclient": 705, "start": "2024-02-04T14:39:58.401649+0000", "src_ip": "10.0.0.10", "dest_ip": "18.154.22.96", "src_port": 51318, "dest_port": 80 } } |
Modos de funcionamiento de Suricata
Suricata tiene varias formas de trabajar (predeterminado “autofp”), las podemos listar de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
suricata@SURICATA:/$ sudo /usr/bin/suricata --list-runmodes ------------------------------------- Runmodes ------------------------------------------ | RunMode Type | Custom Mode | Description |---------------------------------------------------------------------------------------- | PCAP_DEV | single | Single threaded pcap live mode | --------------------------------------------------------------------- | | autofp | Multi threaded pcap live mode. Packets from each flow are assigned to a single detect thread, unlike "pcap_live_auto" where packets from the same flow can be processed by any detect thread | --------------------------------------------------------------------- | | workers | Workers pcap live mode, each thread does all tasks from acquisition to logging |---------------------------------------------------------------------------------------- | PCAP_FILE | single | Single threaded pcap file mode | --------------------------------------------------------------------- | | autofp | Multi threaded pcap file mode. Packets from each flow are assigned to a single detect thread, unlike "pcap-file-auto" where packets from the same flow can be processed by any detect thread |---------------------------------------------------------------------------------------- | PFRING(DISABLED) | autofp | Multi threaded pfring mode. Packets from each flow are assigned to a single detect thread, unlike "pfring_auto" where packets from the same flow can be processed by any detect thread | --------------------------------------------------------------------- | | single | Single threaded pfring mode | --------------------------------------------------------------------- | | workers | Workers pfring mode, each thread does all tasks from acquisition to logging |---------------------------------------------------------------------------------------- | NFQ | autofp | Multi threaded NFQ IPS mode with respect to flow | --------------------------------------------------------------------- | | workers | Multi queue NFQ IPS mode with one thread per queue |---------------------------------------------------------------------------------------- | NFLOG | autofp | Multi threaded nflog mode | --------------------------------------------------------------------- | | single | Single threaded nflog mode | --------------------------------------------------------------------- | | workers | Workers nflog mode |---------------------------------------------------------------------------------------- | IPFW | autofp | Multi threaded IPFW IPS mode with respect to flow | --------------------------------------------------------------------- | | workers | Multi queue IPFW IPS mode with one thread per queue |---------------------------------------------------------------------------------------- | ERF_FILE | single | Single threaded ERF file mode | --------------------------------------------------------------------- | | autofp | Multi threaded ERF file mode. Packets from each flow are assigned to a single detect thread |---------------------------------------------------------------------------------------- | ERF_DAG | autofp | Multi threaded DAG mode. Packets from each flow are assigned to a single detect thread, unlike "dag_auto" where packets from the same flow can be processed by any detect thread | --------------------------------------------------------------------- | | single | Singled threaded DAG mode | --------------------------------------------------------------------- | | workers | Workers DAG mode, each thread does all tasks from acquisition to logging |---------------------------------------------------------------------------------------- | AF_PACKET_DEV | single | Single threaded af-packet mode | --------------------------------------------------------------------- | | workers | Workers af-packet mode, each thread does all tasks from acquisition to logging | --------------------------------------------------------------------- | | autofp | Multi socket AF_PACKET mode. Packets from each flow are assigned to a single detect thread. |---------------------------------------------------------------------------------------- | AF_XDP_DEV | single | Single threaded af-xdp mode | --------------------------------------------------------------------- | | workers | Workers af-xdp mode, each thread does all tasks from acquisition to logging |---------------------------------------------------------------------------------------- | NETMAP(DISABLED) | single | Single threaded netmap mode | --------------------------------------------------------------------- | | workers | Workers netmap mode, each thread does all tasks from acquisition to logging | --------------------------------------------------------------------- | | autofp | Multi-threaded netmap mode. Packets from each flow are assigned to a single detect thread. |---------------------------------------------------------------------------------------- | DPDK(DISABLED) | workers | Workers DPDK mode, each thread does all tasks from acquisition to logging |---------------------------------------------------------------------------------------- | UNIX_SOCKET | single | Unix socket mode | --------------------------------------------------------------------- | | autofp | Unix socket mode |---------------------------------------------------------------------------------------- | WINDIVERT(DISABLED) | autofp | Multi-threaded WinDivert IPS mode load-balanced by flow |---------------------------------------------------------------------------------------- |
Tarjeta de red en modo promiscuo en Proxmox
Hay un único problema, el contenedor no tiene la tarjeta en modo promiscuo, y no ve el tráfico del resto de la red. Esto se debe a una configuración del host Proxmox que tenemos que habilitar.
Para ello agregaremos el siguiente parámetro a la tarjeta de red del host Proxmox que tiene configurada el contenedor:
1 |
bridge-ageing 0 |
Editamos el fichero y agregamos la línea a la interfaz:
1 |
root@minis2:~# nano /etc/network/interfaces |
Lanzamos desde otra máquina de la red la prueba que hemos visto anteriormente:
Y veremos que se refleja en los logs ese tráfico malicioso:
1 |
02/05/2024-17:27:26.429475 [**] [1:2013028:7] ET POLICY curl User-Agent Outbound [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.0.0.100:55290 -> 52.89.34.17:80 |
Realizada prueba sobre un host sin cambiar el parámetro no funciona:
Con esto ya tenemos Suricata prácticamente en marcha, nuestra primera pieza del SOC, que más adelante uniremos al resto de componentes.
ENTRADAS RELACIONADAS CREACION SOC OPENSOURCE
-
- Crear SOC mediante herramientas OpenSource
- Implementar SOC: Instalación Suricata bajo Proxmox
- Instalar Docker sobre contenedor LXC Proxmox
- Implementar SOC: Instalación Wazuh
- Implementar SOC: Instalar TheHive, Cortex y MISP
- Implementar SOC: Instalación Patrowl
- Implementar SOC: Instalación Opensearch
- Implementar SOC: Decoders, Playbooks y Workflows
- Implementar SOC: Directorios Windows, Linux y MacOS a revisar
- Implementar SOC: Monitorización Completa con Prometheus, AlertManager, Grafana y Loki bajo Contenedores
- Implementar SOC: Instalar Security Onion sobre Proxmox
- Implementar SOC: Códigos de estado, Mensajes y Alertas
- Suricata: Cómo crear y testear reglas personalizadas
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?