Saltar al contenido principal

YARA

Malware Detection4.xBlue Team

El estándar de facto para crear y aplicar reglas de detección de malware. Permite clasificar y detectar muestras de malware basándose en patrones textuales y binarios.

YARA: el lenguaje de detección de malware

Reglas, metadatos, strings y condiciones

YARA es un herramienta diseñada para ayudar a investigadores de malware a clasificar y detectar muestras maliciosas. Con YARA puedes describir las características de families de malware mediante reglas que combinan texto (strings) y expresiones binarias.

¿Qué es una regla YARA? Una regla YARA tiene tres componentes:

  1. Metadatos: información descriptiva (autor, fecha, referencia)
  2. Strings: patrones de texto o bytes que identifican el malware
  3. Condiciones: lógica que determina cuándo la regla aplica

¿Qué puedes detectar con YARA? • Strings específicos de malware (URLs, nombres de archivos, comandos C2) • Patrones binarios (opcodes, secuencias de bytes) • Cabeceras PE maliciosas • Técnicas de ofuscación (XOR loops, API hashing) • Comportamientos de archivos (imports sospechosos, secciones inusuales)

Usos profesionales: • Sandboxes (Cuckoo, Any.run) usan YARA para clasificar muestras • EDR/XDR aplican reglas YARA en endpoints • Threat intelligence feeds distribuyen reglas YARA • Response a incidentes: buscar IoCs en filesystem y memoria • Malware labs: clasificar colecciones de malware

bash
# ── INSTALACIÓN ───────────────────────────────────────
# Ubuntu/Debian
sudo apt install yara

# macOS
brew install yara

# Verificar
yara --version

# ── ESTRUCTURA DE UNA REGLA ────────────────────────────
# Regla básica con string de texto
cat > detect_c2.yar << 'EOF'
rule Detect_C2_Server {
    meta:
        description = "Detecta un servidor C2 conocido"
        author = "CyberFlows"
        date = "2026-07-23"
        severity = "high"
        reference = "https://example.com/report"

    strings:
        $c2_url = "http://evil-server.com/beacon" ascii wide
        $c2_path = "/gate.php" ascii
        $mutex = "Global\Mutex_Malware_v3" ascii
        $hex_pattern = { 8B 45 ?? 03 C1 89 45 ?? 8B 4D }

    condition:
        2 of them
}
EOF

# ── ESCANEAR ARCHIVOS ──────────────────────────────────
# Escanear un archivo específico
yara detect_c2.yar suspicious_file.exe

# Escanear un directorio completo
yara detect_c2.yar -r /path/to/samples/

# Escanear con recurrencia
yara -r rules/ /evidence/ > scan_results.txt

# ── REGLAS AVANZADAS ───────────────────────────────────
# Regla con patrones hex y operadores lógicos
cat > detect_ransomware.yar << 'EOF'
rule Detect_Ransomware_Behavior {
    meta:
        description = "Detecta comportamiento típico de ransomware"
        severity = "critical"

    strings:
        $readme1 = "YOUR FILES ARE ENCRYPTED" ascii wide nocase
        $readme2 = "DECRYPT" ascii wide nocase
        $readme3 = "how to decrypt" ascii wide nocase
        $ext = ".locked" ascii
        $ext2 = ".encrypted" ascii
        $bitcoin = "bitcoin" ascii wide nocase
        $onion = ".onion" ascii wide nocase
        $vssadmin = "vssadmin delete shadows" ascii wide nocase
        $bcdedit = "bcdedit /set {default} recoveryenabled no" ascii wide nocase
        $cipher = "cipher /W:" ascii wide nocase

    condition:
        uint16(0) == 0x5A4D and
        3 of them
}
EOF

# ── USO EN RESPONSE A INCIDENTES ───────────────────────
# Buscar indicadores en memoria dump
yara -r iocs_rules/ memory_dump.raw

# Escanear todos los procesos en Linux
yara -r rules/ /proc/*/exe 2>/dev/null

💡Combina YARA con Volatility para detectar malware en memoria: crea reglas para patrones de código inyectado y escanea dumps de memoria con vol.py + malfind.

Escribir reglas efectivas

Patrones, modularidad y mejores prácticas

Escribir buenas reglas YARA es un arte. Una mala regla genera falsos positivos o no detecta nada. Aquí aprenderás a crear reglas precisas y reutilizables.

Principios de reglas efectivas:

  1. Sé específico: mejor 3 strings específicos que 1 genérico
  2. Usa metadatos descriptivos: siempre incluye descripción, autor, severidad
  3. Combina condiciones: usa AND, OR, NOT y conteos (2 of them)
  4. Modularidad: crea reglas base y usa includes para reutilizar
  5. Testing: valida contra colecciones de malware y archivos limpios

Modularidad con includes: YARA permite importar otras reglas. Crea un archivo base con strings comunes y reutilízalo.

Evitar falsos positivos: • Usa condiciones específicas (múltiples strings, rangos de tamaño) • Excluye archivos legítimos conocidos • Testea contra Windows/system32 completo • Usa filesize para limitar el alcance

bash
# ── REGLA MODULAR ──────────────────────────────────────
# base_strings.yar — strings comunes de malware
cat > base_strings.yar << 'EOF'
private rule Is_PE {
    condition:
        uint16(0) == 0x5A4D
}

private rule Has_Persistence {
    strings:
        $reg1 = "CurrentVersion\\Run" ascii
        $reg2 = "CurrentVersion\\RunOnce" ascii
        $task = "schtasks" ascii wide
    condition:
        any of them
}

private rule Has_Network {
    strings:
        $http = "http://" ascii
        $https = "https://" ascii
        $tor = ".onion" ascii
        $c2_useragent = "User-Agent:" ascii
    condition:
        2 of them
}
EOF

# regla_completa.yar — reutiliza las reglas base
cat > regla_completa.yar << 'EOF'
import "pe"
import "math"

rule Malware_Generic {
    meta:
        description = "Detección genérica de malware"
        author = "CyberFlows"
        severity = "high"

    strings:
        $s1 = "CreateRemoteThread" ascii
        $s2 = "VirtualAllocEx" ascii
        $s3 = "WriteProcessMemory" ascii
        $s4 = "NtUnmapViewOfSection" ascii
        $s5 = "IsDebuggerPresent" ascii

    condition:
        Is_PE and
        filesize < 5MB and
        3 of ($s*) and
        not Has_Persistence
}
EOF

# ── TESTING DE REGLAS ──────────────────────────────────
# Escanear colección de malware conocido (debe detectar)
yara regla_completa.yar -r malware_samples/

# Escanear sistema operativo limpio (no debe detectar)
yara regla_completa.yar -r /usr/bin/ /usr/lib/ 2>/dev/null

# Contar falsos positivos
yara regla_completa.yar -r /evidence/ 2>/dev/null | wc -l

# ── REGLA CON PESOS Y CONTADORES ───────────────────────
cat > regla_pesos.yar << 'EOF'
rule Malware_Ponderado {
    strings:
        $api1 = "InternetOpenA" ascii weight 2
        $api2 = "HttpSendRequestA" ascii weight 2
        $api3 = "URLDownloadToFileA" ascii weight 3
        $enc1 = "CryptEncrypt" ascii weight 1
        $enc2 = "CryptGenKey" ascii weight 1
        $perf = "NtQueryInformationProcess" ascii weight 2
        $debug = "CheckRemoteDebuggerPresent" ascii weight 3

    condition:
        uint16(0) == 0x5A4D and
        filesize < 10MB and
        $api3 and
        (
            ($api1 and $api2) or
            ($enc1 and $enc2) or
            $debug
        )
}
EOF

💡Crea una biblioteca de reglas organizada por categoría (ransomware, RATs, banking trojans, etc.) y mantenla actualizada con las reglas de comunidad en https://github.com/Yara-Rules/rules.

Integración automatizada con sandboxes

YARA + Cuckoo, Any.run y pipelines de detección

En entornos profesionales, YARA no se usa manualmente sino integrado en pipelines automatizados de detección.

Integración con sandboxes: • Cuckoo Sandbox ejecuta reglas YARA automáticamente sobre muestras • Any.run muestra coincidencias YARA en la interfaz • Joe Sandbox genera reportes con detecciones YARA

Pipeline de detección típico:

  1. Archivo entra al sandbox → ejecución controlada
  2. Resultados se procesan con reglas YARA
  3. Clasificación automática (malware/benign)
  4. Alerta al SOC con IoCs extraídos
  5. Reglas se actualizan con nuevos patrones

Automatización con scripts: Crea scripts que escaneen directorios periódicamente, generen reportes y envíen alertas.

bash
# ── SCRIPT DE ESCANEO AUTOMATIZADO ─────────────────────
cat > yara_scanner.sh << 'SCRIPT'
#!/bin/bash
# Escáner YARA automatizado para directorios

RULES_DIR="$1"
TARGET_DIR="$2"
REPORT_DIR="./yara_reports/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$REPORT_DIR"

echo "=== ESCANEO YARA AUTOMATIZADO ==="
echo "Reglas: $RULES_DIR"
echo "Objetivo: $TARGET_DIR"
echo "Fecha: $(date)"
echo ""

# Escanear y generar reporte
find "$TARGET_DIR" -type f | while read file; do
    yara -r "$RULES_DIR" "$file" 2>/dev/null
done > "$REPORT_DIR/all_matches.txt"

# Resumen por regla
echo "--- COINCIDENCIAS POR REGLA ---" > "$REPORT_DIR/summary.txt"
cut -f1 "$REPORT_DIR/all_matches.txt" | sort | uniq -c | sort -rn >> "$REPORT_DIR/summary.txt"

# Estadísticas
echo "" >> "$REPORT_DIR/summary.txt"
echo "Total archivos escaneados: $(find $TARGET_DIR -type f | wc -l)" >> "$REPORT_DIR/summary.txt"
echo "Total coincidencias: $(wc -l < $REPORT_DIR/all_matches.txt)" >> "$REPORT_DIR/summary.txt"
echo "Reglas activas: $(ls $RULES_DIR/*.yar 2>/dev/null | wc -l)" >> "$REPORT_DIR/summary.txt"

cat "$REPORT_DIR/summary.txt"
SCRIPT
chmod +x yara_scanner.sh

# ── INTEGRACIÓN CON CRON ───────────────────────────────
# Escanear cada hora un directorio compartido
echo "0 * * * * /opt/scripts/yara_scanner.sh /rules/ /shared/uploads/ >> /var/log/yara_scan.log 2>&1" | sudo tee /etc/cron.d/yara-scan

# ── INTEGRACIÓN CON VOLATILITY ─────────────────────────
# Crear regla desde hallazgo de Volatility
cat > vol_artifact.yar << 'EOF'
rule Detect_Suspicious_Injection {
    meta:
        description = "Detecta código inyectado encontrado con Volatility"
        source = "memory_forensics"

    strings:
        $mz = { 4D 5A }
        $api1 = "VirtualAlloc" ascii
        $api2 = "VirtualProtect" ascii
        $shellcode = { 60 89 E5 31 C0 64 8B 50 30 8B 52 0C 8B 52 14 }

    condition:
        $mz at 0 and filesize < 1MB and
        ($api1 or $api2) and
        $shellcode
}
EOF

# Escanear dumps de memoria extraídos con Volatility
yara vol_artifact.yar ./evidence/*.bin

💡Mantén una carpeta de reglas YARA versionada en Git. Cuando detectes una nueva amenaza, crea una regla y commitea para que todo el equipo la tenga disponible.

Labs Prácticos

Básico 25 min

Lab 1: Crear reglas YARA para detección de malware

Objetivo

Escribir reglas YARA para detectar muestras de malware basándose en strings, patrones hex y condiciones lógicas.

Escenario

Tu equipo de SOC ha identificado una nueva familia de malware que genera tráfico HTTP a un servidor C2 específico. Necesitas crear reglas YARA para detectar esta amenaza en archivos entrantes y en el filesystem de máquinas comprometidas.

Pasos

1

Escribir una regla básica con metadatos y strings de texto

2

Agregar patrones hexadecimales para detección más precisa

3

Crear condiciones lógicas para reducir falsos positivos

4

Validar la regla contra archivos conocidos

bash — práctica
# CREAR REGLA BÁSICA
cat > detect_c2.yar << 'EOF'
rule Detect_C2_EvilServer {
    meta:
        description = "Detecta malware que contacta evil-server.com"
        author = "SOC Team"
        date = "2026-07-23"
        severity = "high"
        reference = "https://threat-intel.example.com/report-123"

    strings:
        $c2_url = "http://evil-server.com/beacon" ascii wide
        $c2_path = "/gate.php" ascii
        $c2_path2 = "/cmd.php" ascii
        $mutex = "Global\Mutex_Malware_v3" ascii

    condition:
        2 of them
}
EOF

# ESCANEAR ARCHIVO SOSPECHOSO
yara detect_c2.yar suspicious_file.exe

# ESCANEAR DIRECTORIO COMPLETO
yara -r detect_c2.yar /tmp/samples/

# ESCANEAR CON DETALLES
yara -s detect_c2.yar suspicious_file.exe
# -s muestra qué strings específicos hicieron match

# REGLA CON PATRONES HEX Y CONDICIONES
cat > detect_shellcode.yar << 'EOF'
rule Detect_Shellcode_Pattern {
    meta:
        description = "Detecta shellcode x86 común"

    strings:
        $shellcode1 = { 60 89 E5 31 C0 64 8B 50 30 8B 52 0C }
        $shellcode2 = { FC E8 82 00 00 00 60 89 E5 31 C0 64 }
        $api_hash = { 8B 45 ?? 03 C1 89 45 ?? 8B 4D }

    condition:
        any of ($shellcode*) or $api_hash
}
EOF

Resultado esperado

La regla detectará el archivo sospechoso por contener las strings del C2. Verás coincidencias con las strings específicas. La regla con shellcode detectará patrones de código de explotación.

Intermedio 35 min

Lab 2: Reglas modulares y automatización

Objetivo

Crear reglas YARA modulares con imports, combinar con Volatility para análisis forense, y automatizar escaneos periódicos.

Escenario

El equipo de IR necesita detectar múltiples amenazas en dumps de memoria y filesystems. Necesitas crear un sistema de reglas modulares que clasifique malware automáticamente y genere reportes.

Pasos

1

Crear reglas privadas reutilizables con imports

2

Desarrollar regla completa para ransomware

3

Integrar YARA con dumps de Volatility

4

Automatizar escaneos con scripts y cron

bash — práctica
# REGLAS MODULARES
cat > base_rules.yar << 'EOF'
private rule Is_PE {
    condition:
        uint16(0) == 0x5A4D
}

private rule Has_Persistence {
    strings:
        $reg1 = "CurrentVersion\\Run" ascii
        $reg2 = "CurrentVersion\\RunOnce" ascii
        $task = "schtasks" ascii wide
    condition:
        any of them
}

private rule Has_Encryption {
    strings:
        $rsa = "RSA" ascii
        $aes = "AES" ascii
        $crypt = "CryptEncrypt" ascii
        $cipher = "cipher" ascii wide
    condition:
        2 of them
}
EOF

# REGLA COMPLETA DE RANSOMWARE
cat > ransomware.yar << 'EOF'
import "pe"

rule Detect_Ransomware {
    meta:
        description = "Detección de ransomware por comportamiento"
        severity = "critical"

    strings:
        $readme1 = "YOUR FILES ARE ENCRYPTED" ascii wide nocase
        $readme2 = "DECRYPT" ascii wide nocase
        $ext = ".locked" ascii
        $vssadmin = "vssadmin delete shadows" ascii wide nocase
        $bcdedit = "bcdedit /set {default} recoveryenabled no" ascii wide nocase

    condition:
        Is_PE and
        filesize < 10MB and
        (
            (2 of ($readme*) and 1 of ($ext, $vssadmin)) or
            ($vssadmin and $bcdedit)
        )
}
EOF

# ESCANEAR CON MÚLTIPLES REGLAS
yara -r rules/ /evidence/ > scan_results.txt

# INTEGRAR CON VOLATILITY
# Dump de memoria extraído con vol.py
python vol.py -f imagen.raw windows.memmap --pid 1234 --dump-dir ./dumps/
yara -r rules/ ./dumps/*.bin > vol_yara_results.txt

# SCRIPT DE AUTOMATIZACIÓN
cat > auto_yara.sh << 'SCRIPT'
#!/bin/bash
RULES="/opt/yara/rules"
TARGETS=("/tmp/suspicious" "/mnt/evidence" "/var/log/uploads")
REPORT="/var/log/yara_$(date +%Y%m%d).log"

echo "=== ESCANEO YARA $(date) ===" > "$REPORT"
for dir in "${TARGETS[@]}"; do
    if [ -d "$dir" ]; then
        echo "--- $dir ---" >> "$REPORT"
        yara -r "$RULES" "$dir" 2>/dev/null >> "$REPORT"
    fi
done

# Enviar alerta si hay coincidencias
if grep -q "^[a-z].*:" "$REPORT"; then
    echo "ALERTA: Coincidencias YARA detectadas" | mail -s "YARA Alert" soc@empresa.com
fi
SCRIPT
chmod +x auto_yara.sh

Resultado esperado

Deberías tener un sistema de reglas modulares que detecte ransomware por comportamiento (vssadmin, cifrado, archivos cifrados) y los dumps de memoria de Volatility escaneados con YARA.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.