27.10.2021

Hack Pub

Новости интересные и малоизвестные из IT индустрии

Ransomware red button on keyboard, 3D rendering

Эволюция шифровальщика JSWorm

Введение

В последние несколько лет ландшафт угроз, связанных с программами-шифровальщиками, постепенно меняется. От массовых эпидемий 2017 года, таких как WannaCry, NotPetya и Bad Rabbit, вымогатели перешли к менее заметной, но гораздо более прибыльной тактике, которую условно можно назвать «охотой на крупную дичь». Новости о том, что атака шифровальщика вызвала сбой в работе сервисов международной корпорации, все больше становятся частью повседневной реальности.

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

Хронология

Шифровальщик JSWorm был обнаружен в 2019 г. В дальнейшем разные варианты этой угрозы были известны под разными названиями — Nemty, Nefilim, Offwhite и др.

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

На приведенной ниже схеме указаны некоторые из названий этого троянца и периоды активного распространения каждого варианта (но не дата первого обнаружения). Следует отметить, что это не полный список версий, а лишь основные этапы эволюции JSWorm.

Помимо изменения названий, разработчики перерабатывали код шифровальщика и пробовали разные способы распространения.

В какой-то момент в 2020 г. они даже сменили язык программирования с C++ на Go и переписали код с нуля. Однако сходство в схемах шифрования и сообщениях с требованиями выкупа, а также использование злоумышленниками одного и того же сайта для публикации скомпрометированных данных позволяют нам считать, что все эти варианты зловреда — часть одной кампании.

Исходная версия зловреда, а также некоторые из ее последующих «брендов» (например, Nemty) рекламировались на одном из хакерских форумов пользователем под псевдонимом jsworm.

Реклама ранней версии JSWorm, размещенная на форуме

Методы распространения

С момента своего появления в 2019 г. и до первой половины 2020 г. JSWorm действовал как публичный сервис, работающий по схеме «шифровальщик как услуга» (RaaS). Было замечено распространение этого троянца с помощью:

  • набора эксплойтов RIG;
  • ботнета Trik;
  • поддельных страниц оплаты;
  • спам-кампаний.

В первой половине 2020 г. операторы закрыли публичный RaaS-сервис и занялись «охотой на крупную дичь». Существуют свидетельства того, что для первоначального заражения они использовали уязвимости серверного ПО (Citrix ADC) и доступ к компьютерам через незащищенный RDP.

Технические подробности

Рассмотрим несколько примечательных вариантов JSWorm, обнаруженных в на разных этапах развития этого семейства вредоносного ПО. Мы не будем даже пытаться описать все известные версии: их слишком много. Указанные даты обозначают приблизительный период активного распространения каждого из вариантов «в дикой природе».

Май 2019 г. JSWorm

MD5: a20156344fc4832ecc1b914f7de1a922

Это образец одного из первых обнаруженных вариантов шифровальщика JSWorm. В отличие от последующих вариантов, он не содержит внутреннего номера версии. Образец написан на языке C++ и скомпилирован в MS Visual Studio.

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

Схема шифрования

Файлы шифруются с помощью кастомной модификации алгоритма Blowfish с 256-битным ключом. Ключ генерируется в начале выполнения программы на основании строки, получаемой путем конкатенации имени пользователя, MAC-адреса устройства и серийного номера тома (примеры значений приведены ниже).

Процесс генерации ключа

Затем генерируется строка, фигурирующая в сообщении с требованием выкупа как JSWORM PUBLIC KEY. Однако слово public в данном случае не имеет смысла, поскольку здесь не применяется асимметричное шифрование. То, что разработчики называют «открытым ключом», в действительности является уже упомянутым ключом алгоритма Blowfish, преобразованным посредством операции XOR со строкой KCQKCQKCQKCQ и закодированным с помощью Base64.

Операция XOR с ключом KCQKCQKCQKCQ

Вот пример вычисления такого ключа. Серийный номер тома и MAC-адрес приведены для иллюстрации.

  • Ключ Blowfish: 53385773534FE:ED:00:DE:AF:00user
  • «Открытый ключ» после операции XOR: 5xpi~tfxvbx05x14qx06x15qsaqx07x14qx02x17qsa>049
  • «Открытый ключ» после преобразования в Base64: NXhwaX50Znh2Yn8FFHEGFXFzYXEHFHECF3FzYT4wNDk=

Для шифрования содержимого каждого из файлов жертвы использовалась кастомная версия алгоритма Blowfish. При этом в каждом случае шифровалось не более 100 000 байт — возможно, чтобы ускорить процесс обработки больших файлов. Зашифрованные данные записывались поверх исходных.

Разработчики изменили внутреннюю реализацию алгоритма Blowfish, сделав ее несовместимой со стандартными реализациями — возможно, чтобы усложнить работу исследователей.

Зашифровав содержимое файла, программа переименовывает его. К имени файла добавляется дополнительное расширение .[ID-…][[email protected]].JSWORM.

Недостатки схемы шифрования

Ключ для расшифровки файлов по сути хранится в сообщении с требованием выкупа. Выполнив несложные манипуляции (декодирование Base64 и обратную операцию XOR), можно восстановить данные, не платя вымогателям. Даже если сообщение от вымогателей будет по какой-то причине утеряно, ключ на зараженной машине легко восстановить.

Июль 2019 г. JSWorm 4.0.3

MD5: 5444336139b1b9df54e390b73349a168

В этой обновленной и усовершенствованной версии JSWorm разработчики попытались исправить недостатки предыдущих вариантов.

Этот образец может выполнять проверку языка системы — вероятно, для того, чтобы не допустить шифрования данных в системах, использующих русский (RU), белорусский (BE), узбекский (UZ), киргизский (KY), таджикский (TG), туркменский (TK), казахский (KK) и украинский (UK) языки.

Определение языка пользователя

При этом (вероятно, из-за ошибки разработчиков) данная версия вымогателя шифрует файлы только в русскоязычных системах. Если внимательно посмотреть на приведенный выше фрагмент кода, можно заметить, что первое условие — «!=» («не равно»). Из-за этого троянец выполняет ветку кода, которая завершает его работу без шифрования в системах, использующих отличный от русского язык. Если бы на месте этого условия стояло «==», то выполнялась бы другая ветка, соответствующая тому поведению троянца, которое, вероятно, было изначально задумано.

Сообщение с требованием выкупа в этом варианте выглядит как HTA-файл с именем <ID>-DECRYPT.hta, где <ID> — уникальный идентификатор жертвы, присвоенный зловредом. Файл HTA запускается по завершении шифрования файлов. Зловред также добавляет его в автозапуск, прописывая в реестре значение:

  • reg add HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun /v «zapiska» /d «C:UsersuserJSWRM-DECRYPT.hta»
  • reg add HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun /v «zapiska» /d «C:UsersuserJSWRM-DECRYPT.hta»

Сообщение с требованием выкупа от JSWorm 4.0.3

Схема шифрования

Эта версия JSWorm использует для шифрования файлов WinAPI-реализацию алгоритма RSA и кастомную реализацию алгоритма AES. JSWorm генерирует два случайных значения длиной 128 бит (вектор инициализации) и 256 бит (ключ), используя прописные и строчные буквы английского алфавита от A до Z и цифры от 0 до 9. Открытый ключ RSA встроен в код шифровальщика:

Открытый ключ, используемый в JSWorm 4.0.3

С помощью этого ключа JSWorm шифрует ключ AES и вектор инициализации, а затем кодирует их в Base64.

Шифрование с помощью WinAPI RSA в JSWorm 4.0.3

Полученное значение добавляется в файл сообщения с требованием выкупа (<ID>-DECRYPT.hta), но остается невидимым, поскольку прописывается в HTML-коде как комментарий.

Значения в HTA-файле, содержащем сообщение с требованием выкупа

Чтобы усложнить процесс расшифровки для исследователей, разработчики зловреда применили кастомный вариант алгоритма блочного шифрования AES, несовместимый со стандартным алгоритмом. Содержимое файлов жертвы шифруется этим алгоритмом с использованием вышеописанных ключа и вектора инициализации.

Подобно предыдущей версии, в целях оптимизации шифруются только первые 160 000 байт больших файлов. Как и в случае с предыдущим образцом, после шифрования к имени файла добавляется дополнительное расширение: <filename>.[ID-NQH1J49][[email protected]].JSWRM.

Недостатки схемы шифрования

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

Август 2019 г. Nemty 1.4

MD5: 1780f3a86beceb242aa81afecf6d1c01

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

Этот образец, как и предыдущий, написан на языке C++ и скомпилирован в MS Visual Studio. В нем реализован несложный прием для защиты от анализа, основанный на обфускации строк. Строки (например, имя и содержимое файла с требованием выкупа, открытый ключ RSA, URL-адрес страницы для перевода денег и т. д.) зашифрованы с помощью поточного шифра RC4 с жестко прописанным ключом «fuckav» и кодированы в Base64.

Сообщение с требованием выкупа, созданное Nemty 1.4

После запуска образец собирает информацию об устройствах для хранения данных, присоединенных к зараженному компьютеру, получает его внешний IP-адрес с помощью HTTP-запроса на сайт http://api.ipify.org и определяет страну нахождения жертвы, запрашивая данные по адресу http://api.db-ip.com/v2/free/. Затем он генерирует пару сессионных ключей RSA-2048 и объединяет все собранные данные в JSON-структуре. Эта структура затем шифруется с использованием содержащегося в коде зловреда открытого ключа RSA и сохраняется в конце сообщения с требованием выкупа как NEMTY DECRYPTION KEY.

Информация о жертве, еще не зашифрованная с помощью RSA

В этой структуре представляют интерес несколько значений:

  • isRU: уточняет, не относится ли внешний IP-адрес жертвы к одной из следующих стран: Россия, Белоруссия, Казахстан, Таджикистан, Украина;
  • version: внутренняя версия троянца;
  • CompID: уникальный идентификатор зараженного компьютера;
  • FileID: идентификатор заражения, который генерируется при каждом запуске вредоносного ПО;
  • UserID: идентификатор партнера, жестко прописанный в коде образца;
  • key: закодированный в Base64 ключ для шифрования файлов (о нем ниже);
  • pr_key: закодированный в Base64 секретный сессионный ключ RSA-2048 (о нем ниже).

Схема шифрования

Код троянца содержит жестко прописанный открытый ключ RSA-8192, созданный злоумышленниками. Далее мы будем называть его открытым мастер-ключом RSA.

После запуска на компьютере жертвы троянец также генерирует пару сессионных ключей RSA-2048 (секретный ключ из этой пары обозначен выше как pr_key). Кроме этого, он генерирует 256-битный ключ, который будет использоваться для применения кастомного алгоритма блочного шифрования на базе AES.

256-битный ключ и pr_key шифруются с помощью открытого мастер-ключа RSA и сохраняются в сообщении с требованием выкупа.

При шифровании очередного файла жертвы Nemty 1.4 генерирует 128-битный вектор инициализации, который затем использует вместе с 256-битным ключом, чтобы шифровать содержимое файла посредством кастомного алгоритма на базе AES. Вектор инициализации шифруется с помощью открытого сессионного ключа RSA и добавляется к зашифрованному файлу.

Имена зашифрованных файлов меняются: к ним добавляется дополнительное расширение ._NEMTY_<…>_. На месте многоточия прописывается упомянутый выше идентификатор заражения — FileID.

Недостатки схемы шифрования

Как и в случае с предыдущими вариантами JSWorm, реализация криптографической схемы в Nemty 1.4 небезупречна. В ней есть слабые места, которые можно использовать для расшифровки файлов:

  1. для создания ключей используется генератор псевдослучайных чисел, который не является криптографически стойким;
  2. ключ для RSA-сессии не удаляется из системного хранилища.

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

Связь с командным сервером

Образец загружает Tor-клиент с адреса https://dist.torproject.org/torbrowser/8.5.4/tor-win32-0.4.0.5.zip, распаковывает его и запускает на зараженном компьютере. Через 30 секунд (очевидно, разработчики считают, что столько времени будет достаточно, чтобы установить соединение с сетью Tor) троянец отправляет информацию о заражении на командный сервер, адрес которого жестко прописан в коде образца:

 

zjoxyw5mkacojk5ptn2iprkivg5clow72mjkyk5ttubzxprjjnwapkad.onion

1 zjoxyw5mkacojk5ptn2iprkivg5clow72mjkyk5ttubzxprjjnwapkad.onion

Nemty 1.4 отправляет HTTP-запрос GET с URI /public/gate?data=

Данные, которые отправляются на сервер, идентичны тем, что прописываются в каждом сообщении с требованием выкупа, и по сути представляют собой зашифрованную JSON-структуру, о которой мы рассказывали выше.

Последующие версии Nemty

Название Nemty использовалось до марта 2020 г. Один из последних вариантов этого шифровальщика имел внутреннюю версию 3.1.

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

Также стоит отметить, что разработчики этого зловреда часто добавляли в код транслитерированные строки на русском языке — возможно, чтобы привлечь внимание исследователей или просто шутки ради. Некоторые из них содержат нецензурные цитаты из рэп-текстов.

Строки из образца Nemty 2.4

Строки из образца Nemty 2.6

Март 2020 г. Nefilim

MD5: 5ff20e2b723edb2d0fb27df4fc2c4468

Приблизительно в марте 2020 г. разработчики изменили название троянца на Nefilim. К моменту появления его первых вариантов модель распространения этого семейства вредоносного ПО изменилась. От схемы общедоступного RaaS-сервиса, которая использовалась для JSWorm и Nemty, разработчики перешли к прямому сотрудничеству с партнерами, заинтересованными в «охоте на крупную дичь». Выбрав цель крупного калибра, злоумышленники проникали в ее сеть, вручную похищали конфиденциальные данные и запугивали жертву, угрожая выложить украденную информацию в общий доступ.

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

Как и Nemty, Nefilim был написан на языке C++ и скомпилирован в MS Visual Studio. Значительные совпадения участков кода поздних версий Nemty (2+) и Nefilim позволяют предположить, что для их разработки использовался один и тот же исходный код.

Например, процедуры расшифровки строк у этих вариантов выглядят одинаково. Единственное отличие — ключи RC4.

Процедуры расшифровки строк выглядят одинаково. Слева — Nemty 2.6 (141dbb1ff0368bd0359972fb5849832d), справа — Nefilim

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

Сходство кода процедур шифрования файлов. Слева — Nemty 2.6 (141dbb1ff0368bd0359972fb5849832d), справа — Nefilim

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

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

Схема шифрования

В коде троянца содержится жестко прописанный открытый мастер-ключ RSA-2048, созданный злоумышленниками.

Для каждого файла жертвы Nefilim генерирует 128-битный ключ и один 128-битный вектор инициализации и шифрует содержимое файла с использованием алгоритма AES в режиме CBC. Ключ и вектор инициализации шифруются с использованием мастер-ключа RSA и сохраняются в конце зашифрованного файла.

К имени зашифрованного файла добавляется дополнительное расширение .NEFILIM.

Сообщение с требованием выкупа и электронными адресами для связи с шантажистами сохраняется в обработанных папках как файл NEFILIM-DECRYPT.txt.

Сообщение с требованием выкупа, созданное Nefilim

Апрель 2020 г. Offwhite

MD5: ad25b6af563156765025bf92c32df090

При смене названия Nefilim на Offwhite разработчики еще больше сократили код зловреда, чтобы уменьшить итоговый размер бинарного файла. С этой целью они перестали использовать библиотеку STL и избавились от кода среды выполнения C++, создававшего ненужный объем. В остальном Nefilim остался все тем же. В дополнение к описанным выше возможностям, в коде троянца появилась новая интересная функция: разработчики научили его создавать обои для рабочего стола с текстом сообщения о выкупе и сохранять их как файл scam.jpg.

Обои для рабочего стола, созданные Offwhite

Июнь 2020 г. Telegram

MD5: 004f67c79b428da67938dadec0a1e1a4

Различия между вариантами Offwhite и Telegram оказались минимальными. Код нового варианта практически идентичен предыдущему, а главные отличия заключаются в том, что разработчики поменяли расширение зашифрованных файлов (на .TELEGRAM) и имя файла с сообщением для требования выкупа (на TELEGRAM-RECOVER.txt), а также перестали кодировать названия импортируемых API-функций в виде шестнадцатеричных строк.

Ноябрь 2020 г. Fusion

MD5: f37cebdff5de994383f34bcef4131cdf

Этот вариант троянца написан на языке Go. Как мы уже упоминали, предыдущие варианты разрабатывались на C++, а значит, код был переписан с нуля и, возможно, другим разработчиком.

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

Больше того, в коде троянца жестко прописан адрес сайта, на котором злоумышленники, стоящие за этим семейством, ранее уже публиковали скомпрометированные данные, — это неопровержимый аргумент в пользу предположения о связи Fusion с его предшественниками.

Как и предыдущие варианты, Fusion получает аргумент командной строки — имя файла, подлежащего шифрованию. Возможно, эта функция используется для отладки шифровальщика.

Схема шифрования

Программа генерирует два случайных числа длиной 128 бит (вектор инициализации и ключ), которые используются для шифрования файлов с помощью алгоритма AES в режиме GCM. Если файл весит меньше 1,5 МБ, его содержимое шифруется полностью, а если больше, то применяется следующий принцип:

  • 320 КБ данных шифруются;
  • затем 320 КБ пропускаются без шифрования;
  • следующие 320 КБ шифруются;
  • следующие 320 КБ пропускаются;
  • и т. д., до конца файла.

Таким образом, большой файл оказывается зашифрованным только наполовину (но обработанные и необработанные фрагменты чередуются).

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

Открытый ключ RSA, используемый Fusion

В довершение ко всему, в конец файла записывается строка FUSION, а к имени файла добавляется расширение .FUSION. Образец также оставляет сообщение с контактами для связи в виде файла FUSION-README.txt:

Сообщение с требованием выкупа, созданное Fusion

Январь 2021 г. Milihpen

MD5: e226e6ee60a4ad9fc8eec41da750dd66

Для варианта Milihpen создатели семейства JSWorm в очередной раз полностью переписали код и, возможно, наняли для этого нового разработчика. Подобно Nefilim и более ранним вариантам, этот образец был разработан на языке C++, а не на Go, как Fusion.

Несмотря на это, основная функциональность, поток выполнения, схема шифрования и адрес сайта, на котором злоумышленники угрожают опубликовать скомпрометированные данные, остались прежними. Кроме того, связь с одним из предыдущих вариантов видна в самом имени троянца: это слово Nephilim, написанное задом наперед.

Теперь троянец логирует свои действия в консоли — вероятно, чтобы оператору было удобнее управлять процессом заражения.

Консольный журнал Milihpen

Как и предыдущие варианты, этот образец вредоносного ПО подписан цифровым сертификатом. При запуске Milihpen парсит данные конфигурации, жестко прописанные в его коде. Конфигурационная структура хранится в формате JSON и содержит следующие поля:

 

{
//имя мьютекса
«mutex»: «MILIHPEN»,

//расширение зашифрованного файла
«ext»: «MILIHPEN»,

//часть имени файла, содержащего сообщение с требованием выкупа
«nt_name»: «-INSTRUCT.txt»,

//главный открытый ключ RSA, закодированный в base64 (сокращен)
«pub»: «UlNB…Bnum9ew==»,

//текст сообщения с требованием выкупа, закодированный в base64 (сокращен)
«nt_content»: «VHdvIHRoa…wuY29t»,

//расширения пропускаемых файлов
«whiteext»: [«.exe», «.dll», «.lnk», «.url», «.log», «.cab», «.cmd», «.bat», «.dll», «.msi», «.mp3», «.mp4», «.pif», «.ini»],

//названия пропускаемых папок
«whitedir»: [«windows», «programdata», «program files», «program files (x86)», «appdata», «$recycle.bin», «all users», «.», «..», «rsa»],

//имена динамически импортируемых API-функций
«winapi»: [«MessageBoxA», «MessageBoxW», «BCryptOpenAlgorithmProvider», «BCryptGenRandom», «BCryptImportKeyPair», «BCryptEncrypt»]
}

12345678910111213141516171819202122232425 { //имя мьютекса «mutex»: «MILIHPEN»,  //расширение зашифрованного файла «ext»: «MILIHPEN»,  //часть имени файла, содержащего сообщение с требованием выкупа «nt_name»: «-INSTRUCT.txt»,  //главный открытый ключ RSA, закодированный в base64 (сокращен) «pub»: «UlNB…Bnum9ew==»,  //текст сообщения с требованием выкупа, закодированный в base64 (сокращен) «nt_content»: «VHdvIHRoa…wuY29t»,  //расширения пропускаемых файлов «whiteext»: [«.exe», «.dll», «.lnk», «.url», «.log», «.cab», «.cmd», «.bat», «.dll», «.msi», «.mp3», «.mp4», «.pif», «.ini»],  //названия пропускаемых папок «whitedir»: [«windows», «programdata», «program files», «program files (x86)», «appdata», «$recycle.bin», «all users», «.», «..», «rsa»],  //имена динамически импортируемых API-функций «winapi»: [«MessageBoxA», «MessageBoxW», «BCryptOpenAlgorithmProvider», «BCryptGenRandom», «BCryptImportKeyPair», «BCryptEncrypt»]}

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

JSON-структура конфигурации в образце Milihpen

Схема шифрования

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

Milihpen использует все те же алгоритмы для шифрования файлов — AES в режиме CBC и RSA. Ключ AES и вектор инициализации имеют длину 128 бит, шифруются с использованием главного открытого ключа RSA и сохраняются в конце зашифрованного файла.

В отличие от своих предшественников, для генерации случайных чисел и RSA-шифрования Milihpen использует функции BCrypt API из библиотеки CNG (Cryptography Next Generation), появившейся в Windows Vista. Это не дает Milihpen особых преимуществ, однако является примечательной характеристикой, поскольку сегодняшние разработчики шифровальщиков редко используют BCrypt API.

К именам зашифрованных файлов добавляется дополнительное расширение .MILIHPEN, а сообщение с требованием выкупа сохраняется как файл MILIHPEN-INSTRUCT.txt.

Оно содержит схожий текст и те же адреса сайтов для публикации скомпрометированных данных, что и у предыдущих вариантов семейства JSWorm.

Сообщение с требованием выкупа, созданное Milihpen

Февраль 2021 г. Gangbang

MD5: 173ab5a59490ea2f66fe37c5e20e05b8

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

Конфигурация образца Gangbang (сокращена)

Сайт для публикации скомпрометированных данных

Весной 2020 г. создатели семейства JSWorm занялись «охотой на крупную дичь» и запустили собственный сайт, на котором стали публиковать конфиденциальные данные, украденные у жертв.

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

Страница с описанием условий, предъявляемых злоумышленниками своим жертвам

На странице «Контакты» перечислены актуальные адреса электронной почты, которые злоумышленники используют для переговоров.

Страница с электронными адресами для связи

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

Страница для загрузки украденных данных

Жертвы

Основываясь на данных телеметрии Kaspersky Security Network (KSN), мы создали таблицу, показывающую географическое распределение атак шифровальщиков JSWorm.

Географическое распределение жертв JSWorm (по данным Kaspersky Security Network) (скачать)

10 стран, столкнувшихся с наибольшим количеством атак JSWorm (по данным статистики Kaspersky Security Network)

Страна %*
1 Китай 21,39%
2 Соединенные Штаты Америки 7,96%
3 Вьетнам 7,46%
4 Мексика 6,97%
5 Российская Федерация 6,47%
6 Бразилия 5,47%
7 Индия 5,47%
8 Германия 4,98%
9 Франция 4,48%
10 Республика Корея 2,99%

* Доля уникальных атакованных пользователей в стране по отношению ко всем пользователям, столкнувшимся с семейством JSWorm

Кроме того, мы проанализировали данные о жертвах, размещенные злоумышленниками на их сайте, и создали диаграмму, показывающую распределение жертв JSWorm по отраслям.

Распределение жертв JSWorm по отраслям (согласно информации с сайта, где злоумышленники публикуют скомпрометированные данные) (скачать)

Согласно списку жертв, опубликованному вымогателями, две пятых (41%) атак JSWorm пришлись на инженерно-производственный сектор. Энергоснабжение и коммунальные услуги (10%), финансовый сектор (10%), сфера услуг (10%), транспортный сектор (7%) и здравоохранение (7%) также занимают верхние позиции в списке.

Заключение

Семейство JSWorm эволюционировало в течение двух лет. За это время троянец сменил модель распространения, а его код был несколько раз переписан с нуля. С момента своего появления в 2019 г. он из типичного массового вымогателя, угрожающего индивидуальным пользователям, превратился в «охотника на крупную дичь», атакующего серьезные цели и запрашивающего огромные выкупы.

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

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

Ниже приведем прочие рекомендации, помогающие максимально защитить организацию.

  • Изолируйте от публичных сетей службы удаленного рабочего стола (такие как RDP), если нет абсолютной необходимости в доступе к этим службам извне, и всегда используйте для них надежные пароли.
  • Убедитесь, что используете актуальные версии коммерческих VPN-решений и другого серверного ПО, поскольку этот вид программного обеспечения часто является вектором заражения для шифровальщиков. Вовремя обновляйте клиентские приложения.
  • В своей стратегии защиты уделите особое внимание обнаружению эксфильтрации данных в интернет и дальнейшего распространения зловредов в вашей сети. Обращайте особое внимание на исходящий трафик — это позволит обнаружить подключения злоумышленников. Регулярно выполняйте резервное копирование данных. Обеспечьте быстрый доступ к резервным копиям в экстренных случаях. Используйте сервисы информирования об угрозах, чтобы знать, какие методы и тактики используют злоумышленники в настоящее время.
  • Используйте такие решения, как Kaspersky Endpoint Detection and Response и Kaspersky Managed Detection and Response, которые помогают обнаружить и остановить атаку на ранних этапах, до того как злоумышленники достигнут своих конечных целей.
  • Обучайте своих сотрудников основам информационной безопасности. В этом могут помочь специализированные курсы, которые можно найти, например, на платформе Kaspersky Automated Security Awareness Platform.
  • Используйте надежное решение для защиты рабочих мест, например Kaspersky Endpoint Security для бизнеса, обладающее функциями защиты от эксплойтов, выявления подозрительного поведения и отката вредоносных действий. Это решение также имеет механизмы самозащиты, препятствующие его удалению злоумышленниками.

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

JSWorm (ранний вариант)
MD5: a20156344fc4832ecc1b914f7de1a922

JSWorm 4.0.3
MD5: 5444336139b1b9df54e390b73349a168

Nemty 1.4
MD5: 1780f3a86beceb242aa81afecf6d1c01

Nefilim
MD5: 5ff20e2b723edb2d0fb27df4fc2c4468

Offwhite
MD5: ad25b6af563156765025bf92c32df090

Telegram
MD5: 004f67c79b428da67938dadec0a1e1a4

Fusion
MD5: f37cebdff5de994383f34bcef4131cdf

Milihpen
MD5: e226e6ee60a4ad9fc8eec41da750dd66

Gangbang
MD5: 173ab5a59490ea2f66fe37c5e20e05b8