在本系列多篇文章的前几篇文章中,Elastic 安全实验室团队的恶意软件研究人员分析了 REMCOS 的执行流程,详细介绍了其记录功能及其与 C2 的通信。在本文中,您将了解更多关于 REMCOS 配置结构及其 C2 命令的信息。
配置
在本节中,我们将全面概述恶意软件的配置字段。
配置表
研究人员成功恢复了大约 80% 的配置结构(56 个字段中的 45 个)。我们在下表中提供了详细的配置信息
索引 | 名称 | 描述 |
---|---|---|
0x0 | c2_list | 包含“域:端口:启用_tls”的字符串,用“\x1e”字符分隔 |
0x1 | botnet | 僵尸网络名称 |
0x2 | connect_interval | 尝试连接到 C2 的间隔(以秒为单位) |
0x3 | enable_install_flag | 在主机上安装 REMCOS |
0x4 | enable_hkcu_run_persistence_flag | 启用注册表中的持久性设置 |
0x5 | enable_hklm_run_persistence_flag | 启用注册表中的持久性设置 |
0x7 | keylogger_maximum_file_size | 轮换前键盘记录数据的最大大小 |
0x8 | enable_hklm_policies_explorer_run_flag | 启用注册表中的持久性设置 |
0x9 | install_parent_directory | 安装文件夹的父目录。映射到硬编码路径的整数 |
0xA | install_filename | 安装后的 REMCOS 二进制文件的名称 |
0xC | enable_persistence_directory_and_binary_hidding_flag | 启用超级隐藏安装目录和二进制文件,并将它们设置为只读 |
0xD | enable_process_injection_flag | 启用在另一个进程中注入运行恶意软件 |
0xE | mutex | 用作恶意软件互斥锁和注册表项的字符串 |
0xF | keylogger_mode | 设置键盘记录功能。键盘记录模式,0 = 禁用,1 = 键盘记录所有内容,2 = 键盘记录特定窗口 |
0x10 | keylogger_parent_directory | 键盘记录文件夹的父目录。映射到硬编码路径的整数 |
0x11 | keylogger_filename | 键盘记录数据的文件名 |
0x12 | enable_keylogger_file_encryption_flag | 启用键盘记录数据文件的 RC4 加密 |
0x13 | enable_keylogger_file_hidding_flag | 启用键盘记录数据文件的超级隐藏 |
0x14 | enable_screenshot_flag | 启用屏幕录制功能 |
0x15 | screenshot_interval_in_minutes | 捕获每个屏幕截图的时间间隔(分钟) |
0x16 | enable_screenshot_specific_window_names_flag | 为特定窗口名称启用屏幕录制 |
0x17 | screenshot_specific_window_names | 包含用“;”字符分隔的窗口名称的字符串 |
0x18 | screenshot_specific_window_names_interval_in_seconds | 当在当前前台窗口标题中找到特定窗口名称时,捕获每个屏幕截图的时间间隔(秒) |
0x19 | screenshot_parent_directory | 屏幕截图文件夹的父目录。映射到硬编码路径的整数 |
0x1A | screenshot_folder | 屏幕截图文件夹的名称 |
0x1B | enable_screenshot_encryption_flag | 启用屏幕截图加密 |
0x23 | enable_audio_recording_flag | 启用音频录制功能 |
0x24 | audio_recording_duration_in_minutes | 每次音频录制的持续时间(秒) |
0x25 | audio_record_parent_directory | 音频录制文件夹的父目录。映射到硬编码路径的整数 |
0x26 | audio_record_folder | 音频录制文件夹的名称 |
0x27 | disable_uac_flag | 在注册表中禁用 UAC |
0x28 | logging_mode | 设置日志模式:0 = 禁用,1 = 在托盘中最小化,2 = 控制台日志记录 |
0x29 | connect_delay_in_second | 首次尝试连接到 C2 之前的延迟(以秒为单位) |
0x2A | keylogger_specific_window_names | 包含用“;”字符分隔的窗口名称的字符串 |
0x2B | enable_browser_cleaning_on_startup_flag | 在 REMCOS 启动时启用清除 Web 浏览器的 Cookie 和登录信息 |
0x2C | enable_browser_cleaning_only_for_the_first_run_flag | 仅在 Remcos 首次运行时启用 Web 浏览器清除 |
0x2D | browser_cleaning_sleep_time_in_minutes | 清除 Web 浏览器之前的休眠时间(分钟) |
0x2E | enable_uac_bypass_flag | 启用 UAC 绕过功能 |
0x30 | install_directory | 安装目录的名称 |
0x31 | keylogger_root_directory | 键盘记录目录的名称 |
0x32 | enable_watchdog_flag | 启用看门狗功能 |
0x34 | license | 许可证序列号 |
0x35 | enable_screenshot_mouse_drawing_flag | 启用在每个屏幕截图上绘制鼠标 |
0x36 | tls_raw_certificate | 启用 tls 的 C2 通信时使用的原始格式证书 |
0x37 | tls_key | 证书的密钥 |
0x38 | tls_raw_peer_certificate | 原始格式的 C2 公共证书 |
整数到路径映射
REMCOS 为其某些“文件夹”字段使用自定义映射,而不是用户提供的字符串。
我们在下面提供了映射的详细信息
值 | 路径 |
---|---|
0 | %Temp% |
1 | 当前恶意软件目录 |
2 | %SystemDrive% |
3 | %WinDir% |
4 | %WinDir%//SysWOW64 |
5 | %ProgramFiles% |
6 | %AppData% |
7 | %UserProfile% |
8 | %ProgramData% |
配置提取,内部视角
我们喜欢构建工具,并希望借此机会深入了解我们为帮助分析 REMCOS 等恶意软件系列而开发的工具类型。
我们开发了一个名为“conf-tool”的配置提取器,它不仅可以从特定样本中提取和解包配置,还可以通过修改重新打包配置。
首先,我们解包配置。
配置以 JSON 文档的形式保存到磁盘,每个字段都映射到其对应的类型。
我们将列表中的所有域替换为我们的 C2 模拟器的 IP 地址,以启动与样本的通信。
我们还启用控制台的日志记录模式 (2)
完成后,重新打包所有内容
瞧,我们有了控制台,样本尝试连接到我们的模拟器!
我们正在发布一个 REMCOS 恶意软件配置提取器,其中包括其中的一些功能。
C2 命令
在本节中,我们将列出我们已逆向的所有可由命令和控制 (C2) 执行的命令。此外,我们还提供精选命令子集的其他详细信息。
命令表
研究人员恢复了大约 95% 的命令(78 个中的 74 个)。我们在下表中提供了有关命令的信息
功能 | 名称 |
---|---|
0x1 | 心跳 |
0x2 | 禁用保持活动 |
0x3 | 列出已安装的应用程序 |
0x6 | 列出正在运行的进程 |
0x7 | 终止进程 |
0x8 | 列出进程窗口 |
0x9 | 关闭窗口 |
0xA | 最大化显示窗口 |
0xB | 恢复显示窗口 |
0xC | 通过窗口句柄和列出进程窗口来终止进程 |
0xD | 执行 Shell 命令 |
0xE | 启动管道 Shell |
0xF | 执行程序 |
0x10 | 可能上传屏幕截图 |
0x11 | 获取主机地理位置 |
0x12 | 获取离线键盘记录器信息 |
0x13 | 启动在线键盘记录器 |
0x14 | 停止在线键盘记录器 |
0x15 | 可能设置键盘记录器名称并上传数据 |
0x16 | 上传键盘记录器数据 |
0x17 | 删除键盘记录器数据,然后在两者之间有任何新内容时上传 |
0x18 | 清除浏览器 Cookie 和登录信息 |
0x1B | 启动网络摄像头模块 |
0x1C | 停止网络摄像头模块 |
0x1D | 启用音频捕获 |
0x1E | 禁用音频捕获 |
0x1F | 窃取密码 |
0x20 | 删除文件 |
0x21 | 终止自身和看门狗 |
0x22 | 卸载 |
0x23 | 重启 |
0x24 | 从 URL 更新 |
0x25 | 从 C2 更新 |
0x26 | 消息框 |
0x27 | 关闭或休眠主机 |
0x28 | 上传剪贴板数据 |
0x29 | 将剪贴板设置为特定数据 |
0x2A | 清空剪贴板,然后在两者之间有任何内容时上传 |
0x2B | 从 C2 加载 DLL |
0x2C | 从 URL 加载 DLL |
0x2D | 启动 FunFunc 模块 |
0x2F | 编辑注册表 |
0x30 | 启动聊天模块 |
0x31 | 设置僵尸网络名称 |
0x32 | 启动代理模块 |
0x34 | 管理服务 |
0x8F | 搜索文件 |
0x92 | 从 C2 设置壁纸 |
0x94 | 设置窗口文本,然后列出进程窗口 |
0x97 | 从 DXDiag 上传数据 |
0x98 | 文件管理器 |
0x99 | 列出上传的屏幕截图 |
0x9A | 使用 Nirsoft 转储浏览器历史记录 |
0x9E | 触发警报 Wav |
0x9F | 启用 C2 断开连接时的警报 |
0xA0 | 禁用 C2 断开连接时的警报 |
0xA2 | 从 C2 下载警报 Wav 并选择播放 |
0xA3 | 音频播放器 |
0xAB | 提升进程权限 |
0xAC | 启用日志控制台 |
0xAD | 显示窗口 |
0xAE | 隐藏窗口 |
0xB2 | 从C2或URL执行Shell或注入PE |
0xC5 | 注册表设置高亮值 |
0xC6 | 上传浏览器Cookie和密码 |
0xC8 | 暂停进程 |
0xC9 | 恢复进程 |
0xCA | 读取文件 |
0xCB | 写入文件 |
0xCC | 启动离线键盘记录器 |
0xCD | 停止离线键盘记录器 |
0xCE | 列出进程TCP和UDP表 |
列出已安装应用程序命令
要列出已安装的应用程序,REMCOS 会迭代 Software\Microsoft\Windows\CurrentVersion\Uninstall
注册表项。对于每个子项,它会查询以下值
显示名称
发布者
显示版本
安装位置
安装日期
卸载字符串
执行 Shell 命令
Shell 命令使用 ShellExecuteW API 执行,参数为 cmd.exe /C {命令}
。
获取主机地理位置命令
为了获取主机地理位置,REMCOS 使用 geoplugin.net API 并直接上传返回的 JSON 数据。
启动在线键盘记录器命令
在线键盘记录器采用与离线版本相同的键盘记录器结构。但是,数据不是写入磁盘,而是实时发送到 C2。
启动网络摄像头模块命令
REMCOS 使用外部模块进行网络摄像头录制。该模块是一个 DLL,必须从其 C2 接收并加载,作为命令参数的一部分。
加载模块后,您可以发送子命令来捕获和上传网络摄像头图片。
窃取密码命令
密码窃取很可能使用 3 个不同的 Nirsoft 二进制文件执行,由 "/sext" 参数标识。这些二进制文件从 C2 接收并注入到新创建的进程中。这两个元素都是命令参数的一部分。
/sext
参数指示软件将输出写入文件,每个输出文件名都是随机生成的并存储在恶意软件安装文件夹中。读取它们的内容并上传到 C2 后,它们将被删除。
还可以使用一个额外的 DLL,该 DLL 具有 FoxMailRecovery 导出。像其他二进制文件一样,该 DLL 作为命令参数的一部分从 C2 接收。顾名思义,该 DLL 很可能用于转储 FoxMail 数据
卸载命令
卸载命令将删除主机上所有与 Remcos 相关的文件和持久性注册表项。
首先,它会终止看门狗进程。
然后,它会删除所有录制文件(键盘记录、屏幕截图和音频录制)。
然后,它会删除其注册表持久性项。
最后,它通过在 %TEMP% 文件夹中创建并执行一个具有随机文件名的 Visual Basic 脚本来删除其安装文件,然后终止其进程。
以下是带有注释的生成脚本。
' Continue execution even if an error occurs
On Error Resume Next
' Create a FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
' Loop while the specified file exists
while fso.FileExists("C:\Users\Cyril\Desktop\corpus\0af76f2897158bf752b5ee258053215a6de198e8910458c02282c2d4d284add5.exe")
' Delete the specified file
fso.DeleteFile "C:\Users\Cyril\Desktop\corpus\0af76f2897158bf752b5ee258053215a6de198e8910458c02282c2d4d284add5.exe"
' End of the loop
wend
' Delete the script itself
fso.DeleteFile(Wscript.ScriptFullName)
重启命令
重启命令会终止看门狗进程,并使用生成的 Visual Basic 脚本重启 REMCOS 二进制文件。
以下是带有注释的生成脚本。
' Create a WScript.Shell object and run a command in the command prompt
' The command runs the specified .exe file
' The "0" argument means the command prompt window will not be displayed
CreateObject("WScript.Shell").Run "cmd /c ""C:\Users\Cyril\Desktop\corpus\0af76f2897158bf752b5ee258053215a6de198e8910458c02282c2d4d284add5.exe""", 0
' Create a FileSystemObject and delete the script itself
CreateObject("Scripting.FileSystemObject").DeleteFile(Wscript.ScriptFullName)
使用 Nirsoft 转储浏览器历史记录命令
与窃取密码命令类似,使用 Nirsoft 转储浏览器历史记录命令可能会使用另一个从 C2 接收的 Nirsoft 二进制文件,作为命令参数的一部分来窃取浏览器历史记录。同样,我们通过 /stext
参数来识别该二进制文件属于 Nirsoft。
提升进程权限命令
如果该进程尚未以管理员权限运行,提升进程权限命令将设置 HKCU/SOFTWARE/{mutex}/elev
注册表项,并使用与重启命令相同的方法重启恶意软件。
重启后,REMCOS 会在其初始化阶段检查 elev
值。如果该值存在,它将删除该值并利用其 UAC 绕过功能来提升其权限。
这是第三篇文章的结尾。在最后一部分中,我们将介绍使用 Elastic 技术检测和捕获 REMCOS 的策略。