Группа APT (Advanced Persistent Threat, условно-постоянная угроза) Turla, связанная с российскими спецслужбами, продолжает совершенствовать свой инструментарий. Исследователи обнаружили новую, значительно усовершенствованную версию загрузчика для известного бэкдора Kazuar, обозначенную как v3. Этот загрузчик демонстрирует возросшую сложность, активно используя технологию COM (Component Object Model, модель компонентных объектов) и передовые методы обхода систем безопасности, включая бесфайловый (patchless) байпас ETW (Event Tracing for Windows, трассировка событий Windows) и AMSI (Antimalware Scan Interface, интерфейс сканирования на наличие вредоносных программ).
Описание
Кампания начинается с чистого, необфусцированного VBS-скрипта, который, предположительно, запускается злоумышленниками уже после получения доступа к системе. Скрипт создает на диске жертвы каталог, маскирующийся под папку драйверов HP, и загружает в него несколько файлов с контролируемого сервера. Среди них - легитимный подписанный установщик драйвера принтера "hpbprndi.exe", который впоследствии используется для техники DLL side-loading (подмены библиотеки). Он загружает вредоносную библиотеку "hpbprndiLOC.dll", выступающую в роли нативного загрузчика. Кроме того, скачиваются три зашифрованных модуля Kazuar v3: KERNEL, WORKER и BRIDGE. Для обеспечения устойчивости (persistence) скрипт создает запись в автозагрузке реестра Windows.
Нативный загрузчик, реализованный как DLL, обладает сложной обфускацией кода с ложными вызовами API и запутанным потоком управления. Его ключевой особенностью является метод перенаправления потока выполнения (control flow redirection), который позволяет коду выполниться повторно после того, как система сочтет загрузку библиотеки завершенной. Этот трюк используется для активации основных вредоносных функций.
На втором этапе выполняется обход систем мониторинга. Загрузчик применяет изощренный бесфайловый метод байпаса ETW и AMSI с использованием аппаратных точек останова (hardware breakpoints). Вместо модификации кода в памяти, вредоносная программа регистрирует обработчик исключений и настраивает процессор на прерывание выполнения при вызове критических функций безопасности - "NtTraceControl" (для ETW) и "AmsiScanBuffer". Когда вызов происходит, срабатывает исключение, управление перехватывает обработчик, который подменяет результат проверки на «чистый» и пропускает выполнение оригинальной функции, эффективно ослепляя системы защиты.
Далее загрузчик активно использует COM для скрытной подготовки окружения. Он реплицирует регистрацию COM-объекта "ADODB.Stream" из системного раздела реестра в пользовательский, что является техникой уклонения от обнаружения. Затем, используя автоматизацию оболочки Windows через COM, вредоносная программа создает целевые каталоги для полезной нагрузки, при этом операция атрибутируется как действие легитимного процесса "explorer.exe". После этого в память расшифровывается управляемая сборка .NET, которая записывается на диск с помощью того же COM-объекта "ADODB.Stream", избегая прямых вызовов файловых API.
Финальным шагом загрузчик создает в реестре три пользовательские регистрации COM-объектов, которые указывают на эту сборку .NET. При их активации операционная система запускает управляемую среду CLR (Common Language Runtime) внутри процесса-суррогата "dllhost.exe". Нативная часть передает зашифрованные байты модулей Kazuar и криптографический ключ в публичный метод сборки, которая выполняет их расшифровку и загрузку непосредственно в память.
Все три модуля Kazuar v3 - KERNEL, WORKER и BRIDGE - представляют собой обфусцированные сборки .NET, разделенные по функциональности. KERNEL выступает основным оркестратором, WORKER занимается сбором информации о системе и установленных средствах защиты, а BRIDGE отвечает за коммуникацию с серверами управления, используя для этого скомпрометированные сайты на WordPress. Анализ показал, что в полезной нагрузке используется метка агента "AGN-RR-01", что может связывать эту атаку с кампанией, о которой ранее сообщала ESET, предполагая возможное сотрудничество между группами Gamaredon и Turla.
Таким образом, обновленный загрузчик Kazuar v3 демонстрирует высокий уровень технической изощренности Turla. Комбинация сложной обфускации, перенаправления потока выполнения, бесфайлового обхода ETW/AMSI и глубокой интеграции в легитимные механизмы Windows COM делает эту угрозу крайне скрытной и сложной для обнаружения как традиционными антивирусами, так и современными EDR-решениями.
Индикаторы компрометации
IPv4
- 185.126.255.132
Domains
- esetcloud.com
URLs
- https://arianeconseil.online/wp-includes/sitemaps/html/
- https://download.originalapk.com/wp-content/plugins/loginizer/styles/
- https://portal.northernfruit.com/wp-content/plugins/file-away/core/
SHA256
- 3db10e71dab8710fb69b5c65c48382f43be3e4c79456d7a7abd5a7059873f581
- 436cfce71290c2fc2f2c362541db68ced6847c66a73b55487e5e5c73b0636c85
- 458ca514e058fccc55ee3142687146101e723450ebd66575c990ca55f323c769
- 69908f05b436bd97baae56296bf9b9e734486516f9bb9938c2b8752e152315d4
- 6eb31006ca318a21eb619d008226f08e287f753aec9042269203290462eaa00d
- 866824f2474ad603576b12b83831b2acc12d378f0ef4d0b20df10639b04c44da
- b755e4369f1ac733da8f3e236c746eda94751082a3031e591b6643a596a86acb
- befa1695fcee9142738ad34cb0bfb453906a7ed52a73e2d665cf378775433aa8
- c1f278f88275e07cc03bd390fe1cbeedd55933110c6fd16de4187f4c4aaf42b9
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import "pe" rule turla_kazuar_v3_native_loader { meta: author = "Dominik Reichel" description = "Detects Turla's Kazuar v3 native loader" date = "2026-01-12" reference = "https://r136a1.dev/2026/01/14/command-and-evade-turlas-kazuar-v3-loader/" strings: $a0 = "%d:%08X" $a1 = "Software\\Classes\\" wide $b0 = {7B 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 2D 00 ?? 00 ?? 00 ?? 00 ?? 00 2D 00 ?? 00 ?? 00 ?? 00 ?? 00 2D 00 ?? 00 ?? 00 ?? 00 ?? 00 2D 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 ?? 00 00 00} condition: uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and all of ($a*) and b0 >= 3 and pe.imports("dbghelp.dll", "SymInitialize") and pe.imports("dbghelp.dll", "SymCleanup") and pe.imports("oleaut32.dll", "SafeArrayAccessData") and pe.imports("oleaut32.dll", "SafeArrayUnaccessData") and pe.imports("ole32.dll", "StringFromCLSID") and pe.imports("ole32.dll", "CLSIDFromProgID") and pe.imports("ole32.dll", "CLSIDFromString") and pe.imports("ole32.dll", "CoUninitialize") } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import "pe" rule turla_kazuar_v3_com_visible_app { meta: author = "Dominik Reichel" description = "Detects Turla's Kazuar v3 COM-visible application" date = "2026-01-12" reference = "https://r136a1.dev/2026/01/14/command-and-evade-turlas-kazuar-v3-loader/" strings: $a0 = "GetDelegateForFunctionPointer" $a1 = "StackFrame" $a2 = "GuidAttribute" $a3 = "ComVisibleAttribute" $a4 = "ClassInterfaceAttribute" $a5 = "UnmanagedFunctionPointerAttribute" $a6 = "CompilerGeneratedAttribute" $a7 = "System.Reflection" $a8 = "CallingConvention" $a9 = "TargetInvocationException" $a10 = "get_InnerException" $b0 = "ResourceManager" condition: uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and pe.imports("mscoree.dll", "_CorDllMain") and all of ($a*) and filesize < 100KB and not $b0 } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import "pe" rule turla_kazuar_v3 { meta: author = "Dominik Reichel" description = "Detects Turla's KERNEL, WORKER and BRIDGE Kazuar v3" date = "2026-01-12" reference = "https://r136a1.dev/2026/01/14/command-and-evade-turlas-kazuar-loader/" strings: $a0 = "FxResources.System.Buffers" $a1 = "FxResources.System.Numerics.Vectors" $a2 = "Google.Protobuf.Reflection" $a3 = "Google.Protobuf.WellKnownTypes" $a4 = "Microsoft.CodeAnalysis" $a5 = "System.Diagnostics.CodeAnalysis" $a6 = "System.Runtime.InteropServices" $b0 = "RequestElection" $b1 = "LeaderShutdown" $b2 = "ClientAnnouncement" $b3 = "LeaderAnnouncement" $b4 = "Silence" $c0 = "ExchangeWebServices" $c1 = "WebSocket" $c2 = "HTTP" $d0 = "AUTOS" $d1 = "GET_CONFIG" $d2 = "PEEP" $d3 = "CHECK" $d4 = "KEYLOG" $d5 = "SYN" $d6 = "TASK_RESULT" $d7 = "CHECK_RESULT" $d8 = "CONFIG" $d9 = "SEND" $d10 = "TASK_KILL" $d11 = "SEND_RESULT" $d12 = "TASK" condition: uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and pe.imports("mscoree.dll", "_CorExeMain") and ( ( 4 of ($a*) and 2 of ($b*) ) or ( 5 of ($a*) and all of ($c*) ) or ( 5 of ($a*) and 9 of ($d*) ) or ( 2 of ($b*) and 2 of ($c*) ) or ( 2 of ($b*) and 6 of ($d*) ) or ( all of ($b*) ) or ( 10 of ($d*) ) ) } |