Разработчики и любители видеоигр стали мишенью новой сложной кампании. Злоумышленники используют угнанные аккаунты в Discord (мессенджере), поддельный сайт инди-игры и вредоносный пакет в npm (менеджере пакетов для JavaScript), чтобы доставить на компьютеры жертв троян удалённого доступа XWorm. Атака рассчитана прежде всего на разработчиков, которые могут установить заражённый пакет, и на геймеров, которые поверятся просьбе протестировать новую игру.
Описание
Исследователи из компании JFrog Security обнаружили, что кампания действует по двум параллельным каналам. Первый вектор - социальная инженерия через Discord. Злоумышленники взламывают учётные записи реальных пользователей, после чего от их имени рассылают друзьям сообщения с просьбой: "Не хочешь протестировать мою новую игру?". К сообщению прилагается ссылка на профессионально оформленный сайт astralwarfare[.]fr. Внешне он напоминает страницу настоящего игрового проекта: есть трейлеры, вымышленная история про стража "Экис" и кнопки для скачивания. Однако архив Astral_Warfare.rar, который пользователь получает по ссылке, не содержит игры. Скриншоты геймплея украдены из реального проекта Elsie студии Knight Shift Games, а сам исполняемый файл - это вредоносная программа на языке Go (компилируемый язык программирования).
Второй канал - публикация вредоносного пакета в реестре npm под именем @kindo/selfbot с заявленным назначением "просто селф-бот". Специалисты JFrog Security в своём отчёте рассказали, что были выпущены версии с 1.0.0 по 1.0.4. Пакет использует стандартный механизм npm - хук preinstall, который запускает произвольный код ещё до завершения установки. Достаточно выполнить команду npm install, чтобы на компьютер попал вредоносный дроппер. Кроме того, сам модуль при импорте (require) немедленно выполняет свою главную функцию. Таким образом, даже простое добавление пакета в зависимости проекта автоматически активирует атаку.
Оба вектора сходятся в одной многоступенчатой схеме доставки финальной полезной нагрузки - XWorm RAT (трояна удалённого доступа). На начальном этапе JavaScript-дроппер из npm-пакета скачивает с сервера злоумышленника скрипт script.bat и запускает его. Исполняемый файл фейковой игры (написанный на Go) делает то же самое, но иначе: он извлекает из своего кода 5260 обрывков строк, собирает из них закодированную в Base64 последовательность, очищает её от греческих букв-шумов, декодирует и записывает полученный batch-файл во временную папку. Результат одинаков - на компьютере оказывается объемный (252 тысячи байт, 3557 строк) обфусцированный (запутанный) пакетный сценарий.
Этот сценарий выполняет сразу несколько задач. Он проверяет, не анализируется ли система: завершает работу, если имя пользователя содержит слова Admin или admin, если объём оперативной памяти меньше 3 гигабайт или если производитель материнской платы указывает на виртуальную машину VMware. Если проверки пройдены, скрипт создаёт скрытую папку C:\ProgramData\IntelDrIver, копирует себя туда, устанавливает атрибуты скрытый и системный. Затем он делает копию легитимного исполняемого файла PowerShell (powershell.exe) в каталог %USERPROFILE%\Downloads\CPU.exe, чтобы запускать команды PowerShell под безобидным именем.
Следующий этап - извлечение зашифрованной полезной нагрузки. Сценарий собирает все строки, начинающиеся с двойного двоеточия, в файл icon.png, а строки, начинающиеся с символа @, - в файл logo.jpg. На самом деле это не изображения, а данные, зашифрованные с помощью простого XOR с ключом "d6". Полученный таким образом PowerShell-скрипт (второй этап) декодируется и выполняется. Он, в свою очередь, расшифровывает ещё один слой - загрузчик, который сканирует память процесса explorer.exe на предмет сигнатуры DE AD BE CA FE BA EF и осуществляет инъекцию шелл-кода (вредоносного кода) в удалённый поток. Если внедрение в explorer не удаётся после десяти попыток, загрузчик пробует другие процессы: SecurityHealthSystray, OneDrive, sihost, taskhostw, RuntimeBroker. При полном провале создаётся запланированная задача с именем applicationbackup_, которая при каждом входе пользователя запускает исходный пакетный сценарий повторно.
Инжектированный шелл-код (третий этап) размером около 50 тысяч байт написан на архитектуре x64 и умеет обходить антивирус и систему мониторинга событий Windows (ETW). Он содержит в себе сжатый .NET-модуль. После декомпрессии и расшифровки на свет появляется финальная полезная нагрузка - XWormClient.exe. Это классический троян удалённого доступа с версией XWorm V7.4. Сервер управления злоумышленников находился по адресу 185.94.29.43 на порту 7004, а разделителем протокола служила строка <Xwormmm>. Троян использует шифрование AES-ECB с ключом на основе MD5 от некоторого предустановленного ключа. При подключении к серверу он передаёт подробную информацию о системе: имя пользователя, версию ОС, сведения о процессоре, видеокарте, объёме памяти и установленных антивирусах.
XWorm поддерживает широкий набор команд. Он может выполнять произвольные команды в системе, загружать и запускать файлы с диска или из памяти, открывать URL в браузере, делать скрытые HTTP-запросы, организовывать DDoS-атаку типа HTTP-флуд, мониторить заголовки окон, делать скриншоты и отправлять их, а также управлять плагинами через реестр. Плагины хранятся в сжатом виде в разделе реестра HKCU\Software\<идентификатор>, где идентификатор вычисляется как MD5 от аппаратного обеспечения. Код может самоудаляться, перезапускаться или обновляться на новую версию.
Последствия такой атаки крайне серьёзны. Установленный троян даёт злоумышленникам полный контроль над машиной. Они могут украсть токены Discord (ключи доступа к аккаунту), позволяя им взламывать другие учётные записи и продолжать распространение. Для разработчиков, установивших вредоносный npm-пакет, угроза удваивается: вместе с системой под удар попадают репозитории кода, закрытые ключи SSH, учётные данные к базам данных и облачным сервисам. Если вы случайно выполнили npm install @kindo/selfbot или скачали и распаковали "Astral Warfare", считайте ваш компьютер скомпрометированным.
Эксперты JFrog Security рекомендуют немедленно удалить запланированную задачу applicationbackup_, очистить папки C:\ProgramData\IntelDrIver и IntelDriver, а также удалить скачанный скрипт и все артефакты из временной папки. Но самое важное - полностью сменить все пароли и токены, к которым мог получить доступ троян: ключи Discord, npm, SSH, базы данных и облачных провайдеров. В качестве превентивной меры полезно отключить автоматическое выполнение скриптов при установке npm-пакетов командой npm config set ignore-scripts true. Это не позволит вредоносным пакетам запускать свои хуки preinstall.
Данная кампания демонстрирует, насколько изощрёнными стали методы злоумышленников. Они не поленились создать правдоподобный игровой сайт, написать дроппер на Go и поддерживать несколько версий npm-пакета - всё ради того, чтобы доставить троян на машины разработчиков и геймеров. Многослойная обфускация, проверки на виртуальное окружение и встраивание в легитимные процессы делают детектирование такой угрозы сложной задачей. Разработчикам стоит особенно внимательно относиться к любым ссылкам от знакомых в мессенджерах и дважды проверять публикуемые в npm пакеты, даже если они кажутся безобидными.
Индикаторы компрометации
IPv4 Port Combinations
- 185.94.29.43:7004
URLs
- https://astralwarfare.fr/Astral_Warfare.rar
- https://astralwarfare.fr/script.bat
SHA256
- 0b2ce48e4be6a6be85565ce309d2f10cc1b3179a03d25a61f66c6b50fe37b010
- 1255d41081452cd8fa2358860449bbf3b3494b80282e2bb4ba6b6980ceaf9be1
- 219bd4b681b05addd5364bc9c741065bcdc698560b45c5cbf537561583b66702
- 7a8cef4bfa1ca9c24be4886136c30402d4433310283aee22e2da67cbb938b3a9
- c26f8d09e0486aacba414f04c310c6532541d2cdf3f40d95e3fe224d9b77e0a6
Package
- @kindo/selfbot 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4
