序言
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
的参数中。此参数实际上是指向结构的指针,该结构包含恶意软件配置和可执行二进制数据。
或者将其自身安装并作为服务运行。在这种情况下,服务名称和描述将为 Test
和 Digital 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 包形式提供。
本研究中讨论了以下可观测项。
可观测项 | 类型 | 名称 | 参考 |
---|---|---|---|
e14ee3e2ce0010110c409f119d56f6151fdca64e20d902412db46406ed89009a | SHA-256 | BrLogAPI.dll | BLOODALCHEMY 加载器 |
25268bc07b64d0d1df441eb6f4b40dc44a6af568be0657533088d3bfd2a05455 | SHA-256 | NA | BLOODALCHEMY 有效负载 |