Исследователи кибербезопасности раскрыли детали сложной атаки с использованием нового malware-as-a-service платформ Lunex Stealer (также известного как Psychedelic Stealer), которая нацелена на украиноязычных пользователей через скомпрометированные веб-сайты с фейковыми CAPTCHA-страницами. Атака использует уязвимый драйвер AMD Radeon (CVE-2023-20598) через технику Bring-Your-Own-Vulnerable-Driver (BYOVD) для отключения мониторинга безопасности при сохранении видимости процессов, крадет учетные данные из семи Chromium-браузеров и криптовалютных кошельков, а также устанавливает персистентный удаленный доступ к файловой системе через Chrome Native Messaging Hosts.
Ключевые факты: Lunex использует CVE-2023-20598 в драйвере AMD PDFWKRNL.sys; техника BYOVD обнуляет kernel callbacks для ослепления EDR; крадет credentials из 7 Chromium-браузеров (Chrome, Edge, Brave, Yandex, Opera, Opera GX, Vivaldi); извлекает данные из 9 криптовалютных кошельков; 28 C2 панелей обнаружены в 13 странах; платформа создана русскоязычными разработчиками.
Атака Lunex Stealer следует тщательно продуманной четырехэтапной цепочке, начинающейся с социальной инженерии и завершающейся установлением полного контроля над системой жертвы.
Атакующие компрометируют легитимные украинские веб-сайты, внедряя iframe элементы, которые обслуживают ClickFix-подобные фейковые CAPTCHA страницы. Эти страницы инструктируют жертву выполнить команду msiexec, которая тихо устанавливает вредоносный MSI пакет с сервера злоумышленника. MSI пакет elita.msi (1.1 MB) представляет собой неподписанный OLE Compound Document, представляющий себя как "Vertification" от "Internal Software" — намеренная опечатка соответствует украинскому слову в тексте приманки.
Установщик использует несколько техник для минимизации обнаружения: свойство LIMITUI=1 подавляет стандартный мастер Windows Installer, установка происходит в пользовательскую директорию %LOCALAPPDATA%\Programs\Internal Software\Vertification\ без запроса прав администратора и UAC elevation prompt. Свойства ARPNOMODIFY=1 и ARPNOREPAIR=1 скрывают кнопки Modify и Repair из панели Add/Remove Programs. Custom Action типа 226 на позиции 6700 автоматически запускает payload сразу после InstallFinalize, причем флаг "continue on error" означает, что MSI сообщает об успешной установке даже если payload не выполняется.
Второй этап — это 2.3 MB 64-битный исполняемый файл psychedelic.exe (также config.exe), скомпилированный с MinGW-w64, который маскируется под несуществующий "Update Manager" от Canonical Ltd. Timestamp компиляции фальсифицирован на 2054 год, а два TLS callback выполняются до PE entry point — сильный индикатор malware. Все операционные строки в бинарнике зашифрованы AES-256 в CTR режиме с 32-байтным ключом и 16-байтным IV, встроенными в секцию .rdata.
Loader реализует сложную схему обфускации Import Address Table через dead-code функцию, защищенную условием GetTickCount() == 0x9E3779B9 (константа TEA/XTEA шифров, производная от золотого сечения). Это математически невозможно при нормальном выполнении. Функция вызывает 55 импортированных API с NULL параметрами, существуя исключительно для раздувания Import Address Table ложными записями из SHELL32, WINHTTP, WS2_32, CRYPT32, GDI32 и десяти дополнительных DLL.
Для эскалации привилегий Loader выполняет четырехшаговую цепочку: перезаписывает ImagePathName, CommandLine и InMemoryOrderModuleList в Process Environment Block путем из GetWindowsDirectoryA; вызывает CoGetObject с COM Elevation Moniker строкой для CMSTPLUA COM объекта, отмеченного как auto-elevate в реестре Windows; включает SeLoadDriverPrivilege через OpenProcessToken и AdjustTokenPrivileges; устанавливает и загружает BYOVD драйвер через OpenSCManagerA, CreateServiceA и StartServiceA.
Loader читает C:\Windows\system32\ntoskrnl.exe для извлечения RSDS PDB GUID из PE debug directory, затем запускает curl.exe с User-Agent Microsoft-Symbol-Server/10.1700.661.0 для загрузки ntkrnlmp.pdb с официального Microsoft Symbol Server. Загруженный PDB файл содержит точные смещения структур и определения типов для конкретной сборки Windows ядра. Loader memory-maps PDB и парсит его через восемь dbghelp.dll API, разрешая 15 kernel символов включая PspCreateProcessNotifyRoutine, PspCreateThreadNotifyRoutine, PspLoadImageNotifyRoutine, ActiveProcessLinks, Token, Protection, SignatureLevel и CallbackListHead.
Затем Loader дешифрует 2 MB AES-256-GCM зашифрованный overlay (91% размера файла), который оказывается нативным x64 kernel драйвером. Перед развертыванием драйвера Loader проверяет запущенные процессы и kernel модули против 20-элементного blocklist, включающего драйверы Microsoft Defender, Kaspersky (6 драйверов), Dr.Web (3 драйвера), ESET (3 драйвера), Elastic, Sysinternals, CrowdStrike и SentinelOne.Entry 20 — это fltMgr.sys, сам Windows Filter Manager; удаление hooks из этого драйвера отключает все minifilter-based продукты безопасности одновременно.
Loader устанавливает уязвимый AMD драйвер PDFWKRNL.sys (USB-C Power Delivery Firmware Update Utility Driver), который подписан через цепочку AMD → Sectigo → USERTrust → Microsoft Code Verification Root. Драйвер регистрирует устройство на .\PdFwKrnl и обрабатывает IRP_MJ_DEVICE_CONTROL через switch statement на 12 IOCTL control codes без каких-либо проверок доступа. IOCTL 0x80002028 копирует содержимое kernel callback table в user-mode buffer, а IOCTL 0x80002014 копирует нули в callback table entries, принадлежащие security продуктам. Loader использует read IOCTL для получения содержимого callback table, определяет какой kernel module владеет каждой записью через K32GetDeviceDriverBaseNameA, проверяет имя модуля против 20-элементного blocklist и обнуляет совпадающие записи через write IOCTL.
После обнуления kernel callbacks Loader загружает финальный payload psychedeliclove.exe (275 KB 64-битный исполняемый файл, скомпилированный 12 сентября 2026) с http://107.175[.]82[.]242:9000/wilow/psychedeliclove.exe. Этот бинарник содержит 11 PE секций, 169 импортов через 11 DLL и встроенную 2,124-байтную JSON конфигурацию в кастомной .embed секции.
LunexStealer коммуницирует с Lunex панелью на 193.178.159[.]128 через HTTP с API-key аутентификацией. Протокол следует структурированному потоку: инициализация, дешифрование конфигурации, machine fingerprinting с 17 собранными полями, check-in с kill switch проверкой, кража credentials и кошельков со структурированной exfiltration, и persistent task polling с рандомизированными heartbeat интервалами (20-25 секунд jitter).
Для кражи browser credentials LunexStealer нацеливается на семь Chromium-based браузеров: Google Chrome, Microsoft Edge, Brave, Yandex Browser, Opera, Opera GX и Vivaldi. Browser процесс завершается через taskkill /F /IM для освобождения locks на SQLite database файлах. Бинарник не линкует SQLite library, а реализует custom B-tree page parser для чтения browser databases напрямую. Извлечение encryption key обрабатывает три Chrome версии: Version 10 использует AES-GCM с DPAPI-protected master key; Version 11 (Chrome's App-Bound Encryption, июль 2024) требует COM-based process injection с генерацией x64 shellcode для взаимодействия с Chrome's IElevator COM service; Version 20 использует ChaCha20-Poly1305 authenticated encryption.
Критическая персистентность: LunexStealer устанавливает три независимых канала персистентности: Registry Run key, скрытую scheduled task "psychedelicloveUtils" и Chrome Native Messaging Host через HKCU\Software\Google\Chrome\NativeMessagingHosts\com.lunex.explorer. NMH backed 13,200-байтным PowerShell скриптом, предоставляющим шесть filesystem actions: list_drives, list_dir, read_file (до 524 MB), write, download и run. Это переживает удаление stealer binary, перезагрузки системы и перезапуски браузера.
Кампания работала через три хоста под разными провайдерами в разных странах. Payload server на 107.175.82[.]242 (OneProvider, Seattle) обслуживал LunexStealer на порту 9000 и управлялся через EasyPanel. Exfiltration server на 193.178.159[.]128 (UFO Technologies, Roubaix, France) хостил четыре сервиса: Lunex operator panel на порту 8000, REST API на порту 8080, публично暴露的 phpMyAdmin 5.2.3 на порту 8081 с root MySQL user и SSH. Delivery domain uasputnik[.]com разрешался в shared hosting в Варшаве, Польша.
Оба C2 хоста имели идентичный SSH HASSH fingerprint, подтверждая единого оператора, управляющего обоими серверами с одинаковым provisioning tooling. TLS не был сконфигурирован ни на одном C2 порту. phpMyAdmin instance предоставлял прямой, неаутентифицированный database access. Безопасность инфраструктуры оператора была плохой, что контрастировало с технической сложностью loader — это предполагает либо отдельных лиц, обрабатывающих разработку и операции, либо инфраструктуру, спроектированную как disposable.
Анализ Lunex panel frontend (React single-page application, обслуживаемый nginx) выявил 453 KB JavaScript bundle, содержащий полный operator interface. Internationalisation framework (i18next) загружает русский как default locale. Более 150 русскоязычных UI строк встроены, включая empty-state messages ("Ботов пока нет – подключи установщик с API-ключом"), error messages ("Неверный логин или пароль") и operational labels ("Команд в очереди"). Language selector перечисляет "Русский" как primary option. Placeholder пример в browser spoofing конфигурации использует "ya.ru" (домашнюю страницу Yandex Russia) как target domain.
UFO Technologies в Красногорске (Московская область) хостит четыре панели, делая это наиболее концентрированным кластером. Одна из этих панелей (193.178.158.61) находится в той же /24 сети, что и exfiltration server в этом анализе, предполагая shared operator infrastructure. Одна панель в Турции (103.101.85[.]123) разрешалась в пять phishing доменов: account-sams-club[.]com, teamwork-recover-password[.]com, namshi-uae[.]com, whatsappbusineses[.]com и ibraq-perfumes[.]com, подтверждая использование Lunex для brand impersonation и phishing наряду с credential theft.
Lunex Stealer реализует несколько техник, превышающих типичную сложность stealer. FNV-1a hash-based API resolution, подобная Cobalt Strike's beacon, избегает plaintext API name strings в памяти. Бинарник извлекает raw syscall numbers напрямую из ntdll.dll для выполнения direct syscalls, обходя user-mode EDR hooks. Custom implementations throughout, включая hand-written JSON parser с linked-list dictionaries, SQLite B-tree page reader, ZIP builder с raw PK headers и Shell.Application COM-based extraction, устраняют external library dependencies, которые signature-based detection мог бы target.
Полная Ghidra decompilation через 275 functions произвела 992 KB pseudocode. Chrome Secure Preferences integrity bypass, присутствующий в LunexStealer, первоначально вызвал потенциальную связь с APT31's SUPERSTOMP tool, задокументированным Volexity 9 сентября 2026. Однако в течение сентября 2026 по крайней мере четыре независимые реализации того же bypass были идентифицированы в несвязанных операциях, указывая, что техника полностью proliferated и больше не является reliable indicator state-sponsored activity.
| Техника | Описание | Назначение |
|---|---|---|
| PEB masquerade | Перезапись ImagePathName, CommandLine в Process Environment Block | Маскировка под легитимные Windows binaries для auto-elevate COM |
| PDB-guided symbol resolution | Загрузка kernel debugging symbols с Microsoft Symbol Server | Version-agnostic получение kernel structure offsets |
| Dead-code IAT anchor | Недостижимая функция с 55 decoy API imports | Раздувание Import Address Table ложными записями |
| AES-256 string encryption | Все operational strings зашифрованы в CTR режиме | Сокрытие API names, file paths, registry keys, C2 URLs |
| Direct syscalls | Raw syscall numbers из ntdll.dll | Обход user-mode EDR hooks |
| Custom B-tree parser | Self-implemented SQLite database reader | Устранение external library dependencies |
Для защитников критическое понимание заключается в том, что detection должен фокусироваться на этапах до возникновения EDR blindness: PDB downloads из non-development processes, driver drops в temporary directories и service creation для unsigned drivers из non-standard paths. Post-blindness, Native Messaging Host registry key (NativeMessagingHosts\com.lunex.explorer) является наиболее reliable indicator of compromise и должен быть включен в любой remediation scope наряду с stealer binary, scheduled task и Run key.
| Тип | Индикатор | SHA-256 / Значение |
|---|---|---|
| MSI installer | elita.msi | 38E90AFFE37342EE36917CDC535FE9BF04589AFA8430EB8D1BA1016ADCFC1878 |
| Loader | psychedelic.exe / config.exe | bf14cd6c3328ebd08e940478b5d1da04e9e5aa576d045d41950bf4f1e2456dd8 |
| BYOVD driver | PDFWKRNL.sys (CVE-2023-20598) | 6e8b49cf70bf854e8c59c7d27cefa89406caf8978461190dabb86dafcd8554e1 |
| Stealer | psychedeliclove.exe | 06f434695f93d7fd11eeff71358ff69fed79d310a66d993bbcc4ff979c117c90 |
| C2 server | Exfiltration endpoint | 193.178.159[.]128:8080 |
| Delivery domain | Fake CAPTCHA host | uasputnik[.]com |
| API key | X-API-Key header | c9daf8dbafc5e1f63e4af742a14a8a6669365e106ab0247ab366621bbc1f6967 |
| Registry persistence | Native Messaging Host | HKCU\Software\Google\Chrome\NativeMessagingHosts\com.lunex.explorer |
Lunex Stealer представляет значительную эволюцию в тактике information stealers, комбинируя legitimate driver abuse с browser-based persistence mechanisms для evasion detection при сохранении long-term access к victim systems. Платформа быстро расширялась с июня 2026, с 28 unique command-and-control panels, идентифицированными в 13 странах, демонстрируя active development и distribution среди multiple criminal groups. Для организаций это подчеркивает необходимость многоуровневой защиты, включающей контроль driver installation, мониторинг kernel-level activities и regular audit browser extension и Native Messaging Host configurations.
«В мире кибербезопасности самая опасная атака — та, которую вы не видите. Когда malware ослепляет ваши инструменты защиты, но оставляет их работающими, вы думаете, что все в порядке, пока ваши данные уже не украдены».
— Микко Хиппонен, главный исследователь F-Secure
