Wazuh · Detección de malware con listas CDB y Active Response

Guía técnica · CLOCKWORK COMPUTER

Documentación paso a paso para monitorizar un directorio con FIM, detectar el fichero EICAR mediante una lista CDB en el manager y eliminarlo automáticamente con Active Response. Incluye explicación teórica, comandos listos para copiar y verificaciones visuales para seguirla a la vez que el vídeo.

1. Introducción

En esta práctica vamos a construir una detección completa en Wazuh usando File Integrity Monitoring (FIM), una lista CDB y Active Response.

El objetivo es muy didáctico: monitorizar un directorio en un endpoint Linux, detectar el archivo de prueba EICAR por su hash SHA256 y, cuando la detección sea positiva, eliminar el archivo automáticamente desde el propio agente.

Esta práctica está pensada para laboratorio y demostración. EICAR no es malware real; es un fichero de prueba estándar usado para validar soluciones de seguridad.

2. Arquitectura y flujo de la práctica

Flujo lógico
[Agente Ubuntu]
   ↓
FIM monitoriza /tmp/cdb-demo
   ↓
Se crea eicar.com.txt
   ↓
El agente calcula hashes y envía el evento
   ↓
[Wazuh Manager]
   ↓
La regla 100300 compara el SHA256 con la lista CDB
   ↓
Coincidencia positiva
   ↓
Alerta 100300
   ↓
Active Response ejecuta remove-threat.sh en el agente
   ↓
El archivo se elimina automáticamente

3. Conceptos clave

3.1 File Integrity Monitoring (FIM)

FIM es el módulo de Wazuh que monitoriza cambios en archivos y directorios. Puede detectar creación, modificación y borrado de archivos, además de calcular hashes como MD5, SHA1 y SHA256.

3.2 Listas CDB

Una lista CDB es una base de datos de búsqueda rápida que Wazuh usa para comprobar si un valor existe o no en una lista. El formato es muy simple: clave:valor. En esta práctica, la clave será el hash SHA256 de EICAR y el valor será una etiqueta descriptiva.

3.3 Active Response

Active Response permite que Wazuh ejecute una acción automática cuando se cumple una regla. En este caso, cuando se dispare la regla 100300, se ejecutará un script personalizado en el agente para borrar el fichero.

3.4 Por qué usamos SHA256

En esta demo usamos SHA256 para alinear la detección con una práctica más robusta al trabajar con hashes en listas CDB. Además, Wazuh puede comparar directamente el campo sha256 de los eventos FIM con la lista.

4. Requisitos

  • Un Wazuh Manager operativo.
  • Un agente Linux registrado en el manager.
  • Acceso administrativo en ambos sistemas.
  • Conectividad desde el agente para descargar EICAR, o alternativa con printf.
  • Paquete jq instalado en el agente para el script de Active Response.

5. Preparar el directorio de laboratorio en el agente

Vamos a usar un directorio simple y limpio para que la práctica sea fácil de seguir y depurar.

Crear el directorio de pruebas
mkdir -p /tmp/cdb-demo
ls -ld /tmp/cdb-demo

6. Configurar FIM en el agente

Edita el archivo /var/ossec/etc/ossec.conf del agente y añade o ajusta el bloque syscheck para monitorizar /tmp/cdb-demo en tiempo real.

Editar ossec.conf del agente
nano /var/ossec/etc/ossec.conf
Bloque syscheck recomendado
<syscheck>
  <disabled>no</disabled>
  <directories check_all="yes" realtime="yes">/tmp/cdb-demo</directories>
</syscheck>

check_all="yes" hace que Wazuh calcule atributos y hashes del archivo. realtime="yes" permite detectar el cambio en cuanto se crea o modifica el fichero.

Reiniciar el agente
systemctl restart wazuh-agent

7. Crear la lista CDB en el manager

Las listas CDB se crean y se cargan en el manager, no en el agente. En esta práctica almacenaremos el SHA256 de EICAR.

Crear la lista malware-hashes
mkdir -p /var/ossec/etc/lists
cat > /var/ossec/etc/lists/malware-hashes << 'EOF'
275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f:eicar
EOF
chown wazuh:wazuh /var/ossec/etc/lists/malware-hashes
chmod 660 /var/ossec/etc/lists/malware-hashes
Ese valor 275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f es el SHA256 correcto del fichero EICAR sin salto de línea adicional.

8. Declarar la lista en el manager

Ahora hay que decirle a Wazuh que cargue la lista dentro del bloque ruleset de /var/ossec/etc/ossec.conf.

Editar ossec.conf del manager
nano /var/ossec/etc/ossec.conf
Añadir la lista dentro de <ruleset>
<list>etc/lists/malware-hashes</list>

9. Crear la regla 100300 en local_rules.xml

Para esta práctica usaremos local_rules.xml porque es la opción más simple y clara para laboratorio. La regla se apoyará en los eventos FIM 550 y 554, y comparará el campo sha256 con la lista CDB.

Editar local_rules.xml
nano /var/ossec/etc/rules/local_rules.xml
Regla 100300
<group name="syscheck,malware,cdb,">

  <rule id="100300" level="12">
    <if_sid>554,550</if_sid>
    <list field="sha256" lookup="match_key">etc/lists/malware-hashes</list>
    <description>CDB - Hash malicioso detectado: $(file)</description>
  </rule>

</group>

10. Reiniciar y validar la carga

Después de crear o modificar una lista CDB, es obligatorio reiniciar el manager para que Wazuh la compile y la cargue. Luego conviene verificar que exista el archivo .cdb.

Reiniciar manager y comprobar la compilación
systemctl restart wazuh-manager
ls -l /var/ossec/etc/lists/malware-hashes*

Deberías ver dos archivos:

  • /var/ossec/etc/lists/malware-hashes
  • /var/ossec/etc/lists/malware-hashes.cdb
Si el archivo .cdb existe, la lista se ha compilado correctamente.

11. Descargar EICAR y probar la detección

Ahora generaremos el evento real en el agente creando el archivo de prueba EICAR dentro del directorio monitorizado.

Descargar EICAR y comprobar el SHA256
wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt
sha256sum /tmp/cdb-demo/eicar.com.txt

El resultado esperado del hash es:

SHA256 esperado
275a021bbfb648564fd2b7f4b43406a1611acd2524bb265fc95c65dbf20c1f55  /tmp/cdb-demo/eicar.com.txt
Si el SHA256 no coincide, normalmente hay un salto de línea o un contenido distinto. En ese caso, la regla 100300 no disparará.

12. Añadir Active Response en el manager

Como en este laboratorio no estaba disponible el ejecutable nativo remove-threat, vamos a usar un script personalizado llamado remove-threat.sh.

En el manager, dentro de /var/ossec/etc/ossec.conf y siempre dentro de <ossec_config>, añade estos bloques:

Bloques command y active-response
<command>
  <name>remove-threat</name>
  <executable>remove-threat.sh</executable>
  <timeout_allowed>no</timeout_allowed>
</command>

<active-response>
  <disabled>no</disabled>
  <command>remove-threat</command>
  <location>local</location>
  <rules_id>100300</rules_id>
</active-response>
Se puede colocar al final del archivo, pero siempre antes de </ossec_config>.

13. Crear el script remove-threat.sh en el agente

Este script leerá el JSON que envía Wazuh, extraerá la ruta del archivo desde parameters.alert.syscheck.path y lo eliminará.

Instalar jq
apt update
apt -y install jq
Crear remove-threat.sh
cat > /var/ossec/active-response/bin/remove-threat.sh << 'EOF'
#!/bin/bash

LOCAL=$(dirname "$0")
cd "$LOCAL/.." || exit 1
PWD=$(pwd)

read INPUT_JSON

COMMAND=$(echo "$INPUT_JSON" | jq -r .command)
FILENAME=$(echo "$INPUT_JSON" | jq -r .parameters.alert.syscheck.path)
LOG_FILE="${PWD}/../logs/active-responses.log"

if [ "$COMMAND" = "add" ]; then
  printf '{"version":1,"origin":{"name":"remove-threat","module":"active-response"},"command":"check_keys","parameters":{"keys":[]}}\n'
  read RESPONSE
  COMMAND2=$(echo "$RESPONSE" | jq -r .command)

  if [ "$COMMAND2" != "continue" ]; then
    echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Active response abortada" >> "${LOG_FILE}"
    exit 0
  fi
fi

rm -f "$FILENAME"

if [ $? -eq 0 ]; then
  echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Archivo eliminado correctamente" >> "${LOG_FILE}"
else
  echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Error eliminando archivo" >> "${LOG_FILE}"
fi

exit 0
EOF

chmod 750 /var/ossec/active-response/bin/remove-threat.sh
chown root:wazuh /var/ossec/active-response/bin/remove-threat.sh
El script se crea en el agente, no en el manager, porque la eliminación debe ejecutarse donde existe realmente el fichero.

14. Probar la eliminación automática

Una vez añadida la configuración y creado el script, reinicia manager y agente.

Reiniciar servicios
# En el manager
systemctl restart wazuh-manager

# En el agente
systemctl restart wazuh-agent

Ahora repite la descarga del fichero EICAR:

Lanzar la prueba final
rm -f /tmp/cdb-demo/eicar.com.txt
wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt

Si todo está bien, el archivo se creará y se eliminará automáticamente casi al instante.

15. Visualización en tiempo real

Esta parte queda muy bien tanto para validación como para grabación del vídeo. Usa varias terminales para verlo todo a la vez.

Terminal 1 · Ver el directorio en vivo
watch -n 1 ls -l /tmp/cdb-demo
Terminal 2 · Ver active-responses.log
tail -f /var/ossec/logs/active-responses.log
Terminal 3 · Lanzar la descarga
wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt
El comando watch conviene ejecutarlo en una terminal separada, dejándolo abierto mientras haces la descarga en otra sesión.

16. Qué deberías ver al final

Componente Resultado esperado
Manager Alerta 100300 con el texto CDB - Hash malicioso detectado.
Dashboard Evento de Active Response indicando que se ejecutó remove-threat.sh.
Agente El archivo aparece y desaparece del directorio /tmp/cdb-demo.
active-responses.log Registro con el JSON de la acción y el mensaje de eliminación correcta.

17. Errores comunes y cómo resolverlos

Problema Causa habitual Solución
No salta la 100300 El hash del archivo no coincide con el de la lista Validar con sha256sum que sea 275a021bbfb648564fd2b7f4b43406a1611acd2524bb265fc95c65dbf20c1f55.
No se genera el .cdb La lista no se cargó o no se reinició el manager Revisar permisos, reiniciar wazuh-manager y comprobar el archivo compilado.
No hay eventos FIM El directorio no está monitorizado o no se reinició el agente Comprobar syscheck y reiniciar wazuh-agent.
No se borra el fichero El script no existe o tiene permisos incorrectos Verificar que /var/ossec/active-response/bin/remove-threat.sh tenga 750 y propietario root:wazuh.
XML inválido en ossec.conf Bloques command o active-response fuera de ossec_config Asegurarse de añadirlos antes de </ossec_config>.