关键词
BLOODALCHEMY、Shellcode注入、DLL侧载、REF5961入侵集
BLOODALCHEMY 是一种全新的,仍在积极开发中,利用二进制白文件作为注入载体的后门,该后门也是 REF5961 入侵集的一部分。
BLOODALCHEMY 是一个用 C 语言编写的 x86 后门,以 shellcode 的形式注入到一个带签名的白进程中,它也是REF5961入侵集的一部分。
该后门需要运行特定的加载程序,因为它不是反射加载执行的(它本身没有加载和执行自身的能力)。此外,BLOODALCHEMY 的shellcode并未编译为位置无关的,所以当加载到与首选基地址不同的基地址时,必须针对新的“地址”进行二进制代码修补。
在本文的分析中,签名的白进程是被之前的一个恶意DLL进行了侧载运行。因此样本数据中缺少了这个恶意DLL,但其很可能是 BLOODALCHEMY shellcode 的容器和加载器。
根据本文的研究,该恶意软件是一个更大的工具集的一部分,因为其当前缺乏必要的功能,启用了异常调试日志记录,以及存在用于持续性服务设置的测试字符串,因此它仍在积极开发中。
-
BLOODALCHEMY 可能是一个新的后门,并且仍在积极开发中
-
BLOODALCHEMY 滥用合法的二进制文件进行加载
-
BLOODALCHEMY 具有多种运行模式、持续化机制和通信选项
图1:用于执行 BLOODALCHEMY 加载程序的命令行
图2:虚假的BrLogApi.dll,BLOODALCHEMY 工具集的一部分,由 BrDifxapi.exe 侧载
BrDifxapi.exe 是日本兄弟工业株式会社开发的二进制文件,本文观察到的版本签名已过期。
图3:签名过期的 BrDifxapi.exe
合法的BrLogApi.dll DLL 也是日本兄弟工业株式会社的未签名 DLL。BLOODALCHEMY 利用了相同的 DLL 名称。
图4:合法的 BrLogApi.dll 是一个未签名的 DLL 文件
(1)数据混淆
为了隐藏其字符串,BLOODALCHEMY 恶意软件使用了一种经典技术,即对每个字符串进行加密,然后在其前面加上单字节解密密钥,最后将所有字符串连接在一起,形成所谓的加密 blob。虽然字符串不以空值结束,但从 Blob 开始的偏移量、字符串和大小会作为参数传递给解密函数。
加密的 blob 格式为:
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:
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
(2)持久化
BLOODALCHEMY 通过将自身复制到路径后缀为Testtest.exe的持久化目录中来维护持久化。
图5:BLOODALCHEMY 文件夹和二进制名称
持久化文件夹的根目录是根据其当前权限级别选择的,它可以是:
-
%ProgramFiles%
-
%ProgramFiles(x86)%
-
%Appdata%
-
%LocalAppData%Programs
图6:BLOODALCHEMY 持久化根目录选择
根据配置,可以通过不同的方法实现持续性:
-
作为一项服务
-
作为注册表项
-
作为计划任务
-
使用COM接口
为了识别持续性机制,我们可以使用卸载命令来观察恶意软件删除持续性的不同方式:
-
作为名为Test的服务:
图7:BLOODALCHEMY 删除以前安装的服务
-
作为注册表项CurrentVersionRun:
图8:BLOODALCHEMY 删除“CurrentVersionRun”持续性注册表项
-
作为计划任务,通过以下方式以系统权限运行schtask.exe:
b'schtasks.exe /CREATE /SC %s /TN "%s" /TR "'%s'" /RU "NT AUTHORITY\SYSTEM" /Fb'
使用TaskScheduler::ITaskServiceCOM接口进行持久化。
图9:ITaskService COM 接口的实例化
(3)运行模式
该恶意软件根据其配置有不同的运行模式:
-
在主进程或单独的进程线程内运行
恶意软件可以在主进程线程内运行,或者在单独的线程中运行。
图10:在主函数中调用功能函数
图11:在新线程中调用的功能函数
-
创建一个Windows进程并向其中注入shellcode
从硬编码列表创建一个 Windows 进程,并使用WriteProcessMemory+QueueUserAPC+ResumeThread方法通过参数传递 shellcode的入口点。
图12:进程注入运行方法
图13:用于注入进程的目标二进制文件列表
shellcode 包含在我们称之为 p_interesting_data 的参数中,该参数实际上是一个指向包含恶意软件配置和可执行二进制数据结构的指针。
图14:入口点原型
图15:在远程进程中复制提供的 shellcode
图16:进程注入例程的最后部分
-
作为一项服务
将其自身作为服务安装并运行的情况下,服务名称和描述将为Test和Digital Imaging System:
图17:用于安装 BLOODALCHEMY 服务的名称和描述字符串
此外,当作为服务运行并由服务管理器启动时,恶意软件会首先将服务状态设置为“SERVICE_RUNNING”,然后将状态设置为“SERVICE_STOPPED”,从而将自身伪装为已停止,而实际上恶意软件仍在运行。
图18:BLOODALCHEMY 的服务入口点伪装服务状态
(4)通信
恶意软件使用 HTTP 协议、命名管道或套接字进行通信。当使用 HTTP 协议时,恶意软件请求以下 URI:
/Inform/logger/.
图19:用于连接到 C2 的 URI
在这种情况下,BLOODALCHEMY 将尝试使用在注册表项中找到的任何代理服务器SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings。
图20:从注册表获得的主机代理信息
本文的示例并未发现任何 C2 基础设施,但 URL 可能如下所示:
https://malwa[.]re/Inform/logger
使用命名管道时,名称是使用当前 PID 作为种子随机生成的。
图21:使用当前 PID 生成随机管道名称
在等待客户端连接到该命名管道时,恶意软件会扫描正在运行的进程,并检查其父进程是否仍在运行,这可能是为了限制对命名管道的访问。也就是说,恶意软件并没有检查管道客户端是否是正确的父进程,只是检查父进程是否在运行。这就在保护命名管道时,引入了有缺陷的逻辑。
图22:检索父级 PID
图23:用于限制管道访问父进程的检查存在缺陷
从恶意软件字符串和导入函数中我们知道恶意软件还可以使用 TCP/UDP 套接字进行操作。
图24:在 "通信 "接口的一个实现中使用套接字API
虽然我们还没有对它们的使用做出任何结论,但可以列出在加密字符串中找到的所有协议,对于所有协议,数据都可以加密,如LZNT1 压缩和/或 Base64 编码:
-
DNS://
-
HTTP://
-
HTTPS://
-
MUX://
-
UDP://
-
SMB://
-
SOCKS5://
-
SOCKS4://
-
TCP://
(5)命令
该恶意软件仅包含几个具有实际效果的命令:
-
写入/覆写恶意软件工具集
有三个命令可以使用接收到的 Base64 编码的二进制数据写入(或覆写)恶意软件工具集:
n任意一个恶意软件二进制文件 ( Test.exe)
n侧载 DLL ( BrLogAPI.dll)
n主要受信二进制文件 ( BrDifxapi.exe)
图25:BLOODALCHEMY 工具集覆盖命令
-
启动其恶意软件二进制文件Test.exe
在持续化目录中启动Test.exe二进制文件的一个命令。
图26:运行恶意软件可执行二进制文件的BLOODALCHEMY 命令
-
卸载并终止
卸载并自行终止命令会首先删除特定位置的所有文件,然后删除任何持续性注册表项或计划任务,接着删除已安装的服务,最后结束自身。
图27:卸载并自行终止的命令
图28:卸载功能
-
收集主机信息
一个主机信息收集命令包括CPU、OS、显示器、网络等。
图29:信息收集命令
BLOODALCHEMY 是一个仅包含原始代码(无静态链接库)的后门 shellcode。该代码似乎是由经验丰富的恶意软件开发人员编写的。
后门包含基于其配置的模块化功能。这些功能包括多种持久化机制、C2 和执行机制。
虽然未经证实,但有效命令的存在表明该恶意软件可能是仍在开发中的较大入侵集或恶意软件包的一部分,或者是用于特定战术用途的恶意软件。
(1)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
}
样本 |
类型 |
名称 |
来源 |
e14ee3e2ce0010110c409f119d56f6151fdca64e20d902412db46406ed89009a |
SHA-256 |
BrLogAPI.dll |
BLOODALCHEMY loader |
25268bc07b64d0d1df441eb6f4b40dc44a6af568be0657533088d3bfd2a05455 |
SHA-256 |
NA |
BLOODALCHEMY payload |
编辑|何其颖
审校|何双泽、王仁
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。
原文始发于微信公众号(国家网络威胁情报共享开放平台):探索BLOODALCHEMY后门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论