在本系列文章的第一篇中,Elastic 安全实验室团队的恶意软件研究人员简要介绍了 REMCOS 威胁,并深入研究了其执行流程的前半部分,从加载配置到清理受感染机器的网络浏览器。
简介
Elastic 安全实验室继续对高影响威胁进行检查,重点关注 REMCOS 4.9.3 Pro 版本(2023 年 11 月 26 日)的内部复杂性。
REMCOS 由 Breaking-Security 开发,最初是一款红队工具,但此后已被各种针对几乎所有行业的威胁所采用。
当我们在 1 月中旬进行分析时,它是 ANY.RUN 报告的最普遍的恶意软件家族。此外,它仍在积极开发中,正如该公司于 2024 年 3 月 9 日发布的 4.9.4 版本的最新公告所证明的那样。
我们分析的所有样本都来自相同的 REMCOS 4.9.3 Pro x86 版本。该软件使用 C++ 编写,并大量使用 std::string
类进行字符串和字节相关的操作。
REMCOS 具有广泛的功能,包括逃避技术、权限提升、进程注入、录制功能等。
本系列文章提供了对以下内容的广泛分析:
- 执行和功能
- 使用 Elastic 的 ES|QL 查询进行检测和狩猎策略
- 恢复约 80% 的配置字段
- 恢复约 90% 的 C2 命令
- 每个 IDA Pro 屏幕截图下的样本虚拟地址
- 以及更多!
如有任何问题或反馈,请随时通过社交媒体 @elasticseclabs 或 Elastic 社区 Slack 与我们联系。
加载配置
REMCOS 配置存储在一个加密的 Blob 中,该 Blob 位于名为 SETTINGS
的资源中。此名称在不同版本的 REMCOS 中保持一致。
恶意软件首先从其资源部分加载加密的配置 Blob。
要加载加密的配置,我们使用以下 Python 脚本和 Lief 模块。
import lief
def read_encrypted_configuration(path: pathlib.Path) -> bytes | None:
if not (pe := lief.parse(path)):
return None
for first_level_child in pe.resources.childs:
if first_level_child.id != 10:
continue
for second_level_child in first_level_child.childs:
if second_level_child.name == "SETTINGS":
return bytes(second_level_child.childs[0].content)
我们可以确认 4.9.3 版本与 Fortinet 研究人员先前描述的结构和解密方案相同。
我们将“加密配置”称为包含解密密钥和加密数据 Blob 的结构,如下所示:
struct ctf::EncryptedConfiguration
{
uint8_t key_size;
uint8_t key[key_size];
uint8_t data
};
配置仍然使用 RC4 算法解密,如下面的屏幕截图所示。
要解密配置,我们使用以下算法。
def decrypt_encrypted_configuration(
encrypted_configuration: bytes,
) -> tuple[bytes, bytes]:
key_size = int.from_bytes(encrypted_configuration[:1], "little")
key = encrypted_configuration[1 : 1 + key_size]
return key, ARC4.ARC4Cipher(key).decrypt(encrypted_configuration[key_size + 1 :])
配置用于初始化一个我们称为 g_configuration_vector
的全局向量,通过使用字符串 \x7c\x1f\x1e\x1e\x7c
作为分隔符将其拆分。
我们将在本系列的后面详细解释配置。
绕过 UAC
当配置中的 enable_uac_bypass_flag
(索引 0x2e
)启用时,REMCOS 会尝试使用已知的基于 COM 的技术绕过 UAC。
在此之前,REMCOS 会伪装其进程以避免检测。
REMCOS 通过将映像路径和命令行替换为 explorer.exe
字符串来修改当前进程的 PEB 结构,同时将原始信息保存到全局变量以供以后使用。
众所周知的 技术利用 CoGetObject
API 传递 Elevation:Administrator!new:
moniker,以及 CMSTPLUA
CLSID 和 ICMLuaUtil
IID,以实例化一个提升的 COM 接口。然后,REMCOS 使用该接口的 ShellExec()
方法以管理员权限启动一个新进程,然后退出。
此技术在 2023 年的 Elastic 安全实验室文章中已有记录:探索 Windows UAC 绕过:技术和检测策略。
以下是最近使用 Elastic Defend 代理检测此漏洞的屏幕截图。
禁用 UAC
当配置中的 disable_uac_flag
启用时(索引 0x27
),REMCOS 禁用注册表中的 UAC,方法是使用 reg.exe
Windows 二进制文件将 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemEnableLUA
值设置为 0
。
安装和持久化
当配置中的 enable_install_flag
(索引 0x3
)激活时,REMCOS 将自行安装到主机上。
安装路径使用以下配置值构建:
install_parent_directory
(索引0x9
)install_directory
(0x30
)install_filename
(0xA
)
恶意软件二进制文件被复制到 {install_parent_directory}/{install_directory}/{install_filename}
。在此示例中,它是 %ProgramData%\Remcos\remcos.exe
。
如果配置中的 enable_persistence_directory_and_binary_hiding_flag
(索引 0xC
)启用,则安装文件夹和恶意软件二进制文件将设置为超级隐藏(即使用户启用显示隐藏文件或文件夹,文件也会被 Windows 隐藏以保护具有系统属性的文件)并设置为只读,方法是为其应用只读、隐藏和系统属性。
安装后,REMCOS 会根据配置中启用的以下标志之一在注册表中建立持久性:
enable_hkcu_run_persistence_flag
(索引0x4
)HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
enable_hklm_run_persistence_flag
(索引0x5
)HKLM\Software\Microsoft\Windows\CurrentVersion\Run\
enable_hklm_policies_explorer_run_flag
(索引0x8
)HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run\
然后,恶意软件使用ShellExecuteW
从安装文件夹重新启动,随后终止初始进程。
进程注入
当配置中启用enable_process_injection_flag
(索引0xD
)时,REMCOS 会将自身注入到指定的或从硬编码列表中选择的 Windows 进程中,以逃避检测。
enable_process_injection_flag
可以是布尔值或目标进程的名称。当设置为 true (1) 时,注入的进程将以“尽力而为”的方式从以下选项中选择
iexplorer.exe
ieinstal.exe
ielowutil.exe
注意:REMCOS 中只有一种注入方法可用,当我们谈论进程注入时,我们特指此处概述的方法。
REMCOS 使用经典的ZwMapViewOfSection
+ SetThreadContext
+ ResumeThread
技术进行进程注入。这涉及通过共享内存将自身复制到注入的二进制文件中,使用ZwMapViewOfSection
映射,然后使用SetThreadContext
和ResumeThread
方法将其执行流程劫持到 REMCOS 入口点。
它首先使用CreateProcessW
API以挂起模式创建目标进程,并使用GetThreadContext
API检索其线程上下文。
然后,它使用ZwCreateSection
API创建一个共享内存,并使用ZwMapViewOfSection
API将其映射到目标进程中,以及远程进程的句柄。
接下来,通过将二进制文件的头部和节复制到共享内存中,将其加载到远程进程中。
如有必要,将应用重定位。然后,使用WriteProcessMemory
API修复 PEB ImageBaseAddress
。随后,线程上下文设置为一个新的入口点,指向 REMCOS 入口点,并恢复进程执行。
以下是我们的代理对这种进程注入技术的检测
设置日志记录模式
REMCOS 有三个日志记录模式值,可以使用配置的logging_mode
(索引0x28
)字段进行选择。
- 0:不记录日志
- 1:以最小化方式启动到托盘图标
- 2:控制台日志记录
将此字段设置为 2 将启用控制台,即使启用进程注入也是如此,并公开其他信息。
清理浏览器
当启用enable_browser_cleaning_on_startup_flag
(索引0x2B
)时,REMCOS 将删除主机上已安装的 Web 浏览器的 Cookie 和登录信息。
根据官方文档,此功能的目标是增强系统对密码盗窃的安全性。
目前,支持的浏览器包括 Internet Explorer、Firefox 和 Chrome。
清理过程涉及使用FindFirstFileA
、FindNextFileA
和DeleteFileA
API删除浏览器已知目录路径中的 Cookie 和登录文件。
作业完成后,REMCOS 会向控制台打印一条消息。
值得一提的是配置中的两个相关字段
enable_browser_cleaning_only_for_the_first_run_flag
(索引0x2C
)browser_cleaning_sleep_time_in_minutes
(索引0x2D
)
browser_cleaning_sleep_time_in_minutes
配置值决定了 REMCOS 在执行作业之前将休眠多长时间。
当启用enable_browser_cleaning_only_for_the_first_run_flag
时,清理只会在 REMCOS 的第一次运行时发生。之后,将设置注册表值HKCU/SOFTWARE/{mutex}/FR
。
在随后的运行中,如果注册表中存在该值并已设置,则函数将直接返回。
第一篇文章到此结束。第二部分将涵盖 REMCOS 执行流程的后半部分,从其看门狗开始到与 C2 的第一次通信。