Initial Access Simulado: Macros, LNK e ISO en un Lab Windows 11 Aislado
Reproducimos tres vectores clasicos de initial access en un lab Windows 11 cerrado para entender que registra realmente el EDR y donde falla la deteccion.
Quien trabaja en red team sabe que initial access sigue siendo el capitulo mas terco del playbook. Las macros de Office se declararon muertas en 2022 cuando Microsoft bloqueo VBA por defecto en archivos de internet, y aun asi, en 2025, Mandiant siguio mapeando campanas de Storm-0978 entregando .docm via HTML smuggling. Montamos un lab con Windows 11 23H2, Defender for Endpoint en modo audit y Sysmon 15 con la configuracion de SwiftOnSecurity para reproducir tres vectores: macro VBA clasica, archivo LNK con argumentos ofuscados e ISO con LNK mas DLL side-loading. Todo offline, VLAN aislada, snapshot antes de cada ejecucion. El objetivo no fue romper el EDR, fue entender que registra realmente.
El primer test fue la macro. Generamos un .docm con AutoOpen llamando a WScript.Shell para descargar un payload via certutil. Mark-of-the-Web activo, Defender bloqueo antes del prompt. Quitando MOTW con un Alternate Data Stream limpio (powershell -Command "Clear-Content -Stream Zone.Identifier"), la macro ejecuto. En Sysmon EventID 1 vimos winword.exe creando cmd.exe con la command line completa, y EventID 3 con la conexion saliendo en el puerto 80. Esto encaja con la regla Sigma proc_creation_win_office_susp_child_processes que muchas equipos ya tienen. Para entender el pipeline defensivo de punta a punta vale revisitar Threat Hunting con Sigma y Elastic: Del Indicador a la Regla de Deteccion y cruzar con Hunting de Living-off-the-Land Binaries en Windows con KQL, porque el problema rara vez es que la regla no exista, sino que no este habilitada en produccion.
Vector dos: LNK. Generamos un acceso directo con target apuntando a powershell.exe -nop -w hidden -enc
Vector tres fue el mas exitoso fingiendo ser benigno: ISO con LNK mas DLL legitima vulnerable a side-loading. Adjuntamos la ISO via mount automatico (comportamiento por defecto del Explorer en Windows 11). El usuario ve solo un "PDF" que en realidad es el LNK llamando a una copia renombrada de OneDriveStandaloneUpdater.exe que carga nuestra version.dll del mismo directorio. Como el binario firmado por Microsoft es quien hace LoadLibrary, la telemetria de EventID 7 (Image loaded) muestra la DLL no firmada, pero el parent process es legitimo. Defender no alerto. Hubo que habilitar Attack Surface Reduction con la regla Block untrusted unsigned processes that run from USB y ajustarla para mounted images, algo que Adversary Emulation con Caldera y MITRE ATT&CK en Laboratorio Corporativo tambien cubre en detalle.
Lo que aprendimos mirando los tres tests lado a lado: la deteccion depende mas de configuracion que de producto. Sysmon sin schema correcto, PowerShell sin ScriptBlockLogging, ASR eternamente en audit, MOTW ignorado por archivos extraidos con 7zip viejo. Cada uno de esos puntos convierte un vector visible en un vector ciego. Vale recordar que nada de esto es nuevo, todos los comportamientos estan mapeados en T1566.001, T1204.002 y T1574.002 de MITRE ATT&CK, y existen desde hace anos. Equipos que aun no construyeron el ciclo descrito en Purple Team en la Practica: Construyendo Ciclo de Feedback Red vs Blue van a seguir redescubriendo estas brechas en vez de cerrarlas de una vez.
Tambien probamos la cadena completa levantando un C2 minimalista para validar callback, en otra VLAN para no mezclar trafico de simulacion con trafico de gestion. Los detalles operacionales de esa parte estan en Construyendo Infra de C2 con Sliver en Lab Aislado para Estudio Defensivo, que ya documentamos. El punto importante es que initial access no termina en la ejecucion, termina en el beacon estable; y cada salto desde alli tiene su propia ventana de deteccion. Si solo miras EventID 1 de Sysmon y no correlacionas con DNS, TLS JA3 y flujos de salida, te pierdes la mitad de la historia.
Takeaway practico: no gastes un sprint reescribiendo ofuscacion de macros si tu equipo todavia no habilito ScriptBlockLogging, Sysmon con config curada y ASR fuera de audit. Reproduce los tres vectores de este post en un lab aislado, snapshotado, sin conexion con produccion, y genera la evidencia de que EventID dispara en que etapa. Documenta el gap. Solo despues tiene sentido evolucionar a tecnicas mas ruidosas como direct syscalls, que cubrimos en Evasion de EDR para Investigacion: Direct Syscalls Explicados sin Romantizar. Una herramienta cara sin configuracion decente sigue siendo un dashboard bonito mientras el adversario pasa por el descampado de al lado.