SOC Prime Bias: Crítico

27 Nov 2025 19:10

La Caza de Amenazas de Zscaler Expone y Reconstruye la Campaña APT Water Gamayun

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
La Caza de Amenazas de Zscaler Expone y Reconstruye la Campaña APT Water Gamayun
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

El informe cubre una intrusión en varias etapas atribuida al grupo Water Gamayun APT que explota una vulnerabilidad de día cero de MMC (CVE-2025-26633) para entregar cargas útiles de PowerShell en un archivo RAR de doble extensión.

Investigación

Zscaler reconstruyó la cadena de muerte desde un redireccionamiento de búsqueda de Bing a un sitio comprometido, descarga de un archivo .pdf.rar, explotación de MSC EvilTwin, scripts de PowerShell en etapas y ejecución del backdoor ItunesC.exe.

Mitigación

La guía incluye monitorear archivos de doble extensión, inspeccionar redirecciones, detectar comandos de PowerShell codificados y bloquear la IP y los dominios maliciosos.

Respuesta

Al detectar, alertar sobre mmc.exe generando PowerShell con -EncodedCommand, poner en cuarentena el archivo, bloquear conexiones salientes a 103.246.147.17 y activar procedimientos de respuesta a incidentes.

mermaid graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#ccccff classDef file fill:#ffff99 classDef c2 fill:#ffccff %% Node Definitions node_initial_access[«<b>Acción</b> – <b>T1659 Inyección de Contenido</b><br /><b>Descripción</b>: Compromiso de un sitio legítimo para inyectar redirecciones maliciosas»] class node_initial_access action node_malicious_domain[«<b>Archivo</b> – <b>Nombre</b>: Dominio malicioso similar<br /><b>Propósito</b>: Sirve archivo de doble extensión»] class node_malicious_domain file node_pdf_rar[«<b>Archivo</b> – <b>Nombre</b>: brochure.pdf.rar<br /><b>Tipo</b>: Archivo de doble extensión disfrazado como PDF»] class node_pdf_rar file node_user_execution[«<b>Acción</b> – <b>T1204.001 Enlace Malicioso</b><br /><b>Descripción</b>: La víctima hace clic en el enlace y descarga el archivo»] class node_user_execution action node_exploit_client[«<b>Acción</b> – <b>T1203 Explotación para Ejecución en Cliente</b><br /><b>Descripción</b>: El archivo descomprime .msc que secuestra mmc.exe vía MSC EvilTwin»] class node_exploit_client action node_cve[«<b>Herramienta</b> – <b>Nombre</b>: Exploit MSC EvilTwin (CVE‑2025‑26633)<br /><b>Objetivo</b>: mmc.exe»] class node_cve tool node_mmc[«<b>Proceso</b> – <b>Nombre</b>: mmc.exe»] class node_mmc process node_powershell[«<b>Proceso</b> – <b>Nombre</b>: powershell.exe»] class node_powershell process node_ps_command[«<b>Acción</b> – <b>T1059.001 PowerShell</b><br /><b>Descripción</b>: Comando Base64 UTF‑16LE codificado»] class node_ps_command action node_obfuscation[«<b>Acción</b> – <b>T1027 Ofuscación</b> y <b>T1140 Decodificación</b><br /><b>Descripción</b>: Comando PowerShell codificado doblemente»] class node_obfuscation action node_unrar[«<b>Herramienta</b> – <b>Nombre</b>: UnRAR.exe»] class node_unrar tool node_rar_payload[«<b>Archivo</b> – <b>Nombre</b>: Cargas RAR protegidas por contraseña»] class node_rar_payload file node_hidden_window[«<b>Acción</b> – <b>T1564.003 Ventana Oculta</b><br /><b>Descripción</b>: Clase .NET WinHpXN llama a ShowWindow para ocultar consola»] class node_hidden_window action node_itunesc[«<b>Malware</b> – <b>Nombre</b>: ItunesC.exe<br /><b>Función</b>: Cargador y puerta trasera»] class node_itunesc malware node_c2[«<b>C2</b> – <b>IP</b>: 103.246.147.17<br /><b>Protocolo</b>: HTTPS»] class node_c2 c2 %% Connections node_initial_access u002du002d>|redirecciona_a| node_malicious_domain node_malicious_domain u002du002d>|sirve| node_pdf_rar node_pdf_rar u002du002d>|descargado_por| node_user_execution node_user_execution u002du002d>|activar| node_exploit_client node_exploit_client u002du002d>|descarga| node_cve node_cve u002du002d>|secuestra| node_mmc node_mmc u002du002d>|carga| node_powershell node_powershell u002du002d>|ejecuta| node_ps_command node_ps_command u002du002d>|utiliza| node_obfuscation node_ps_command u002du002d>|descarga| node_unrar node_unrar u002du002d>|extrae| node_rar_payload node_rar_payload u002du002d>|conduce_a| node_hidden_window node_hidden_window u002du002d>|lanza| node_itunesc node_itunesc u002du002d>|comunica_con| node_c2

Flujo de Ataque

Ejecución de simulación

Prerequisito: El Control Preventivo de Telemetría y Línea de 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 DEBEN reflejar directamente los TTPs identificados y tender 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 del ataque y comandos:
    El atacante, aprovechando la metodología de Water Gamayun, prepara una carga útil maliciosa de PowerShell que escribe un nuevo usuario administrador local y lo agrega al grupo de Administradores. Para ocultar la carga útil, el atacante:

    1. Escribe el script de PowerShell en texto claro.
    2. Lo codifica en Base64 de UTF‑16LE.
    3. Inserta un guion bajo (_) después de cada 4 caracteres para aumentar la entropía.
    4. Encadena una operación |Replace('_','') de modo que PowerShell en tiempo de ejecución elimina los guiones bajos antes de decodificar, igualando la firma de detección.

    El comando de ejecución final es:

    powershell.exe -EncodedCommand <Base64StringWithUnderscores> | Replace('_','')

    Esta línea de comando exacta satisface las dos condiciones de la regla Sigma (-EncodedCommand and |Replace('_','')), generando entradas Sysmon EventID 1 y Security EventID 4688 que la regla marcará.

  • Script de prueba de regresión:
    El script a continuación automatiza la creación de la carga útil ofuscada y la ejecuta. Puede ejecutarse en cualquier host de Windows con PowerShell 5.1+.

    # Simulación de ofuscación de PowerShell al estilo Water Gamayun
    # Paso 1: Definir la carga útil de PowerShell maliciosa (agrega un usuario administrador local)
    $payload = @'
    $user = "tempAdmin"
    $pwd  = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
    New-LocalUser -Name $user -Password $pwd -FullName "Temp Admin" -Description "Test admin account"
    Add-LocalGroupMember -Group "Administrators" -Member $user
    '@
    
    # Paso 2: Codificar a UTF-16LE y luego a Base64
    $bytes   = [System.Text.Encoding]::Unicode.GetBytes($payload)
    $b64     = [Convert]::ToBase64String($bytes)
    
    # Paso 3: Inyectar guiones bajos cada 8 caracteres (simulando el patrón del grupo)
    $b64Underscored = ($b64 -split '(.{8})' | Where-Object {$_} | ForEach-Object { $_ + '_' }) -join ''
    
    # Paso 4: Ejecutar con el pipeline requerido Replace('_','')
    powershell.exe -EncodedCommand $b64Underscored | Replace('_','')
  • Comandos de limpieza:
    Los siguientes comandos eliminan el usuario de prueba y restauran el entorno.

    # Limpieza: Eliminar la cuenta de administrador temporal creada por la prueba
    $user = "tempAdmin"
    if (Get-LocalUser -Name $user -ErrorAction SilentlyContinue) {
        Remove-LocalUser -Name $user
        Write-Host "Deleted test user $user."
    } else {
        Write-Host "Test user $user does not exist."
    }