AssyaELM/malware-analysis-cerber-lab
GitHub: AssyaELM/malware-analysis-cerber-lab
这是一个针对Cerber勒索软件的完整恶意软件分析实验室,提供从静态逆向到动态行为捕获的实践方法,帮助安全人员深入理解威胁并提取防御指标。
Stars: 0 | Forks: 0
# 恶意软件分析实验室 — Cerber 勒索软件
### 使用沙箱的静态与动态分析 | VMware 上的 FlareVM
## 目录
1. [什么是 Cerber?](#what-is-cerber)
2. [目标](#objectives)
3. [实验室架构](#lab-architecture)
4. [使用的工具](#tools-used)
5. [环境设置](#environment-setup)
6. [静态分析](#static-analysis)
- [初步分类](#initial-triage)
- [使用 Ghidra 进行深入分析](#deep-analysis-with-ghidra)
- [IOC 提取与 YARA 规则](#ioc-extraction--yara-rule)
7. [沙箱中的动态分析](#dynamic-analysis-in-sandbox)
- [沙箱准备](#sandbox-preparation)
- [受控执行](#controlled-execution)
- [捕获分析](#capture-analysis)
- [关联与 MITRE ATT&CK 映射](#correlation--mitre-attck-mapping)
8. [IOC 摘要](#ioc-summary)
9. [YARA 检测规则](#yara-detection-rule)
10. [MITRE ATT&CK 完整映射](#mitre-attck-full-mapping)
11. [反思与局限性](#reflections--limitations)
12. [结论](#conclusion)
## 什么是 Cerber?
Cerber 是一个著名的勒索软件即服务 (RaaS) 家族,首次发现于 2016 年。它专门针对 Windows 系统,以其技术复杂性和去中心化的犯罪商业模式而闻名,附属机构可以租用勒索软件基础设施来开展自己的攻击活动。
从技术角度来看,Cerber 是一个使用 Microsoft Visual C/C++ (MSVC 2008) 编译的 PE32 可执行文件。它没有加壳,全局熵值约为 5.09,这意味着其代码可以直接通过反汇编工具读取,无需任何脱壳步骤。尽管如此,它在运行时使用了多种混淆技术——特别是栈字符串构造——以在静态分析中隐藏其意图。
| 属性 | 值 |
|---|---|
| **类型** | 勒索软件 (RaaS) |
| **家族** | Cerber |
| **平台** | Windows (PE32) |
| **编译器** | Microsoft Visual C/C++ (MSVC 2008) |
| **加壳** | 未加壳 (熵 ~5.09) |
| **加密文件扩展名** | `.aa78` (动态生成) |
| **风险等级** | 🔴 严重 |
一旦执行,Cerber 会按顺序执行一系列破坏性操作。它首先识别受害者的环境——检查键盘语言环境以避免感染独联体/俄语国家的机器(一种地理围栏机制)。然后,它将自身复制到 `%AppData%` 并写入一个注册表 Run 键以在重启后生存。在开始加密之前,它使用 `vssadmin` 删除 Windows 卷影副本,以阻止任何本地恢复。接着,它递归扫描文件系统并加密用户文件,使用随机的 4 字符扩展名(本样本中为 `.aa78`)重命名它们。一个勒索信被投放到每个受影响的目录中,并作为 HTML 应用程序显示。最后,原始二进制文件自行删除以阻碍取证调查。
## 目标
本实验室的主要目标是在受控和安全的环境中培养对恶意软件分析技术的实践能力。工作涵盖了对一个真实世界勒索软件样本的完整分析生命周期,从二进制文件的初步观察到对其行为和结构的完全理解。
更具体地说,本实验室涵盖了使用哈希、熵和字符串提取进行初步分类;使用 Ghidra 和 PEStudio 进行静态分析以理解代码结构和意图;配置完全隔离的沙箱环境;以受控方式执行恶意软件并捕获其行为;分析网络流量以及文件、注册表和进程方面的系统更改;提取威胁指标 (IOC) 并编写 YARA 检测规则;将观察到的行为映射到 MITRE ATT&CK 框架;以及将静态和动态发现关联成一个统一的威胁视图。
## 实验室架构
整个实验室在 VMware Workstation 中离线运行。虚拟机被放置在仅主机模式的网络中,没有通往互联网的路径。选择 FlareVM 作为分析环境,因为它是由 Mandiant(前身为 FireEye)预先配置的 Windows 10 发行版,已经安装了所有主要的恶意软件分析工具。这消除了手动设置的需要,并确保了一致、可复现的环境。
## 使用的工具
### 静态分析工具
| 工具 | 用途 | 来源 |
|---|---|---|
| Ghidra | 逆向工程 / 反汇编 / 反编译 | https://ghidra-sre.org/ |
| PEStudio | PE 文件分析器(导入表、节、字符串、指标) | https://www.winitor.com/ |
| Detect It Easy (DIE) | 加壳器 / 编译器检测 | https://github.com/horsicq/DIE-engine |
| HxD | 十六进制编辑器——检查原始字节和魔术数字 | https://mh-nexus.de/en/hxd/ |
| YARA | 模式匹配检测规则引擎 | https://github.com/VirusTotal/yara |
### 动态分析工具
| 工具 | 用途 | 来源 |
|---|---|---|
| Process Monitor (Procmon) | 实时文件、注册表和进程监控 | https://learn.microsoft.com/sysinternals/ |
| Process Explorer | 进程树、DLL 和句柄检查 | https://learn.microsoft.com/sysinternals/ |
| Autoruns | 持久性和启动项分析 | https://learn.microsoft.com/sysinternals/ |
| FakeNet-NG | 离线网络模拟(DNS、HTTP、HTTPS、SMTP 拦截) | https://github.com/mandiant/flare-fakenet-ng |
| Wireshark | 网络流量捕获与分析 | https://www.wireshark.org/ |
| Regshot | 执行前后的注册表快照 | https://sourceforge.net/projects/regshot/ |
| API Monitor | Windows API 调用监控 | http://www.rohitab.com/apimonitor |
## 环境设置
### VMware 安装
1. 从官方网站下载 VMware Workstation:
https://www.vmware.com/products/workstation-pro.html
2. 使用默认设置运行安装程序
3. 如果需要,重新启动系统
4. 启动 VMware 并验证安装正确
### Windows 10
| 设置 | 值 |
|---|---|
| RAM | 4096 MB (最低 4 GB) |
| CPU | 最低 2 核 |
| 磁盘 | 60 GB (动态分配) |
| 操作系统 | Windows 10 Enterprise |
下载 Windows 10 评估版 ISO:
https://www.microsoft.com/evalcenter/evaluate-windows-10-enterprise
### 安装 FlareVM
FlareVM 是使用官方 Mandiant 安装脚本在 Windows 10 虚拟机内安装的。该脚本从提升权限的 PowerShell 终端运行,并自动处理所有工具的安装。整个过程需要 1 到 2 小时。完成后,桌面壁纸会更改,以确认所有工具——Ghidra、PEStudio、x64dbg、YARA、Sysinternals Suite、FakeNet-NG、Wireshark、DIE、HxD、Regshot——已安装并准备就绪。
```
(New-Object net.webclient).DownloadFile(
'https://raw.githubusercontent.com/mandiant/flare-vm/main/install.ps1',
"$env:USERPROFILE\Desktop\install.ps1"
)
Set-ExecutionPolicy Unrestricted -Force
& "$env:USERPROFILE\Desktop\install.ps1"
```

### 禁用 Windows Defender
在处理恶意软件 cerber 之前,必须禁用 Windows Defender,否则它会在解压缩过程中自动隔离或删除文件。由于虚拟机完全隔离于任何真实网络,这样做是安全的。
```
Set-MpPreference -DisableRealtimeMonitoring $true
```

即使执行此命令后,Windows 在解压 ZIP 文件时仍然会删除 cerber。为永久解决此问题,通过 Windows 安全中心设置手动添加了指向 `C:\Malware` 的文件夹排除项。此后,cerber 文件保持完整。
```
Windows Security → Virus & Threat Protection →
Manage Settings → Add or Remove Exclusions →
Add Folder → C:\Malware
```

### 创建干净快照
在开始任何分析之前,为虚拟机创建一个干净的快照:
```
VMware Workstation → Right-click VM →
Snapshot → Take Snapshot →
Name: "FlareVM_Clean"
```
在每次新的动态分析会话之前恢复此快照。

### 网络隔离和静态 IP
在 VMware 中,虚拟机的网络适配器被设置为仅主机模式,创建了一个没有通往互联网路由的私有网段。然后通过 PowerShell 分配了一个静态 IP 地址,以便 FakeNet-NG 和其他网络工具可以在隔离网段内正常工作。
```
New-NetIPAddress -InterfaceAlias "Ethernet0" `
-IPAddress 192.168.56.10 `
-PrefixLength 24
```

打开浏览器并尝试访问任何网站。所有连接均因 DNS 错误而失败,确认不存在互联网路径。

### 虚拟机加固
为防止恶意软件意外泄漏到主机,已确认 VMware 的共享文件夹处于禁用状态,并且“来宾隔离”设置已配置为禁用拖放和双向剪贴板。即使是意外的复制粘贴操作也无法将恶意内容转移出虚拟机。
| 功能 | 状态 | 如果启用的风险 |
|---|---|---|
| 共享文件夹 | ❌ 禁用 | 恶意软件可能逃逸到主机 |
| 拖放 | ❌ 禁用 | 意外文件传输 |
| 双向剪贴板 | ❌ 禁用 | 数据泄漏 |
| 互联网 (NAT) | ❌ 禁用 | 真实的 C2 连接 |


## 静态分析
静态分析意味着在不执行恶意软件的情况下检查它。目标是仅通过检查二进制文件来了解其结构、能力和意图。
### 初步分类
#### 任务 1:计算文件哈希
第一步是计算文件的加密哈希值。这些哈希值作为恶意软件的唯一指纹,允许验证文件完整性并与 VirusTotal 等威胁情报数据库进行交叉引用。
```
Get-FileHash -Algorithm SHA256 .\cerber.exe
Get-FileHash -Algorithm MD5 .\cerber.exe
Get-FileHash -Algorithm SHA1 .\cerber.exe
```
| 算法 | 哈希值 |
|---|---|
| MD5 | `8B6BC16FD137C09A08802BBE1887D670` |
| SHA1 | `C69A0F6C6F809C01DB92CA658FCF1B643391A2B7` |
| SHA256 | `E67834D1E8B38EC5864CFA1010140AEABA8F1908A6E269E6A94C90FCBFE56678` |

#### 任务 2:使用 Detect It Easy (DIE) 进行加壳检测
打开 `die.exe` 并将 `cerber.exe` 拖放进去。
| 字段 | 结果 |
|---|---|
| **格式** | PE32 (32 位可执行文件) |
| **编译器** | Microsoft Visual C/C++ |
| **链接器** | Visual Studio 2008 |
| **加壳器** | ❌ 未加壳 |
| **熵** | ~5.09 (< 7.0 = 未压缩) |


熵值**高于 7.0** 通常表示文件已被加壳或加密。Cerber 的熵值约为 5.09,意味着代码可以直接读取——在逆向工程之前无需脱壳步骤。
#### 任务 3:PEStudio 分析
在 PEStudio 中打开 `cerber.exe` 并检查每个选项卡:
**元数据**
| 字段 | 值 |
|---|---|
| 入口点 | `0x0004F4E0` |
| 编译时间戳 | 2017 年 5 月 |
| 架构 | x86 (32 位) |
**PE 节**
| 节 | 熵 | 备注 |
|---|---|---|
| `.text` | 6.093 | 可执行代码——可读 |
| `.rdata` | — | 只读数据(字符串、常量) |
| `.data` | — | 全局变量 |
| `.rsrc` | 6.553 | 资源(此处存储勒索信 HTML) |

**可疑导入(由 PEStudio 标记)**

**字符串亮点**(发现 7,000+ 个字符串):
- `!This program cannot be run in DOS mode`(DOS 桩代码——确认 PE 结构)
- `http://schemas.microsoft.com/SMI/2005/WindowsSettings`(Microsoft 模式 URL)
- 对注册表路径、文件扩展名和加密例程的引用

#### 任务 4:使用 HxD 进行十六进制分析
1. 在 HxD 中打开 `cerber.exe`

2. 验证偏移 `0x0000` 处的**魔术数字**:
```
Offset 00 01 02 03 ...
00000000 4D 5A ... → "MZ" = Valid Windows PE file ✅
```
3. 搜索 (`Ctrl+F`) 模式:
- `http://` → 找到 URL 引用(C2 指标)
- `cmd.exe` → 命令执行
- `vssadmin` → 删除卷影副本的命令
### 使用 Ghidra 进行深入分析
#### 任务 1:创建 Ghidra 项目
1. 启动 Ghidra (`ghidraRun.bat`)
2. `File → New Project → Non-Shared Project`
3. 命名项目:`TP_Analyse_Cerber`

4. `File → Import File` → 选择 `cerber.exe`
5. 双击文件 → 接受自动分析 → **等待完成**
**导入摘要:**
| 字段 | 值 |
|---|---|
| 格式 | PE (Portable Executable) |
| 架构 | x86 / 32 位 / 小端序 |
| 识别的函数 | 154 |
| 符号 | 337 |

#### 任务 2:Ghidra 界面
| 面板 | 用途 |
|---|---|
| **列表** (中央) | 原始反汇编——汇编指令 |
| **反编译器** (右侧) | 伪 C 反编译代码 |
| **符号树** (左侧) | 函数、导入、导出、标签 |
| **程序树** (左侧) | PE 节结构 |

**常用快捷键:**
| 键 | 操作 |
|---|---|
| `G` | 转到地址 |
| `L` | 重命名函数/变量 |
| `;` | 添加注释 |
| `Ctrl+Shift+F` | 搜索字符串 |
| `X` | 交叉引用 (xrefs) |
#### 任务 3:代码分析
**入口点分析**
导航到 `Symbol Tree → Functions → entry` (重命名为 `MAIN_LOADER`)。
从反编译的伪代码中得到的关键观察:
```
void __cdecl entry(undefined4 param_1) {
// Step 1: Fingerprinting — checks keyboard locale
GetKBCodePage();
// Step 2: Constructs strings on the stack (obfuscation technique)
// Characters are pushed byte-by-byte: 0x69='i', 0x6e='n', 0x74='t'...
DAT_0048c0c8 = 0x69; // 'i'
_DAT_0048c0ca = 0x6e; // 'n'
_DAT_0048c0cc = 0x74; // 't'
// ...builds "interface\{...}" — likely a GUID or mutex name
// Step 3: Registry access via RegOpenKeyExW
DAT_0048c1a0 = RegOpenKeyExW_exref;
do {
iVar1 = (*DAT_0048c1a0)(DAT_0048c0b0, &DAT_0048c0c8, 0, 0x20019, &DAT_0048c1bc);
} while (iVar1 != 0); // Retries until it can open the registry key
// Step 4: Calls internal functions (encryption prep, victim ID generation)
DAT_0048c184 = FUN_0044f2a0();
DAT_0048c144 = FUN_0044f250();
DAT_0048c188 = FUN_0044f810();
}
```

**执行流程(逐步):**
```
1. Fingerprinting → GetKBCodePage() — identify victim locale
2. Config Decryption → Stack strings built byte-by-byte (anti-static evasion)
3. Victim ID Generation → Hardware-based unique ID created
4. Persistence → RegOpenKeyExW / RegSetValueExW → HKCU\...\Run
5. Encryption Routine → File enumeration + CryptEncrypt loop
6. Ransom Note Display → mshta.exe opens .hta file
7. Self-Deletion → Original binary removed
```
**识别的反分析技术:**
| 技术 | 证据 |
|---|---|
| **栈字符串** | 在内存中逐字符构建字符串以绕过字符串搜索工具 |
| **动态 API 解析** | 使用 `GetProcAddress` 隐藏敏感导入 |
| **反调试** | 调用 `IsDebuggerPresent` / `GetTickCount` |
| **地理围栏** | `GetKBCodePage()` 检查语言环境——跳过独联体国家 |
| **反虚拟机** | 检查与虚拟机相关的工件和工具存在性 |
### IOC 提取与 YARA 规则
#### 任务 1:提取的 IOC
| 类别 | 指标 | 来源 |
|---|---|---|
| **API** | `VirtualAlloc` | PE 导入表 |
| **API** | `CryptEncrypt`, `CryptGenKey` | PE 导入表 |
| **API** | `RegSetValueExW`, `RegOpenKeyExW` | PE 导入表 |
| **API** | `CreateProcessW`, `CreateThread` | PE 导入表 |
| **API** | `InternetOpenA`, `HttpSendRequestA` | PE 导入表 |
| **字符串** | `interfe\{` | Ghidra — 栈字符串片段 |
| **字符串** | `11111kicu4p3050f55f298b5211cf2bb82200aa00bdce0bf` | Ghidra — 可能的受害者 ID 种子 |
| **注册表** | `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` | 代码分析 |
| **进程** | `vssadmin.exe delete shadows` | 代码分析 |
| **进程** | `mshta.exe` | 代码分析 — HTA 勒索信 |
#### 任务 2:YARA 检测规则
创建文件 `tp_detection.yar`:
```
rule Cerber_Ransomware_Detection {
meta:
author = "Assya"
description = "Detects Cerber ransomware sample analyzed"
date = "2025-5-18"
hash_sha256 = "E67834D1E8B38EC5864CFA1010140AEABA8F1908A6E269E6A94C90FCBFE56678"
reference = "Cybersecurity Lab"
threat_level = "Critical"
strings:
$str1 = "interfe\\{" ascii
$api_crypt1 = "CryptEncrypt" ascii
$api_crypt2 = "CryptGenKey" ascii
$api_reg1 = "RegSetValueExW" ascii
$api_reg2 = "RegOpenKeyExW" ascii
$api_mem = "VirtualAlloc" ascii
$api_net = "InternetOpenA" ascii
$api_anti_dbg = "IsDebuggerPresent" ascii
$ransom_note = "_READ_THIS_FILE_" ascii wide
condition:
uint16(0) == 0x5A4D // Valid PE file (MZ header)
and filesize < 500KB // File size constraint
and ($str1 or $ransom_note) // At least one unique string
and 3 of ($api_*) // At least 3 suspicious APIs
}
```
**测试规则:**
```
# 针对样本进行测试
yara tp_detection.yar C:\Malware\Samples\cerber.exe
# 递归扫描
yara -r tp_detection.yar C:\Malware\Samples\
```
**如何改进规则(减少误报):**
- 为字符串匹配添加精确的字节偏移 (`$str1 at 0x...`)
- 包含 PE 节熵检查 (`pe.sections[0].entropy > 6.0`)
- 添加从 Ghidra 中提取的更多唯一字符串
- 使用更严格的逻辑组合 API + 字符串 + 行为条件
## 沙箱中的动态分析
动态分析意味着执行恶意软件并观察其实际行为。沙箱的配置使得每个系统操作和每个网络请求都被捕获和记录。
## **开始前:恢复干净快照**
### 沙箱准备
在运行恶意软件**之前**配置所有监控工具:
#### 步骤 1:禁用 Windows Defender
```
Set-MpPreference -DisableRealtimeMonitoring $true
```

#### 步骤 2:Regshot(第 1 次快照)
1. 打开 Regshot
2. 勾选 **Scan dir1** → 设置路径为 `C:\`
3. 点击 **1st shot** → **Shot** → 等待完成
4. 结果:记录了约 514,511 个注册表项和约 526,587 个文件

#### 步骤 3:Process Monitor (Procmon)
1. 以管理员身份启动 `Procmon64.exe`

2. 配置过滤器:`Filter → Process Name → is → cerber.exe → Include`
3. 同时排除:`Procmon64.exe`, `Procexp64.exe`
4. 开始捕获:`Ctrl+E`

窗口在 cerber.exe 运行前将是**空的**——这是预期行为。

#### 步骤 4:FakeNet-NG(离线网络模拟)
```
# 以管理员身份
cd C:\Tools\FakeNet-NG
fakenet.exe
```

FakeNet-NG 拦截**所有出站流量**并模拟 DNS、HTTP、HTTPS、SMTP 响应。恶意软件会“相信”它已连接到互联网并暴露其 C2 通信——而实际上没有建立任何真实连接。
#### 步骤 5:Wireshark
1. 启动 Wireshark
2. 选择活动的网络接口
3. 开始数据包捕获

### 受控执行
#### 步骤 1:执行样本
```
Right-click cerber.exe → Run as Administrator
```

以管理员身份运行是故意的——勒索软件通常寻求提升权限以禁用 VSS(卷影副本)并访问所有用户文件。
#### 步骤 2:观察行为(5–10 分钟)
**执行后立即观察:**
| 时间 | 事件 |
|---|---|
| T+0s | `cerber.exe` 启动,立即开始加载系统 DLL (`ntdll.dll`, `kernel32.dll`) |
| T+2s | 开始注册表枚举——读取系统配置键 |
| T+5s | 文件系统扫描开始——扫描 `AppData\Local`, `Documents`, `Desktop` |
| T+10s | 磁盘活动激增——文件加密开始 |
| T+30s | 勒索信窗口出现(通过 `mshta.exe` 的 HTA) |
| T+60s | 系统变得迟钝——用户文件加密接近完成 |
| T+90s | `cerber.exe` 从 `C:\Malware\Samples\` 自行删除 |
**视觉影响:**
- 出现一个全屏 HTA 窗口:“您的文档、照片、数据库和其他重要文件已被加密!”
- 加密文件被重命名:例如,`document.docx` → `ioxhNOOHJy.aa78`
- `_READ_THIS_FILE_.txt` 和 `_READ_THIS_FILE_.hta` 被投放到每个目录中
- 壁纸更改为勒索通知
#### 步骤 3 — Process Explorer 观察
**恶意软件创建的进程树:**
```
cerber.exe (PID: 8096)
├── vssadmin.exe "delete shadows /all /quiet" ← Destroys backups
├── icacls.exe ← Modifies file permissions
├── cmd.exe ← Command execution
└── mshta.exe "_READ_THIS_FILE_.hta" ← Displays ransom note
```
**加载的 DLL:**
- `ntdll.dll` — 核心系统函数
- `kernel32.dll` — 进程/文件/内存管理
- `advapi32.dll` — 注册表和加密 API
- `wininet.dll` — 互联网连接


#### 步骤 4 — Regshot(第 2 次快照与比较)
1. 点击 **2nd shot** → **Shot**

2. 点击 **Compare** → 保存 HTML 报告
**结果:**
| 更改类型 | 数量 |
|---|---|
| 添加的注册表项 | 152 |
| 添加的文件 | 14,593 |
| 删除的文件 | 12,959 |
| 添加的文件夹 | 51 |
| **总更改** | **34,102** |

#### 步骤 5 — 保存所有日志
```
# Process Monitor: 文件 → 保存 → Capture_Cerber.pml
# Wireshark: 文件 → 另存为 → Capture_Cerber.pcapng
# Regshot: 已保存为 HTML 报告
# FakeNet-NG: Ctrl+C → 日志保存在 FakeNet-NG 文件夹中
```
### 捕获分析
#### 任务 1:Process Monitor 分析
应用过滤器并分析:
**过滤器:`Operation is CreateFile`**
- Cerber 在加密之前递归打开用户目录中的每个文件
**过滤器:`Operation is RegSetValue`**
- 关键持久性条目:`HKCU\Software\Microsoft\Windows\CurrentVersion\Run`
- 值名称:随机 GUID 字符串
- 值数据:指向 `%AppData%\Roaming\` 中恶意软件副本的路径
**过滤器:`Operation is Process Create`**
- `vssadmin.exe delete shadows /all /quiet` — 消除恢复点
- `mshta.exe` — 执行 HTML 勒索信

#### 任务 2:网络分析(Wireshark + FakeNet-NG)
**使用的 Wireshark 过滤器:**
```
dns # DNS queries
http # HTTP connections
nbns # NetBIOS Name Service
tcp.port != 80 and tcp.port != 443 # Non-standard ports
icmp # ICMP (failed C2 connections)
```





**观察到的网络活动:**
| 协议 | 目标 | 目的 |
|---|---|---|
| **DNS** | `ctldl.windowsupdate.com` | 伪装的互联网连接测试 |
| **DNS** | `ocsp.digicert.com`, `crl.digicert.com` | 证书验证 |
| **NBNS** | `192.168.183.255` (广播) | AD 域控制器发现 |
| **LDAP** | 本地域 | 寻找要加密的文件共享 |
| **SSDP** | `239.255.255.250` (多播) | UPnP/NAS 设备发现 |
| **ICMP** | 多个公共 IP | 失败的 C2 连接尝试(硬编码 IP) |
| **HTTP** | `192.0.2.123` (FakeNet) | 模拟的 C2 通信 |
**关键发现:** Cerber 使用 `ctldl.windowsupdate.com` 在暴露 C2 域名之前测试真实的互联网连接——这是一种常见的规避技术。我们的仅主机设置阻止了所有真实的出站流量。
**FakeNet-NG 日志分析:**
- 所有 DNS 查询被拦截并以 `192.0.2.123` 响应
- 捕获到包含受害者遥测数据(机器 ID、操作系统版本)的 HTTP POST 请求
- 连 FakeNet 的日志文件也被重命名为 `.aa78` — Cerber 针对**所有**文件,包括取证证据
#### 任务 3:Regshot 分析
**确认的持久性键:**
```
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
→ Value: {4F8EBC11-A123-...} (random GUID)
→ Data: C:\Users\Administrator\AppData\Roaming\{GUID}\cerber2.exe
```
**投放的文件:**
- `_R_E_A_D__T_H_I_S___[ID]_.txt` — 勒索信(纯文本)
- `_R_E_A_D__T_H_I_S___[ID]_.hta` — 勒索信(带 Tor 说明的 HTML)
- `C:\Users\Administrator\AppData\Roaming\[random]\cerber2.exe` — 持久性副本





## MITRE ATT&CK 完整映射
| 战术 | 技术 | ID | 证据 |
|---|---|---|---|
| **初始访问** | 用户执行 | T1204.002 | 手动执行 `cerber.exe` |
| **执行** | 命令和脚本解释器 | T1059 | `mshta.exe` 执行 HTA 勒索信 |
| **持久性** | 启动或登录自动执行:注册表运行键 | T1547.001 | `HKCU\...\CurrentVersion\Run` 被修改 |
| **防御规避** | 混淆文件或信息 | T1027 | 栈字符串、动态 API 解析、类似加壳的行为 |
| **防御规避** | 主机上的指标移除 | T1070 | 执行后原始二进制文件自行删除 |
| **发现** | 系统信息发现 | T1082 | `GetKBCodePage()`,系统信息枚举 |
| **发现** | 网络服务扫描 | T1046 | LDAP/NBNS 扫描域资源 |
| **C2** | 应用层协议:Web 协议 | T1071.001 | 通过 FakeNet 的 HTTP/DNS 通信 |
| **渗出** | 通过 C2 通道渗出 | T1041 | 通过 HTTP POST 发送受害者 ID 和统计信息 |
| **影响** | 为影响而加密数据 | T1486 | 所有用户文件使用 `.aa78` 扩展名加密 |
| **影响** | 抑制系统恢复 | T1490 | `vssadmin delete shadows /all /quiet` |

## IOC 摘要
```
{
"sample": {
"name": "cerber.exe",
"type": "PE32 Ransomware",
"family": "Cerber",
"md5": "REPLACE_WITH_ACTUAL",
"sha1": "REPLACE_WITH_ACTUAL",
"sha256": "REPLACE_WITH_ACTUAL"
},
"network": {
"simulated_c2_ip": "192.0.2.123",
"dns_requests": [
"ctldl.windowsupdate.com",
"ocsp.digicert.com",
"crl.digicert.com",
"wpad.mylab.local"
],
"c2_domains_type": [".top", ".onion (Tor)"]
},
"filesystem": {
"ransom_notes": [
"_R_E_A_D__T_H_I_S___[ID]_.txt",
"_R_E_A_D__T_H_I_S___[ID]_.hta"
],
"encrypted_extension": ".aa78",
"persistent_copy": "C:\\Users\\[user]\\AppData\\Roaming\\[GUID]\\cerber2.exe"
},
"registry": {
"persistence_key": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
"value_name": "{random-GUID}"
},
"processes": [
"vssadmin.exe delete shadows /all /quiet",
"mshta.exe _READ_THIS_FILE_.hta",
"icacls.exe"
],
"apis": [
"CryptEncrypt", "CryptGenKey",
"RegSetValueExW", "RegOpenKeyExW",
"VirtualAlloc", "GetProcAddress",
"InternetOpenA", "HttpSendRequestA",
"IsDebuggerPresent", "GetKBCodePage"
]
}
```
## YARA 检测规则
以下规则是根据静态和动态分析期间收集的 IOC 创建的。它针对在 Ghidra 中发现的唯一二进制字符串,以及该样本行为特征性的关键 API 名称。
```
rule Cerber_Ransomware_Detection {
meta:
author = "Assya"
description = "Detection rule for the Cerber ransomware sample analyzed in the malware analysis lab"
date = "2026-2027"
family = "Cerber"
type = "Ransomware"
risk = "Critical"
strings:
// Unique strings extracted from the binary via Ghidra
$str1 = "11111kicu4p3050f55f298b5211cf2bb82200aa00bdce0bf"
$str2 = "interfe\\{"
// Critical APIs identified in PEStudio and Ghidra
$api1 = "VirtualAlloc"
$api2 = "RegOpenKeyExW"
$api3 = "CryptEncrypt"
$api4 = "CreateProcessW"
$api5 = "IsDebuggerPresent"
condition:
uint16(0) == 0x5A4D and // Valid PE file (MZ magic number)
filesize < 500KB and
(1 of ($str*)) and
(3 of ($api*))
}
```
要针对样本或完整目录测试规则:
```
yara tp_detection.yar cerber.exe
yara -r tp_detection.yar C:\Malware\Samples\
```
该规则正确检测到了样本,因为它结合了结构约束(PE 头、文件大小)和基于内容的特征(唯一字符串加上 API 名称)。为了进一步减少误报,该规则可以加入 PE 节熵阈值、更精确的字符串偏移或通过更深入的 Ghidra 分析识别的其他唯一字节序列。
## 9. 反思与局限性
### 静态 vs 动态 — 比较
| 标准 | 静态分析 | 动态分析---|---|
| **安全性** | ✅ 安全 — 恶意软件从不运行 | ⚠️ 有风险 — 恶意软件执行 |
| **速度** | ✅ 快速 | ❌ 需要时间和监控设置 |
| **覆盖范围** | ✅ 看到所有代码分支 | ❌ 只看到一条执行路径 |
| **绕过** | ❌ 被加壳/混淆挫败 | ✅ 在内存中看到脱壳后的代码 |
| **影响证据** | ❌ 没有运行时证据 | ✅ 显示确切的系统更改 |
| **工具** | DIE, PEStudio, Ghidra, Strings | Procmon, Wireshark, Regshot, FakeNet-NG |
| **输出** | 哈希、导入、代码结构 | 修改的文件、注册表、网络流量 |
### 静态分析的局限性
- **加壳**:二进制文件显示为压缩的块——Ghidra 只看到脱壳器存根,而不是真正的代码
- **字符串混淆(栈字符串)**:在内存中逐字节组装的字符串对 `strings` 工具不可见
- **动态 API 解析**:如果使用 `GetProcAddress`,关键 API 不会出现在导入表中
- **对策**:执行期间进行内存转储 + 在 Ghidra 中重新分析脱壳后的二进制文件
### 动态分析的局限性
恶意软件可以使用以下技术检测沙箱环境:
| 技术 | 工作原理 |
|---|---|
| **虚拟机工件检测** | 检查 `VBoxMouse.sys`、`vmtoolsd.exe`、特定 MAC 地址 (`00:0C:29`) |
| **资源检查** | 检查磁盘大小(虚拟机通常磁盘较小)、CPU 核心数(1 核 = 沙箱) |
| **人工交互** | 在激活前等待真实的鼠标移动或键盘输入 |
| **计时/休眠** | 休眠 15 分钟以上以超过自动沙箱超时 |
| **进程检查** | 扫描正在运行的进程以寻找分析工具(Procmon、Wireshark 等) |
### 针对 Cerber 类勒索软件的推荐防御措施
1. **3-2-1 离线备份**:3 份副本,2 种介质,1 份离线(物理隔离)— Cerber 针对网络共享和 VSS
2. **EDR(端点检测与响应)**:检测行为模式(批量文件加密),而不仅仅是基于特征的检测
3. **最小权限原则**:用户不应是本地管理员——防止执行 `vssadmin` 和禁用 Defender
4. **网络分段**:将工作站与文件服务器隔离——防止横向移动和批量加密
5. **应用程序白名单**:阻止从 `%AppData%`、`%Temp%` 执行未知二进制文件
6. **电子邮件过滤 + 用户意识**:大多数勒索软件通过网络钓鱼到达——过滤附件并培训用户
## 结论
本实验室提供了将恶意软件分析方法论应用于真实世界勒索软件的完整、实践性演练。静态和动态分析的结合被证明至关重要:使用 Ghidra 和 PEStudio 进行的静态分析揭示了恶意软件的结构、规避技术和潜在的代码路径,而使用 Procmon、Wireshark、Regshot 和 FakeNet-NG 进行的动态分析确认了实际影响——34,102 次系统更改、数千个加密文件、网络侦察活动以及完整的攻击时间线。
## 11. 参考文献
- Mandiant FlareVM: https://github.com/mandiant/flare-vm
- MITRE ATT&CK Framework: https://attack.mitre.org
- YARA Documentation: https://yara.readthedocs.io
- MalwareBazaar: https://bazaar.abuse.ch
- EICAR Test File: https://www.eicar.org/download-anti-malware-testfile/
- Windows Sysinternals: https://learn.microsoft.com/en-us/sysinternals/
- PracticalMalwareAnalysis Labs: https://github.com/mikesiko/PracticalMalwareAnalysis-Labs
*由 **Assya** 完成 | 2025/2026 年*
标签:Cerber, Cloudflare, DAST, FlareVM, Ghidra, IOC提取, MITRE ATT&CK, PE32分析, VMware, Windows恶意软件, YARA, 云安全监控, 云资产可视化, 云资产清单, 勒索软件, 合规性检查, 威胁情报, 威胁映射, 开发者工具, 恶意软件分析, 攻击技术映射, 检测规则, 沙箱, 网络资产发现, 自动化分析, 虚拟化环境, 规则编写, 跨站脚本, 逆向工程, 静态分析