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.
2. Arquitectura y flujo de la práctica
[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
mkdir -p /tmp/malwarebazaar
Paso 2 · Añadir la ruta a <syscheck>
nano /var/ossec/etc/ossec.conf
<directories check_all="yes" realtime="yes">/tmp/malwarebazaar</directories>
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
systemctl restart wazuh-agent
Paso 4 · Generar un evento de prueba
echo "prueba fim malwarebazaar" > /tmp/malwarebazaar/prueba.txt
/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
install -d -m 700 /root/.secrets nano /root/.secrets/malwarebazaar.key chmod 600 /root/.secrets/malwarebazaar.key
6. Descargar un CSV de referencia
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
head -n 20 /tmp/malwarebazaar_recent.csv
grep -v '^#' /tmp/malwarebazaar_recent.csv | head -n 15 | awk -F',' '{gsub(/"| /, "", $2); print $2}'
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
nano /var/ossec/etc/ossec.conf
Paso 2 · Declarar la lista dentro de <ruleset>
<list>etc/lists/malwarebazaar-sha256</list>
<ruleset> ... <list>etc/lists/malwarebazaar-sha256</list> ... </ruleset>
Paso 3 · Crear el fichero de la lista
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
ls -l /var/ossec/etc/lists/malwarebazaar-sha256
8. Regla FIM con prefijo MALWAREBAZAAR
Esta regla utiliza la lista alimentada automáticamente desde MalwareBazaar para correlacionar eventos FIM mediante el campo sha256.
nano /var/ossec/etc/rules/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.
install -d -m 750 /usr/local/bin nano /usr/local/bin/sync-malwarebazaar.sh chmod 750 /usr/local/bin/sync-malwarebazaar.sh
#!/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}"
/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
/usr/local/bin/sync-malwarebazaar.sh
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
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
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.
nano /var/ossec/etc/ossec.conf
<localfile> <location>/var/log/malwarebazaar-sync.log</location> <log_format>syslog</log_format> </localfile>
<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.
nano /var/ossec/etc/decoders/local_decoder.xml
<decoder name="malwarebazaar-sync"> <program_name>^MALWAREBAZAAR$</program_name> </decoder>
nano /var/ossec/etc/rules/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>
systemctl restart wazuh-manager
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.
cat > /etc/cron.d/malwarebazaar-sync << 'EOF' 0 2 * * * root /usr/local/bin/sync-malwarebazaar.sh EOF chmod 644 /etc/cron.d/malwarebazaar-sync
14. Validación final
Opción A · ejecutar el script y revisar 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
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
/tmp/malwarebazaar para que FIM genere el evento que activa 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
echo "$(date '+%b %d %H:%M:%S') $(hostname -s) MALWAREBAZAAR: update ok count=999 list=malwarebazaar-sha256" >> /var/log/malwarebazaar-sync.log
/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. |