PureLogs Entregados a Través de Esteganografía de PawsRunner
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
La campaña se basa en un correo electrónico de phishing que lleva un archivo TXZ que entrega un cargador JavaScript, el cual establece variables de entorno y lanza conhost.exe en modo sin cabeza. Luego, el cargador descifra una ensambladura .NET conocida como PawsRunner, que recupera imágenes PNG que contienen contenido cifrado oculto a través de técnicas esteganográficas. De esas imágenes, el malware extrae la carga útil final: el infostealer PureLogs .NET. Una vez activo, PureLogs se conecta a un servidor de comando y control remoto a través de HTTPS y exfiltra credenciales de navegador junto con información del sistema.
Investigación
El análisis mostró que el cargador JavaScript obtiene comandos de las variables de entorno del proceso, lanza PowerShell con un indicador de ventana oculta y descifra una carga útil cifrada con AES que se ejecuta a través de la reflexión en .NET. PawsRunner rota entre tres APIs de red y tres cadenas diferentes de user-agent mientras obtiene archivos PNG, luego analiza iTXt and IEND fragmentos para localizar los datos ocultos y descifra la siguiente etapa con RC4. PureLogs, a su vez, usa TripleDES y Gzip para cargar un DLL descargador, realiza solicitudes HTTP protegidas por TLS a puntos de acceso específicos y recopila un amplio conjunto de datos relacionados con el navegador del sistema víctima.
Mitigación
Las organizaciones deben bloquear los adjuntos TXZ en la puerta de enlace de correo electrónico, monitorear las conhost.exe instancias que se ejecutan sin una ventana visible y detectar PowerShell lanzado con la -w hidden bandera. Los equipos de seguridad también deben desplegar firmas tanto para PawsRunner como para PureLogs, restringir el tráfico saliente al dominio e IP de comando y control identificados, y limitar la ejecución de ensambladuras .NET no firmadas. Cuando sea posible, se debe aplicar detección de esteganografía a los archivos de imagen entrantes sospechosos.
Respuesta
Si se detecta esta actividad, aísle el punto final afectado, termine los procesos sospechosos conhost.exe y de PowerShell, y elimine cualquier binario .NET dejado caer del sistema. Las credenciales comprometidas deben ser revocadas, se debe hacer cumplir la autenticación multifactor, y restablecer las contraseñas almacenadas en el navegador. Los investigadores deben también realizar forenses de la red para confirmar que no ocurrió comunicación adicional de comando y control y aplicar pasos de remediación para prevenir reinfección.
"grafo TB %% Definiciones de clase classDef action fill:#99ccff classDef tool fill:#cccccc classDef process fill:#ffdd99 classDef malware fill:#ff9999 %% Nodos initial_phishing["<b>Acción</b> – <b>T1566.001 Adjunto Spearphishing</b><br/>El atacante envía un correo electrónico de phishing con un archivo adjunto TXZ que contiene la carga maliciosa."] class initial_phishing action malicious_archive["<b>Malware</b> – <b>Nombre</b>: Archivo TXZ malicioso<br/><b>Descripción</b>: Archivo utilizado para entregar la carga útil inicial de JavaScript."] class malicious_archive malware user_execution["<b>Acción</b> – <b>T1204.004 Ejecución de usuario</b><br/>La víctima extrae el archivo, el JavaScript ejecuta PowerShell en modo oculto y lee comandos de variables de entorno."] class user_execution action powershell_loader["<b>Proceso</b> – <b>Nombre</b>: Cargador PowerShell<br/><b>Descripción</b>: Ejecuta ensambladuras .NET descifradas a través de reflexión sin escribir en disco."] class powershell_loader process defense_compile["<b>Acción</b> – <b>T1027.004 Compila después de la entrega</b><br/>Ensambladura .NET descifrada se carga en memoria a través de reflexión."] class defense_compile action defense_compress["<b>Acción</b> – <b>T1027.015 Compresión</b><br/>La carga útil es AESu2011descifrada y luego descomprimida usando Gzip."] class defense_compress action defense_stego["<b>Acción</b> – <b>T1027.003 Esteganografía</b><br/>El cargador descarga imágenes PNG y extrae datos cifrados ocultos de fragmentos iTXt/IEND."] class defense_stego action masquerade_icon["<b>Acción</b> – <b>T1036.008 Camuflaje</b><br/>El binario utiliza imágenes de gatos como su icono de aplicación para parecer inofensivo."] class masquerade_icon action c2_encrypted["<b>Acción</b> – <b>T1573 Canal cifrado</b><br/>La comunicación C2 adicional ocurre a través de HTTPS con cargas cifradas AESu2011256."] class c2_encrypted action credential_access["<b>Acción</b> – <b>T1555.003 Credenciales de navegadores web</b><br/>PureLogs enumera navegadores y extrae contraseñas guardadas, cookies y archivos de carteras criptográficas."] class credential_access action purelogs_tool["<b>Herramienta</b> – <b>Nombre</b>: PureLogs<br/><b>Descripción</b>: Utilidad de dumping de credenciales que recolecta datos de navegadores."] class purelogs_tool tool collection_archive["<b>Acción</b> – <b>T1560.003 Archivado de datos recolectados</b><br/>Los datos recolectados se comprimen con Gzip y se cifran con AES antes de la exfiltración."] class collection_archive action exfiltration_http["<b>Acción</b> – <b>T1048.003 Exfiltración a través de Protocolo no C2 sin cifrar</b><br/>Los datos se envían mediante solicitudes HTTP POST a múltiples puntos externos."] class exfiltration_http action %% Conexiones initial_phishing –>|entrega| malicious_archive malicious_archive –>|desencadena| user_execution user_execution –>|ejecuta| powershell_loader powershell_loader –>|realiza| defense_compile defense_compile –>|utiliza| defense_compress defense_compress –>|utiliza| defense_stego defense_stego –>|habilita| masquerade_icon masquerade_icon –>|establece| c2_encrypted c2_encrypted –>|habilita| credential_access credential_access –>|utiliza| purelogs_tool credential_access –>|recoge| collection_archive collection_archive –>|exfiltra a través de| exfiltration_http %% Asignaciones de clase class initial_phishing action class malicious_archive malware class user_execution action class powershell_loader process class defense_compile action class defense_compress action class defense_stego action class masquerade_icon action class c2_encrypted action class credential_access action class purelogs_tool tool class collection_archive action class exfiltration_http action "
Flujo de ataque
Detecciones
La posibilidad de ejecución a través de líneas de comando PowerShell ocultas (mediante cmdline)
Ver
LOLBAS WScript / CScript (mediante process_creation)
Ver
LLamada a Métodos .NET sospechosos desde PowerShell (mediante powershell)
Ver
Posibles indicadores de ofuscación de PowerShell (mediante powershell)
Ver
LOLBAS Conhost (mediante cmdline)
Ver
IOCs (HashSha256) para detectar: PureLogs: Entrega a través de Steganografía de PawsRunner
Ver
IOCs (SourceIP) para detectar: PureLogs: Entrega a través de Steganografía de PawsRunner
Ver
IOCs (DestinationIP) para detectar: PureLogs: Entrega a través de Steganografía de PawsRunner
Ver
Desencriptación AES de PowerShell desde Variables de Entorno [Windows PowerShell]
Ver
Detección de Ejecución de Procesos Maliciosos mediante Conhost y PowerShell Ocultos [Windows Process Creation]
Ver
Ejecución de Simulación
Prerequisito: El chequeo pre-vuelo de Telemetría y Línea Base debe haber sido aprobado.
-
Narrativa & Comandos del Ataque
- Etapa 1 – Preparación de la carga útil cifrada
- El atacante crea una pequeña carga de prueba (
"segredo"), la cifra con AES‑256 usando una clave conocida, codifica el texto cifrado en Base64 y lo almacena en una variable de entornoENC_PAYLOAD.
- El atacante crea una pequeña carga de prueba (
- Etapa 2 – Ejecutar el cargador de desencriptación de PowerShell
- Una sola línea lee
ENC_PAYLOAD, decodifica la cadena Base64, construye unAesCryptoServiceProviderde .NET, deriva la clave/IV, desencripta los datos, y opcionalmente ejecuta el texto plano.
- Una sola línea lee
- Etapa 3 – Generar telemetría de detección
- El comando de PowerShell incluye la palabra literal “AES” (por ejemplo,
Nuevo-Objeto System.Security.Cryptography.AesCryptoServiceProvider) y se registra como EventID 4104, cumpliendo con la regla de detección.
- El comando de PowerShell incluye la palabra literal “AES” (por ejemplo,
- Etapa 1 – Preparación de la carga útil cifrada
-
Guión de Prueba de Regresión
# ------------------------------------------------- # Simulación de Desencriptación AES de PowerShell (Dispara detección) # ------------------------------------------------- # 1. Definir una clave estática de 256 bits y IV (para propósitos de demostración) $key = [byte[]](0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20) $iv = [byte[]](0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0) # 2. Carga útil en texto sin formato (ejemplo) $plain = [System.Text.Encoding]::UTF8.GetBytes("datos secretos") # 3. Cifrar la carga útil usando AES (CBC, PKCS7) $aes = [System.Security.Cryptography.AesCryptoServiceProvider]::new() $aes.Key = $key $aes.IV = $iv $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $encryptor = $aes.CreateEncryptor() $cipherBytes = $encryptor.TransformFinalBlock($plain,0,$plain.Length) $cipherB64 = [Convert]::ToBase64String($cipherBytes) # 4. Almacene el texto cifrado en una variable de entorno # 5. Cargador de desencriptación – la línea exacta que se registrará (contiene "AES") $loader = @" `$enc = [System.Environment]::GetEnvironmentVariable('ENC_PAYLOAD') `$bytes = [Convert]::FromBase64String(`$enc) `$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider `$aes.Key = $($key -join ',') `$aes.IV = $($iv -join ',') `$decryptor = `$aes.CreateDecryptor() `$plain = `$decryptor.TransformFinalBlock(`$bytes,0,`$bytes.Length) `$result = [System.Text.Encoding]::UTF8.GetString(`$plain) Write-Output `"Desencriptado: `$result`" "@ # Ejecute el cargador (será capturado como EventID 4104) Invoke-Expression $loader -
Comandos de Limpieza
# Eliminar la variable de entorno # Limpiar cualquier variable temporal de la sesión Remove-Variable -Name key,iv,plain,cipherBytes,cipherB64,loader -ErrorAction SilentlyContinue
Validación Post-Simulación
- Ejecute el consulta de validación (ejemplo KQL arriba) pero filtrar por
ScriptBlockText contiene "AES"para confirmar que la detección se activó. - Revise los detalles de la alerta en el SIEM; verifique que el nombre de la alerta coincida con la regla (si está definida) y que la severidad se reporte como Alta.
Conclusiones
- La regla detecta con éxito el escenario sencillo de uso de «AES».
- Los adversarios pueden evadir dividiendo la palabra (por ejemplo,
"AE"+"S"), cargando la clase .NET a través de reflexión, o realizando desencriptación dentro de binarios compilados. - Mejorar la regla con indicadores de comportamiento (uso de variables de entorno para texto cifrado, cadenas de alta entropía, creación de
AesCryptoServiceProviderobjetos, y llamadas subsiguientes aTransformFinalBlock) mejorará la resiliencia a la ofuscación simple.