Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Целью атаки трояна‑шифровальщика может стать не просто компьютер или работающий в сети сервер, а виртуальная машина уровня предприятия, на которой обычно крутится очень много важных сервисов. Сегодня мы разберем принцип действия шифровальщика, ориентированного на VMware ESXi, и поговорим о том, как обезопасить свою виртуальную инфраструктуру.
Компрометация гипервизора или связанной с ним инфраструктуры может поставить под угрозу целую экосистему серверов, баз данных и бизнес‑приложений. Неудивительно, что хакерские группы все чаще фокусируют свои атаки на VMware ESXi, создавая специализированные программы‑шифровальщики, нацеленные на файлы виртуальных машин, такие как *.vmdk, *.vmx, *.vmsn, *.vswp, *.vmem и другие. Сегодня мы рассмотрим конкретный случай, в котором был обнаружен бинарный ELF-файл с именем encrypt и сопровождающий его Bash-скрипт encrypt.sh. Я подробно опишу этапы атаки: от проникновения в сеть и получения доступа к ESXi до запуска файлов, шифрования виртуальных дисков и устранения следов, что оставляет жертву перед выбором — заплатить выкуп или потерять данные.
Чтобы понять всю глубину этого инцидента, нужно рассмотреть последовательность действий атакующих от момента эксплуатации уязвимости CVE-2021-44228 на VMware Horizon до непосредственного запуска шифрования на ESXi. Уязвимость, получившая название Log4Shell, стала широко известна зимой 2021–2022 годов и давала возможность злоумышленникам выполнять произвольный код в контексте сервера, где используется логирующая библиотека Log4j уязвимых версий. VMware Horizon, будучи сложным продуктом, базирующимся на Java и в прошлом включавшим уязвимые компоненты, иногда оставался непропатченным, что открывало возможность провести RCE-атаку (remote code execution).
Злоумышленник, имея специальный эксплоит, мог переслать серверу Horizon пакет, включавший вызов к JNDI с вредоносным классом. Библиотека Log4j динамически загружала его и исполняла. Как только этот класс попадал в среду исполнения, он раскрывал перед атакующим безграничные возможности — от установки дополнительного malware-инструментария до внедрения скриптов и эскалации на уровень локального администратора. Именно так, согласно собранным данным, в ряде случаев удавалось проникнуть в корпоративную сеть и скомпрометировать сервер Horizon.
После эксплуатации уязвимости CVE-2021-44228 атака не останавливается на одной машине, ведь обычно злоумышленникам интересны более масштабные цели. Поэтому они анализируют сетевую среду, отыскивают уязвимые узлы и, самое важное, осуществляют атаку SAM-хранилища в попытке извлечь NTLM-хеш локального администратора. Если в компании на многих серверах используется один и тот же пароль локального админа (или хотя бы на нескольких ключевых машинах), это дает атакующим возможность перемещаться по сети (lateral movement) при помощи pass-the-hash.
Когда обнаруживается узел, где запущена сессия пользователя из группы «Администраторы домена», то дамп lsass.exe или аналогичное средство позволяет получить NTLM-хеш доменного админа, после чего злоумышленники могут выполнить любые действия от имени доменного администратора, в том числе получить доступ к ESXi, если настроена аутентификация через доменные учетные записи.
Если учетка Domain Admin без жесткой изоляции тоже имеет право подключаться к ESXi, то злоумышленники этим непременно воспользуются, ведь, овладев доменными привилегиями, они без труда загрузят нужную вредоносную программу в /tmp или другой каталог на гипервизоре (с помощью SCP или иным способом). В нашем случае атакующие загружают файлы encrypt и encrypt.sh — двух компонентов, которые действуют в связке.

Анализ VirusTotal файла encrypt.sh

Анализ VirusTotal файла encrypt

Анализ Cuckoo Sandbox файла encrypt
Анализ показал, что ELF-бинарь encrypt представляет собой модуль‑вымогатель, написанный под 64-битную Linux-платформу. В ESXi внутренне используется Linux-образ, поэтому запуск ELF-файла напрямую там возможен, особенно если установлен параметр execInstalledOnly = 0 (или скомпилированы нужные shared-библиотеки).

Параметры файла encrypt
Логика запуска файла encrypt — обработка ошибки, когда нет ссылки на файл для шифрования. Если ссылка присутствует, то запускается процесс шифрования.

Логика запуска шифровальщика
Бинарь при старте ждет от пользователя аргумента — пути к файлу, который будет шифроваться. При этом, если верить дизассемблеру, в коде реализованы криптопримитивы Curve25519 (для обмена или генерации ключей) и Sosemanuk (для быстрого шифрования). Давай разберем всю последовательность действий этой софтины.

Логика основной функции encrypt_file
Вот примерный пошаговый алгоритм выполнения функции.
Открытие файла. Файл открывается для чтения и записи в бинарном режиме. Если открыть файл не удалось (fopen64 вернул NULL), функция возвращает 1.

Логика основной функции encrypt_file
Выделение памяти под ключ и инициализация базы данных значениями.

Выделение памяти под ключ и инициализация базы данных значениями
Декодирование строки Base64 и генерация ключа.

Декодирование строки Base64 и генерация ключа
В коде можно найти вот такие константы:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Они используются для Base64 в процессе декодирования встроенной строки‑ключа, «вшитой» прямо в бинарь. Исходная длина decoded_length записывается сюда же, прочитанная строка используется для генерации нового ключа функцией generate_key.

Развернутая функция generate_key
Функция generate_key принимает шесть аргументов:
_int64 privateKey1 — первый приватный ключ для Curve25519; _int64 privateKey2 — второй приватный ключ для Curve25519; _BYTE *sosemanukStateBuffer — указатель на буфер состояния Sosemanuk (поточного шифра); _BYTE *curve25519PrivateArray — указатель на 32-байтовый массив для работы с Curve25519; _int64 sharedSecret1 — буфер для результата первого вызова функции curve25519_donna; _int64 sharedSecret2 — буфер для результата второго вызова функции curve25519_donna. Шаги выполнения этой части вредоносного приложения.
curve25519_donna задействована для выполнения операций Диффи — Хеллмана с использованием алгоритма Curve25519. Значения sharedSecret1 и sharedSecret2 генерируются с помощью закрытого ключа curve25519PrivateArray и двух разных открытых ключей privateKey1 и privateKey2. curve25519PrivateArray очищается с помощью функции secure_memset, чтобы предотвратить утечку чувствительной информации. sharedSecret2. sha256_init() и sha256_hash(), подготавливается и вычисляется хеш. secure_memset(); очищает память, использованную для вычисления SHA-256, чтобы удалить промежуточные данные. sosemanuk_schedule() готовит внутренние состояния для шифра Sosemanuk на основе ключа (результата SHA-256). sosemanuk_init() завершает инициализацию шифра, передавая подготовленный контекст. secure_memset. На следующем этапе выполняется инициализация списка разделов и проверка файловой системы.

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

Развернутая функция check_file_system
Затем программа проверяет, является ли входная структура валидной MBR или GPT.

Развернутая функция add_partition
Источник: xakep.ru