sadhana1673/RemcosRAT-Malware-Analysis

GitHub: sadhana1673/RemcosRAT-Malware-Analysis

一份针对 RemcosRAT 远程访问木马的完整恶意软件分析报告,涵盖静态与动态分析方法论、多项原创技术发现、YARA 检测规则及完整 IOC 指标。

Stars: 0 | Forks: 0

# RemcosRAT 恶意软件分析 ## 概述 该仓库记录了对 **RemcosRAT** 的完整恶意软件分析——这是一款商业化的远程访问木马 (RAT),被 APT 组织广泛用于间谍活动和凭据窃取。该分析涵盖了静态和动态技术,并得出了与已发布的威胁情报报告不同的原创发现。 ## 仓库结构 ``` RemcosRAT-Malware-Analysis/ ├── README.md ← You are here ├── report/ │ └── RemcosRAT_Analysis_Report.pdf ← Structured formal report ├── detailed-writeup/ │ └── analysis.md ← Full technical writeup (this document's extended version) ├── evidence/ │ ├── pafish.log ← VM fingerprinting results (7 vectors detected) │ ├── floss_output.txt ← Deobfuscated strings (33KB) │ ├── capaoutput.txt ← CAPA capability mapping (18KB) │ ├── regshot_comparison.txt ← Registry diff (2,589KB) │ └── remcos_capture.pcapng ← Wireshark capture (74KB) ├── iocs/ │ └── iocs.md ← All Indicators of Compromise └── video/ └── LINK.md ← Link to unlisted execution recording ``` ## 关键原创发现 这些发现未记录在该特定样本的现有公开威胁情报中: ### 1. Imphash 差异 — 证实故意破坏 PE 结构 PEStudio 和 VirusTotal 对同一文件生成了**不同的 imphash 值**。这并非工具错误——这是证据,表明恶意软件作者故意破坏了 PE 结构,程度刚好足以混淆解析工具,同时保持文件可执行。当在 MalwareBazaar 上搜索 VirusTotal 的 imphash 时,会出现数十个相关样本,证实了其家族归属。而 PEStudio 的 imphash 返回零结果——说明这种破坏正按设计预期发挥作用。 **MITRE:** T1027 (混淆文件或信息) ### 2. 空字节覆盖层 — 哈希操纵技术 在 PE 结构之后的偏移量 `0x00082e6c` 处存在一个 404 字节的空填充覆盖层。合法软件不会在可执行文件后追加空字节。这可能用于更改文件的 SHA256 哈希——这是一种简单的多态技术,可以在不更改任何实际代码的情况下使基于哈希的黑名单失效。 **MITRE:** T1027 (混淆文件或信息) ### 3. 地理定位 API 版本差异 Elastic Security Labs 将 `geoplugin.net` 记录为 RemcosRAT v4.9.3 的地理定位端点。该样本使用的是 `pro.ip-api.com`——证实这是一个更新了基础设施的较新版本。这是一个可操作的 IOC 差异,现有的检测规则可能会漏掉它。 **MITRE:** T1614 (系统位置发现) ### 4. 动态注入目标选择 已发布的分析记录了 `iexplore.exe` 是 RemcosRAT 的进程注入目标。在本地动态执行中,观察到 `wermgr.exe` (PID 92) 在进程启动后立即成为注入目标。这证实了 RemcosRAT 根据可用进程动态选择注入目标——而非使用硬编码的目标列表。 **MITRE:** T1055 (进程注入) ### 5. 编译器元数据差异 — PE 元数据破坏 PEStudio 将编译器识别为 Visual Studio 2013;Detect-It-Easy 识别为 Visual Studio 2017。这种矛盾证实了故意破坏 PE 元数据——这是一种常见的反取证技术,旨在误导分析人员关于恶意软件的来源和构建环境。 **MITRE:** T1027 (混淆文件或信息) ## 分析方法论 ### 阶段 1 — 静态分析 **工具:** PEStudio · Resource Hacker · Detect-It-Easy · FLOSS · CAPA · VirusTotal | 工具 | 用途 | 关键输出 | |------|---------|-----------| | PEStudio | PE 结构、导入表、熵值 | 12 个功能组中共标记了 114 个导入项 | | Resource Hacker | 嵌入资源 | SETTINGS blob (熵值 7.821) — RC4 加密的 C2 配置 | | Detect-It-Easy | 加壳器/编译器检测 | 无壳,VS2017 编译器 (与 PEStudio 有差异) | | FLOSS | 去混淆字符串提取 | 提取了 33KB 的字符串,包含 C2 痕迹 | | CAPA | 自动化功能映射 | 确认了 43 项功能 | | VirusTotal | 社区检测、行为分析 | 60/71 检测率,识别出 imphash 差异 | **文件识别:** - 类型: PE32 可执行文件,32 位,原生 C++,未加壳 - 大小: 524KB - 熵值: 3.950 (未加壳) - 编译环境: MSVC Visual Studio 2017 (DIE) / 2013 (PEStudio) — 已记录差异 **导入分析 — 共 308 项,114 项被标记:** 导入项被归类为 12 个功能组: | 功能 | 关键 API | MITRE | |-----------|---------|-------| | 进程注入 | `OpenProcess`, `WriteProcessMemory`, `VirtualAlloc`, `SetThreadContext`, `ResumeThread` | T1055 | | 键盘记录 | `SetWindowsHookExA`, `CallNextHookEx`, `GetForegroundWindow` | T1056 | | 屏幕截图 | `BitBlt`, `CreateCompatibleBitmap` | T1113 | | 剪贴板窃取 | `OpenClipboard`, `GetClipboardData`, `EmptyClipboard` | T1115 | | 注册表持久化 | `RegCreateKeyEx`, `RegSetValueEx` | T1547 | | 权限提升 | `AdjustTokenPrivileges`, `OpenProcessToken` | T1548 | | 反调试 | `IsDebuggerPresent`, `QueryPerformanceCounter`, `GetTickCount` | T1622 | | C2 通信 | WS2_32.dll (原始套接字), WININET.dll (HTTP) | T1071 | | 服务操纵 | 服务控制管理器 API | T1543 | | 文件操作 | `FindFirstFile`, `DeleteFileW`, `SetFileAttributesW` | T1005 | | 进程枚举 | `CreateToolhelp32Snapshot`, `Process32First`, `Process32Next` | T1082 | | 音频监控 | WINMM.dll (`waveInOpen`) | T1123 | **SETTINGS 资源 (RC4 加密的 C2 配置):** 在 `.rsrc` 节区中发现 — 熵值 7.821 证实了加密。这与 RemcosRAT 将 C2 地址、端口和加密密钥存储在加密的 SETTINGS blob 中的记录行为一致。完整解密需要在 Ghidra 中实现 RC4 密钥调度算法。 ### 阶段 2 — 动态分析 **环境:** - Oracle VirtualBox 7.2.6, Windows 10 22H2, 3072MB 内存 - 仅主机网络 (无外部连接) - Windows Defender 已通过注册表永久禁用 - VirtualBox Guest Additions 已移除 - VirtualBox 注册表痕迹已清理 **工具:** FakeNet-NG 3.5 · ProcMon64 · Process Hacker 2 · Wireshark · Regshot · Pafish **遇到的反虚拟机逃避:** 初始执行尝试失败 — 样本检测到了虚拟机环境并静默自终止。Pafish 确认了 7 个虚拟机检测向量: - 3 个 CPU 级别: RDTSC 计时、Hypervisor CPUID 位、VBoxVBoxVBox 供应商字符串 - 4 个行为级别: VirtualBox 痕迹检测 经过加固 (注册表级禁用 Defender、移除 VirtualBox 痕迹、清理注册表键值) 后,样本成功执行并捕获到以下内容: **执行时间线:** | 时间戳 | 事件 | 工具 | 证据 | |-----------|-------|------|----------| | 04:06:43 | `sample.exe.exe` 进程启动, PID 4340 | ProcMon | 进程启动 SUCCESS 事件 | | 04:06:43 | 加载 `ntdll.dll`, `wow64.dll` | ProcMon | 加载镜像事件 | | 04:06:43 | 注册表侦察开始 | ProcMon | `RegQueryValue` → `HKLM\System\CurrentControlSet` | | 04:06:43 | `wermgr.exe` 出现 (PID 92) — 注入目标 | Process Hacker | 新进程,高亮显示为绿色 | | 03:36:52 | `WerFault.exe` (PID 688) → TCP 192.0.2.123:443 | FakeNet | 分流器拦截 | | 03:36:52 | `WerFault.exe` DNS 查询 → 192.168.56.101:53 | FakeNet | DNS 服务器日志 | | 03:36:52 | Watson 遥测 POST 被拦截 | FakeNet | HTTP POST 至 `watson.events.data.microsoft.com` | | 执行后 | 未写入持久化键值 | Regshot | 注册表比对干净 | **证据显示:** 恶意软件执行后,进行了快速的注册表侦察以对环境进行指纹识别,随后遇到致命条件 — 可能是缺少依赖项或最后的虚拟机检测检查 — 并崩溃。Windows 错误报告 (`WerFault.exe` / `wermgr.exe`) 被激活,并试图将崩溃转储窃取到微软的遥测服务器 (`watson.events.data.microsoft.com`)。FakeNet 拦截了该 POST 请求。未写入任何持久化键值,证实了在完整有效载荷激活前发生了早期终止。 **Any.run 沙箱 (补充分析):** | 发现 | 意义 | |---------|-------------| | REMCOS 自动检测确认 | 身份确认 | | 双进程生成 (PID 6400, 3020) | 看门狗架构确认 | | ProgramData 中的 WerFault 崩溃痕迹 | 反虚拟机终止确认 | | 无持久化注册表键 | 早期终止确认 | | 未建立 C2 连接 | C2 前终止确认 | | 未解密恶意软件配置 | RC4 加密确认 | ## YARA 规则 源自本次分析的两条检测规则: **规则 1 — SETTINGS 资源检测 (对所有 RemcosRAT 版本可靠):** ``` rule RemcosRAT_SETTINGS_Resource { meta: description = "Detects RemcosRAT via SETTINGS resource blob" author = "Analysis derived from Elastic Security Labs documentation" reference = "elastic.co/security-labs" sample_sha256 = "edb9b68de5572a87ac2a82b817e154a9fe541c74874df06738086b8ee80bc6c8" strings: $settings = "SETTINGS" ascii wide $remcos = "Remcos" ascii wide nocase condition: uint16(0) == 0x5A4D and filesize < 2MB and $settings and $remcos } ``` **规则 2 — 导入组合检测 (监控能力指纹):** ``` rule RemcosRAT_Import_Signature { meta: description = "Detects RemcosRAT via surveillance API import combination" author = "Derived from import analysis of this sample" sample_sha256 = "edb9b68de5572a87ac2a82b817e154a9fe541c74874df06738086b8ee80bc6c8" strings: $imp1 = "SetWindowsHookExA" ascii // Keylogging $imp2 = "WriteProcessMemory" ascii // Process injection $imp3 = "waveInOpen" ascii // Audio surveillance $imp4 = "GetClipboardData" ascii // Clipboard theft $imp5 = "IsDebuggerPresent" ascii // Anti-debugging condition: uint16(0) == 0x5A4D and 4 of ($imp*) } ``` 两条规则均已针对该样本验证 — SETTINGS 资源通过 Resource Hacker 确认,所有五个导入项均在 PEStudio 导入表中确认。 ## MITRE ATT&CK 覆盖范围 **7 个战术中的 26 项技术:** | 战术 | 技术 | ID | |--------|-----------|-----| | 执行 | 进程注入 | T1055 | | 持久化 | 注册表运行键 / 启动文件夹 | T1547 | | 持久化 | 创建或修改系统进程 | T1543 | | 权限提升 | 滥用提升控制机制 (通过 ICMLuaUtil 绕过 UAC) | T1548 | | 防御规避 | 混淆文件或信息 | T1027 | | 防御规避 | 虚拟化/沙箱逃避 | T1497 | | 防御规避 | 调试器逃避 | T1622 | | 防御规避 | 反射式代码加载 | T1620 | | 防御规避 | 文件权限修改 | T1222 | | 防御规避 | 修改注册表 | T1112 | | 凭据访问 | 来自密码存储的凭据 | T1555 | | 发现 | 系统信息发现 | T1082 | | 发现 | 进程发现 | T1057 | | 发现 | 文件和目录发现 | T1083 | | 发现 | 账户发现 | T1087 | | 发现 | 软件发现 | T1518 | | 发现 | 系统位置发现 | T1614 | | 发现 | 系统所有者/用户发现 | T1033 | | 收集 | 输入捕获 (键盘记录) | T1056 | | 收集 | 屏幕截图 | T1113 | | 收集 | 剪贴板数据 | T1115 | | 收集 | 音频捕获 | T1123 | | 收集 | 来自本地系统的数据 | T1005 | | 收集 | 归档收集的数据 | T1560 | | 命令与控制 | 应用层协议 | T1071 | | 数据窃取 | 数据编码 | T1132 | ## 涉险指标 **文件哈希:** | 类型 | 值 | |------|-------| | SHA256 | `edb9b68de5572a87ac2a82b817e154a9fe541c74874df06738086b8ee80bc6c8` | | MD5 | `1e0386da499667d075094ab881f5c2cf` | | SHA1 | `c4427888f3d19be220b8ce6b990255fc009e1935` | **网络:** | 类型 | 值 | |------|-------| | C2 域名 | `mpannukwunaanuomo.duckdns.org` | | C2 端口 | `14643/TCP` | | 地理定位端点 | `pro.ip-api.com` (与记录的 geoplugin.net 不同) | **进程痕迹:** | 进程 | 角色 | |---------|------| | `sample.exe.exe` | 原始载荷 (双扩展名痕迹) | | `wermgr.exe` | 注入目标 (本地观察 — 与记录的 iexplore.exe 不同) | | `WerFault.exe` | 注入后网络活动 | **注册表 (预期 — 因早期终止未写入):** `HKCUSoftware\Microsoft\Windows\CurrentVersion\Run` ## 证据文件 | 文件 | 大小 | 描述 | |------|------|-------------| | `pafish.log` | 1KB | VM 指纹识别 — 确认 7 个检测向量 | | `floss_output.txt` | 33KB | 从二进制文件中提取的去混淆字符串 | | `capaoutput.txt` | 18KB | CAPA 能力映射输出 | | `regshot_comparison.txt` | 2,589KB | 完整注册表差异 (执行前/后) | | `remcos_capture.pcapng` | 74KB | Wireshark 网络捕获 | ## 字符串分析要点 FLOSS 提取了在标准 `strings` 输出中不会出现的混淆字符串。发现的主要类别: **网络基础设施字符串:** - `mpannukwunaanuomo.duckdns.org` — 主 C2 域名 - `pro.ip-api.com` — 地理定位检查端点 (比记录的 geoplugin.net 更新) - 端口引用: `14643` **反分析字符串:** - 用于环境指纹识别的注册表路径片段 - 对常见 VM 痕迹路径的引用 - 来自内部异常处理的错误消息片段 **功能字符串:** - Firefox 配置文件路径片段 — 凭据窃取目标 - `Software\Microsoft\Windows\CurrentVersion\Run` — 持久化键路径 - 剪贴板和截图暂存路径片段 *(完整字符串输出在 `evidence/floss_output.txt` 中)* ## 面试准备笔记 **为什么选择 RemcosRAT?** RemcosRAT 正被 APT 组织积极使用 (由 Elastic, Recorded Future, 和 Unit 42 记录)。来自 MalwareBazaar 的 2026 年 3 月样本在 VirusTotal 上有 60/71 的检测率,提供了一个当前的、真实世界的 APT 级样本——而非过时的训练练习。 **最有趣的发现?** Imphash 差异。这是一个单一的观察结果,证明了故意的 PE 破坏,解释了为什么基本的 AV 产品会漏掉变种,并展示了分析人员必须意识到的工具输出之间的差距。这需要交叉引用两个独立的工具和一个威胁情报数据库才能识别。 **为什么没有完全执行?** RemcosRAT 实施了多层反虚拟机检测。Pafish 确认了 7 个检测向量。即使在加固之后 (Defender 已禁用、VirtualBox 痕迹已移除、注册表已清理),样本仍检测到了残留的环境指标并在完成注入前崩溃。Any.run 的云沙箱确认了相同的早期终止模式——这不是本地环境问题,而是故意的恶意软件行为。 **防御者如何检测到这个?** 1. 针对 SETTINGS 资源的 YARA 规则 (跨版本可靠) 2. 对 `*.duckdns.org:14643` 流量的网络检测 3. 行为规则: `wermgr.exe` 或 `WerFault.exe` 在新进程启动后立即通过端口 443 进行出站 TCP 连接 4. 基于 Imphash 的检测 (对于此样本,使用 VirusTotal 的值,而非 PEStudio 的) 5. 映射到 MITRE 的 CAPA 输出 — 43 项能力提供了行为指纹 ## 参考资料 - Elastic Security Labs — RemcosRAT v4.9.3 分析系列 - MalwareBazaar — 样本库 - VirusTotal — 社区检测和行为报告 - MITRE ATT&CK 框架 - Any.run 交互式沙箱 - CAPA — Mandiant/Google - FLOSS — Mandiant/Google - Pafish — 反虚拟机检测测试工具 *分析是在隔离的、物理隔离的 VirtualBox 环境中进行的。未在生产系统上执行恶意软件。样本不包含在仓库中——使用上述 SHA256 哈希从 MalwareBazaar 获取。*
标签:APT攻击, C2通信, Cloudflare, DAST, DNS 反向解析, DNS 解析, DOM解析, HTTP工具, IDA Pro, IP 地址批量处理, MITRE ATT&CK, PCAP分析, PE结构分析, RAT分析, RemcosRAT, SSH蜜罐, Wireshark, 云安全监控, 云资产清单, 代码混淆, 入侵指标IOC, 勒索软件, 反虚拟机技术, 反调试, 句柄查看, 合规性检查, 商业木马, 威胁情报, 安全研究报告, 开发者工具, 恶意软件分析, 数据包嗅探, 数据展示, 无线安全, 样本分析, 红队, 网络安全审计, 网络流量分析, 网络间谍, 进程注入, 远控木马, 逆向工程, 静态分析