Ghost AcademyGhostForensics · Ghost Academy
GhostForensicsMódulo 13Caso práctico

Análisis de malware estático

El módulo 11 extrajo mimikatz.exe directamente de la captura de red. Este módulo lo analiza sin ejecutarlo nunca: solo examinando su estructura, su contenido textual y comparándolo contra bases de datos conocidas. Es siempre el primer paso antes de plantearse una ejecución controlada (módulo 14) — más rápido, sin riesgo, y suficiente en la mayoría de los casos para confirmar qué es una muestra.

Objetivos de la unidad
📦 Caso práctico descargable

Descarga el paquete de evidencia, descomprímelo y lee el LEEME.md antes de empezar. Verifica el hash según el módulo 2 antes de analizar nada:

Hashes de referencia (ver también LEEME.md):

⬇️ Descargar M13_MalwareEstatico.zip   Ver solución paso a paso →

1. Estático vs dinámico

El análisis estático examina un fichero sin ejecutarlo: estructura, contenido, metadatos. El análisis dinámico (módulo 14) lo ejecuta en un entorno controlado y observa su comportamiento. El orden importa: el estático es más rápido, sin ningún riesgo de infectar el entorno de análisis, y a menudo ya resuelve el caso — el dinámico se reserva para cuando el estático no basta (muestra muy ofuscada, packer desconocido, comportamiento que solo se revela en ejecución).

2. Primer paso siempre: hash y reputación

Antes de abrir el fichero con cualquier herramienta, se calcula su hash y se consulta contra bases de datos de malware conocido — exactamente el mismo hash SHA-1 que ya aparecía en Amcache en el módulo 5, ahora calculado directamente sobre la muestra:

analista@lab (salida real)
$ sha256sum mimikatz.exe
7a3f9c1e8b2d4a5f6c8e9b1a2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e  mimikatz.exe
Subir una muestra a VirusTotal la hace pública para siempre. Si el malware es dirigido específicamente contra la organización investigada (no una familia genérica ya conocida), subir la muestra puede avisar al propio atacante de que se ha detectado. La práctica correcta es primero consultar el hash (sin subir el fichero) para ver si ya es conocido; solo subir el binario completo si el caso y las políticas de la organización lo permiten explícitamente.

3. Strings: qué revela el texto legible de un binario

Incluso un binario compilado contiene fragmentos de texto legible: mensajes de error, nombres de funciones, URLs, direcciones IP, nombres de mutex, rutas de ficheros. Extraerlos es, a menudo, la forma más rápida de hacerse una primera idea de qué hace una muestra:

analista@lab (salida real)
$ strings mimikatz.exe | grep -iE "http|\.exe|mutex|CreateRemoteThread"
http://203.0.113.44/stage3.ps1
sekurlsa::logonpasswords
Global\mk_mutex_8821
CreateRemoteThread
VirtualAllocEx

sekurlsa::logonpasswords es un comando característico de Mimikatz (volcado de credenciales desde lsass.exe), y conecta directamente con la anomalía de jerarquía de procesos que ya se detectó en el módulo 9: svc_update.exe colgando de lsass.exe empieza a tener una explicación mucho más concreta.

4. Estructura PE: secciones, imports, marca de tiempo

El formato PE (Portable Executable) es la estructura de cualquier .exe o .dll de Windows. Una herramienta como PEStudio la desglosa sin ejecutar nada:

CampoQué aporta
Secciones (.text, .data, .rsrc...)Tamaño y entropía de cada una; una sección de código con entropía muy alta suele indicar compresión o cifrado (packing, punto 7).
Imports (funciones de la API de Windows que el ejecutable usa)Un indicador directo de capacidades: VirtualAllocEx + WriteProcessMemory + CreateRemoteThread juntas son prácticamente la firma textual de inyección de código en otro proceso — la misma técnica que malfind detectaba en memoria en el módulo 9, ahora visible en el propio binario antes de ejecutarlo.
Marca de tiempo de compilaciónPuede estar falsificada deliberadamente, pero cuando no lo está da una pista de cuándo se construyó la muestra.
Firma digitalUn ejecutable sin firmar, o firmado con un certificado robado o revocado, es más sospechoso que uno firmado por un fabricante reconocido — aunque la ausencia de firma por sí sola no prueba nada.

5. YARA: reglas de detección por patrón

YARA permite describir, en forma de regla, los patrones de texto o de bytes que caracterizan a una familia de malware, y aplicarla contra un fichero o un directorio completo de muestras:

analista@lab (salida real)
$ cat mimikatz_detect.yar
rule Mimikatz_Indicadores {
    strings:
        $s1 = "sekurlsa::logonpasswords"
        $s2 = "mimikatz" nocase
        $api1 = "CreateRemoteThread"
    condition:
        2 of them
}
analista@lab (salida real)
$ yara mimikatz_detect.yar mimikatz.exe
Mimikatz_Indicadores mimikatz.exe

La regla detecta la muestra con dos de los tres indicadores presentes, exactamente los mismos que se extrajeron manualmente con strings en el punto 3 — YARA automatiza y repite de forma consistente lo que, de otro modo, habría que verificar a mano en cada muestra nueva.

6. CyberChef: deofuscar sin escribir código

Cuando las cadenas de un binario (o de un script, como el stage2.ps1 del módulo 11) están codificadas —Base64, XOR con una clave de un byte, hexadecimal anidado—, CyberChef permite encadenar operaciones de decodificación visualmente, sin necesidad de escribir un script propio para cada caso.

🧰 Guided Lab relacionado (Ghost Academy)

Laboratorio guiado ya publicado en Ghost Academy que puedes usar para practicar esta herramienta:

CyberChef

7. Empaquetado (packing): por qué complica el análisis estático

Un packer comprime o cifra el código real de un ejecutable y antepone una pequeña rutina que lo descomprime en memoria justo antes de ejecutarlo. El resultado es que strings y PEStudio ven muy poco —el código real no está legible en el fichero en disco— hasta que el programa se ejecuta de verdad.

Indicio de empaquetadoPor qué
Entropía muy alta en una sección de códigoDatos comprimidos o cifrados tienen una distribución de bytes mucho más uniforme que código máquina normal.
Muy pocos imports visiblesLa mayoría de las llamadas a la API de Windows están ocultas dentro de la parte empaquetada, no en la tabla de imports visible.
Firma de packer conocidaPackers populares como UPX dejan cabeceras de sección reconocibles (UPX0, UPX1).

Una muestra empaquetada es precisamente el caso en el que el análisis estático deja de bastar y hace falta pasar al análisis dinámico del módulo 14: ejecutarla en un entorno controlado para que se desempaquete sola y observar qué hace realmente en memoria.

Autoevaluación

  1. ¿Por qué se consulta primero el hash antes de subir una muestra completa a VirusTotal?
  2. ¿Qué tres funciones de la API de Windows, vistas juntas en los imports de un binario, son indicio casi directo de inyección de código?
  3. En este capítulo, ¿qué cadena extraída con strings conecta directamente con la anomalía detectada en memoria en el módulo 9?
  4. ¿Qué condición exige la regla YARA de ejemplo para considerar que una muestra coincide, y cuántos de sus patrones encontró en mimikatz.exe?
  5. ¿Por qué una muestra empaquetada obliga a pasar del análisis estático al dinámico?