Обнаружен новый вымогатель Obscura: анализ атаки через доменный контроллер

ransomware

Аналитики компании Huntress столкнулись с ранее неизвестным вариантом программ-вымогателей под названием Obscura. Это имя было взято из файла с требованием выкупа (README_Obscura.txt), который также содержал несколько отсылок к этому слову в своём тексте. В ходе исследования не было найдено никаких публичных упоминаний о вымогателе с таким названием, что указывает на совершенно новую разработку.

Описание

Исполняемый файл вредоносной программы впервые был замечен в работе на нескольких компьютерах организации-жертвы. В этой сети было ограничено развёртывание агента Huntress, что негативно сказалось на возможностях обнаружения и реагирования, затруднив работу центра мониторинга безопасности (SOC). Это также ограничило видимость некоторых аспектов атаки, включая первоначальный вектор проникновения.

Тем не менее, удалось установить, что исполняемый файл вымогателя находился на контроллере домена по пути: C:\WINDOWS\sysvol\sysvol\[domain].local\scripts\. В инциденте, наблюдавшемся SOC Huntress, файл был назван в соответствии с доменом, в котором он был обнаружен - вероятно, чтобы замаскироваться. Файл представляет собой бинарный файл Go (включая идентификатор сборки Go) и содержит ряд путей, таких как /run/media/veracrypt1/Backups/Obscura/Locker/windows/locker/ и /run/media/veracrypt1/Locker Deps/go1.15.linux-amd64/go/src/os/exec.

Расположение бинарного файла на контроллере домена было общим для папки NETLOGON, которая предоставляет скрипты и объекты групповой политики (GPO) пользователям. Кроме того, содержимое папки автоматически реплицируется на все контроллеры домена для обеспечения согласованности. Однако это также означало, что исполняемый файл вымогателя автоматически распространялся по всей инфраструктуре.

На нескольких компьютерах в сети, включая контроллер домена, была создана запланированная задача с именем SystemUpdate для запуска бинарного файла вымогателя из общей папки NETLOGON. На одной из пользовательских машин злоумышленник создал задачу с именем "iJHcEkAG", которая выполняла команду cmd.exe /C netsh firewall set service type = remotedesktop mode = enable > \Windows\Temp\SJYfXB 2>&1 для включения доступа по протоколу удалённого рабочего стола через брандмауэр Windows.

При запуске исполняемый файл вымогателя выполняет встроенную команду cmd.exe /c vssadmin delete shadows /all /quiet в попытке отключить восстановление на конечной точке. Текст требования выкупа содержится в бинарном файле в виде строки, закодированной в base64.

Технический анализ показал, что при запуске бинарный файл проверяет статус переменной окружения DAEMON. Если значение равно 1, файл создаёт файл с требованием выкупа и продолжает шифрование. Если переменная отсутствует или имеет значение 0, он запускает серию функций для подготовки системы к шифрованию. Функция main_run() выполняется в режиме демона с установленной переменной DAEMON=1. Она извлекает 32-байтовый открытый ключ злоумышленника путём декодирования встроенной в исполняемый файл строки base64, а затем проводит разведку системы, перечисляя все устройства хранения и вычисляя их ёмкости для создания полной карты всех доступных дисков и их размеров для последующего шифрования.

Функция main_windows_api_IsRunAsAdmin() проверяет привилегии Windows с помощью двух последовательных вызовов Windows API, чтобы определить, обладают ли правами администратора. Если проверка показывает, что процесс не имеет прав администратора, вымогатель выводит сообщение "[!!!] user not admin. exit [!!!" и немедленно завершает работу. Это жёсткое требование, так как вымогателю нужны административные привилегии для завершения системных процессов, удаления теневых копий томов и доступа к системным API, необходимым для обнаружения домена и создания процессов-демонов.

После подтверждения административных привилегий вымогатель собирает критически важную системную информацию, вызывая GetSystemInfo() через Windows API. Он извлекает значение dwNumberOfProcessors, которое указывает количество ядер процессора и используется для оптимизации стратегии многопоточности во время фазы шифрования. Фаза подготовки системы продолжается агрессивным завершением процессов, нацеленных на приложения безопасности и базы данных, которые могут помешать процессу шифрования. Вымогатель вызывает main_windows_api_KillProcesses(), которая перебирает предопределённый список из 120 целевых процессов. Символ '*', найденный в некоторых именах процессов, используется в качестве подстановочного знака для сопоставления строк.

Вымогатель использует Windows API DsRoleGetPrimaryDomainInformation для определения роли компьютера в домене. Это выполняется в функции main_windows_api_GetPCRole(), которая сопоставляет роли домена Windows с внутренними значениями. Независимо от обнаруженной роли домена, каждая ветвь выполняет одну и ту же последовательность: загрузку строкового сообщения, specificчного для роли, и отображение соответствующих статусных сообщений перед немедленным переходом к фазе создания демона. Эти сообщения предполагают запланированные возможности сетевого распространения, которые либо никогда не были полностью реализованы, либо представляют незавершённую разработку, поскольку фактический код не содержит функциональности lateral movement помимо локальной процедуры шифрования.

Бинарный файл выбирает из нескольких стратегий шифрования: EncryptFull или EncryptPart. Обе эти функции используют функцию encryptFileRange() с разными аргументами. У них есть одноранговый открытый ключ (Curve25519), и во время шифрования генерируется временный закрытый ключ с помощью main_windows_api_generateEphemeralKeyPair(). Они используются для генерации ключа XChaCha20, который затем используется для шифрования файлов. Для этого используется скалярное умножение (X25519) между закрытым ключом и их открытым ключом для генерации 32-байтного общего секрета. Этот общий секрет вместе со случайными 24-байтным одноразовым номером (nonce) используются как параметры для шифрования файлов ChaCha. Перед записью зашифрованного файла обратно на диск они добавляют 64-байтный footer, который состоит из: сигнатуры "OBSCURA!", 32-байтного открытого ключа и 24-байтного одноразового номера. Поскольку у них есть одноранговый закрытый ключ, они могут использовать этот footer для повторного получения ключа ChaCha20, который использовался для шифрования файла.

Вымогатель Obscura реализует механизм фильтрации файлов, разработанный для максимального ущерба пользовательским данным при сохранении системной функциональности. Система фильтрации работает через функцию main_hasExcludedExtension(), которая выполняет сравнение расширений файлов без учёта регистра с жёстко заданным списком исключений. Функция извлекает расширение файла и сравнивает его с 15 предопределёнными расширениями, включая системные исполняемые файлы и библиотеки (.exe, .dll, .msi, .sys), компоненты загрузки и прошивки (.efi, .boot, .iso, .rom, .bin), системные конфигурации и утилиты (.ini, .cfg, .lnk, .hosts, .swapfile), а также расширение для самозащиты вымогателя (.obscura).

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

SHA256

  • c00a2d757349bfff4d7e0665446101d2ab46a1734308cb3704f93d20dc7aac23
Комментарии: 0