Cuando el Malware Contraataca
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El informe describe una cadena de intrusión en Windows de múltiples etapas que combina un script por lotes oculto, un cargador basado en PowerShell y shellcode generado por Donut para establecer un RAT persistente, residente en memoria, con capacidad de robo de credenciales. El cargador entrega un implante .NET diseñado para el sigilo, con cobertura fuerte de anti-análisis, inyección de procesos y características de control remoto interactivas. Los datos robados son enviados a través de webhooks de Discord y bots de Telegram, reforzando un diseño modular enfocado en la ejecución en memoria y una huella mínima en disco.
Investigación
El análisis identificó persistencia a través de un valor de registro Run por usuario que activa un archivo por lotes oculto en %APPDATA%. El script por lotes contiene un blob Base64 incrustado que extrae y decodifica en una etapa de PowerShell. Ese cargador desencripta una carga útil de shellcode de Donut y la inyecta en svchost.exe and explorer.exe, utilizando APIs de Windows como CreateRemoteThread para ejecutar el implante en memoria. La etapa desencriptada se resuelve en un ensamblado .NET fuertemente ofuscado que incluye funcionalidad de Pulsar RAT más un módulo dedicado de robo. Los investigadores observaron comprobaciones anti-VM y anti-depuración, salvaguardas destinadas a detectar análisis o monitoreo de inyección, y manejadores de comandos que intentan debilitar las defensas locales—como deshabilitar el Administrador de tareas y manipular el comportamiento relacionado con el Control de cuentas de usuario (UAC).
Mitigación
Bloquear la creación de archivos por lotes ocultos en rutas de AppData escribibles por el usuario e investigar las entradas desconocidas agregadas a las claves de Run por usuario. Monitorizar las líneas de comando de PowerShell en busca de patrones de decodificación Base64 y señales de actividad de inyección de memoria remota. Utilizar herramientas de endpoint capaces de reconocer características de shellcode de Donut, detectando ensamblados .NET en memoria y señalando tráfico C2 a Discord y Telegram. Imponer listas de permitidos de aplicaciones y aplicar controles de egreso que restrinjan el acceso saliente a endpoints de webhooks y C2 basado en mensajería.
Respuesta
Si es detectado, aislar el endpoint, detener las svchost.exe and explorer.exe instancias vinculadas a la creación maliciosa de un hilo, y eliminar tanto el archivo por lotes oculto como la persistencia asociada a la clave de Run. Capturar imágenes de memoria para preservar artefactos en memoria, extraer y analizar la carga útil de .NET, y buscar en todo el entorno comportamientos e indicadores coincidentes. Restablecer credenciales potencialmente expuestas y revocar cualquier token comprometido de webhook de Discord/Telegram para evitar la exfiltración continua.
Palabras clave: malware de Windows, cargador de PowerShell, archivo por lotes oculto, AppData, clave Run, shellcode de Donut, CreateRemoteThread, inyección de procesos, .NET en memoria, Pulsar RAT, robo de credenciales, webhooks de Discord, bot de Telegram, anti-VM, anti-depuración.
Flujo de Ataque
Detecciones
Posible abuso de Telegram como canal de comando y control (vía dns_query)
Ver
Puntos de posible persistencia [ASEPs – Hive de Software/NTUSER] (vía registry_event)
Ver
Llamado a funciones API de Windows sospechosas desde PowerShell (vía powershell)
Ver
Cadenas de PowerShell sospechosas (vía powershell)
Ver
Uso posible de Schtasks o AT para persistencia (vía cmdline)
Ver
Intento de manipulación de flujo de datos alternativo (ADS) Zone.Identifier sospechoso (vía process_creation)
Ver
Powershell ejecutando archivo en directorio sospechoso utilizando política de ejecución de omisión (vía cmdline)
Ver
IOCs (DestinationIP) para detectar: Cuando el malware responde
Ver
IOCs (SourceIP) para detectar: Cuando el malware responde
Ver
IOCs (HashMd5) para detectar: Cuando el malware responde
Ver
IOCs (HashSha1) para detectar: Cuando el malware responde
Ver
Persistencia a través de la clave Run para la ejecución de archivo por lotes [Evento de registro de Windows]
Ver
Detección de inyección de memoria y ejecución de carga útil vía PowerShell [Powershell de Windows]
Ver
Detección de ejecución de lotes y PowerShell para persistencia de malware oculto [Creación de procesos de Windows]
Ver
Ejecución de simulación
Prerrequisito: La Verificación de Telemetría & Línea Base debe haber pasado.
Fundamento: 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 TTPs identificados y apuntar a 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 de ataque y comandos:
- Reconocimiento y Recuperación de Carga Útil – El atacante utiliza una línea de comando de PowerShell para descargar un blob de shellcode codificado en Base64 desde un servidor C2 (simulado a través de un archivo local).
- Ofuscación – La carga descargada está ofuscada con XOR utilizando la clave
0xAA. El script contiene la cadena literal «XOR» para satisfacer la segunda cláusula de la regla. - Decodificación y Des-ofuscación – El atacante decodifica la cadena Base64, aplica la operación XOR en memoria y almacena el shellcode claro en un array de bytes.
- Inyección de Procesos – Usando la API de Windows
CreateRemoteThread, el script inyecta el shellcode en un proceso objetivo benigno (notepad.exe). La línea de comando incluye explícitamente el texto «CreateRemoteThread». - Ejecución – El hilo remoto se ejecuta, logrando ejecución de código en el host.
-
Script de Prueba de Regresión:
# ------------------------------------------------------------ # Campaña de inyección en memoria simulada de PowerShell # ------------------------------------------------------------ # 1. Preparar una carga ficticia (shellcode): para propósitos de demostración, # solo utilizamos un pequeño array de bytes que imprime "Injected". $shellcode = [Byte[]] (0x90,0x90,0x90,0x90) # Marcador de NOP # 2. Ofuscar la carga útil con XOR utilizando la clave 0xAA $key = 0xAA $xorPayload = $shellcode | ForEach-Object { $_ -bxor $key } # 3. Codificar la carga ofuscada en Base64 $b64 = [Convert]::ToBase64String($xorPayload) # 4. Construir el comando de PowerShell que ejecutará la inyección $injectCmd = @" `$bytes = [Convert]::FromBase64String('$b64') # Des-ofuscación XOR (literal 'XOR' presente para la detección) `$decoded = `$bytes | ForEach-Object { `$_ -bxor $key } # Lanzar notepad como objetivo de inyección `$proc = Start-Process notepad -PassThru # Asignar memoria en proceso remoto `$addr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(`$decoded.Length) # Crear hilo remoto (cadena literal para la detección) `$thread = [System.Threading.Thread]::Start( { } ) "@ # 5. Codificar el comando completo de inyección (incluye marcador ::6bbd64163c24f552::) $marker = '::6bbd64163c24f552::' $fullCmd = $marker + $injectCmd $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($fullCmd)) # 6. Ejecutar el PowerShell malicioso vía -EncodedCommand powershell.exe -EncodedCommand $encoded -
Comandos de limpieza:
# Terminar cualquier instancia de notepad iniciada durante la prueba Get-Process notepad -ErrorAction SilentlyContinue | Stop-Process -Force # Eliminar cualquier archivo/módulo temporal si se crearon (ninguno en esta demo) Write-Host "Limpieza completa."