
Плохие вещи от плохих парней
Образец Hive, проанализированный и упомянутый в этом документе, был случайным образом выбран из этого списка, созданного @rivitna, которому я выражаю свою искреннюю благодарность. Артефакты доступны на платформе VirusTotal.
В этом документе в качестве эталона взят файл a0h2uih3d2.exe
MD5: 15CF5E0DA094ACDD751A513402A8C941
SHA-1: 72E15AC4473903C814E65E3C06F54EB0399580AA
SHA-256: 335D2E4A743D059955760ECF2EC25EE86D36AA60B096C9180E860C64EF78EE55
Чтобы получить представление о сложности этого вымогателя, пожалуйста, ознакомьтесь с этим анализом, опубликованным центром Microsoft Threat Intelligence Center (MSTIC).
Пожалуйста, внимательно прочитайте весь документ, прежде чем начинать экспериментировать с кодом!
В последние месяцы я направил большую часть своих усилий на изучение и обратную разработку алгоритма шифрования Hive v5. У меня была возможность сотрудничать с выдающимся аналитиком вредоносного ПО и реверс-инженером @rivitna, который в прошлом анализировал предыдущие версии Hive и публиковал код и PoC, касающиеся их механизмов шифрования. Он внёс немалый вклад в выявление компонентов, участвующих в операциях шифрования Hive v5, который, будучи написанным на RUST, стал более сложным для анализа. Я нашёл нечто общее с Babuk, ещё одним очень важным вымогателем, исходные коды которого были раскрыты в июне 2021 года:
Вымогатель Hive v5, работающий в системе жертвы, генерирует два cleartext-ключа, используя алгоритм, приведённый ниже, основанный на Windows API QueryPerformanceCounter и QueryPerformanceFrequency.
Пожалуйста, обратитесь к этой странице Microsoft для получения дополнительной информации об API QueryPerformanceCounter, а здесь — об API QueryPerformanceFrequency.
QueryPerformanceCounter — это очень точный счётчик времени. При вызове он возвращает время, прошедшее с момента последнего включения ПК.
QueryPerformanceFrequency возвращает значение (частоту) счётчика производительности. Оно имеет фиксированное значение 0x989680. Это означает, что значение QueryPerformanceCounter обновляется 0x989680 раз в секунду, то есть 10 000 000 раз.
Два cleartext-ключа имеют размер 0xCFFF00 байт и генерируются по одному, байт за байтом. Ниже приведён фрагмент, который позволяет создать массив размером 0xA00000 байт, составляющий наибольшую часть так называемого cleartext-ключа, которым Hive шифрует файлы на ПК жертвы.

Каждый байт ключа получается путём взятия значения регистра AL. Регистр EAX содержит результат функции 0044ADE0, переименованной в createByte, которая вычисляет разницу между текущим моментом времени и начальным значением семени (seed), рассчитанным при первом вызове функции 0044A850, переименованной в call_to_QueryPerformanceCounter.
Ниже приведён код на C++ для генерации cleartext-ключа:

Алгоритм очень прост, хотя внутри функции 0044ADE0 были вставлены инструкции, выполняющие избыточные операции и различные условные переходы, чтобы попытаться замедлить время выполнения кода во время генерации cleartext-ключа:

В папке HiveRansomwareV5_custom_keygen_PoC вы найдёте исходный код, восстановленный из проанализированного образца Hive v5. Это не оптимизированный код, подобный тому, что присутствует во вредоносном ПО, поскольку мне нужно было не упустить ни одной строки кода из скомпилированной версии.
В папке HiveRansomwareV5_custom_keygen_PoC-optimized вы найдёте оптимизированный код, полученный из вышеупомянутого исходного кода. В этой версии код читается гораздо легче, чем исходный, что позволяет понять реализуемую им функциональность.
Обе версии перед запуском необходимо настроить под вашего пользователя, чтобы сохранить сгенерированный cleartext-ключ на вашем рабочем столе.
Оба cleartext-ключа генерируются с использованием одного и того же алгоритма.
Cleartext-ключ состоит из 0xA00000 безопасно сгенерированных случайным образом байт. Затем первые 0x2FFF00 байт копируются в конец, создавая итоговый cleartext-ключ размером 0xCFFF00 байт.

Затем Hive использует два сгенерированных ключа для шифрования файлов, но прежде всего вымогатель Hive v5 шифрует сгенерированные ключи в собственную структуру (далее мы будем называть их keystream) и размещает их в корне каждого шифруемого диска с расширением .key. Например, если в вашей системе установлены оба диска C и D, зашифрованные keystream-файлы будут присутствовать в корне каждого диска.

Вымогатель Hive v5 использует сгенерированные cleartext-ключи для шифрования файлов с помощью инструкции XOR, так что мы имеем дело с очень быстрым симметричным шифрованием на современных процессорах x86/x64.
Вымогателю Hive v5 необходимо защитить сгенерированный cleartext-ключ, зашифровав его два раза; далее мы будем называть эти шифрования раундами. Для получения итогового keystream требуется два раунда шифрования.
Для этого на каждом раунде выполняются следующие шаги:
Шаг 3 гарантирует создание keystream, который может быть открыт двойной парой приватных ключей: теми, что Hive генерирует во время шифрования, и теми, что партнёр Hive сгенерировал, когда компилировал для нас вымогателя.
