SOC Prime Bias: Medio

03 Feb 2026 20:06

Cuando el Malware Contraataca

Author Photo
Ruslan Mikhalov Jefe de Investigación de Amenazas en SOC Prime linkedin icon Seguir
Cuando el Malware Contraataca
shield icon

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.

graph TB %% Class Definitions classDef action fill:#99ccff classDef file fill:#ccffcc classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Files and Registry logon_script_file[«<b>Archivo</b>: 0a1a98b5f9fc7c62.bat<br/><b>Ubicación</b>: %APPDATA%\\Microsoft\\…»] class logon_script_file file run_key[«<b>Registro</b>: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\bada287ebf»] class run_key file %% Nodes – Techniques (Actions) persistence_run[«<b>Técnica</b> – T1037.001 Scripts de inicialización de arranque o inicio de sesión<br/><b>Descripción</b>: Archivo por lotes oculto ubicado en %APPDATA% y registrado en la clave Run para persistencia.»] class persistence_run action powershell_interpreter[«<b>Técnica</b> – T1059.001 Intérprete de comandos y scripts: PowerShell<br/><b>Descripción</b>: Ejecuta un script de PowerShell decodificado con política de omisión.»] class powershell_interpreter action obfuscation[«<b>Técnica</b> – T1027 Archivos o información ofuscados<br/><b>Descripción</b>: Matriz de bytes cifrada con XOR y lógica de compilación posterior a la entrega.»] class obfuscation action deobfuscate[«<b>Técnica</b> – T1140 Desofuscar/Decodificar archivos o información<br/><b>Descripción</b>: Decodificación Base64 y XOR para producir shellcode.»] class deobfuscate action reflective_loading[«<b>Técnica</b> – T1620 Carga reflexiva de código<br/><b>Descripción</b>: Asigna memoria en el proceso objetivo y escribe shellcode.»] class reflective_loading action process_injection[«<b>Técnica</b> – T1055.002 Inyección de procesos: Inyección de ejecutable portátil<br/><b>Descripción</b>: Inyecta shellcode mediante CreateRemoteThread en svchost.exe y explorer.exe.»] class process_injection action sandbox_evasion[«<b>Técnica</b> – T1497 Evasión de virtualización o sandbox<br/><b>Descripción</b>: Verifica máquinas virtuales y entornos sandbox antes de continuar.»] class sandbox_evasion action indirect_cmd[«<b>Técnica</b> – T1202 Ejecución indirecta de comandos<br/><b>Descripción</b>: Habilita o deshabilita el Administrador de tareas y el Control de cuentas de usuario a través de C2.»] class indirect_cmd action uac_bypass[«<b>Técnica</b> – T1548.002 Abuso del mecanismo de control de elevación: Omisión del Control de cuentas de usuario<br/><b>Descripción</b>: Deshabilita el Control de cuentas de usuario y la interfaz de seguridad.»] class uac_bypass action scheduled_task[«<b>Técnica</b> – T1053 Tarea programada/Trabajo<br/><b>Descripción</b>: Crea una tarea schtasks.exe para ejecutar la carga útil al iniciar sesión.»] class scheduled_task action autostart[«<b>Técnica</b> – T1547 Ejecución automática en arranque o inicio de sesión<br/><b>Descripción</b>: Persistencia dual mediante clave Run y tarea programada.»] class autostart action cred_from_browser[«<b>Técnica</b> – T1555.003 Credenciales desde navegadores web<br/><b>Descripción</b>: Extrae credenciales almacenadas.»] class cred_from_browser action alternate_auth[«<b>Técnica</b> – T1550.004 Uso de material de autenticación alternativo: Cookie de sesión web<br/><b>Descripción</b>: Extrae cookies de sesión y tokens.»] class alternate_auth action archive_data[«<b>Técnica</b> – T1560.002 Archivar datos recopilados: Archivo mediante biblioteca<br/><b>Descripción</b>: Comprime en memoria las credenciales recopiladas.»] class archive_data action compression[«<b>Técnica</b> – T1027.015 Compresión<br/><b>Descripción</b>: Comprime los datos en un archivo ZIP antes de la exfiltración.»] class compression action exfil_webhook[«<b>Técnica</b> – T1567.004 Exfiltración mediante webhook<br/><b>Descripción</b>: Envía el archivo ZIP a un webhook de Discord y a un bot de Telegram.»] class exfil_webhook action web_service[«<b>Técnica</b> – T1102.003 Servicio web: Comunicación unidireccional<br/><b>Descripción</b>: Utiliza HTTPS hacia Discord y Telegram para la exfiltración.»] class web_service action compile_after_delivery[«<b>Técnica</b> – T1027.004 Compilación posterior a la entrega<br/><b>Descripción</b>: Compila código de interoperabilidad en C# en tiempo de ejecución para la inyección.»] class compile_after_delivery action stripped_payload[«<b>Técnica</b> – T1027.008 Cargas útiles despojadas<br/><b>Descripción</b>: Ensamblado final .NET sin metadatos.»] class stripped_payload action embedded_payload[«<b>Técnica</b> – T1027.009 Cargas útiles incrustadas<br/><b>Descripción</b>: El shellcode de Donut incrusta la carga útil .NET.»] class embedded_payload action %% Nodes – Files Produced ps_script_file[«<b>Archivo</b>: ps_7b948266.ps1<br/><b>Contenido</b>: Decodifica la carga Base64 y la ejecuta.»] class ps_script_file file donut_shellcode[«<b>Archivo</b>: decoded.bin<br/><b>Tipo</b>: Shellcode generado por Donut»] class donut_shellcode file %% Nodes – Processes svchost_process[«<b>Proceso</b>: svchost.exe»] class svchost_process process explorer_process[«<b>Proceso</b>: explorer.exe»] class explorer_process process %% Nodes – Malware credential_stealer[«<b>Malware</b>: ladrón .NET<br/><b>Descripción</b>: Extrae contraseñas, cookies y tokens de navegadores.»] class credential_stealer malware %% Connections – Attack Flow logon_script_file –>|registrado en| run_key run_key –>|habilita| persistence_run persistence_run –>|ejecuta| powershell_interpreter powershell_interpreter –>|ejecuta| ps_script_file ps_script_file –>|contiene| obfuscation obfuscation –>|requiere| deobfuscate deobfuscate –>|produce| donut_shellcode donut_shellcode –>|cargado por| reflective_loading reflective_loading –>|escribe en| svchost_process svchost_process –>|inyecta mediante| process_injection process_injection –>|apunta a| explorer_process process_injection –>|utiliza| compile_after_delivery process_injection –>|utiliza| embedded_payload explorer_process –>|ejecuta| credential_stealer credential_stealer –>|extrae| cred_from_browser credential_stealer –>|extrae| alternate_auth cred_from_browser –>|datos recopilados| archive_data archive_data –>|comprimido por| compression compression –>|enviado mediante| exfil_webhook exfil_webhook –>|utiliza| web_service sandbox_evasion –>|verifica antes de| powershell_interpreter indirect_cmd –>|controla| uac_bypass scheduled_task –>|persistencia alternativa| autostart autostart –>|asegura| persistence_run

Flujo de Ataque

Detecciones

Posible abuso de Telegram como canal de comando y control (vía dns_query)

Equipo SOC Prime
02 Feb 2026

Puntos de posible persistencia [ASEPs – Hive de Software/NTUSER] (vía registry_event)

Equipo SOC Prime
02 Feb 2026

Llamado a funciones API de Windows sospechosas desde PowerShell (vía powershell)

Equipo SOC Prime
02 Feb 2026

Cadenas de PowerShell sospechosas (vía powershell)

Equipo SOC Prime
02 Feb 2026

Uso posible de Schtasks o AT para persistencia (vía cmdline)

Equipo SOC Prime
02 Feb 2026

Intento de manipulación de flujo de datos alternativo (ADS) Zone.Identifier sospechoso (vía process_creation)

Equipo SOC Prime
02 Feb 2026

Powershell ejecutando archivo en directorio sospechoso utilizando política de ejecución de omisión (vía cmdline)

Equipo SOC Prime
02 Feb 2026

IOCs (DestinationIP) para detectar: Cuando el malware responde

Reglas AI de SOC Prime
02 Feb 2026

IOCs (SourceIP) para detectar: Cuando el malware responde

Reglas AI de SOC Prime
02 Feb 2026

IOCs (HashMd5) para detectar: Cuando el malware responde

Reglas AI de SOC Prime
02 Feb 2026

IOCs (HashSha1) para detectar: Cuando el malware responde

Reglas AI de SOC Prime
02 Feb 2026

Persistencia a través de la clave Run para la ejecución de archivo por lotes [Evento de registro de Windows]

Reglas AI de SOC Prime
02 Feb 2026

Detección de inyección de memoria y ejecución de carga útil vía PowerShell [Powershell de Windows]

Reglas AI de SOC Prime
02 Feb 2026

Detección de ejecución de lotes y PowerShell para persistencia de malware oculto [Creación de procesos de Windows]

Reglas AI de SOC Prime
02 Feb 2026

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:

    1. 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).
    2. 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.
    3. 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.
    4. 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».
    5. 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."