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, 勒索软件, 反虚拟机技术, 反调试, 句柄查看, 合规性检查, 商业木马, 威胁情报, 安全研究报告, 开发者工具, 恶意软件分析, 数据包嗅探, 数据展示, 无线安全, 样本分析, 红队, 网络安全审计, 网络流量分析, 网络间谍, 进程注入, 远控木马, 逆向工程, 静态分析