Cyril François

披露 BLOODALCHEMY 后门

BLOODALCHEMY 是一种新型、正在积极开发的后门,它利用良性二进制文件作为注入载体,并且是 REF5961 入侵集的一部分。

Disclosing the BLOODALCHEMY backdoor

序言

BLOODALCHEMY 是用 C 语言编写的 x86 后门,被发现是以 shellcode 的形式注入到已签名的良性进程中。它是在我们的分析中发现的,是 REF5961 入侵集的一部分,您可以在此处阅读相关信息。

BLOODALCHEMY 需要运行特定的加载程序,因为它不是自反射的(它没有自行加载和执行的能力)。此外,BLOODALCHEMY 没有编译为位置无关(当加载到与首选基址不同的基址时,必须修补二进制文件以考虑新的“位置”)。

在我们的分析中,已签名的良性进程之前是用恶意的 DLL 侧载的。该 DLL 在样本数据中缺失,但很可能是 BLOODALCHEMY shellcode 的容器和加载程序。

我们根据我们的研究认为,该恶意软件是更大的工具集的一部分,并且由于其当前缺乏的功能、启用的异常调试日志以及用于持久性服务设置的测试字符串的存在,该恶意软件仍在积极开发中。

主要发现

  • BLOODALCHEMY 很可能是一个新的后门,并且仍在积极开发中
  • BLOODALCHEMY 滥用合法的二进制文件进行加载
  • BLOODALCHEMY 具有多种运行模式、持久性机制和通信选项

初始执行

在初始执行阶段,攻击者部署了一个良性实用程序 BrDifxapi.exe,该实用程序容易受到 DLL 侧加载攻击。在部署此易受攻击的实用程序时,攻击者可以侧加载未签名的 BLOODALCHEMY 加载程序 (BrLogAPI.dll) 并将 shellcode 注入到当前进程中。

BrDifxapi.exe 是日本公司兄弟工业开发的一个二进制文件,我们观察到的版本具有已撤销的签名。

名为 BrLogApi.dll 的合法 DLL 也是兄弟工业的未签名 DLL。BLOODALCHEMY 使用相同的 DLL 名称。

代码分析

数据混淆

为了隐藏其字符串,BLOODALCHEMY 恶意软件使用了一种经典技术,其中每个字符串都被加密,前面加上一个单字节解密密钥,最后,所有字符串连接在一起,形成我们所说的加密 blob。

虽然字符串不是以 null 结尾的,但从 blob 的开头到字符串的偏移量和大小将作为参数传递给解密函数。这是加密 blob 格式

Blob = 密钥 0:加密字符串 0 + 密钥 1:加密字符串 1 + ... + 密钥 N:加密字符串 N

下面给出了字符串解密算法的 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 中包含的字符串使用相同的方案进行加密,但是每个字符串的 id(或偏移量)都被混淆了;它增加了两个额外的混淆层,必须解决。下面,我们可以解决额外的混淆层,从配置中解密字符串

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)来保持持久性。

持久性文件夹的根目录是根据其当前权限级别选择的,它可以是

  • %ProgramFiles%
  • %ProgramFiles(x86)%
  • %Appdata%
  • %LocalAppData%\Programs

持久性是通过不同的方法实现的,具体取决于配置

  • 作为服务
  • 作为注册表项
  • 作为计划任务
  • 使用 COM 接口

为了识别持久性机制,我们可以使用卸载命令来观察恶意软件删除持久性的不同方式。

作为名为 Test 的服务。

作为 CurrentVersion\Run 处的注册表项

作为计划任务,通过 schtask.exe 以 SYSTEM 权限运行

b'schtasks.exe /CREATE /SC %s /TN "%s" /TR "\'%s\'" /RU "NT AUTHORITY\\SYSTEM" /Fb'

使用 TaskScheduler::ITaskService COM 接口。此持久性机制的意图目前尚不清楚。

运行模式

该恶意软件根据其配置具有不同的运行模式

  • 在主线程或单独的进程线程中
  • 创建一个 Windows 进程并将 shellcode 注入其中
  • 作为服务

恶意软件可以在主进程线程中工作。

或者在单独的线程中运行。

或者从硬编码列表中创建一个 Windows 进程,并使用 WriteProcessMemory+QueueUserAPC+ResumeThread 方法将通过参数传递到入口点的 shellcode 注入其中。

shellcode 包含在我们称为 p_interesting_data 的参数中。此参数实际上是指向结构的指针,该结构包含恶意软件配置和可执行二进制数据。

或者将其自身安装并作为服务运行。在这种情况下,服务名称和描述将为 TestDigital Imaging System

此外,当作为服务运行时,并且由服务管理器启动时,恶意软件会通过首先将服务状态设置为“SERVICE_RUNNING”,然后将状态设置为“SERVICE_STOPPED”来伪装成已停止状态,而实际上恶意软件仍在运行。

通信

恶意软件使用 HTTP 协议、命名管道或套接字进行通信。

使用 HTTP 协议时,恶意软件请求以下 URI /Inform/logger/.

在这种情况下,BLOODALCHEMY 将尝试使用在注册表项 SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings 中找到的任何代理服务器。

我们没有通过我们的样本发现任何 C2 基础设施,但 URL 可能如下所示:https://malwa[.]re/Inform/logger

当使用命名管道时,名称是使用当前 PID 作为种子随机生成的。

在等待客户端连接到此命名管道时,恶意软件会扫描正在运行的进程,并检查其父进程是否仍在运行,这可能是为了限制对命名管道的访问。也就是说,恶意软件没有检查管道客户端是否是正确的父进程,只是检查父进程是否正在运行。这在保护命名管道方面引入了有缺陷的逻辑。

从恶意软件字符串和导入信息中,我们得知该恶意软件还可以使用 TCP/UDP 套接字进行操作。

虽然我们尚未对其使用方式得出任何结论,但我们列出了在加密字符串中发现的所有协议。

  • DNS://
  • HTTP://
  • HTTPS://
  • MUX://
  • UDP://
  • SMB://
  • SOCKS5://
  • SOCKS4://
  • TCP://

对于所有协议,数据都可以进行加密、LZNT1 压缩和/或 Base64 编码。

命令

该恶意软件只包含少数具有实际效果的命令

  • 写入/覆盖恶意软件工具集
  • 启动其恶意软件二进制文件 Test.exe
  • 卸载并终止
  • 收集主机信息

有三个命令可使用接收到的 Base64 编码二进制数据写入(或覆盖)恶意软件工具集

  • 恶意软件二进制文件 (Test.exe)
  • 侧加载的 DLL (BrLogAPI.dll)
  • 或主受信任二进制文件 (BrDifxapi.exe)

一个命令用于启动持久性文件夹中的 Test.exe 二进制文件。

卸载和终止自身的命令会先删除其位于特定位置的所有文件,然后删除任何持久性注册表项或计划任务,接着移除已安装的服务,最后终止自身。

一个主机信息收集命令:CPU、操作系统、显示器、网络等。

总结

BLOODALCHEMY 是一个仅包含原创代码(无静态链接库)的后门 shellcode。这段代码似乎由经验丰富的恶意软件开发人员编写。

该后门包含基于其配置的模块化功能。这些功能包括多种持久性、C2 和执行机制。

虽然尚未证实,但如此少的有效命令的存在表明,该恶意软件可能是更大的入侵集或恶意软件软件包的一个子功能,仍处于开发阶段,或者是一个针对特定战术用途的高度集中的恶意软件。

BLOODALCHEMY 和 MITRE ATT&CK

Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见策略、技术和程序。

策略

策略代表技术或子技术的原因。它是攻击者的战术目标:执行行动的原因。

恶意软件预防能力

YARA

Elastic Security 创建了 YARA 规则来识别此活动。以下是用于识别 BLOODALCHEMY 恶意软件的 YARA 规则

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
}

观测

所有可观测项也可在 下载 中以 ECS 和 STIX 格式的组合 zip 包形式提供。

本研究中讨论了以下可观测项。

可观测项类型名称参考
e14ee3e2ce0010110c409f119d56f6151fdca64e20d902412db46406ed89009aSHA-256BrLogAPI.dllBLOODALCHEMY 加载器
25268bc07b64d0d1df441eb6f4b40dc44a6af568be0657533088d3bfd2a05455SHA-256NABLOODALCHEMY 有效负载