Integración de Wazuh con MalwareBazaar

SHA256 + listas CDB + actualización automática + alertas visibles en manager

Guía técnica para integrar MalwareBazaar como fuente de inteligencia basada en SHA256 con Wazuh mediante listas CDB y actualización automatizada.

1. Introducción

La práctica se centra en la automatización de la obtención de hashes SHA256 desde MalwareBazaar y su integración en Wazuh mediante listas CDB. El objetivo es disponer de inteligencia de amenazas actualizada de forma automática y generar alertas visibles en el manager.

La validación puede realizarse comprobando la actualización de la lista y la generación de alertas en Wazuh, sin necesidad de utilizar muestras reales.

2. Arquitectura y flujo de la práctica

Resumen visual
[MalwareBazaar]
  ├─ CSV de referencia para revisar columnas y hashes SHA256
  └─ CSV reciente automatizado para alimentar la lista CDB

[Wazuh manager]
  ├─ Script sync-malwarebazaar.sh
  ├─ /var/ossec/etc/lists/malwarebazaar-sha256
  ├─ Regla FIM que compara field="sha256"
  ├─ Log /var/log/malwarebazaar-sync.log
  └─ Regla visible en manager: MALWAREBAZAAR - Lista SHA256 actualizada correctamente

[Agente monitorizado]
  └─ FIM sobre /tmp/malwarebazaar o sobre el directorio que se decida monitorizar

3. Requisitos

  • Wazuh operativo en el manager y, si aplica, acceso para editar la configuración del agente que monitoriza el directorio.
  • Acceso root o sudo en el Wazuh manager.
  • Conectividad saliente desde el manager hacia MalwareBazaar.
  • Auth-Key válido de abuse.ch / MalwareBazaar.

4. Habilitar FIM en /tmp/malwarebazaar

Antes de utilizar la correlación con SHA256 conviene habilitar FIM sobre un directorio de prueba. En este ejemplo se utiliza /tmp/malwarebazaar como ruta monitorizada.

Paso 1 · Crear el directorio de prueba

Crear el directorio
mkdir -p /tmp/malwarebazaar

Paso 2 · Añadir la ruta a <syscheck>

Editar ossec.conf en el sistema que monitoriza la ruta
nano /var/ossec/etc/ossec.conf
Bloque a añadir dentro de <syscheck>
<directories check_all="yes" realtime="yes">/tmp/malwarebazaar</directories>
El atributo check_all="yes" permite que el evento incluya hashes como sha256, necesarios para la correlación con la lista CDB.

Paso 3 · Reiniciar el servicio correspondiente

Reiniciar el componente que monitoriza el directorio
systemctl restart wazuh-agent

Paso 4 · Generar un evento de prueba

Crear un fichero en el directorio monitorizado
echo "prueba fim malwarebazaar" > /tmp/malwarebazaar/prueba.txt
Tras estos pasos, FIM queda habilitado sobre /tmp/malwarebazaar y los eventos generados en ese directorio podrán compararse después con la lista de hashes de MalwareBazaar.

5. Crear cuenta y obtener el Auth-Key

Se accede al portal de autenticación de abuse.ch, se crea la cuenta y se genera un Auth-Key. Ese token se utiliza tanto para descargar un CSV manual como para automatizar la actualización de la lista.

Guardar la clave en el manager

Crear fichero seguro con el Auth-Key
install -d -m 700 /root/.secrets
nano /root/.secrets/malwarebazaar.key
chmod 600 /root/.secrets/malwarebazaar.key
Dentro del fichero se deja únicamente la clave, sin comillas ni espacios adicionales.

6. Descargar un CSV de referencia

Descargar el CSV reciente
AUTH_KEY=$(cat /root/.secrets/malwarebazaar.key)
curl -L "https://mb-api.abuse.ch/files/exports/recent.csv?auth-key=${AUTH_KEY}" -o /tmp/malwarebazaar_recent.csv
Ver cabecera y primeras líneas
head -n 20 /tmp/malwarebazaar_recent.csv
Extraer solo la columna SHA256
grep -v '^#' /tmp/malwarebazaar_recent.csv | head -n 15 | awk -F',' '{gsub(/"| /, "", $2); print $2}'
El CSV permite revisar la estructura de la fuente y comprobar que la exportación incluye hashes SHA256 utilizables.

7. Crear la lista en Wazuh

La creación de la lista consta de varios pasos: declarar la lista en la configuración, crear el fichero físico y dejarlo preparado para que el script de sincronización lo actualice automáticamente.

Paso 1 · Editar la configuración de Wazuh

Abrir ossec.conf
nano /var/ossec/etc/ossec.conf

Paso 2 · Declarar la lista dentro de <ruleset>

Bloque a añadir dentro de <ruleset>
<list>etc/lists/malwarebazaar-sha256</list>
Ejemplo de ubicación
<ruleset>
  ...
  <list>etc/lists/malwarebazaar-sha256</list>
  ...
</ruleset>

Paso 3 · Crear el fichero de la lista

Crear el archivo y asignar permisos
touch /var/ossec/etc/lists/malwarebazaar-sha256
chown root:wazuh /var/ossec/etc/lists/malwarebazaar-sha256
chmod 640 /var/ossec/etc/lists/malwarebazaar-sha256

Paso 4 · Verificar que la lista existe

Comprobar el fichero
ls -l /var/ossec/etc/lists/malwarebazaar-sha256
En este punto la lista puede estar vacía. El contenido se cargará después mediante el script de sincronización.

8. Regla FIM con prefijo MALWAREBAZAAR

Esta regla utiliza la lista alimentada automáticamente desde MalwareBazaar para correlacionar eventos FIM mediante el campo sha256.

Abrir local_rules.xml para editarlo
nano /var/ossec/etc/rules/local_rules.xml
Añadir a local_rules.xml
<group name="syscheck,malware,cdb,">

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

</group>

9. Crear el script de sincronización

El script descarga el CSV reciente de MalwareBazaar, guarda una copia local para revisión, extrae los SHA256 válidos, construye la lista en formato key:value, reinicia el manager para recargar la CDB y escribe una línea de log para su posterior monitorización.

Crear directorio y script
install -d -m 750 /usr/local/bin
nano /usr/local/bin/sync-malwarebazaar.sh
chmod 750 /usr/local/bin/sync-malwarebazaar.sh
Contenido del script
#!/bin/bash
set -euo pipefail

AUTH_KEY=$(tr -d '\r\n' < /root/.secrets/malwarebazaar.key)
TMP_CSV=$(mktemp)
TMP_LIST=$(mktemp)
TARGET_LIST="/var/ossec/etc/lists/malwarebazaar-sha256"
SAVED_CSV="/var/ossec/tmp/malwarebazaar_recent.csv"
LOG_FILE="/var/log/malwarebazaar-sync.log"
HOSTNAME_SHORT=$(hostname -s)

log_line() {
  echo "$(date '+%b %d %H:%M:%S') ${HOSTNAME_SHORT} $1" >> "${LOG_FILE}"
}

cleanup() {
  rm -f "${TMP_CSV}" "${TMP_LIST}"
}
trap cleanup EXIT

mkdir -p /var/ossec/tmp

if ! curl -fsSL "https://mb-api.abuse.ch/files/exports/recent.csv?auth-key=${AUTH_KEY}" -o "${TMP_CSV}"; then
  log_line "MALWAREBAZAAR: update failed stage=download"
  exit 1
fi

cp "${TMP_CSV}" "${SAVED_CSV}"

grep -v '^#' "${TMP_CSV}" | awk -F',' '
  NF > 1 {
    gsub(/"/, "", $2)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2)
    if ($2 ~ /^[A-Fa-f0-9]{64}$/) {
      print tolower($2) ":malwarebazaar_recent"
    }
  }
' | sort -u > "${TMP_LIST}"

COUNT=$(wc -l < "${TMP_LIST}")

if [ "${COUNT}" -eq 0 ]; then
  log_line "MALWAREBAZAAR: update failed stage=parse count=0 csv=${SAVED_CSV}"
  exit 1
fi

install -o root -g wazuh -m 640 "${TMP_LIST}" "${TARGET_LIST}"
systemctl restart wazuh-manager
log_line "MALWAREBAZAAR: update ok count=${COUNT} list=malwarebazaar-sha256 csv=${SAVED_CSV}"
El script conserva una copia del CSV descargado en /var/ossec/tmp/malwarebazaar_recent.csv para poder revisar el contenido y depurar fácilmente si la lista queda vacía.

10. Probar el script manualmente

Ejecución manual
/usr/local/bin/sync-malwarebazaar.sh
Comprobar que la lista se ha generado
ls -l /var/ossec/etc/lists/malwarebazaar-sha256
head -n 5 /var/ossec/etc/lists/malwarebazaar-sha256
wc -l /var/ossec/etc/lists/malwarebazaar-sha256
Revisar el CSV descargado y el log si la lista queda vacía
head -n 20 /var/ossec/tmp/malwarebazaar_recent.csv
grep -v '^#' /var/ossec/tmp/malwarebazaar_recent.csv | head
grep -v '^#' /var/ossec/tmp/malwarebazaar_recent.csv | awk -F',' '{gsub(/"| /, "", $2); print $2}' | head
tail -n 20 /var/log/malwarebazaar-sync.log
La presencia de líneas en formato sha256:malwarebazaar_recent confirma que la actualización de la lista se ha completado correctamente. Al utilizar recent.csv, la cantidad puede variar entre una ejecución y otra.

11. Monitorizar el log del script en el manager

El log del script se incorpora a Wazuh para que las ejecuciones correctas o fallidas puedan convertirse en alertas visibles en el manager.

Añadir monitorización del log
nano /var/ossec/etc/ossec.conf
Bloque localfile
<localfile>
  <location>/var/log/malwarebazaar-sync.log</location>
  <log_format>syslog</log_format>
</localfile>
El script escribe líneas con formato syslog. Eso permite que Wazuh las recoja y que se puedan definir reglas basadas en <match>.

12. Crear reglas visibles en manager

El log del sincronizador se procesa mediante un decoder local y, a partir de ese decoder, se generan alertas visibles para ejecuciones correctas o fallidas.

Abrir local_decoder.xml para editarlo
nano /var/ossec/etc/decoders/local_decoder.xml
Añadir decoder local
<decoder name="malwarebazaar-sync">
  <program_name>^MALWAREBAZAAR$</program_name>
</decoder>
Abrir local_rules.xml para editarlo
nano /var/ossec/etc/rules/local_rules.xml
Añadir al final de local_rules.xml
<group name="malwarebazaar,local,">

  <rule id="100309" level="0">
    <decoded_as>malwarebazaar-sync</decoded_as>
    <description>MALWAREBAZAAR - Evento de sincronizacion detectado</description>
  </rule>

  <rule id="100310" level="5">
    <if_sid>100309</if_sid>
    <match>update ok</match>
    <description>MALWAREBAZAAR - Lista SHA256 actualizada correctamente</description>
  </rule>

  <rule id="100311" level="10">
    <if_sid>100309</if_sid>
    <match>update failed</match>
    <description>MALWAREBAZAAR - Error actualizando la lista SHA256</description>
  </rule>

</group>
Reiniciar manager para aplicar cambios
systemctl restart wazuh-manager
El decoder local permite que Wazuh identifique el program_name MALWAREBAZAAR y aplique las reglas de éxito o error sobre el contenido del log.

13. Programar la actualización

La programación propuesta ejecuta el script una vez al día, por la noche. La expresión 0 2 * * * significa que la sincronización se lanza todos los días a las 02:00. Esta frecuencia reduce el impacto operativo de los reinicios del manager al actualizar la lista CDB.

Cron diario nocturno
cat > /etc/cron.d/malwarebazaar-sync << 'EOF'
0 2 * * * root /usr/local/bin/sync-malwarebazaar.sh
EOF
chmod 644 /etc/cron.d/malwarebazaar-sync
Al requerirse reinicio del manager tras modificar la lista CDB, una ejecución nocturna diaria resulta más adecuada para laboratorio y reduce reinicios innecesarios durante el día.

14. Validación final

Opción A · ejecutar el script y revisar el log

Ejecutar y seguir el log
/usr/local/bin/sync-malwarebazaar.sh
tail -f /var/log/malwarebazaar-sync.log

Opción B · validar la regla 100302 sin usar malware real

Insertar un hash benigno en la lista y crear el fichero de prueba
mkdir -p /tmp/malwarebazaar
printf 'validacion-regla-100302-malwarebazaar\n' > /tmp/validacion-100302.txt
HASH=$(sha256sum /tmp/validacion-100302.txt | awk '{print $1}')
grep -v ':validacion_100302$' /var/ossec/etc/lists/malwarebazaar-sha256 > /tmp/malwarebazaar-list.tmp || true
echo "${HASH}:validacion_100302" >> /tmp/malwarebazaar-list.tmp
install -o root -g wazuh -m 640 /tmp/malwarebazaar-list.tmp /var/ossec/etc/lists/malwarebazaar-sha256
systemctl restart wazuh-manager
cp /tmp/validacion-100302.txt /tmp/malwarebazaar/validacion-100302.txt
Esta validación no descarga malware. Primero se genera un fichero de texto benigno fuera del directorio monitorizado para calcular su SHA256, después ese hash se añade temporalmente a la lista CDB y, por último, el fichero se copia a /tmp/malwarebazaar para que FIM genere el evento que activa la regla 100302.
Limpiar la validación de la regla 100302
rm -f /tmp/malwarebazaar/validacion-100302.txt /tmp/validacion-100302.txt
grep -v ':validacion_100302$' /var/ossec/etc/lists/malwarebazaar-sha256 > /tmp/malwarebazaar-list.tmp || true
install -o root -g wazuh -m 640 /tmp/malwarebazaar-list.tmp /var/ossec/etc/lists/malwarebazaar-sha256
systemctl restart wazuh-manager

Opción C · comprobar la alerta de actualización del script

Línea de prueba manual para la alerta del log
echo "$(date '+%b %d %H:%M:%S') $(hostname -s) MALWAREBAZAAR: update ok count=999 list=malwarebazaar-sha256" >> /var/log/malwarebazaar-sync.log
La regla 100302 debe aparecer cuando el fichero benigno de prueba se crea en el directorio monitorizado y su SHA256 coincide con la lista CDB. La alerta del log valida por separado la parte de monitorización de /var/log/malwarebazaar-sync.log.

15. Errores comunes y cómo resolverlos

Problema Causa probable Solución
La lista queda vacía El CSV descargado no contiene hashes válidos, el Auth-Key es incorrecto o la extracción de la columna SHA256 falla Revisar /var/ossec/tmp/malwarebazaar_recent.csv, probar el curl manualmente y comprobar el log /var/log/malwarebazaar-sync.log.
El CSV no se descarga o el script no genera datos URL incorrecta, Auth-Key erróneo o contenido inesperado en la exportación Ejecutar el curl manual, revisar /var/ossec/tmp/malwarebazaar_recent.csv y verificar que la columna SHA256 se extrae correctamente.
No salta la alerta 100310 El log no se está monitorizando Revisar el bloque localfile y reiniciar wazuh-manager.
No salta la regla FIM 100302 El fichero no coincide o FIM no envía SHA256 Validar que el evento 550/554 incluye el campo correspondiente y que la regla usa field="sha256".
Permiso denegado al escribir la lista Ruta o permisos incorrectos Verificar propietario y permisos en /var/ossec/etc/lists y ejecutar el script como root.
Reinicio del manager demasiado frecuente Intervalo de cron muy agresivo Aumentar el intervalo y utilizar una ejecución diaria nocturna, por ejemplo a las 02:00, según los requisitos del entorno.