Cyril FrançoisSamir Bousseaden

REMCOS RAT 深入分析:对 2024 年广泛传播的恶意软件的深入分析,第一部分

第一部分:REMCOS 简介以及深入其初始化过程

阅读时间:10 分钟恶意软件分析
Dissecting REMCOS RAT: An in-depth analysis of a widespread 2024 malware, Part One

在本系列文章的第一篇中,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_directory0x30
  • install_filename0xA

恶意软件二进制文件被复制到 {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(索引0x4HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
  • enable_hklm_run_persistence_flag(索引0x5HKLM\Software\Microsoft\Windows\CurrentVersion\Run\
  • enable_hklm_policies_explorer_run_flag(索引0x8HKLM\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映射,然后使用SetThreadContextResumeThread方法将其执行流程劫持到 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。

清理过程涉及使用FindFirstFileAFindNextFileADeleteFileA 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 的第一次通信。