Análisis de Phantom Stealer: Dentro de una cadena de ataque de dos capas
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
Phantom Stealer es un infostealer de Windows de dos etapas que comienza con un malicioso pdh.dll cargador y termina con una carga útil .NET inyectada en jsc.exe. El cargador utiliza secuestro de DLL, vaciamiento de procesos y compilación AOT nativa para reducir la probabilidad de detección. Una vez activo, la carga útil de segunda etapa roba credenciales, datos del navegador, información de billeteras de criptomonedas, contenido del portapapeles y otros datos sensibles, y también puede reemplazar direcciones de billeteras copiadas con valores controlados por el atacante. El malware se comercializa como una oferta de crimeware comercial y está siendo utilizado en ataques activos.
Investigación
Los investigadores encontraron que el cargador se copia a sí mismo a %APPDATA%MicrosoftRasManagementMpDlpService.exe y crea una clave de ejecución para mantener la persistencia. Luego descifra una carga útil cifrada doblemente con RC4, la inyecta en un jsc.exe proceso suspendido, y realiza múltiples verificaciones anti-análisis antes de comenzar el robo de datos. El stealer interno .NET es capaz de eludir el cifrado ligado a la aplicación de Chrome 127+ y exfiltrar la información robada mediante SMTP utilizando un dominio falsificado. Hilos separados manejan funciones de corte de cripto y de keylogging.
Mitigación
Los defensores deben monitorear cargas inesperadas desde rutas que no sean del sistema y aplicar controles que reduzcan el riesgo de secuestro de DLL. Los equipos de seguridad también deben detectar ejecutables desconocidos colocados en pdh.dll loads from non-system paths and enforce controls that reduce DLL hijacking risk. Security teams should also detect unfamiliar executables placed in %APPDATA%MicrosoftRasManagement y observar por la clave de ejecución RasManSvc. Las detecciones basadas en comportamiento deben enfocarse en el vaciado de procesos que involucran Run key. Behavior-based detections should focus on process hollowing involving jsc.exe, mientras el monitoreo de red debe marcar conexiones sospechosas a los dominios de comando y control identificados. El endurecimiento adicional del almacenamiento de credenciales del navegador y controles más estrictos sobre el acceso al portapapeles para aplicaciones no confiables pueden reducir aún más la exposición.
Respuesta
Alerta sobre la creación de MpDlpService.exe dentro del directorio RasManagement y sobre cambios a la clave de registro de ejecución relacionada. Investigue cualquier jsc.exe proceso que muestre signos de código inyectado y termine la actividad maliciosa de inmediato. Recopile los indicadores relevantes de compromiso, ponga en cuarentena los archivos asociados y realice un análisis forense para determinar qué credenciales y datos de billeteras pueden haber sido expuestos. Restablezca las cuentas afectadas y notifique a los usuarios afectados según sea necesario.
graph TB %% Class definitions classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[«<b>Técnica</b> – <b>T1176 Extensiones de Software</b><br/><b>Descripción</b>: Colocar pdh.dll malicioso en la misma carpeta que una aplicación legítima que carga la biblioteca PDH de Windows, provocando la ejecución del código del atacante.»] class step1_ext technique step1_masq[«<b>Técnica</b> – <b>T1036.005 Mascaramiento: Coincidir con nombre o ubicación de recurso legítimo</b><br/><b>Descripción</b>: Nombrar la DLL como una biblioteca legítima de Windows para evadir detección.»] class step1_masq technique step1_dynapi[«<b>Técnica</b> – <b>T1027.007 Archivos o información ofuscados: Resolución dinámica de API</b><br/><b>Descripción</b>: Resolver llamadas API en tiempo de ejecución para ocultar importaciones estáticas.»] class step1_dynapi technique file_dll[«<b>Archivo</b> – pdh.dll (malicioso)»] class file_dll file step1_ext –>|usa| step1_masq step1_ext –>|usa| step1_dynapi step1_ext –>|deposita| file_dll file_dll –>|cargado por| step1_ext step2_compromise[«<b>Técnica</b> – <b>T1554 Comprometer binario de software del host</b><br/><b>Descripción</b>: Reemplazar o modificar un binario confiable para ejecutar carga maliciosa.»] class step2_compromise technique step2_activeSetup[«<b>Técnica</b> – <b>T1547.014 Ejecución de inicio: Active Setup</b><br/><b>Descripción</b>: Crear entrada Active Setup que copia el cargador a %APPDATA%\\Microsoft\\RasManagement\\MpDlpService.exe.»] class step2_activeSetup technique step2_runkey[«<b>Técnica</b> – <b>T1547.001 Ejecución de inicio: Claves Run del registro / carpeta de inicio</b><br/><b>Descripción</b>: Añadir clave Run “RasManSvc” apuntando al ejecutable.»] class step2_runkey technique file_loader[«<b>Archivo</b> – MpDlpService.exe (cargador)»] class file_loader file step1_ext –>|conduce_a| step2_compromise step2_compromise –>|habilita| step2_activeSetup step2_activeSetup –>|crea| file_loader file_loader –>|registrado_vía| step2_runkey step3_evasion[«<b>Técnica</b> – <b>T1497.002 Evasión de sandbox/virtualización: comprobaciones de actividad de usuario</b><br/><b>Descripción</b>: Consulta registro, GPU, procesos, servicios sandbox, IP, hostname, GUID; se autodestruye si detecta análisis.»] class step3_evasion technique step3_queryReg[«<b>Técnica</b> – <b>T1012 Consulta de registro</b><br/><b>Descripción</b>: Obtener valores del registro para detectar entornos de análisis.»] class step3_queryReg technique step2_compromise –>|activa| step3_evasion step3_evasion –>|usa| step3_queryReg step4_hollow[«<b>Técnica</b> – <b>T1055.012 Inyección de proceso: Process Hollowing</b><br/><b>Descripción</b>: Crear jsc.exe suspendido y reemplazar memoria con payload .NET.»] class step4_hollow technique step4_threadHijack[«<b>Técnica</b> – <b>T1055.003 Inyección de proceso: secuestro de ejecución de hilo</b><br/><b>Descripción</b>: Usar llamadas NT resueltas dinámicamente para secuestrar hilos.»] class step4_threadHijack technique process_jsc[«<b>Proceso</b> – jsc.exe (legítimo)»] class process_jsc process process_mal[«<b>Proceso</b> – Payload .NET inyectado»] class process_mal process step3_evasion –>|conduce_a| step4_hollow step4_hollow –>|crea| process_jsc step4_hollow –>|reemplaza_memoria_de| process_jsc process_jsc –>|aloja| process_mal step4_hollow –>|usa| step4_threadHijack step5_browserDisc[«<b>Técnica</b> – <b>T1217 Descubrimiento de navegadores</b><br/><b>Descripción</b>: Enumerar navegadores instalados.»] class step5_browserDisc technique step5_credWeb[«<b>Técnica</b> – <b>T1555.003 Credenciales de navegadores</b><br/><b>Descripción</b>: Extraer contraseñas, cookies y autofill.»] class step5_credWeb technique step5_privateKey[«<b>Técnica</b> – <b>T1552.004 Credenciales no seguras: claves privadas</b><br/><b>Descripción</b>: Robar claves privadas de wallets crypto.»] class step5_privateKey technique step4_hollow –>|conduce_a| step5_browserDisc step5_browserDisc –>|habilita| step5_credWeb step5_credWeb –>|añade| step5_privateKey step6_keylog[«<b>Técnica</b> – <b>T1056.001 Captura de entrada: keylogging</b><br/><b>Descripción</b>: Instalar hook de teclado WH_KEYBOARD_LL.»] class step6_keylog technique step5_credWeb –>|habilita| step6_keylog step7_screen[«<b>Técnica</b> – <b>T1113 Captura de pantalla</b><br/><b>Descripción</b>: Captura pantalla cada 30 minutos.»] class step7_screen technique step6_keylog –>|conduce_a| step7_screen step8_clipboard[«<b>Técnica</b> – <b>T1115 Datos del portapapeles</b><br/><b>Descripción</b>: Monitorear portapapeles y reemplazar direcciones crypto.»] class step8_clipboard technique step7_screen –>|conduce_a| step8_clipboard step9_emailCollect[«<b>Técnica</b> – <b>T1114 Recolección de correo</b><br/><b>Descripción</b>: Recoger correos y mensajes locales.»] class step9_emailCollect technique step9_identity[«<b>Técnica</b> – <b>T1589.002 Información de identidad: correos</b><br/><b>Descripción</b>: Recopilar emails de víctimas.»] class step9_identity technique step9_exfil[«<b>Técnica</b> – <b>T1048.003 Exfiltración por SMTP</b><br/><b>Descripción</b>: Enviar datos por SMTP.»] class step9_exfil technique step8_clipboard –>|conduce_a| step9_emailCollect step9_emailCollect –>|incluye| step9_identity step9_identity –>|exfiltra_vía| step9_exfil step10_reflective[«<b>Técnica</b> – <b>T1620 Carga de código reflectivo</b><br/><b>Descripción</b>: Ejecutar payload Base64 en memoria.»] class step10_reflective technique step9_exfil –>|activa| step10_reflective
Flujo de Ataque
Detecciones
Posibles Puntos de Persistencia [ASEPs – Colmena Software/NTUSER] (vía evento de registro)
Ver
Ejecución de Cambio de Página de Código Inusual (vía línea de comandos)
Ver
Posible Descubrimiento de Contraseñas de Wifi (vía línea de comandos)
Ver
IOCs (HashSha256) para detectar: Análisis de Phantom Stealer: Dentro de la Cadena de Ataque de Dos Capas Oculta Detrás de una DLL de Windows
Ver
IOCs (HashMd5) para detectar: Análisis de Phantom Stealer: Dentro de la Cadena de Ataque de Dos Capas Oculta Detrás de una DLL de Windows
Ver
Persistencia en Registro a través de la Clave de Ejecución RasManSvc [Evento de Registro de Windows]
Ver
Vaciamiento de Procesos en jsc.exe y Persistencia a través de MpDlpService.exe [Creación de Procesos de Windows]
Ver
Ejecución de Simulación
Prerequisito: La Verificación Pre-vuelo de Telemetría y Línea Base 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 reflejan directamente los TTPs identificados y apuntan a generar la telemetría exacta esperada por la lógica de detección.
-
Narrativa del Ataque y Comandos:
Un adversario primero roba una carga útil maliciosa (por ejemplo, una DLL de shell inversa) y la almacena en eldirectorio del usuario. Usandocomo anfitrión de vaciamiento, el atacante crea un nuevo proceso, inyecta la carga útil, y reanuda la ejecución, cumpliendo conjsc.exeas a hollowing host, the attacker creates a new process, injects the payload, and resumes execution—fulfilling T1055.012 and T1055.003.
Para asegurar persistencia, el atacante copia la DLL maliciosa a%APPDATA%MicrosoftRasManagementMpDlpService.exey la registra como un servicio que se ejecuta al iniciar sesión, abusando del nombre del servicio legítimo (T1620). -
Script de Test de Regresión:
# --------------------------------------------------------- # Script de adversario simulado – Vaciamiento de Procesos + Persistencia # --------------------------------------------------------- # Variables $appData = "$env:APPDATAMicrosoftRasManagement" $loaderPath = Join-Path $appData "MpDlpService.exe" $maliciousDll = "$env:TMPmalicious.dll" # marcador de posición para la carga útil # 1. Prepara el directorio de persistencia New-Item -Path $appData -ItemType Directory -Force | Out-Null # 2. Dejar caer una DLL maliciosa ficticia (carga útil simulada) # En un ataque real, esto sería una carga útil compilada; aquí creamos un archivo de cero bytes. New-Item -Path $maliciousDll -ItemType File -Force | Out-Null # 3. Copiar la DLL a la ubicación del servicio falsificado Copy-Item -Path $maliciousDll -Destination $loaderPath -Force # 4. Registrar un servicio temporal apuntando al archivo copiado (requiere administrador) $svcName = "MpDlpService" sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null # 5. Iniciar el servicio (dispara la ejecución de MpDlpService.exe) sc.exe start $svcName | Out-Null # 6. Realizar vaciamiento de procesos usando jsc.exe como el anfitrión # Lanzaremos jsc.exe suspendido, reemplazaremos su memoria con la carga útil ficticia, # luego reanudaremos. Esto usa la función Invoke-ProcessHollowing de PowerSploit. function Invoke-ProcessHollowing { param( [string]$HostPath, [string]$PayloadPath ) # Cargar API de .NET Add-Type @" using System; using System.Diagnostics; using System.Runtime.InteropServices; public class Hollow { [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine, IntPtr procSec, IntPtr threadSec, bool inherit, uint flags, IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi); [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } "@ # Crear proceso suspendido $si = New-Object Hollow+STARTUPINFO $pi = New-Object Hollow+PROCESS_INFORMATION $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si) $CREATE_SUSPENDED = 0x00000004 $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false, $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $ok) { Write-Error "Failed to create suspended process" ; return } # (Pasos de inyección de carga útil omitidos – marcador de posición para técnica real) # Reanudar hilo $RESUME_THREAD = 0x00000001 [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null } # Ejecutar vaciamiento (usando el verdadero jsc.exe como anfitrión) $jscPath = "$env:SystemRootSystem32jsc.exe" Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll # --------------------------------------------------------- # Fin de la simulación # --------------------------------------------------------- -
Comandos de Limpieza:
# Detener y eliminar servicio temporal sc.exe stop MpDlpService | Out-Null sc.exe delete MpDlpService | Out-Null # Eliminar cargador y carga útil ficticia Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue # Opcional: matar cualquier proceso jsc.exe remanente iniciado por la prueba Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force