В середине июня 2026 года исследователи безопасности зафиксировали целенаправленную атаку на несколько немецких финансовых учреждений. Злоумышленники использовали многослойную схему заражения, основанную на компрометации легитимного программного обеспечения. Конечными целями стали информационный стилер Vidar версии 2.1 и сложный удалённый троян SnappyClient. Анализ показывает, что операторы потратили значительные усилия на обход стандартных средств защиты, включая антивирусные сканеры и системы обнаружения на основе сигнатур.
Описание
Исходным вектором атаки стало фишинговое письмо, в котором сотрудникам банков предлагалось установить срочное обновление корпоративного VPN-клиента. Вложение представляло собой самораспаковывающийся 7-Zip архив, содержащий легитимную, подписанную копию Radmin VPN и набор библиотек Qt. При запуске архива на диск извлекались 13 файлов, среди которых не было ни одного очевидного вредоносного исполняемого модуля. Все файлы, включая сам VPN-клиент, имели валидные цифровые подписи, что позволило бы им пройти проверку в большинстве решений безопасности.
Ключевым элементом атаки стала подменённая библиотека Qt5Core.dll. Несмотря на наличие подписи Famatech Corp., её криптографическая верификация не проходила. Это указывало на то, что файл был модифицирован после подписания. Легитимный Radmin VPN, будучи запущенным, загружает Qt5Core.dll из своей директории, тем самым исполняя код злоумышленника. Данная техника известна как DLL side-loading (загрузка библиотеки с перехватом).
После загрузки троянизированная библиотека считывала два необычных файла из архива: shader128.map и scenesync45.xml. Первый из них представлял собой зашифрованный шелл-код. Как показал анализ исследователя, этот код, в свою очередь, извлекал из scenesync45.xml набор компонентов, используя стеганографию. Файл scenesync45.xml не был XML-документом, а содержал последовательность блоков изображения PNG (IDAT-чанков). После конкатенации этих блоков, применения простого XOR-ключа и декомпрессии, формировался контейнер с несколькими исполняемыми модулями. Такое поведение характерно для загрузчика HijackLoader (также известного как IDAT Loader), который распространяется как сервис.
Внутри контейнера были обнаружены дополнительные легитимные приложения (например, Opera, Crisp IM, утилита dBpoweramp), троянизированная библиотека opera_elf.dll и несколько компонентов самого HijackLoader. Первая ветвь заражения разворачивалась через подмену NeuroManag.exe - легитимной утилиты dBpoweramp. Vidar, декодированный в памяти, внедрялся в этот процесс методом process hollowing (замена кода процесса). При этом оригинальный исполняемый файл dBpoweramp оставался на диске, а в оперативной памяти его место занимал стилер.
Vidar v2.1, извлечённый исследователем, показал практически идентичный набор возможностей по сравнению с более ранней версией 2.0: сбор учётных данных из браузеров (Chrome, Firefox, Edge, Opera), похищение файлов cookie, криптовалютных кошельков, данных из мессенджеров Discord и Telegram, а также создание снимков экрана. Для обхода защиты App-Bound Encryption в Google Chrome и Microsoft Edge стилер запускал легитимные браузеры с флагами --no-first-run --disable-gpu about:blank, чтобы те сами расшифровали свои данные. Все собранные сведения отправлялись на C2-сервер через защищённое HTTPS-соединение.
Параллельно с Vidar разворачивалась вторая цепочка: подписанный исполняемый файл Opera (AlphVector.exe) загружал троянизированную opera_elf.dll, которая затем извлекала второй набор компонентов HijackLoader. Этот набор содержал файл audio.lib, из которого после расшифровки получался SnappyClient - продвинутый удалённый троян, обеспечивающий постоянный доступ к системе. В отличие от одноразового стилера, SnappyClient устанавливал механизмы устойчивости: создавал ярлык в папке автозагрузки (prompt_analyzer_debug.lnk) и задачу в планировщике Windows (socket_dispatcher_v2.job). Троян использовал порты 3333 и 3334 для связи с C2-сервером 66.163.113[.]238.
Эксперты отмечают, что данная кампания демонстрирует высокий уровень подготовки злоумышленников. Каждый этап заражения прикрывается легитимными, подписанными приложениями, что делает детектирование на основе имён процессов или хешей практически бесполезным. Единственным эффективным методом защиты остаётся поведенческий анализ - мониторинг аномальных загрузок DLL с недействительными подписями, запуск подписанных приложений из временных папок, появление файлов .tmp с образом PE в памяти, а также необычные цепочки родительских процессов.
Хотя Vidar не оставляет следов на диске, его активность можно отследить через журналы Sysmon (Event ID 7 - загрузка образа из временной папки, Event ID 25 - подмена образа процесса). Для финансовых организаций, ставших целью, рекомендуется настроить правила Sigma, которые фиксируют запуск легитимных браузеров с аномальными параметрами командной строки, а также перехват обращений к процессам с правами полного доступа из временных каталогов. Публичное описание цепочки позволяет SIEM-системам и EDR-продуктам оперативно адаптироваться к угрозе.
Индикаторы компрометации
IPv4
- 95.217.245.14
IPv4 Port Combination
- 66.163.113.238:3333
- 66.163.113.238:3334
Domain
- bou.harussm188.top
- bou.rzrrent.com
- get.rzrrent.com
- ggt.gerbongsm188.top
- psh.rzrrent.com
- rzrrent.com
- shader128.map
- srv.turbo88ku.top
URL
- https://steamcommunity.com/profiles/76561198689449626
- https://steamcommunity.com/profiles/76561198694566254
- https://telegram.me/d77xtr
- https://telegram.me/turb00m
SHA256
- 0f4ec73cf4f64d4b89f3c87a127bc7c46c052a4226f9876a3a75015b716d9228
- 1bb2771002bf8240e34e8284048bfc1db8dd7cdade7a7afb4a2cfbe02b1a9749
- 2c08e77f86b0953cffa505bdbe64e87ecb7c088db65d5acb9a2eee65a32565ef
- 2db7fd3c9c3c4b67f2d50a5a50e8c69154dc859780dd487c28a4e6ed1af90d01
- 2e26195dd65015aca675d8a17308e9c4cde30b0303f5de80c4ffe35499b67e7f
- 3245b97f939bbfb0d6ad0732c48097a45b3b7a7f1081eba41562c08ff33130cd
- 32b2344e7310ffad2bfd17454bb64cdabc0c35fb3b55e29627c0aeced6c4e0b7
- 3594a835ed3dbf80ac460c0e852fa91baa3b17aadff9c3b40c03eff6b34658d2
- 40a204d9f4774ba3c320d4f735248267b5db828414aa5e6778383acf357f9738
- 508f772bde00e8cee5e5d185b3e44003982843d283e8448e3a4b6b29b4ff28a8
- 5ebddd8e1d04b75331aae732364cce2da698639263b18b25fa06b92e4778ddc2
- 5ffbf8fd312922fc7aab26654f0da5d41cde2734c5321f8f4bcfd596c2660825
- 63c05cfdd2ee44057e619d1a9acead538e867cbee55873529d01686d1ec678a6
- 674e9e8f298c568798e965a9078f79578b07ef71d02a733231257a435f73b36d
- 68bee500e0080f21c003126e73b6d07804d23ac98b2376a8b76c26297d467abe
- 716a11cdc1b12827ee18027caa947f813cb3550412b5dcaae427be3bbcc0221f
- 725344564a8c9b0a033e9a5d41369fae5b8503d36e87002e7c064eface927e7b
- 729e5965e43ff458f6da901536c9a43be52a3820718e2dd5456150e2d73bb97f
- 81154ee6fba8e9ed282d952e154d907b973526ef06d3d968b9bb950553430106
- 8e8e43a2f0069f081f5ffb77237faebcda9a46e8f8fd0e128500e74bbc9ea3a5
- 9276e394bc5fa9a08b5fc84305d32544ff9f0421d0870c6d76c63a82f1955559
- 94b49a66c71e10984746e722be31aaee20b6fa6e5250c460046a0bf626dcb431
- 9d02e952396bdff3abfe5654e07b7a713c84268a225e11ed9a3bf338ed1e424c
- b02b8547644bbfe77428e59c5ccec56c412e3c83aec44180e59110189a249956
- c208f5d789d03eed155ad1a9f74036c4cab0fe03b8e6c37ff421896ce430d5da
- c2e62475768c9546efe1da92a55f3bb2a55350eed83241139917aabd1ad25f8a
- c50bffbef786eb689358c63fc0585792d174c5e281499f12035afa1ce2ce19c8
- c73b6080ff81a42336be2baa3a159f746a054032615f53d0e1ff56d57c357b14
- d7a3b77b3490745dd4f510ff186a6756e12b4787c2dbf75259136f2fcb2d02b9
- debbb3b4fdd9107deec64c46b453b988c5b51a99e006f2c6d1c804b5e2a33991
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 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 77 | import "pe" rule Vidar_x64_v2_family { meta: description = "Vidar x64 2.x unpacked payload" author = "Gianluca Tiepolo" date = "2026-06-20" family = "Vidar" version = "2.x" arch = "x86-64" scope = "unpacked payload" reference_1 = "725344564a8c9b0a033e9a5d41369fae5b8503d36e87002e7c064eface927e7b" reference_2 = "debbb3b4fdd9107deec64c46b453b988c5b51a99e006f2c6d1c804b5e2a33991" strings: /* * Shared 4-argument bytecode-VM decoder setup */ $vm_setup = { 44 89 4C 24 20 4C 89 44 24 18 89 54 24 10 48 89 4C 24 08 48 83 EC 68 E8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 25 FF 00 00 00 88 44 24 30 C6 44 24 31 00 48 8B 44 24 70 48 89 44 24 38 8B 44 24 78 89 44 24 40 C7 44 24 44 00 00 00 00 } /* * Stable VM dispatch loop */ $vm_dispatch = { 8B 44 24 40 39 44 24 44 73 4F 8B 44 24 50 39 44 24 54 73 45 8B 44 24 44 48 8B 4C 24 38 8A 04 01 88 44 24 20 8B 44 24 44 FF C0 89 44 24 44 0F B6 44 24 20 48 8D 0D ?? ?? ?? ?? 48 8B 04 C1 48 89 44 24 28 48 83 7C 24 28 00 75 02 EB 0C 48 8D 4C 24 30 FF 54 24 28 90 EB A7 48 83 C4 68 C3 } /* * Embedded-config XOR decoder */ $config_xor_loop = { 4C 8B C9 4C 2B CA 4C 8B C2 49 F7 D8 [0-64] 4B 8D 04 18 48 F7 F7 8A 0C 32 41 8A 03 32 C8 43 88 0C 19 49 FF C3 4B 8D 04 18 49 3B C2 72 ?? } condition: uint16(0) == 0x5A4D and pe.machine == pe.MACHINE_AMD64 and pe.number_of_imported_functions == 0 and pe.sections.len() >= 4 and pe.sections.len() <= 6 and filesize > 800KB and filesize < 1500KB and for any i in (0..pe.sections.len() - 1): ( pe.sections[i].name == ".data" and pe.sections[i].virtual_size > 0x100000 and pe.sections[i].raw_data_size < 0x4000 ) and all of them } |