Аналіз Phantom Stealer: всередині двошарового ланцюжка атак
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Phantom Stealer – це двоетапний інфостілер для Windows, який починається з шкідливого pdh.dll завантажувача і закінчується .NET-навантженням, впорскнутим у jsc.exe. Завантажувач використовує вразливість DLL hijacking, hollowing процесів і нативну AOT-компіляцію, щоб зменшити ймовірність виявлення. Як тільки він активується, другий етап payload краде облікові дані, дані браузера, інформацію про криптовалютні гаманці, вміст буфера обміну та інші конфіденційні дані, а також може замінювати скопійовані адреси гаманців на значення, контрольовані атакуючим. Шкідливе ПЗ рекламується як комерційний кримінальний продукт і наразі використовується в активних атаках.
Розслідування
Дослідники виявили, що завантажувач копіює себе в %APPDATA%MicrosoftRasManagementMpDlpService.exe і створює Run ключ для збереження стійкості. Потім він розшифровує двічі зашифроване RC4-шифрування завантаження, впорскує його в призупинений jsc.exe процес і виконує декілька антианалітичних перевірок перед початком викрадення даних. Внутрішній .NET-стіллер здатний обійти шифрування Chrome 127+ app-bound і ексфільтрує викрадену інформацію через SMTP, використовуючи підроблений домен. Окремі потоки обробляють криптопідрізання та функції кейлогінгу.
Пом’якшення
Захисники повинні стежити за несподіваними pdh.dll завантаженнями з не системних шляхів і впроваджувати засоби, що знижують ризик DLL hijacking. Команди безпеки також повинні виявляти незнайомі виконувані файли, розміщені в %APPDATA%MicrosoftRasManagement і спостерігати за Run ключем RasManSvc. Базовані на поведінці детекції повинні бути сконцентровані на hollowing процесів з Run key. Behavior-based detections should focus on process hollowing involving jsc.exe, в той час як моніторинг мережі повинен позначати підозрілі з’єднання з виявленими командно-контрольними доменами. Додаткове посилення зберігання облікових даних і жорстка контроль над доступом до буфера обміну для недовірених додатків можуть ще більше знизити ризик.
Відповідь
Настороження на створення MpDlpService.exe в каталозі RasManagement і на зміни до відповідних ключів в реєстрі Run. Розслідуйте будь-які jsc.exe процеси, що демонструють ознаки впорскнутого коду, і негайно зупиніть шкідливу діяльність. Зберіть відповідні індикатори компромісу, карантинуйте пов’язані файли та проведіть судову експертизу, щоб визначити, які облікові дані та дані гаманців могли бути піддані ризику. Скиньте уражені акаунти та за необхідності повідомте постраждалих користувачів.
graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[“<b>Техніка</b> – <b>T1176 Розширення ПЗ</b><br/><b>Опис</b>: Розміщення pdh.dll поруч із легітимною програмою.”] class step1_ext technique step1_masq[“<b>Техніка</b> – <b>T1036.005 Маскування</b>”] class step1_masq technique step1_dynapi[“<b>Техніка</b> – <b>T1027.007 Динамічне вирішення API</b>”] class step1_dynapi technique file_dll[“<b>Файл</b> – pdh.dll (шкідливий)”] class file_dll file step1_ext –>|використовує| step1_masq step1_ext –>|використовує| step1_dynapi step1_ext –>|розміщує| file_dll file_dll –>|завантажується| step1_ext step2_compromise[“<b>Техніка</b> – <b>T1554 Компрометація бінарників</b>”] class step2_compromise technique step2_activeSetup[“<b>Техніка</b> – <b>T1547.014 Active Setup</b>”] class step2_activeSetup technique step2_runkey[“<b>Техніка</b> – <b>T1547.001 Run ключі реєстру</b>”] class step2_runkey technique file_loader[“<b>Файл</b> – MpDlpService.exe (лоадер)”] class file_loader file step1_ext –>|веде_до| step2_compromise step2_compromise –>|активує| step2_activeSetup step2_activeSetup –>|створює| file_loader file_loader –>|реєструється| step2_runkey step3_evasion[“<b>Техніка</b> – <b>T1497.002 Уникнення sandbox</b>”] class step3_evasion technique step3_queryReg[“<b>Техніка</b> – <b>T1012 Запит реєстру</b>”] class step3_queryReg technique step2_compromise –>|тригер| step3_evasion step3_evasion –>|використовує| step3_queryReg step4_hollow[“<b>Техніка</b> – <b>T1055.012 Process Hollowing</b>”] class step4_hollow technique step4_threadHijack[“<b>Техніка</b> – <b>T1055.003 Перехоплення потоку</b>”] class step4_threadHijack technique process_jsc[“<b>Процес</b> – jsc.exe”] class process_jsc process process_mal[“<b>Процес</b> – інжектований .NET payload”] class process_mal process step3_evasion –>|веде_до| step4_hollow step4_hollow –>|створює| process_jsc step4_hollow –>|замінює_памʼять| process_jsc process_jsc –>|містить| process_mal step4_hollow –>|використовує| step4_threadHijack step5_browserDisc[“<b>Техніка</b> – <b>T1217 Розвідка браузерів</b>”] class step5_browserDisc technique step5_credWeb[“<b>Техніка</b> – <b>T1555.003 Дані браузерів</b>”] class step5_credWeb technique step5_privateKey[“<b>Техніка</b> – <b>T1552.004 Приватні ключі</b>”] class step5_privateKey technique step4_hollow –>|веде_до| step5_browserDisc step5_browserDisc –>|активує| step5_credWeb step5_credWeb –>|додає| step5_privateKey step6_keylog[“<b>Техніка</b> – <b>T1056.001 Кейлогінг</b>”] class step6_keylog technique step5_credWeb –>|активує| step6_keylog step7_screen[“<b>Техніка</b> – <b>T1113 Знімок екрану</b>”] class step7_screen technique step6_keylog –>|веде_до| step7_screen step8_clipboard[“<b>Техніка</b> – <b>T1115 Буфер обміну</b>”] class step8_clipboard technique step7_screen –>|веде_до| step8_clipboard step9_emailCollect[“<b>Техніка</b> – <b>T1114 Збір email</b>”] class step9_emailCollect technique step9_identity[“<b>Техніка</b> – <b>T1589.002 Email ідентифікація</b>”] class step9_identity technique step9_exfil[“<b>Техніка</b> – <b>T1048.003 SMTP витік</b>”] class step9_exfil technique step8_clipboard –>|веде_до| step9_emailCollect step9_emailCollect –>|включає| step9_identity step9_identity –>|витік| step9_exfil step10_reflective[“<b>Техніка</b> – <b>T1620 Рефлективне завантаження</b>”] class step10_reflective technique step9_exfil –>|тригер| step10_reflective
Потік атаки
Детекції
Можливі точки збереження (ASEPs – Бджолині вулики програмного забезпечення/NTUSER) (через registry_event)
Перегляд
Незвичайна зміна виконання кодової сторінки (за допомогою cmdline)
Перегляд
Можливе виявлення паролів WiFi (за допомогою cmdline)
Перегляд
IOCs (HashSha256) для виявлення: Аналіз Phantom Stealer: Внутрішній дворівневий ланцюг атак, прихований за Windows DLL
Перегляд
IOCs (HashMd5) для виявлення: Аналіз Phantom Stealer: Внутрішній дворівневий ланцюг атак, прихований за Windows DLL
Перегляд
Реєстраційняя стійкість через ключ запуску RasManSvc [Подія реєстру Windows]
Перегляд
Захоплення процесу у jsc.exe та стійкість через MpDlpService.exe [Створення процесу Windows]
Перегляд
Виконання симуляції
Передумова: Попередня перевірка телеметрії та базової лінії повинна бути успішно виконана.
Підстава: Цей розділ детально описує точне виконання техніки противника (TTP), призначеної для запуску правила виявлення. Команди та описи безпосередньо відображають виявлені TTP і призначені для генерації точної телеметрії, очікуваної логікою виявлення.
-
Опис атаки та команди:
Спочатку нападник краде шкідливе завантаження (наприклад, DLL зворотного тунелю) і зберігає його в каталозі користувача%APPDATA%. Використовуючиjsc.exeяк хост для hollowing, нападник створює новий процес, впорскує завантаження і відновлює виконання — виконуючи T1055.012 and T1055.003.
Щоб забезпечити стійкість, нападник копіює шкідливий DLL у%APPDATA%MicrosoftRasManagementMpDlpService.exeі реєструє його як службу, яка запускається при вході в систему, зловживаючи легітимним ім’ям служби (T1620). -
Сценарій регресійних тестів:
# --------------------------------------------------------- # Симуляція сценарію атаки – Процес Hollowing + Стійкість # --------------------------------------------------------- # Змінні $appData = "$env:APPDATAMicrosoftRasManagement" $loaderPath = Join-Path $appData "MpDlpService.exe" $maliciousDll = "$env:TMPmalicious.dll" # місце для payload # 1. Підготовка стійкого каталогу New-Item -Path $appData -ItemType Directory -Force | Out-Null # 2. Скидання фальшивого шкідливого DLL (симуляція payload) # У реальному нападі це було б скомпільоване завантаження; тут ми створюємо файл нульової довжини. New-Item -Path $maliciousDll -ItemType File -Force | Out-Null # 3. Копіювання DLL до місця підробленої служби Copy-Item -Path $maliciousDll -Destination $loaderPath -Force # 4. Реєстрація тимчасової служби, яка вказує на скопійований файл (вимагає адміністраторських прав) $svcName = "MpDlpService" sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null # 5. Запуск служби (ініціює виконання MpDlpService.exe) sc.exe start $svcName | Out-Null # 6. Виконання hollowing, використовуючи jsc.exe як хост # Ми запустимо jsc.exe в призупиненому стані, замінимо його пам'ять на фальшивий payload, # потім відновимо. Це використовує функцію Invoke-ProcessHollowing з PowerSploit. function Invoke-ProcessHollowing { param( [string]$HostPath, [string]$PayloadPath ) # Завантаження .NET API Add-Type @" using System; using System.Diagnostics; using System.Runtime.InteropServices; public class Hollow { [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine, IntPtr procSec, IntPtr threadSec, bool inherit, uint flags, IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi); [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } "@ # Створення призупиненого процесу $si = New-Object Hollow+STARTUPINFO $pi = New-Object Hollow+PROCESS_INFORMATION $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si) $CREATE_SUSPENDED = 0x00000004 $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false, $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $ok) { Write-Error "Не вдається створити призупинений процес" ; return } # (Кроки ін'єкції payload пропущені – місце для справжньої техніки) # Відновлення потоку $RESUME_THREAD = 0x00000001 [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null } # Виконати hollowing (використовуючи реальний jsc.exe як хост) $jscPath = "$env:SystemRootSystem32jsc.exe" Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll # --------------------------------------------------------- # Кінець симуляції # --------------------------------------------------------- -
Команди очищення:
# Зупинка та видалення тимчасової служби sc.exe stop MpDlpService | Out-Null sc.exe delete MpDlpService | Out-Null # Видалення завантажувача і фальшивого payload Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue # Опціонально: знищити будь-які залишкові процеси jsc.exe, запущені тестом Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force