BLOODALCHEMY — это бэкдор для x86, написанный на C и обнаруженный в виде шелл-кода, внедренного в подписанный безопасный процесс. Он был обнаружен в ходе нашего анализа и является частью набора вторжений REF5961, о котором вы можете прочитать здесь. В этой статье рассмотрим как раскрывать бэкдор BLOODALCHEMY
Ключевые выводы
- BLOODALCHEMY — это, скорее всего, новый бэкдор, который все еще находится в активной разработке.
- BLOODALCHEMY использует законный двоичный файл для загрузки
- BLOODALCHEMY имеет несколько режимов работы, механизмов сохранения и вариантов связи.
Первоначальное исполнение
На начальном этапе выполнения злоумышленник развернул неопасную утилиту BrDifxapi.exe, которая уязвима для загрузки неопубликованных DLL. При развертывании этой уязвимой утилиты злоумышленник может загрузить неподписанный загрузчик BLOODALCHEMY (BrLogAPI.dll) и внедрить шеллкод в текущий процесс.
Командная строка, используемая для запуска загрузчика BLOODALCHEMY.
Поддельный BrLogApi.dll, часть набора инструментов BLOODALCHEMY, загруженный BrDifxapi.exe.
BrDifxapi.exe — это двоичный файл, разработанный японской компанией Brother Industries, и наблюдаемая нами версия имеет отозванную подпись.
BrDifxapi.exe с отозванной подписью
Законная DLL с именем BrLogApi.dll — это неподписанная DLL, также созданная Brother Industries. BLOODALCHEMY использует то же имя DLL.
Настоящий BrLogApi.dll представляет собой неподписанный файл DLL.
Анализ кода
Обфускация данных
Чтобы скрыть свои строки, вредоносная программа BLOODALCHEMY использует классический метод, при котором каждая строка шифруется, ей предшествует однобайтовый ключ дешифрования, и, наконец, все они объединяются вместе, образуя то, что мы называем зашифрованным блоком.
Хотя строки не завершаются нулем, смещение от начала большого двоичного объекта, строка и размер передаются в качестве параметра функции дешифрования. Вот зашифрованный формат больших двоичных объектов:
Blob = Key0 :EncryptedString0 + Key1:EncryptedString1 + ... + KeyN:EncryptedStringN
Реализация на Python алгоритма дешифрования строк приведена ниже:
def decrypt_bytes(encrypted_data: bytes, offset: int, size: int) -> bytes:
decrypted_size = size - 1
decrypted_data = bytearray(decrypted_size)
encrypted_data_ = encrypted_data[offset : offset + size]
key = encrypted_data_[0]
i = 0
while i != decrypted_size:
decrypted_data[i] = key ^ encrypted_data_[i + 1]
key = (key + ((key << ((i % 5) + 1)) | (key >> (7 - (i % 5))))) & 0xFF
i += 1
return bytes(decrypted_data)
Строки, содержащиеся в BLOB-объекте конфигурации, шифруются по той же схеме, однако идентификаторы (или смещения) каждой строки запутываются; он добавляет два дополнительных уровня запутывания, которые необходимо устранить. Ниже мы можем разрешить дополнительные уровни обфускации для расшифровки строк из конфигурации:
def decrypt_configuration_string(id: int) -> bytes:
return decrypt_bytes(
*get_configuration_encrypted_string(
get_configuration_dword(id)))
Каждая функция представлена ниже:
Функция get_configuration_dword
def get_configuration_dword(id: int) -> int:
b = ida_bytes.get_bytes(CONFIGURATION_VA + id, 4)
return b[0] + (b[1] + (b[2] + (b[3] << 8) << 8) << 8)
Функция get_configuration_encrypted_strng
def get_configuration_encrypted_string(id: int) -> tuple[int, int]:
ea = CONFIGURATION_VA + id
v2 = 0
i = 0
while i <= 63:
c = ida_bytes.get_byte(ea)
v6 = (c & 127) << i
v2 = (v2 | v6) & 0xFFFFFFFF
ea += 1
if c >= 0:
break
i += 7
return ea, v2
Упорство
BLOODALCHEMY сохраняет постоянство, копируя себя в свою постоянную папку с суффиксом пути \Test\test.exe,
Папка BLOODALCHEMY и двоичное имя
Корневой каталог папки персистентности выбирается на основе текущего уровня привилегий. Это может быть любой из следующих вариантов:
-
%ProgramFiles%
%ProgramFiles(x86)%
%Appdata%
%LocalAppData%\Programs
BLOODALCHEMY root persistence folder choice
Сохранение достигается разными методами в зависимости от конфигурации:
-
-
- Как услуга
- В качестве ключа реестра
- Как запланированная задача
- Использование COM-интерфейсов
-
Чтобы определить механизмы сохранения, мы можем использовать команду удаления, чтобы наблюдать различные способы, которыми вредоносное ПО удаляет сохранение.
В качестве службы с именем Test.
BLOODALCHEMY удаление ранее установленного сервиса
В качестве ключа реестра в CurrentVersion\Run.
BLOODALCHEMY удаляет постоянный ключ реестра «CurrentVersion\Run»
В качестве запланированной задачи, выполняемой с привилегиями СИСТЕМЫ через schtask.exe:
b'schtasks.exe /CREATE /SC %s /TN "%s" /TR "\'%s\'" /RU "NT AUTHORITY\\SYSTEM" /Fb'
Использование COM-интерфейса TaskScheduler::ITaskService. Назначение этого механизма сохранения в настоящее время неизвестно.
Создание экземпляра COM-интерфейса ITaskService.
Режимы бега
Вредоносная программа имеет разные режимы работы в зависимости от ее конфигурации:
-
- В основном или отдельном потоке процесса
- Создайте процесс Windows и внедрите в него шеллкод.
- Создайте процесс Windows и внедрите в него шеллкод.
- Как услуга
Вредоносное ПО может работать либо в основном потоке процесса.
Функция возможностей, вызываемая внутри основной функции
Или запускайте в отдельном потоке.
Функция возможностей, вызываемая в новом потоке
Или создайте процесс Windows из жестко запрограммированного списка и внедрите шеллкод, передаваемый параметром, в точку входа с помощью метода WriteProcessMemory+QueueUserAPC+ResumeThr
Метод технологического впрыска
Список целевых двоичных файлов для внедрения в процесс
Шелл-код содержится в параметрах, которые мы называем p_interesting_data. На самом деле этот параметр является указателем на структуру, содержащую как конфигурацию вредоносного ПО, так и исполняемые двоичные данные.
Прототип точки входа
Предоставленный шеллкод, скопированный в удаленном процессе
Заключительная часть процедуры технологического внедрения
Или установите и запустите себя как службу. В этом сценарии именем и описанием службы будет «Система тестирования и цифровой обработки изображений»:
Строки имени и описания, используемые для установки службы BLOODALCHEMY.
Кроме того, при запуске в качестве службы и запуске диспетчером служб вредоносная программа маскируется как остановленная, сначала устанавливая статус службы на «SERVICE_RUNNING», а затем устанавливая статус на «SERVICE_STOPPED», хотя на самом деле вредоносная программа все еще работает.
Точка входа в сервис BLOODALCHEMY маскирует статус сервиса
Коммуникация
Вредоносная программа взаимодействует с помощью протокола HTTP, именованных каналов или сокетов.
При использовании протокола HTTP вредоносная программа запрашивает следующий URI /Inform/logger/.
URI, используемый для подключения к C2
В этом сценарии BLOODALCHEMY попытается использовать любой прокси-сервер, найденный в разделе реестра SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings.
Информация о прокси-сервере хоста, полученная из реестра
В нашем образце мы не обнаружили никакой инфраструктуры C2, но URL-адрес может выглядеть примерно так: https://malwa[.]re/Inform/logger
При использовании именованного канала имя генерируется случайным образом с использованием текущего PID в качестве начального числа.
Генерация случайного имени канала с использованием текущего PID
Ожидая подключения клиента к этому именованному каналу, вредоносная программа сканирует запущенные процессы и проверяет, что его родительский процесс все еще работает. Это может быть сделано для ограничения доступа к именованному каналу. Тем не менее, вредоносная программа не проверяет, является ли клиент канала правильным родительским процессом, а только проверяет, запущен ли родительский процесс. Это приводит к ошибочной логике защиты именованного канала.
Получить родительский PID
Неверная проверка ограничения доступа к каналу родительского процесса
Из строк вредоносного ПО и импорта мы знаем, что вредоносное ПО также может работать с использованием сокетов TCP/UDP.
Использование API сокетов в одной из реализаций «коммуникационного» интерфейса
Пока мы не сделали никаких выводов об их использовании, перечислим все протоколы, обнаруженные в зашифрованных строках.
-
- DNS://
- HTTP://
- HTTPS://
- MUX://
- UDP://
- SMB://
- SOCKS5://
- SOCKS4://
- TCP://
Для всех протоколов данные могут быть зашифрованы, сжаты LZNT1 и/или закодированы в Base64.
Команды
Вредоносная программа содержит лишь несколько команд с реальными эффектами:
-
- Write/overwrite набор инструментов вредоносного ПО
- Запустите вредоносный двоичный файл Test.exe.
- Удалить и прекратить
- Соберите информацию о хосте
Существует три команды, которые записывают (или перезаписывают) набор вредоносных инструментов полученными двоичными данными в кодировке Base64:
-
-
- Либо двоичный файл вредоносного ПО (Test.exe)
- загруженная неопубликованная DLL (BrLogAPI.dll)
- или основной доверенный двоичный файл (BrDifxapi.exe)
-
Набор инструментов BLOODALCHEMY перезаписывает команды
Одна команда, которая запускает двоичный файл Test.exe в папке постоянного хранения.
Команда BLOODALCHEMY для запуска исполняемого двоичного файла вредоносной программы
Команда удаления и завершения сама сначала удалит все файлы в определенных местах, затем удалит все разделы реестра постоянного хранения или запланированные задачи, затем удалит установленную службу и завершит свое завершение.
Команда для удаления и завершения себя
Функция удаления
Одна команда сбора информации о хосте: процессор, ОС, дисплей, сеть и т. д.
Команда сбора информации
YARA
Elastic Security создал правила YARA для идентификации этой активности. Ниже приведены правила YARA для идентификации вредоносного ПО BLOODALCHEMY:
BLOODALCHEMY
rule Windows_Trojan_BloodAlchemy_1 {
meta:
author = "Elastic Security"
creation_date = "2023-05-09"
last_modified = "2023-06-13"
threat_name = "Windows.Trojan.BloodAlchemy"
license = "Elastic License v2"
os = "windows"
strings:
$a1 = { 55 8B EC 51 83 65 FC 00 53 56 57 BF 00 20 00 00 57 6A 40 FF 15 }
$a2 = { 55 8B EC 81 EC 80 00 00 00 53 56 57 33 FF 8D 45 80 6A 64 57 50 89 7D E4 89 7D EC 89 7D F0 89 7D }
condition:
all of them
}
rule Windows_Trojan_BloodAlchemy_2 {
meta:
author = "Elastic Security"
creation_date = "2023-05-09"
last_modified = "2023-06-13"
threat_name = "Windows.Trojan.BloodAlchemy"
license = "Elastic License v2"
os = "windows"
strings:
$a1 = { 55 8B EC 83 EC 54 53 8B 5D 08 56 57 33 FF 89 55 F4 89 4D F0 BE 00 00 00 02 89 7D F8 89 7D FC 85 DB }
$a2 = { 55 8B EC 83 EC 0C 56 57 33 C0 8D 7D F4 AB 8D 4D F4 AB AB E8 42 10 00 00 8B 7D F4 33 F6 85 FF 74 03 8B 77 08 }
condition:
any of them
}
rule Windows_Trojan_BloodAlchemy_3 {
meta:
author = "Elastic Security"
creation_date = "2023-05-10"
last_modified = "2023-06-13"
threat_name = "Windows.Trojan.BloodAlchemy"
license = "Elastic License v2"
os = "windows"
strings:
$a = { 55 8B EC 83 EC 38 53 56 57 8B 75 08 8D 7D F0 33 C0 33 DB AB 89 5D C8 89 5D D0 89 5D D4 AB 89 5D }
condition:
all of them
}
rule Windows_Trojan_BloodAlchemy_4 {
meta:
author = "Elastic Security"
creation_date = "2023-05-10"
last_modified = "2023-06-13"
threat_name = "Windows.Trojan.BloodAlchemy"
license = "Elastic License v2"
os = "windows"
strings:
$a = { 55 8B EC 83 EC 30 53 56 57 33 C0 8D 7D F0 AB 33 DB 68 02 80 00 00 6A 40 89 5D FC AB AB FF 15 28 }
condition:
all of them
}
Заключение
BLOODALCHEMY — это бэкдор-шеллкод, содержащий только оригинальный код (без статически связанных библиотек). Судя по всему, этот код был создан опытными разработчиками вредоносного ПО.(без статически связанных библиотек). Судя по всему, этот код был создан опытными разработчиками вредоносного ПО.