在本多部分系列文章的第一篇文章中,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.exeieinstal.exeielowutil.exe
注:在 REMCOS 中只有一种注入方法,当我们谈论流程注入时,我们特指此处概述的方法
REMCOS 采用经典的ZwMapViewOfSection +SetThreadContext +ResumeThread 技术进行工艺注入。这包括通过共享内存将自身复制到注入的二进制文件中,使用ZwMapViewOfSection 映射,然后使用SetThreadContext 和ResumeThread 方法将其执行流劫持到 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 浏览器。
清理过程包括使用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 的首次通信。
