在本多篇系列文章的第一篇中,Elastic 安全实验室团队的恶意软件研究人员将简要介绍 REMCOS 威胁,并深入研究其执行流程的前半部分,从加载其配置到清除受感染机器的 Web 浏览器。
简介
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 配置存储在名为 SETTINGS
的资源中的加密 Blob 中。此名称在不同版本的 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:
名字,以及 CMSTPLUA
CLSID 和 ICMLuaUtil
IID,以实例化提升的 COM 接口。然后,REMCOS 使用接口的 ShellExec()
方法启动具有管理员权限的新进程并退出。
此技术之前已在 2023 年 Elastic 安全实验室的一篇文章中记录:探索 Windows UAC 绕过:技术和检测策略。
下面是使用 Elastic Defend 代理检测到此漏洞的最新屏幕截图。
禁用 UAC
当配置中启用 disable_uac_flag
时(索引 0x27
),REMCOS 会通过将 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemEnableLUA
的值设置为 0
来在注册表中禁用 UAC,使用 reg.exe
Windows 二进制文件。
安装和持久化
当配置中激活 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 的首次通信。