Como Extraer IOCs de Malware con Analisis Estatico: Guia Practica
Guia paso a paso para extraer Indicadores de Compromiso (IOCs) de muestras de malware usando analisis estatico. Hashes, strings, IPs, dominios, registry keys y mutex con herramientas gratuitas.
Por Que Extraer IOCs de Malware
Cuando un equipo de respuesta a incidentes recibe una muestra de malware, una de las primeras tareas es extraer sus Indicadores de Compromiso (IOCs): los hashes, IPs, dominios, registry keys y otros artifacts que permiten detectar esa misma amenaza en otros sistemas.
El analisis estatico (sin ejecutar el malware) es el primer paso porque es rapido, seguro y reproducible. No necesitas un sandbox, no hay riesgo de infeccion, y los resultados son deterministas.
En esta guia cubrimos el flujo completo: desde generar el hash hasta construir una regla YARA.
Antes de Empezar: El Entorno
Nunca analices malware en tu maquina de trabajo. Usa:
- REMnux: distribucion Linux especializada en analisis de malware (basada en Ubuntu)
- FlareVM: entorno Windows con herramientas de analisis preinstaladas
- VM aislada: cualquier VM sin acceso a red de produccion
Haz un snapshot antes de empezar. Si algo sale mal, restauras en segundos.
Paso 1: Generar Hashes del Archivo
Lo primero es obtener los hashes criptograficos. Son la huella digital unica del sample.
# Linux / macOS
md5sum sample.exe
sha1sum sample.exe
sha256sum sample.exe
# O todos a la vez
file sample.exe && md5sum sample.exe && sha256sum sample.exe
En Windows, HashMyFiles (Nirsoft) permite arrastrar y soltar archivos para obtener MD5, SHA1 y SHA256 simultaneamente.
Que hacer con el hash:
- Buscar en VirusTotal antes de analizar mas. Si ya esta reportado, tendras contexto inmediato
- Buscar en MalwareIntel via IOC Lookup para ver si pertenece a una familia conocida
- Documentar el hash como primer IOC del analisis
Los hashes estan en la base de la Piramide del Dolor: son triviales de cambiar para el atacante (basta recompilar), pero son esenciales para el tracking inicial.
Paso 2: Extraer Strings
Los strings son cadenas de texto legibles embebidas en el binario. Aqui es donde encuentras IPs de C2, URLs de descarga, rutas de archivos, y mutex names.
Herramientas
Sysinternals Strings (Windows):
strings.exe -n 6 sample.exe > strings_output.txt
GNU strings (Linux):
strings -n 6 sample.exe > strings_output.txt
FLOSS (FireEye Labs Obfuscated String Solver): extrae strings ofuscados que strings no detecta:
floss sample.exe > floss_output.txt
Filtrar IOCs de los Strings
Los strings en bruto contienen mucho ruido. Filtra por patrones:
IPs (IPv4):
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' strings_output.txt | sort -u
Dominios/FQDNs:
grep -oE '[a-zA-Z0-9][-a-zA-Z0-9]*\.(com|net|org|io|ru|cn|top|xyz|tk|info|cc)' strings_output.txt | sort -u
URLs:
grep -oE 'https?://[^ "]+' strings_output.txt | sort -u
Registry keys:
grep -iE 'HKEY_|HKLM|HKCU|CurrentVersion\\Run' strings_output.txt
File paths de Windows:
grep -iE 'C:\\|%APPDATA%|%TEMP%|\\Users\\' strings_output.txt
Mutex names:
# Los mutex suelen tener nombres unicos y aparecen junto a CreateMutex
grep -i 'mutex\|Global\\' strings_output.txt
Usando pev para Red
La suite pev tiene un modulo especifico para extraer indicadores de red:
pestr --net sample.exe
Esto extrae IPs, dominios y URLs directamente, sin necesidad de regex manual.
Paso 3: Analizar la Cabecera PE
La cabecera PE (Portable Executable) contiene metadata valiosa:
# Con pev
readpe sample.exe
# Con Python pefile
python3 -c "
import pefile
pe = pefile.PE('sample.exe')
print(f'Compile time: {pe.FILE_HEADER.TimeDateStamp}')
print(f'Sections: {[s.Name.decode().strip(chr(0)) for s in pe.sections]}')
print(f'Imports: {[e.dll.decode() for e in pe.DIRECTORY_ENTRY_IMPORT]}')
"
Que buscar:
| Campo | Que indica |
|---|---|
| Timestamp compilacion | Cuando se compilo (puede estar falsificado) |
| Secciones con nombres raros | Packers o protectores (UPX, Themida) |
| Imports sospechosos | VirtualAlloc, CreateRemoteThread, WriteProcessMemory = injection |
| Ratio entropia alta | Contenido cifrado o empaquetado |
| Resources con PE embebido | Dropper con payload dentro |
Paso 4: Clasificar los IOCs Extraidos
No todos los IOCs tienen el mismo valor. Clasifica segun la Piramide del Dolor:
| IOC extraido | Tipo | Pain level | Accion |
|---|---|---|---|
| SHA256 del sample | Hash | Trivial | Blocklist + buscar en VT |
| IP 185.x.x.x contactada | IP | Trivial | Bloquear en firewall (24-72h) |
| evil-domain.top | Dominio | Manejable | Bloquear + PDNS historico |
| /update.php?id= | Network artifact | Disruptivo | Regla IDS/IPS |
| HKCU\Software\Microsoft\Windows\CurrentVersion\Run\svchost | Registry | Disruptivo | Regla EDR |
| Global\MutexRAT2026 | Mutex | Disruptivo | Deteccion en memoria |
Paso 5: Construir una Regla YARA
Con los strings significativos, construye una regla YARA para detectar variantes de la misma familia:
rule MalwareFamily_Example {
meta:
author = "TuEquipo"
description = "Detecta variantes de ExampleRAT"
date = "2026-06-02"
hash = "a1b2c3d4..."
strings:
$mutex = "Global\\MutexRAT2026"
$c2_pattern = "/update.php?id="
$registry = "CurrentVersion\\Run\\svchost"
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0)"
condition:
uint16(0) == 0x5A4D and // Es un PE
2 of ($mutex, $c2_pattern, $registry, $user_agent)
}
Una regla YARA esta en la cima de la utilidad: detecta toda la familia, no solo un sample. Es un IOC computado que persiste incluso cuando el atacante recompila.
Paso 6: Documentar y Compartir
Estructura tu reporte de IOCs para que sea accionable:
# IOC Report: ExampleRAT
## Hashes
- SHA256: a1b2c3d4...
- MD5: e5f6g7h8...
## Network
- C2: 185.x.x.x:443
- C2 domain: evil-domain.top
- URI pattern: /update.php?id={`<base64>`}
- User-Agent: Mozilla/4.0 (compatible; MSIE 6.0)
## Host
- Mutex: Global\MutexRAT2026
- Persistence: HKCU\...\Run\svchost
- Drop path: %APPDATA%\Microsoft\svchost.exe
## YARA Rule
[adjuntar regla]
## MITRE ATT&CK
- T1566.001 Spearphishing Attachment (vector)
- T1055 Process Injection (ejecucion)
- T1547.001 Registry Run Keys (persistencia)
- T1071.001 Web Protocols (C2)
Herramientas Recomendadas (Todas Gratuitas)
| Herramienta | Uso | Plataforma |
|---|---|---|
| HashMyFiles | Generar hashes | Windows |
| Sysinternals Strings | Extraer strings | Windows |
| FLOSS | Strings ofuscados | Cross-platform |
| pev (pestr, readpe) | Analisis PE + red | Linux |
| YARA | Crear reglas deteccion | Cross-platform |
| MalwareIntel Tools | Hash generator, IOC lookup | Web (navegador) |
| VirusTotal | Verificar hashes y URLs | Web |
| REMnux | Entorno analisis completo | Linux VM |
Limitaciones del Analisis Estatico
El analisis estatico no lo ve todo:
- Malware empaquetado/ofuscado: strings estan cifrados, necesitas desempaquetar primero
- Carga dinamica: DLLs descargadas en runtime no aparecen en imports estaticos
- Configuracion remota: C2 IPs pueden descargarse del servidor, no estar hardcoded
- Anti-analisis: algunos samples detectan VMs y cambian comportamiento
Para estos casos, necesitas analisis dinamico (sandbox): ejecutar el sample en entorno controlado y observar su comportamiento real. Pero el estatico sigue siendo el punto de partida esencial.
Nota de seguridad: Nunca subas muestras que contengan informacion corporativa confidencial a plataformas publicas como VirusTotal. Los samples subidos quedan disponibles para otros investigadores. Si necesitas analisis privado, usa un sandbox local o un servicio con retencion de datos controlada.
Preguntas frecuentes
Artículos relacionados
Pirámide del Dolor: Por Qué los TTPs Valen Más que los IOCs
Que Hace Valioso un IOC: Los 4 Criterios que Separan Inteligencia de Ruido
Guía Práctica de VirusTotal: Análisis de Archivos, URLs y Hashes
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.