Cyril FrançoisSamir Bousseaden

剖析 REMCOS RAT:深入分析普遍存在的 2024 恶意软件,第一部分

第一部分REMCOS 简介及其初始化程序

阅读时间:10 分钟恶意软件分析
剖析 REMCOS RAT:深入分析广泛传播的 2024 恶意软件,第一部分

在本多部分系列文章的第一篇文章中,Elastic Security 实验室团队的恶意软件研究人员简要介绍了 REMCOS 威胁,并深入探讨了其执行流程的前半部分,即从加载配置到清理受感染机器的网络浏览器。

简介

Elastic 安全实验室继续对高影响威胁进行检查,重点关注 REMCOS 4.9.3 版的内部复杂性Pro (November26,2023).

REMCOS 是由Breaking-Security 开发的一款软件,最初是一种红队工具,后来被几乎所有领域的各种威胁所采用。

当我们在 1 月中旬进行分析时,它是ANY.RUN 报告的最流行的恶意软件系列。此外,该系统仍在积极开发中,该公司最近宣布于 3 月9 发布 4.9.4 版就是明证,2024 。

我们分析的所有样本都来自同一个 REMCOS 4.9.3 版本。Pro x86 版本。该软件采用 C++ 编码,大量使用std::string 类进行字符串和字节相关操作。

REMCOS 具有多种功能,包括规避技术、权限升级、进程注入、记录功能等。

本系列文章对以下方面进行了广泛分析:

  • 执行和能力
  • 使用 Elastic 的 ES|QL 查询的检测和猎杀策略
  • 恢复约 80% 的配置字段
  • 恢复约 90% 的 C2 命令
  • 每个 IDA Pro 截图下的虚拟地址示例
  • 还有更多

如有任何问题或反馈,请随时通过社交媒体@elasticseclabs或 ElasticCommunity 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 会修改当前进程的 PEB 结构,用explorer.exe 字符串替换图像路径和命令行,同时将原始信息保存在全局变量中,以备后用。

这种众所周知的技术利用CoGetObject API 传递Elevation:Administrator!new: 单名以及CMSTPLUA CLSID 和ICMLuaUtil IID,以实例化一个升高的 COM 接口。然后,REMCOS 使用接口的ShellExec() 方法启动一个具有管理员权限的新进程,并退出。

Elastic Security Labs 在 2023 年的一篇文章中记录了这一技术:探索 Windows UAC 绕过:技术和检测策略

以下是使用 Elastic Defend 代理检测到该漏洞的最新截图。

禁用 UAC

disable_uac_flag 在配置中启用时(索引0x27 ),REMCOS 会通过使用reg.exe Windows 二进制文件将HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemEnableLUA 值设置为0 ,从而在注册表中禁用 UAC。"

安装和持久性

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 映射,然后使用SetThreadContextResumeThread 方法将其执行流劫持到 REMCOS 入口点。

首先,它会使用CreateProcessW API 在挂起模式下创建目标进程,并使用GetThreadContext API 获取其线程上下文。

然后,它会使用ZwCreateSection API 创建一个共享内存,并使用ZwMapViewOfSection API 将其映射到目标进程,同时将远程进程的句柄也映射进来。

接下来,通过将二进制文件的头和部分复制到共享内存,将其加载到远程进程中。

如有必要,可进行搬迁。然后,使用WriteProcessMemory API 修复 PEBImageBaseAddress 。随后,线程上下文被设置为指向 REMCOS 入口点的新入口,进程执行也随之恢复。

以下是我们的代理对这种程序注入技术的检测:

设置日志记录模式

REMCOS 有三种记录模式值,可通过配置的logging_mode (索引0x28 )字段进行选择:

  • 0: 不记录
  • 1: 在托盘图标中最小化启动
  • 2: 登录控制台

将该字段设置为 2 ,即使启用了进程注入,也能启用控制台,并显示更多信息。

清洁浏览器

启用enable_browser_cleaning_on_startup_flag (index0x2B) 后,REMCOS 将从主机上安装的网络浏览器中删除 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 的首次通信。

分享这篇文章