Caso de Estudio: Analisis Forense de Memoria de un Sistema Infectado
Caso de estudio completo de analisis forense de memoria. Walkthrough paso a paso desde la adquisicion de un volcado de un sistema Windows infectado hasta la identificacion de la familia de malware, reconstruccion de la cadena de ataque, extraccion de IOCs y elaboracion del informe final.
Escenario del incidente
Es martes a las 15:47 UTC. El SOC de una empresa de servicios financieros recibe una alerta del EDR: actividad sospechosa de PowerShell en la estacion de trabajo de un analista financiero (WKSTN-FIN-042). La alerta indica ejecucion de PowerShell con parametros de ofuscacion desde un proceso de Microsoft Word.
El analista SOC de turno verifica que el usuario reporto haber abierto un documento Excel recibido por email de un "proveedor habitual" hace aproximadamente 20 minutos. El documento pedia habilitar macros para "visualizar el contenido correctamente".
El equipo DFIR decide aislar la estacion de red inmediatamente pero mantenerla encendida para adquirir la memoria. Llegan al puesto del usuario en 8 minutos.
Fase 1: Adquisicion
El responder conecta una unidad USB preparada con DumpIt y ejecuta el volcado:
DumpIt.exe /O E:\WKSTN-FIN-042-20260601-1555.raw /T RAW
Datos de la adquisicion:
- Sistema: Windows 11 Pro 23H2, 16 GB RAM
- Hora de inicio: 15:55:12 UTC
- Hora de fin: 15:58:47 UTC
- Tamano del dump: 16.384 MB
- Hash SHA256: a3f2b1c4d5e6f7890123456789abcdef01234567890abcdef01234567890abcd
Se documenta la cadena de custodia, se fotografa la pantalla y se anota que el sistema estaba en la pantalla de escritorio normal sin ventanas visibles sospechosas.
Fase 2: Identificacion del sistema
vol -f WKSTN-FIN-042.raw windows.info
Variable Value
Kernel Base 0xf8000000000
DTB 0x1ad000
Is64Bit True
IsPAE False
primary WindowsIntel32e
memory_model 64bit
MajorOperatingSystemVersion 10
MinorOperatingSystemVersion 0
MachineType 34404
NtBuildNumber 22631
Windows 11 23H2 (Build 22631), 64 bits. Volatility encuentra los simbolos automaticamente.
Fase 3: Analisis de procesos
Vista general con pstree
vol -f WKSTN-FIN-042.raw windows.pstree
Extracto relevante del arbol:
PID PPID ImageFileName CreateTime
...
** 3100 620 explorer.exe 2026-06-01 08:15:30
*** 4200 3100 chrome.exe 2026-06-01 08:20:00
*** 5500 3100 EXCEL.EXE 2026-06-01 15:25:10
**** 5600 5500 cmd.exe 2026-06-01 15:25:15
***** 5700 5600 powershell.exe 2026-06-01 15:25:16
****** 5800 5700 rundll32.exe 2026-06-01 15:25:45
*** 6100 3100 notepad.exe 2026-06-01 15:40:00
Hallazgos inmediatos:
- EXCEL.EXE (PID 5500) lanzo cmd.exe (PID 5600), que lanzo powershell.exe (PID 5700). Esta cadena es el patron clasico de explotacion de macro.
- PowerShell lanzo rundll32.exe (PID 5800), que es un patron comun de ejecucion de payloads.
- Todos los procesos sospechosos se crearon entre 15:25:10 y 15:25:45, una ventana de 35 segundos. La infeccion fue rapida y automatizada.
Lineas de comandos
vol -f WKSTN-FIN-042.raw windows.cmdline
Hallazgos:
PID Process CommandLine
5500 EXCEL.EXE "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" "C:\Users\JGarcia\Downloads\Factura_Proveedor_2026.xlsm"
5600 cmd.exe cmd.exe /c powershell -nop -w hidden -enc UwBlAHQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQA...
5700 powershell.exe powershell -nop -w hidden -enc UwBlAHQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQA...
5800 rundll32.exe C:\Windows\System32\rundll32.exe C:\Users\JGarcia\AppData\Local\Temp\update.dll,DllMain
Indicadores criticos:
- Fichero origen: Factura_Proveedor_2026.xlsm (.xlsm = macro habilitada). Descargado a Downloads.
- PowerShell ofuscado: parametros
-nop(no profile),-w hidden(ventana oculta),-enc(Base64). Patron tipico de payload de primera etapa. - rundll32.exe ejecutando una DLL desde Temp: carga de segunda etapa. La DLL update.dll en AppData\Local\Temp es el payload real.
Fase 4: Analisis de red
vol -f WKSTN-FIN-042.raw windows.netscan | grep -E "ESTABLISHED|LISTENING"
Conexiones relevantes:
Proto LocalAddr LocalPort ForeignAddr ForeignPort State PID Owner
TCPv4 192.168.10.42 49832 185.220.101.45 443 ESTABLISHED 5800 rundll32.exe
TCPv4 192.168.10.42 49850 192.168.10.10 445 ESTABLISHED 5800 rundll32.exe
TCPv4 192.168.10.42 49851 192.168.10.15 445 ESTABLISHED 5800 rundll32.exe
TCPv4 192.168.10.42 49900 192.168.10.10 389 ESTABLISHED 5800 rundll32.exe
TCPv4 192.168.10.42 49200 13.107.42.14 443 CLOSED 4200 chrome.exe
Hallazgos:
- rundll32.exe (PID 5800) tiene C2 activo con 185.220.101.45:443. Esta IP debe verificarse en bases de threat intel.
- Movimiento lateral en progreso: rundll32.exe tiene conexiones SMB (puerto 445) a dos servidores internos (10.10 y 10.15).
- Consulta LDAP (puerto 389) al controlador de dominio (10.10). El atacante esta enumerando el Active Directory.
- La conexion de Chrome a Microsoft (13.107.42.14) es legitima (servicios cloud de Office).
Fase 5: Codigo inyectado
vol -f WKSTN-FIN-042.raw windows.malfind --pid 5800
PID Process Start Protection Hexdump
5800 rundll32.exe 0x000001f0a000 PAGE_EXECUTE_READWRITE
4d 5a 90 00 03 00 00 00 MZ......
04 00 00 00 ff ff 00 00 ........
Cabecera MZ en memoria privada de rundll32.exe. El proceso fue hollowed o tiene un PE inyectado adicionalmente.
vol -f WKSTN-FIN-042.raw windows.malfind --pid 5800 --dump
Extraemos la region y calculamos el hash:
sha256sum pid.5800.vad.0x1f0a000.dmp
# f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3
Buscamos el hash en MalwareBazaar y ThreatFox. Resultado: sin coincidencia directa (variante nueva o custom).
Ejecutamos YARA:
yara malware_rules.yar pid.5800.vad.0x1f0a000.dmp
CobaltStrike_Beacon_Encoded pid.5800.vad.0x1f0a000.dmp
Coincidencia con reglas YARA de Cobalt Strike. El payload es un beacon de Cobalt Strike.
Fase 6: DLLs y handles
vol -f WKSTN-FIN-042.raw windows.dlllist --pid 5800
DLLs sospechosas cargadas por rundll32.exe:
Base Size Name Path
0x00007ff12340 0x4e000 update.dll C:\Users\JGarcia\AppData\Local\Temp\update.dll
0x00007ffb09120 0x9e000 ws2_32.dll C:\Windows\System32\ws2_32.dll
0x00007ffb0a230 0x25000 winhttp.dll C:\Windows\System32\winhttp.dll
update.dll es la DLL que se cargo via la linea de comandos. ws2_32.dll y winhttp.dll indican capacidad de red (coherente con el C2 observado).
vol -f WKSTN-FIN-042.raw windows.handles --pid 5800 --object-type Mutant
Offset PID Type HandleValue Name
0xfa800... 5800 Mutant 0x1d0 \Sessions\1\BaseNamedObjects\MSCTF.Shared.MUTEX.ZZZ
El mutex MSCTF.Shared.MUTEX.ZZZ no es un mutex estandar de Microsoft. Buscando en bases de IOCs: mutex asociado a Cobalt Strike con configuracion especifica.
vol -f WKSTN-FIN-042.raw windows.handles --pid 5800 --object-type Process
Offset PID Type HandleValue Name
0xfa800... 5800 Process 0x1f0 lsass.exe Pid 700
rundll32.exe tiene un handle abierto a lsass.exe. Esto confirma intento de volcado de credenciales.
Fase 7: Registro y persistencia
vol -f WKSTN-FIN-042.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run"
REG_SZ WindowsSecurityUpdate : "rundll32.exe C:\Users\JGarcia\AppData\Local\Temp\update.dll,DllMain"
Persistencia establecida via clave Run. El malware se ejecutara cada vez que el usuario inicie sesion.
vol -f WKSTN-FIN-042.raw windows.registry.printkey --key "ControlSet001\Services"
No se encontraron servicios maliciosos. El atacante uso solo Run key (persistencia de nivel usuario, no sistema).
Fase 8: Extraccion de credenciales
vol -f WKSTN-FIN-042.raw windows.hashdump
User RID nthash
Administrator 500 31d6cfe0d16ae931b73c59d7e0c089c0
JGarcia 1001 a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
svc_backup 1002 f1e2d3c4b5a6f7e8d9c0b1a2f3e4d5c6
Los hashes NTLM del sistema local fueron potencialmente accesibles al atacante. El hash de svc_backup es particularmente preocupante si esa cuenta tiene acceso a datos sensibles.
Fase 9: Timeline y reconstruccion
Basandonos en todos los hallazgos, la timeline del incidente:
| Hora (UTC) | Evento | Evidencia |
|---|---|---|
| 15:25:10 | Usuario abre Factura_Proveedor_2026.xlsm | cmdline EXCEL.EXE |
| 15:25:12 | Macro maliciosa se ejecuta | Macro habilita contenido |
| 15:25:15 | cmd.exe lanzado desde Excel | pstree: EXCEL -> cmd |
| 15:25:16 | PowerShell ofuscado ejecutado | cmdline: -enc Base64 |
| 15:25:30 | update.dll descargado a Temp | DLL en dlllist |
| 15:25:45 | rundll32.exe carga update.dll | cmdline rundll32 |
| 15:25:46 | Cobalt Strike beacon activo | malfind + YARA match |
| 15:25:50 | C2 establecido con 185.220.101.45 | netscan ESTABLISHED |
| 15:26:00 | Persistencia via Run key | printkey Run |
| 15:30:00 | Handle a lsass.exe (credential dump) | handles Process |
| 15:35:00 | Enumeracion LDAP del AD | netscan :389 |
| 15:40:00 | Movimiento lateral via SMB a 10.10 y 10.15 | netscan :445 |
Fase 10: IOCs extraidos
Indicadores de red
- IP C2: 185.220.101.45 (puerto 443/TCP)
- Movimiento lateral: 192.168.10.10, 192.168.10.15 (SMB)
Indicadores de host
- Fichero: C:\Users\JGarcia\AppData\Local\Temp\update.dll
- Hash SHA256: f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3
- Mutex: MSCTF.Shared.MUTEX.ZZZ
- Clave de registro: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\WindowsSecurityUpdate
- Fichero macro: Factura_Proveedor_2026.xlsm
TTPs MITRE ATT&CK
- T1566.001: Phishing con documento macro (Initial Access)
- T1059.001: PowerShell (Execution)
- T1218.011: Rundll32 (Defense Evasion)
- T1055: Process Injection (Defense Evasion)
- T1071.001: HTTPS C2 (Command and Control)
- T1547.001: Registry Run Key (Persistence)
- T1003.001: LSASS credential dump (Credential Access)
- T1021.002: SMB lateral movement (Lateral Movement)
- T1087.002: Domain Account Discovery via LDAP (Discovery)
Atribucion
Cobalt Strike beacon con watermark y configuracion C2 especifica. Cobalt Strike es una herramienta comercial de pentesting ampliamente usada por grupos criminales (especialmente operadores de ransomware) y algunos APTs.
Fase 11: Acciones inmediatas
Basandonos en los hallazgos:
- Contener: aislar WKSTN-FIN-042, 192.168.10.10 y 192.168.10.15 de la red.
- Bloquear: IP 185.220.101.45 en firewall perimetral y proxy.
- Resetear credenciales: cuenta JGarcia y svc_backup inmediatamente.
- Verificar: si las credenciales de svc_backup dan acceso a backups/datos sensibles.
- Analizar: volcados de memoria de 10.10 y 10.15 para determinar alcance del movimiento lateral.
- Buscar: el fichero Factura_Proveedor_2026.xlsm en el servidor de email para identificar si otros empleados lo recibieron.
- Monitorizar: trafico hacia 185.220.101.45 y el mutex en todos los endpoints via EDR.
Leccion aprendida
Este caso ilustra por que el analisis de memoria es insustituible. El EDR detecto la actividad de PowerShell, pero sin la memoria no hubieramos podido:
- Confirmar que el payload era Cobalt Strike.
- Identificar el C2 exacto.
- Descubrir el movimiento lateral en progreso.
- Verificar que las credenciales de lsass fueron accedidas.
- Encontrar el mecanismo de persistencia especifico.
- Extraer IOCs para buscar en el resto de la infraestructura.
El volcado de memoria capturo 35 minutos de actividad maliciosa en una sola fuente de evidencia coherente. Ningun log individual contenia toda esta informacion.
Proximo paso
El ultimo articulo de la serie cubre la automatizacion del analisis de memoria: scripts Python con Volatility, pipelines CI/CD de analisis automatico, YARA scanning de memoria, y como integrar memory forensics en el workflow de respuesta a incidentes de un SOC.
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Analisis de Procesos en Memoria Windows: pslist, pstree y Deteccion de Anomalias
Malfind y Deteccion de Code Injection en Memoria con Volatility 3
Conexiones de Red en Memoria: netscan y Deteccion de Comunicaciones C2
Adquisicion de Imagen Forense de Disco: dd, dc3dd, FTK Imager y Formato E01
Browser Forensics: Analisis Forense de Chrome y Firefox
Cadena de Custodia Digital: Preservacion de Evidencia Electronica
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.