Secuestro de GAC
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El artículo explica cómo los actores de amenazas con acceso de administrador local pueden modificar ensamblados .NET en la Caché de Ensamblados Global (GAC) para ejecutar código desde una ruta de ejecución confiable. Al intercambiar DLLs como MIGUIControls.dll, un atacante puede establecer persistencia y activar cargas maliciosas bajo procesos legítimos. El método depende de derechos elevados para escribir en ubicaciones GAC y puede incluir la eliminación de imágenes nativas para que el runtime se vea obligado a cargar el ensamblado alterado.
Investigación
Una utilidad de prueba de concepto (GAC-POC.exe) demuestra el flujo de trabajo copiando una DLL legítima, parchándola con Mono.Cecil para mostrar un cuadro de mensaje, y escribiendo la versión modificada de nuevo en el GAC. Las acciones observables incluyen la operación de escritura en el GAC, eliminación de imágenes nativas usando ngen.exe y la actividad de creación de procesos subsiguientes que se produce al cargar el ensamblado actualizado.
Mitigación
Habilite la auditoría detallada de creación de procesos (ID de Evento 4688) y la auditoría del sistema de archivos (ID de Evento 4663) para los directorios GAC. Alerta sobre el uso sospechoso de ngen.exe, la ejecución de mscorsvw.exe, y la actividad inesperada de escritura de DLL en rutas de GAC. Reduzca la exposición limitando el acceso de administrador local y aplicando la validación de firma de código o verificaciones de integridad para ensamblados almacenados en el GAC.
Respuesta
Si se detecta la ejecución de GAC-POC.exe, modificaciones inesperadas de ensamblados o eliminaciones de imágenes nativas, aísle el host, conserve artefactos forenses, y restaure ensamblados GAC desde una línea base conocida como buena. Continúe evaluando para determinar cómo el atacante obtuvo privilegios de administrador y si se estableció persistencia adicional.
«graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef malware fill:#ffeb99 %% Node definitions tech_valid_accounts[«<b>Técnica</b> – <b>T1078.003 Cuentas Válidas: Cuentas Locales</b><br/><b>Descripción</b>: Los adversarios obtienen y abusan de credenciales para cuentas locales, incluidos administradores, para conseguir acceso no autorizado.»] class tech_valid_accounts technique tech_hijack_exec[«<b>Técnica</b> – <b>T1574.014 Captura de Flujo de Ejecución: AppDomainManager</b><br/><b>Descripción</b>: Los adversarios reemplazan o modifican el ensamblado .NET AppDomainManager en la Caché de Ensamblados Global para capturar el flujo de ejecución de aplicaciones .NET.»] class tech_hijack_exec technique tech_dll_injection[«<b>Técnica</b> – <b>T1055.001 Inyección de Biblioteca de Enlace Dinámico</b><br/><b>Descripción</b>: Los adversarios inyectan DLLs maliciosas en un proceso de confianza para ejecutar su código en el contexto de ese proceso.»] class tech_dll_injection technique process_task_sched[«<b>Proceso</b> – Task Scheduler MMC snapu2011in<br/><b>Rol</b>: Componente del sistema de confianza utilizado para programar tareas.»] class process_task_sched process malicious_dll[«<b>Malware</b> – DLL Maliciosa (por ejemplo, carga útil)<br/><b>Propósito</b>: Ejecutada después de la inyección para realizar acciones maliciosas.»] class malicious_dll malware %% Conexiones que muestran el flujo de ataque tech_valid_accounts u002du002d>|habilita| tech_hijack_exec tech_hijack_exec u002du002d>|conduce a| tech_dll_injection tech_dll_injection u002du002d>|utiliza| process_task_sched process_task_sched u002du002d>|carga| malicious_dll «
Flujo de Ataque
Ejecución de Simulación
Requisito Previo: La Verificación Previa de Telemetría y Línea Base debe haber sido aprobada.
-
Narrativa de Ataque y Comandos:
El adversario ha preparado un ensamblado malicioso (
GAC‑PoC.exe) que, cuando se coloca en la Caché de Ensamblados Global, será cargado por cualquier proceso .NET que resuelva un nombre fuerte coincidente. Para activar la ejecución inmediata y asegurar que la regla de detección vea la línea de comandos exacta, el atacante ejecuta el ensamblado directamente y también invocangen.exepara pre‑compilar la DLL maliciosa, un paso típico en el secuestro de GAC para mejorar el sigilo. Las acciones generan eventos 4688 distintos que contienen las cadenas observadas.- Copiar ensamblado malicioso a un directorio escribible (por ejemplo,
C:Temp). - Ejecute el binario de prueba de concepto para demostrar el secuestro.
- Run
ngen.execontra el ensamblado malicioso para simular un paso de generación de imagen nativa a menudo observado tras la colocación en GAC.
- Copiar ensamblado malicioso a un directorio escribible (por ejemplo,
-
Script de Prueba de Regresión:
# ------------------------------------------------- # Script de Validación de Detección de Secuestro de GAC # ------------------------------------------------- # Requisito previo: Asegúrese de que la cuenta de prueba tenga derechos de administrador local # y que las políticas de auditoría de Windows del paso previo # estén habilitadas. # ------------------------------------------------- # 1. Desplegar el ejecutable malicioso (simulado) $tempDir = "C:Temp" if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null } $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" # Simular la carga útil – crear un ejecutable pequeño que escriba en un registro. # Aquí usamos un binario de marcador de posición; en una prueba real copiaría el archivo real. Write-Output "Marcador de posición de carga útil falsa" | Out-File "$gacPoCPath.txt" # Para demostrar, simplemente llamamos a cmd /c echo (el nombre del archivo aún aparece en CommandLine) & cmd.exe /c "echo Simulación de GAC-PoC en ejecución > NUL" # 2. Ejecución directa de GAC-PoC.exe Write-Host "[*] Ejecutando GAC-PoC.exe" Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null # 3. Invocar ngen.exe contra el mismo binario $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { Write-Host "[*] Ejecución de ngen.exe en GAC-PoC.exe" & $ngenPath install $gacPoCPath } else { Write-Warning "ngen.exe no encontrado en este host – omitiendo paso." } # 4. Registro de finalización para el analista Write-Host "[+] Simulación completada. Revisar SIEM para alertas de EventID 4688." -
Comandos de Limpieza:
# ------------------------------------------------- # Limpieza después de la validación de Secuestro de GAC # ------------------------------------------------- $tempDir = "C:Temp" $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" if (Test-Path $gacPoCPath) { Remove-Item -Path $gacPoCPath -Force Write-Host "[*] GAC-PoC.exe eliminado" } # Eliminar cualquier imagen nativa generada (si se crearon) $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { & $ngenPath uninstall $gacPoCPath 2>$null Write-Host "[*] Imagen nativa desinstalada (si existía)." } # Opcionalmente eliminar la carpeta temporal si está vacía if ((Get-ChildItem $tempDir).Count -eq 0) { Remove-Item -Path $tempDir -Force Write-Host "[*] Directorio temporal $tempDir eliminado" } Write-Host "[+] Limpieza completada."