Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Иногда вирусным аналитикам удается бесплатно расшифровать файлы, за восстановление которых трояны‑энкодеры требуют очень много денег. Со стороны это выглядит настоящей магией, но в ее основе лежат исследования и знания о том, как работают вредоносные программы. Сегодня мы разберемся в принципах действия таких троянов на примере реального энкодера и напишем программу — декодер зашифрованных им файлов.
Во второй половине 2023 года команда Positive Technologies по расследованию инцидентов PT CSIRT (PT Expert Security Center) разбирала происшествие в инфраструктуре одного из своих заказчиков. Специалисты пришли к выводу, что за случившимся стоят представители хакерской группировки Twelve. Группа позиционирует себя как хактивистов политической направленности и выбирает себе цели среди российских компаний и учреждений. Считается, что эта группа тесно связана с группировкой Shadow, сменившей название сначала на C0met, а с недавних пор, вероятно, скрывающейся под именем Darkstar.
Судя по схожему почерку и инструментарию, эти две группировки являются частью одной команды и отвечают за разные направления. Обе используют в ходе атак различные варианты шифровальщиков, преимущественно семейства LockBit/Babuk. Но если хакеры из Shadow занимаются вымогательством, назначая выкуп за ключ дешифровки, то представители Twelve просто стремятся нанести максимальный ущерб целевой инфраструктуре, при этом публикуя в открытом доступе результаты своей работы, которые иногда включают в себя выгруженные из инфраструктуры чувствительные данные.
В ходе расследования инцидента специалисты обнаружили очень подозрительный исполняемый файл с именем twelve.exe
. Его анализ показал, что вместо привычного LockBit злоумышленники использовали шифровальщик, относящийся к семейству программ‑вымогателей Ryuk / Chaos / Yashma / Obsidian ORB, который использовался во множестве вредоносных кампаний по всему миру.
1,4 тысячи загруженных вредоносных семплов chaos ransomware на VirusTotal
Судя по ряду признаков, для генерации вредоносного файла, скорее всего, использовался публично доступный конструктор Chaos Ransomware Builder, который позволяет злоумышленникам кастомизировать вредоносные программы‑шифровальщики. С его помощью, например, можно изменить имя процесса, имя файла с требованиями, текст самих требований, задать список расширений шифруемых файлов, сбилдить декриптор и так далее.
Интерфейс Chaos Ransomware Builder
Сам троян написан на .NET, благодаря чему можно изучить его функции, например в DNSpy.
Список функций шифровальщика
Пробежавшись по основным функциям, исследователи выяснили, что этот энкодер шифрует файлы с использованием алгоритма AES, затем зашифровывает ключи AES встроенным открытым RSA-ключом и записывает их в конец зашифрованных файлов.
Для каждого шифруемого файла троян генерирует индивидуальный AES-ключ:
string text = Program.CreatePassword(40); // Генерация ключа AESif (fileInfo.Length < (long)((ulong)-1926258176)) // Проверка размера файла{ if (Program.checkDirContains(files[i])) { string keyRSA = Program.RSA_Encrypt(text, Program.rsaKey()); // Шифрование AES-ключа публичным RSA-ключом Program.AES_Encrypt(files[i], text, keyRSA); // Шифрование файлов }}
В первую очередь было интересно понять, каким образом генерируется ключ для AES. Функция генерации ключа выглядит следующим образом:
public static string CreatePassword(int length) { StringBuilder stringBuilder = new StringBuilder(); Random random = new Random(); while (0 < length--) { stringBuilder.Append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/"[random.Next("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/".Length)]); } return stringBuilder.ToString(); }
Ключ генерируется отдельно для каждого файла на основе функции Random
, при этом Random
запускается без сида. Если в DNSpy перейти в объявление класса Random
, то мы увидим следующее.
То есть Random
, вызванный без сида, в качестве начального использует значение Environment.TickCount
. Важно отметить, что это справедливо для приложений .NET версии 4, генерация рандома для версий 5 и выше использует другие начальные значения.
Environment.TickCount
— это количество миллисекунд, прошедших с момента запуска системы. Таким образом, можно предположить, что, зная значение сида, мы в состоянии «угадывать» случайные значения.
Проверим наши предположения. Возьмем функцию CreatePassword
из вредоноса, добавим туда вывод текущего значения Environment.TickCount
и сгенерированного пароля, а затем выведем полученные значения в консоль:
using System;using System.Text;namespace test1{ class Program { static void Main(string[] args) { string s = CreatePassword(40); Console.WriteLine("Key: " + s); } public static string CreatePassword(int length) { StringBuilder stringBuilder = new StringBuilder(); Random random = new Random(); while (0 < length--) { stringBuilder.Append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/"[random.Next("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/".Length)]); } Console.WriteLine("Environment.TickCount: " + Environment.TickCount); return stringBuilder.ToString(); }}}
В результате запуска программы получаем следующие значения:
C:temp>1.exe
Environment.TickCount: 264152453
Key: &Cer88Tf8sErkcxYAgR5CvdawGij/JqSEVOln8m/
Теперь организуем добавление сида в функцию генерации ключа и передадим туда значения TickCount
из предыдущего запуска:
static void Main(string[] args) { int seed = 264152453; string s = CreatePassword(40,seed); Console.WriteLine("Key: " + s); } public static string CreatePassword(int length,int seed) { StringBuilder stringBuilder = new StringBuilder(); Random random = new Random(seed); while (0 < length--) { stringBuilder.Append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/"[random.Next("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/".Length)]); } return stringBuilder.ToString(); }
Источник: xakep.ru