Mustang Panda y PlugX: Un Análisis Profundo de Operaciones de Carga a Través de Phishing
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El informe describe una intrusión de múltiples etapas atribuida al grupo Mustang Panda con nexos en China. La cadena comienza con un acceso directo de Windows (LNK) armado que lanza un cargador de PowerShell. Ese cargador despliega un archivo ZIP señuelo, extrae un DLL cifrado y, finalmente, despliega el troyano de acceso remoto PlugX utilizando carga reflexiva e inyección de hilo en grupo. El tráfico de comando y control se envía a través de HTTPS a la infraestructura asociada con coastallasercompany.com. El implante también implementa técnicas evasivas como hash de API, paseos por el bloque de parámetros de entorno (PEB) y ofuscación intensa de cadenas para reducir la detección estática.
Investigación
Los analistas reconstruyeron el camino de ejecución de extremo a extremo: activación inicial del LNK, puesta en escena de PowerShell, carga lateral de DLL, descifrado en memoria y ejecución final de PlugX. La herramienta utiliza hash de API similar a DJB2 y hash ROL-13 para resolver importaciones, además de un bloque de configuración cifrado con RC4. Se observó persistencia mediante la modificación de la clave de registro HKCU Run. La investigación extrajo indicadores listos para la detección, incluidos nombres de archivos, hashes y el dominio C2 utilizado para hacer balizas HTTPS.
Mitigación
Bloquear o poner en cuarentena archivos .lnk no confiables y restringir la ejecución de PowerShell, especialmente scripts que leen o escriben en ubicaciones escribibles por el usuario. Monitorear la creación sospechosa de archivos bajo %LocalAppData%, particularmente nombres generados aleatoriamente similares a GUID, y endurecer el comportamiento de orden de búsqueda de DLL para reducir las oportunidades de carga lateral. Aplicar controles DNS/proxy para negar el acceso al dominio C2 identificado y usar inspección de TLS cuando sea adecuado para exponer patrones anómalos de balizamiento HTTPS.
Respuesta
Si se detecta actividad sospechosa, aislar el host, capturar la memoria volátil y preservar la configuración cifrada para un análisis más profundo. Barrer el entorno en busca de los IOCs extraídos, eliminar los artefactos dejados caer y eliminar la entrada HKCU Run maliciosa. Rotar las credenciales en el alcance y buscar indicios de movimiento lateral consistente con las técnicas operativas del operador de PlugX.
"graph TB %% Class definitions classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef process fill:#ccccff classDef registry fill:#ffe599 %% Initial Access initial_zip["<b>Artifact</b> – Archivo ZIP malicioso que contiene .lnk"] class initial_zip artifact lnk_shortcut["<b>Artifact</b> – Acceso directo (.lnk) con ícono oculto"] class lnk_shortcut artifact tech_lnk_smack["<b>Technique</b> – T1027.012 Encubrimiento de Icono LNK<br/><b>Description</b>: Usar ícono de LNK para esconder carga útil maliciosa"] class tech_lnk_smack technique tech_user_exec["<b>Technique</b> – T1204.002 Ejecución de Usuario: Archivo Malicioso<br/><b>Description</b>: La víctima abre archivo malicioso"] class tech_user_exec technique %% Execution psh_stage["<b>Process</b> – Etapa de PowerShell ejecutada por .lnk"] class psh_stage process tech_psh["<b>Technique</b> – T1059.001 PowerShell<br/><b>Description</b>: Intérprete de comandos y scripting"] class tech_psh technique tech_archive_custom["<b>Technique</b> – T1560.003 Archivado vía Método Personalizado<br/><b>Description</b>: Lee ZIP como bytes crudos"] class tech_archive_custom technique extracted_exe["<b>Artifact</b> – Ejecutable legítimou2011aparente extraído"] class extracted_exe artifact malicious_dll["<b>Artifact</b> – Eraser.dll (malicioso)"] class malicious_dll artifact encrypted_dat["<b>Artifact</b> – Carga útil .dat cifrada"] class encrypted_dat artifact %% Persistence run_key["<b>Registry</b> – HKCUSoftwareMicrosoftWindowsCurrentVersionRun entrada"] class run_key registry tech_run_key["<b>Technique</b> – T1037.001 Script de Inicio de Sesión (Scripts de Inicialización) <br/><b>Description</b>: Persistencia mediante clave de ejecución"] class tech_run_key technique shortcut_mod["<b>Technique</b> – T1547.009 Modificación de Accesos Directos<br/><b>Description</b>: Modifica accesos directos para autoarranque"] class shortcut_mod technique active_setup["<b>Technique</b> – T1547.014 Configuración Activa<br/><b>Description</b>: Entrada de registro para autoarranque mediante Configuración Activa"] class active_setup technique psh_profile["<b>Technique</b> – T1546.013 Perfil de PowerShell<br/><b>Description</b>: Engancha perfil de PowerShell para ejecución"] class psh_profile technique %% Defense Evasion tech_compress["<b>Technique</b> – T1027.015 Compresión<br/><b>Description</b>: Comprime carga útil dentro de ZIP"] class tech_compress technique tech_dynamic_api["<b>Technique</b> – T1027.007 Resolución Dinámica de API<br/><b>Description</b>: Resuelve APIs en tiempo de ejecución usando hash"] class tech_dynamic_api technique tech_embedded["<b>Technique</b> – T1027.009 Cargas Útiles Incrustadas<br/><b>Description</b>: Incrusta cargas útiles cifradas"] class tech_embedded technique tech_deobfuscate["<b>Technique</b> – T1140 Desofuscar/Decodificar Archivos o Información<br/><b>Description</b>: Descifrado RC4/XOR en tiempo de ejecución"] class tech_deobfuscate technique tech_masquerade["<b>Technique</b> – T1036.008 Suplantación: Suplantación de Tipo de Archivo<br/><b>Description</b>: Superposición de PDF señuelo"] class tech_masquerade technique %% Privilege Escalation / Execution tech_reflective["<b>Technique</b> – T1620 Carga de Código Reflexiva<br/><b>Description</b>: Carga DLL en memoria sin tocar disco"] class tech_reflective technique tech_injection["<b>Technique</b> – T1055.001 Inyección de Procesos: Inyección de DLL<br/><b>Description</b>: Inyecta DLL mediante paseo por PEB y callbacks de hilo en grupo"] class tech_injection technique %% Command and Control c2_https["<b>Process</b> – Comunicación C2 HTTPS (puerto 443)"] class c2_https process tech_nonstd_port["<b>Technique</b> – T1571 Puerto No Estándar<br/><b>Description</b>: Usa puerto común para mezclar tráfico"] class tech_nonstd_port technique tech_dead_drop["<b>Technique</b> – T1102.001 Resolución de Caja Muerta<br/><b>Description</b>: Recupera dirección del servidor desde un servicio web"] class tech_dead_drop technique tech_proxy["<b>Technique</b> – T1090.002 Proxy: Proxy Externo<br/><b>Description</b>: Rutea tráfico a través de proxy externo"] class tech_proxy technique %% Connections initial_zip –>|contiene| lnk_shortcut lnk_shortcut –>|usa| tech_lnk_smack lnk_shortcut –>|desencadena| tech_user_exec tech_user_exec –>|lleva a| psh_stage psh_stage –>|ejecuta| tech_psh psh_stage –>|lee| tech_archive_custom tech_archive_custom –>|extrae| extracted_exe tech_archive_custom –>|extrae| malicious_dll tech_archive_custom –>|extrae| encrypted_dat psh_stage –>|escribe| run_key run_key –>|implementa| tech_run_key psh_stage –>|crea| shortcut_mod psh_stage –>|crea| active_setup psh_stage –>|engancha| psh_profile psh_stage –>|aplica| tech_compress psh_stage –>|aplica| tech_dynamic_api psh_stage –>|aplica| tech_embedded psh_stage –>|aplica| tech_deobfuscate psh_stage –>|aplica| tech_masquerade malicious_dll –>|actúa como| tech_reflective malicious_dll –>|realiza| tech_injection tech_injection –>|habilita| c2_https c2_https –>|usa| tech_nonstd_port c2_https –>|usa| tech_dead_drop c2_https –>|puede enrutar mediante| tech_proxy %% Class assignments class initial_zip,lnk_shortcut,extracted_exe,malicious_dll,encrypted_dat artifact class psh_stage,c2_https process class run_key registry class tech_lnk_smack,tech_user_exec,tech_psh,tech_archive_custom,tech_run_key,shortcut_mod,active_setup,psh_profile,tech_compress,tech_dynamic_api,tech_embedded,tech_deobfuscate,tech_masquerade,tech_reflective,tech_injection,tech_nonstd_port,tech_dead_drop,tech_proxy technique "
Flujo de Ataque
Detecciones
Intento Posible de Carga Lateral de Eraser DLL (vía image_load)
Ver
La Posibilidad de Ejecución a través de Líneas de Comando PowerShell Ocultas (vía cmdline)
Ver
Llamar Métodos .NET Sospechosos desde PowerShell (vía powershell)
Ver
Llamar Clases/Métodos .NET Sospechosos desde Línea de Comando PowerShell (vía creación de procesos)
Ver
IOCs (HashSha256) para detectar: PlugX : APT de Mustang Panda Dentro de Mustang Panda: Desde Cadenas de Spear-Phishing hasta PlugX — Una Inmersión Profunda en la Infraestructura de Carga
Ver
IOCs (HashSha1) para detectar: PlugX : APT de Mustang Panda Dentro de Mustang Panda: Desde Cadenas de Spear-Phishing hasta PlugX — Una Inmersión Profunda en la Infraestructura de Carga
Ver
IOCs (HashMd5) para detectar: PlugX : APT de Mustang Panda Dentro de Mustang Panda: Desde Cadenas de Spear-Phishing hasta PlugX — Una Inmersión Profunda en la Infraestructura de Carga
Ver
Ejecución de Ventana PowerShell Oculta y Desempaquetado de Archivo de Señuelo [Windows PowerShell]
Ver
Detección de Carga Lateral de DLL Maliciosa por ErsChk.exe [Creación de Proceso de Windows]
Ver
Ejecución de Simulación
Prerrequisito: La Comprobación Previa de Telemetría y Línea Base debe haber pasado.
Justificación: 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 y Comandos de Ataque:
Un atacante ha obtenido una posición en una estación de trabajo comprometida y desea escenificar cargas útiles maliciosas mientras permanece invisible para el usuario. Inician PowerShell en modo oculto (-w hidden) para evitar ventanas emergentes de la interfaz de usuario. Dentro de la misma sesión de PowerShell usan la utilidad incorporadatar(disponible en versiones modernas de Windows) para extraer un archivo señuelo que contiene las cargas útiles de la siguiente etapa directamente en%LocalAppData%, una ubicación escribible que a menudo pasa desapercibida por las defensas.Pasos:
- Crear un pequeño archivo tar (
payloads.tar) que contenga un archivo ficticio benigno (simulando la carga útil maliciosa). - Almacenar el archivo en una ubicación temporal (
C:Temp). - Ejecutar PowerShell en ventana oculta que ejecuta el comando de
tarextracción dirigido al%LocalAppData%.
- Crear un pequeño archivo tar (
-
Script de Prueba de Regresión:
# --------------------------------------------------------- # Paso 1 – Preparar un archivo tar de ejemplo (simula cargas útiles) # --------------------------------------------------------- $tempDir = "C:Temp" $archive = "$tempDirpayloads.tar" $payload = "$tempDirdummy.txt" $destDir = "$Env:LocalAppDataStagedPayloads" # Asegurar que la carpeta temporal existe New-Item -ItemType Directory -Path $tempDir -Force | Out-Null # Crear un archivo ficticio para archivar "Este es un archivo de carga útil ficticio." | Set-Content -Path $payload -Encoding UTF8 # Crear el archivo tar (requiere tar de Windows) tar -cf $archive -C $tempDir dummy.txt # --------------------------------------------------------- # Paso 2 – Ejecutar PowerShell oculto que extrae el archivo # --------------------------------------------------------- $extractCmd = "tar -xvf `"$archive`" -C `"$Env:LocalAppData`"" $psArgs = "-NoProfile -WindowStyle Hidden -Command `$extractCmd" Start-Process -FilePath "powershell.exe" -ArgumentList $psArgs -WindowStyle Hidden # --------------------------------------------------------- # Paso 3 – Opcional: Verificar extracción (para validación manual) # --------------------------------------------------------- Write-Host "Extracción completa. Archivos deberían existir ahora en $Env:LocalAppData" -
Comandos de Limpieza:
# Eliminar archivos temporales y cargas útiles escenificadas Remove-Item -Path "C:Temppayloads.tar" -Force -ErrorAction SilentlyContinue Remove-Item -Path "C:Tempdummy.txt" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$Env:LocalAppDatadummy.txt" -Force -ErrorAction SilentlyContinue # Opcionalmente eliminar la carpeta de escena completa si fue creada Remove-Item -Path "$Env:LocalAppDataStagedPayloads" -Recurse -Force -ErrorAction SilentlyContinue