SOC Prime Bias: Alto

29 Jun 2026 06:42 UTC

Campaña Photo ZIP dirigida a la industria de hospitalidad entrega implante Node.js para acceso persistente

Author Photo
SOC Prime Team linkedin icon Seguir
Campaña Photo ZIP dirigida a la industria de hospitalidad entrega implante Node.js para acceso persistente
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Una campaña de intrusión activa y multietapa está apuntando al sector hotelero a través de archivos ZIP temáticos de fotos que contienen archivos LNK maliciosos. La cadena de infección utiliza decodificadores de PowerShell ofuscados, compilación dinámica de DLL de .NET y un implante basado en Node.js para persistencia y comunicación de mando y control. El actor de la amenaza también lava la autenticación a través de servicios legítimos como Calendly y Google para reducir la posibilidad de detección basada en correo electrónico.

Investigación

Microsoft identificó dos oleadas separadas de la campaña y observó una progresión desde cargadores simples de PowerShell a etapas de compilación .NET más complejas. La investigación también descubrió una estrategia de doble persistencia que se basaba tanto en claves de registro HKCURun and HKCURunOnce . Los investigadores también observaron el uso de dominios con frente de Cloudflare y puertos de mando y control no estándar para oscurecer la infraestructura de soporte.

Mitigación

Las organizaciones deben priorizar las detecciones en capas para la ejecución de accesos directos, compilación inesperada de .NET, y procesos de Node.js lanzados desde directorios donde el usuario puede escribir. Se recomienda enfáticamente habilitar las reglas de Reducción de la Superficie de Ataque y monitorear cambios no autorizados en las exclusiones de Microsoft Defender. Bloquear patrones de dominio sospechosos y observar el tráfico saliente por puertos inusuales también puede ayudar a reducir la exposición. .cfd puede también ayudar a reducir la exposición.

Respuesta

Si esta actividad es detectada, la remediación debe incluir la eliminación tanto de la entrada RunOnce de ProgramData como de la clave Node.js para detener el implante evitando que se restaure a sí mismo. Los equipos de seguridad también deben eliminar el entorno de Node.js y los Run de AppDataLocalNodejs .js archivos relacionados del directorio. La limpieza completa requiere abordar tanto la carga activa como cualquier mecanismo de persistencia dejado atrás. archivos relacionados del . Una limpieza completa requiere abordar tanto la carga útil activa como los mecanismos de persistencia restantes.

"flowchart TD step_phishing["T1566.002 – Phishing: Spearphishing Link: Usa el blanqueo de autenticación a través de redireccionamientos de Calendly y Google para entregar un archivo ZIP temático de fotos."] step_user_execution["T1204.002 – Ejecución de Usuario: Archivo Malicioso: La víctima abre un acceso directo de imagen falso (.lnk) que desencadena un descargador de PowerShell ofuscado."] rules_for_user_execution("<b>Nombre de la Regla</b>: Posible Archivo LNK Malicioso con Doble Extensión<br/><b>ID de la Regla</b>: 13f9a3c1-b2fe-4268-8052-bf6fe353e952") step_obfuscation["T1027 – Archivos o Información Ofuscados: PowerShell usa decodificación aritmética (XOR, módulo) para recuperar las etapas subsiguientes."] rules_for_obfuscation("<b>Nombre de la Regla</b>: Posibles Indicadores de Ofuscación de PowerShell<br/><b>ID de la Regla</b>: a11f179d-8248-4d34-905c-e61735a72688") step_compilation["T1027.004 – Compilación Después de la Entrega: PowerShell desencadena la compilación .NET usando csc.exe y cvtres.exe para crear DLLs."] step_implant_execution["Ejecución de implantes basados en Node.js: Despliegue de cargas maliciosas .js a través de node.exe."] rules_for_implant_execution("<b>Nombre de la Regla</b>: Posible Nodo Generado por un Proceso Conocido Abusado<br/><b>ID de la Regla</b>: b36fbdaf-1bab-45c2-a15b-f0c25c696d72") step_persistence["T1547.014 – Ejecución Automática en Inicio o Inicio de Sesión: Configuración Activa: Modelo dual usando claves de registro 'Run' y 'RunOnce' para el componente de Node.js y el ejecutable de ProgramData."] rules_for_persistence("<b>Nombre de la Regla</b>: Posibles Puntos de Persistencia [ASEPs – Colmena del Software/NTUSER]<br/><b>ID de la Regla</b>: 4cb3ac97-0fab-4447-9054-6f2d6ca102a1") step_command_and_control["TA0011 – Mando y Control: Beaconing a infraestructura IP fija sobre puertos no estándar (8443, 56001) y automatización del navegador sin cabeza."] rules_for_c2("<b>Nombre de la Regla</b>: Mando y Control Sospechoso por Solicitud DNS de Dominio de Nivel Superior (TLD) inusual (a través de dns)<br/><b>ID de la Regla</b>: 63f3e8bc-0241-4f00-b9db-d4c309e61036") rules_for_c2_network("<b>Nombre de la Regla</b>: Runtimes de Scripting que Inician Conexiones TLS Salientes (a través de network_connection)<br/><b>ID de la Regla</b>: 1ac66e9b-fd10-4c8c-af41-8c3d901ba03d") step_phishing –>|conduce_a| step_user_execution step_user_execution –>|desencadena| step_obfuscation step_user_execution -.->|detectado_por| rules_for_user_execution step_obfuscation –>|conduce_a| step_compilation step_obfuscation -.->|detectado_por| rules_for_obfuscation step_compilation –>|permite| step_implant_execution step_implant_execution –>|establece| step_persistence step_implant_execution -.->|detectado_por| rules_for_implant_execution step_persistence –>|conduce_a| step_command_and_control step_persistence -.->|detectado_por| rules_for_persistence step_command_and_control -.->|detectado_por| rules_for_c2 step_command_and_control -.->|detectado_por| rules_for_c2_network "

Flujo de Ataque

Ejecución de Simulación

Prerequisito: La verificación previa al vuelo de Telemetría y Línea Base debe haber pasado.

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 TTPs 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 de Ataque y Comandos: Un adversario ha obtenido acceso inicial a través de un enlace de spearphishing (T1566.002). Para establecer persistencia y Mando y Control (C2), el adversario despliega un implante ligero basado en PowerShell. Para evitar la detección por reglas básicas de firewall que solo monitorean puertos estándar, el atacante decide usar un puerto no estándar (8443) para el latido principal. Además, el implante está configurado para realizar una «llamada a casa» secundaria a un dominio de respaldo alojado en un .cfd dominio de nivel superior (TLD) para asegurar resiliencia si la IP primaria es bloqueada. Esto imita el comportamiento de la campaña Photo-Zip mencionada en las referencias de la regla.

  • Script de Prueba de Regresión:

    # Script de Simulación: Emulación de C2 para Validación de Reglas
    # Este script simula conexiones de red a puertos no estándar y dominios .cfd.
    
    Write-Host "[+] Iniciando la Simulación de C2..." -ForegroundColor Cyan
    
    # 1. Simular conexión a un puerto C2 no estándar (8443)
    # Usamos una IP pública que escucha en 8443 (o un oyente local si está disponible)
    Write-Host "[+] Intentando conexión al puerto no estándar 8443..." -ForegroundColor Yellow
    try {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect("8.8.8.8", 8443) # Usando Google DNS como un objetivo ficticio para pruebas de puerto
    } catch {
        Write-Host "[!] Falló la conexión al puerto 8443 (Esperado si el puerto está cerrado), pero la telemetría aún debe generarse." -ForegroundColor Gray
    } finally {
        $tcpClient.Close()
    }
    
    # 2. Simular conexión a un dominio .cfd
    # Intentamos resolver y conectar a un dominio ficticio .cfd
    Write-Host "[+] Intentando conexión al dominio .cfd..." -ForegroundColor Yellow
    $cfdDomain = "malicious-c2-test.cfd"
    try {
        # Usando Resolve-DnsName para activar telemetría DNS, seguido de una solicitud web
        Resolve-DnsName -Name $cfdDomain -ErrorAction SilentlyContinue
        Invoke-WebRequest -Uri "http://$cfdDomain" -TimeoutSec 2 -ErrorAction SilentlyContinue
    } catch {
        Write-Host "[!] Falló la conexión al dominio .cfd (Esperado para dominio ficticio), pero la telemetría debe ser generada." -ForegroundColor Gray
    }
    
    Write-Host "[+] Simulación Completa." -ForegroundColor Cyan
  • Comandos de Limpieza:

    # Limpieza: Este script específico no creó artefactos persistentes.
    # Si se inició un oyente, debe detenerse.
    Write-Host "[+] No se requiere limpieza para esta simulación sin estado." -ForegroundColor Green