Parte: 6 — Análisis de malware · Fuente: Learning Malware Analysis (Monnappa) y MITRE ATT&CK ⏱️ Duración estimada: 110 min · Nivel: Intermedio
Desofuscar y entender malware basado en scripts, hoy dominante en las primeras etapas de intrusión: PowerShell, JScript/JavaScript (WSH), HTA y VBScript. El alumno aprenderá a deshacer capas de ofuscación, reconocer patrones de descarga e inyección en memoria, y usar el logging del propio sistema para reconstruir lo que el script hizo.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Por qué scripts: LOLBins y evasión | Sin binario en disco, menos detección |
| 2 | Ofuscación en PowerShell | Base64, formato, alias, IEX |
| 3 | Reflective loading e inyección | Ejecuta payloads en memoria |
| 4 | JScript/HTA/VBScript (WSH) | Vectores de entrega clásicos |
| 5 | Logging y AMSI | Defensas que ayudan al analista |
| 6 | Desofuscación segura | Sin ejecutar el código malicioso |
| 7 | Extracción de IOCs y TTPs | Detección posterior |
Una parte enorme del malware moderno no es un ejecutable compilado, sino un script —PowerShell,
JavaScript, VBScript—. La razón es estratégica: los scripts usan intérpretes que ya vienen en el
sistema (powershell.exe, wscript.exe, mshta.exe), firmados por Microsoft y de confianza, así que
ejecutar un script no requiere traer un binario que el antivirus detectaría —es living off the land
(Clase 159)—. Además, los scripts se pueden ejecutar
en memoria sin tocar el disco (fileless), son fáciles de ofuscar y de modificar, y a menudo son la
etapa que un maldoc (clase 152) invoca. Analizar malware en scripts es distinto de analizar un binario:
no hay que desensamblar, pero sí desofuscar capas y capas de código deliberadamente ilegible.
PowerShell es la herramienta de scripting favorita del malware en Windows por su potencia: acceso
completo a la API de Windows y a .NET, capacidad de descargar y ejecutar código en memoria, y ubicuidad.
El malware en PowerShell está casi siempre fuertemente ofuscado, y reconocer las técnicas es la mitad
del análisis: codificación Base64 (el clásico powershell -EncodedCommand, que oculta el comando
real), compresión (el script se descomprime en memoria), concatenación y reordenación de cadenas,
sustitución de caracteres, y el uso de alias y sintaxis crípticas. La capacidad más peligrosa es
el reflective loading: PowerShell puede cargar un ensamblado .NET o un DLL directamente en memoria
(sin escribirlo en disco) y ejecutarlo, o inyectar código en otro proceso —todo sin dejar un fichero,
lo que evade las defensas que se fijan en el disco—.
Más allá de PowerShell, Windows ejecuta otros scripts a través del WSH (Windows Script Host):
JScript (la versión Microsoft de JavaScript) y VBScript, que corren con wscript.exe/cscript.exe,
y los HTA (HTML Application), ficheros HTML con scripts que mshta.exe ejecuta con plenos
privilegios (sin las restricciones de un navegador) —un vector muy usado porque un .hta parece una
página web pero puede hacer cualquier cosa—. Todos comparten con PowerShell la lógica: intérprete de
confianza, ofuscación pesada, y a menudo son la etapa intermedia que descarga la carga final. El análisis
es el mismo ejercicio de desofuscación.
El reto central es desofuscar sin ejecutar el código malicioso. La tentación de "simplemente
ejecutarlo para ver qué hace" es peligrosa: hay que hacerlo en el laboratorio aislado (clase 142) o, mejor,
desofuscar estáticamente. La técnica clave es reemplazar el comando de ejecución final (IEX
—Invoke-Expression—, eval) por uno de impresión (Write-Host, console.log), de modo que el
script, en lugar de ejecutar la siguiente capa, la imprima —así se pela la ofuscación capa a capa de
forma segura—. Del lado de la defensa y el logging, Microsoft añadió instrumentación clave: AMSI
(Antimalware Scan Interface) permite al antivirus inspeccionar el script ya desofuscado justo antes
de ejecutarse (el malware ve derrotada su ofuscación en el punto de ejecución, y por eso muchas familias
intentan deshabilitar AMSI —un comportamiento que en sí es un IOC—), y el Script Block Logging de
PowerShell registra el código desofuscado que se ejecuta, dándole al analista y al defensor el script
real aunque llegara ofuscado. El producto del análisis, como siempre, es la extracción de IOCs y TTPs:
las URLs, los comandos, las técnicas ATT&CK usadas. La lección de la clase es que el malware en scripts
cambia el trabajo de "desensamblar código máquina" a "desofuscar capas de script", pero el objetivo es el
mismo —entender qué hace y extraer los indicadores— y que la instrumentación moderna (AMSI, logging) le ha
quitado al scripting parte de su ventaja de invisibilidad.
| Término | Definición concisa |
|---|---|
| Malware en scripts | Malware escrito en PowerShell, JScript, VBScript |
| Intérprete de confianza | powershell/wscript/mshta, firmados por Microsoft |
| PowerShell ofensivo | Acceso a la API y a .NET; carga en memoria |
| EncodedCommand | Comando PowerShell codificado en Base64 |
| Reflective loading | Cargar un ensamblado en memoria sin tocar disco |
| IEX (Invoke-Expression) | Ejecuta una cadena como código |
| WSH | Windows Script Host; ejecuta JScript y VBScript |
| HTA | HTML Application ejecutada por mshta con plenos privilegios |
| Desofuscación segura | Imprimir en vez de ejecutar cada capa |
| Pelado por capas | Revelar la ofuscación una capa cada vez |
| AMSI | Interfaz que inspecciona el script desofuscado |
| Deshabilitar AMSI | Intento del malware de cegar la inspección; es un IOC |
| Script Block Logging | Registra el código PowerShell desofuscado |
| TTP | Tácticas, técnicas y procedimientos del atacante |
Invoke).⚠️ Nota ética y de seguridad: desofusca sin ejecutar el código. Sustituye
IEX/evalpor impresión en pantalla y trabaja en la VM aislada. Ejecutar el script para "ver qué hace" puede detonar la infección real; usa logging y análisis estático primero.
PowerShell ofuscado:
-enc (base64 UTF-16LE), -join, [char], (backticks), Replace, Format.From Base64 + Decode text UTF-16LE).IEX final por Write-Output para revelar la siguiente capa sin ejecutarla. Repite hasta el código limpio.Net.WebClient.DownloadString, Reflection.Assembly, shellcode en [Byte[]], VirtualAlloc/CreateThread (inyección).JScript/HTA:
js-beautify y analiza con box-js (que emula WSH y registra las llamadas) para capturar URLs y comandos sin ejecutarlo de verdad.T1059.001 PowerShell, T1059.007 JavaScript).box-js sobre un JScript y extrae la URL de segunda etapa.IEX en Write-Output y justifica por qué es más seguro.Desofusca un script malicioso (PowerShell o JScript) hasta su forma legible y entrega la cadena de ejecución con la URL/payload de segunda etapa y los IOCs, sin haberlo ejecutado. Criterio de aceptación: muestras el código final desofuscado y explicas cada capa de ofuscación deshecha, con al menos un IOC (URL/comando) verificado en el lab vía INetSim.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Ejecutar el script "para ver" | Detona la infección; desofusca estáticamente o con box-js |
| Base64 da basura | Es UTF-16LE; ajusta el decode en CyberChef |
| Sin ScriptBlock logs | No estaba activado; habilítalo por GPO antes de detonar en lab |
| box-js no resuelve la URL | Emulación incompleta; combina con lectura manual |
| Perder capas de ofuscación | Ve capa por capa reemplazando el ejecutor por print |
❓ ¿Por qué tanto malware en PowerShell? Está firmado y preinstalado (LOLBin), ejecuta en memoria y ofusca fácilmente, reduciendo la detección basada en archivos.
❓ ¿AMSI lo detiene todo? No; existen técnicas de bypass. Aun así, AMSI y el ScriptBlock Logging entregan al defensor el contenido desofuscado, muy útil para el análisis.
❓ ¿Puedo confiar en box-js? Es una gran ayuda para JScript, pero emula un subconjunto; complementa siempre con lectura manual del código.
Clase 152 — Análisis de documentos maliciosos: macros y PDF