norbertsec/Malware-Analysis
GitHub: norbertsec/Malware-Analysis
该仓库是一份针对 Fog 勒索软件 32 位 PE 样本的详细恶意软件分析报告,通过静态分析、逆向工程和动态调试全面记录了其加密、发现与恢复抑制行为。
Stars: 0 | Forks: 0
# Fog 勒索软件恶意软件分析
## 执行摘要
本报告记录了与 Fog 勒索软件相关的一个 32 位 Windows PE 可执行文件的分析过程。该样本获取自 MalwareBazaar,并在一个隔离的恶意软件分析实验室中进行了分析,分析过程使用了静态分诊、FLOSS、capa、Ghidra、x32dbg、ProcMon、Regshot、Process Explorer 以及基于 REMnux 的网络监控。
综合证据支持高置信度的勒索软件评估结论。该样本执行了主机和网络发现,枚举了本地和网络资源,通过 Windows CryptoAPI 初始化加密功能,通过多线程工作流处理文件,将 `.flocked` 扩展名附加到重命名的文件中,尝试进行恢复抑制,并创建了勒索说明。
本仓库仅用于文档记录。它不包含活体恶意软件样本、解压后的 payload、恶意软件归档密码、数据包捕获、内存转储、注册表导出、原始 ProcMon 日志或特定于主机的取证数据。
## 样本信息
| 字段 | 值 |
| --- | --- |
| 来源 | MalwareBazaar |
| SHA256 | `b24680596a9a113f95535f526930b5415382c102cd5753d7392e780cdea0ed63` |
| 公开参考 | `https://bazaar.abuse.ch/sample/b24680596a9a113f95535f526930b5415382c102cd5753d7392e780cdea0ed63/` |
| 文件类型 | 32 位 Windows PE 可执行文件 |
| 评估家族 | Fog 勒索软件 |
| 观察到的加密文件扩展名 | `.flocked` |
| 观察到的勒索说明 | `readme.txt` |
| 评估置信度 | 高 |
## 关键发现
- 该样本通过子进程启动多个 `cmd.exe` 发现命令。
- 它枚举本地驱动器、目录、文件、卷和 Windows 网络资源。
- 它使用 Windows CryptoAPI 并成功导入了标记为 `RSA1` 的 RSA 公钥 blob。
- 它包含与卷影副本删除相关的恢复抑制行为。
- 它使用多线程文件处理工作流,并将 `.flocked` 附加到重命名的文件中。
- 它在 `C:\Config.Msi\readme.txt` 创建勒索说明。
- 在观察到的执行窗口期间,未确认存在明显的基于注册表的持久性。
## 实验室环境
动态运行是在一个隔离的 VirtualBox 环境中进行的,该环境包含一个 Windows 分析虚拟机和一个通过仅内部网络连接的 REMnux 虚拟机。共享文件夹、剪贴板共享和拖放功能已被禁用。在执行之前创建了干净的虚拟机快照。
运行时观察使用了:
- `x32dbg` 用于断点和 API 参数检查。
- `ProcMon` 用于文件、进程和注册表活动。
- `Process Explorer` 用于进程树观察。
- `Regshot` 用于注册表比较。
- REMnux 上的 `Wireshark` 用于网络观察。
## 静态分析
### 初始分诊
该样本被识别为具有 GUI 子系统特征的 32 位 Windows PE 可执行文件,大小约为 106 KB。项目期间引用的 VirusTotal 结果显示其具有广泛的检测率,72 个引擎中有 57 个标记了该文件。

*图 1:经分析的 Fog 勒索软件样本的 VirusTotal 检测摘要。*
在 peStudio 中观察到的编译时间戳为 `2025-01-29`。此值被视为低置信度元数据,因为恶意软件的时间戳可能会被作者或构建过程修改。

*图 2:peStudio 概览,显示 PE 元数据、哈希、大小、熵、架构、子系统和时间戳字段。*
### PE 结构
观察到的区段包括 `.text`、`.rdata`、`.data`、`.rsrc` 和 `.reloc`。整体熵约为 `6.56`。`.text` 区段的熵较高,约为 `6.51`,而可写的 `.data` 区段则更可疑,熵约为 `7.31`。这种组合与可能包含编码配置、嵌入式密钥材料或执行期间使用的运行时数据的二进制文件相一致。

*图 3:peStudio 区段视图,突出显示了区段布局和熵值。*
### 导入和字符串指示符
导入和字符串特征强有力地支持了勒索软件假设。
| 类别 | 证据 |
| --- | --- |
| 驱动器和卷发现 | `GetLogicalDriveStrings`、`GetDriveType`、`FindFirstVolume`、`GetVolumePathNamesForVolumeName` |
| 网络资源枚举 | `WNetOpenEnum`、`WNetEnumResource` |
| 密码学 | `CryptAcquireContext`、`CryptImportKey`、`CryptEncrypt` |
| 文件和进程操作 | `DeleteFile`、`MoveFile`、`CreateProcess` |
| 服务交互 | `OpenSCManager`、`OpenService`、`ControlService` |
| 单实例行为 | `CreateMutexA` |
| 恢复抑制 | `SHEmptyRecycleBinA`、`vssadmin.exe delete shadows /all /quiet` |

*图 4:用于网络资源枚举和 CryptoAPI 使用的静态字符串指示符。*
FLOSS 揭示了一个直接的文件加密字符串:
```
Start encrypt file: %ws
```
它还暴露了用于收集主机、网络、账户、服务、计划任务和驱动程序信息的侦察命令:
```
systeminfo
hostname
ipconfig /all
route print
arp -A
netstat -ano
net users
net start
tasklist /SVC
schtasks /query
DRIVERQUERY
```

*图 5:提取的字符串,显示了发现命令、CryptoAPI 字符串、网络资源枚举字符串以及卷影副本删除命令文本。*
### capa 发现
capa 与手动分诊相一致,并识别了与文件和目录枚举、递归遍历、网络共享枚举、Windows CryptoAPI 使用、卷影副本删除、发现活动、字符串混淆或解码数据以及使用 `GetTickCount` 进行时间检查相关的功能。

*图 6:capa 功能输出,显示了文件系统、密码学、发现、进程、服务和恢复抑制行为。*
## 逆向工程
在 Ghidra 分析期间,根据观察到的行为和调用关系,重命名了几个关键例程。
| 原始函数 | 分析师命名 | 角色 |
| --- | --- | --- |
| `FUN_00407dd0` | `file_worker_thread` | 用于单个文件的工作线程 |
| `FUN_00402470` | `encrypt_file` | 主文件加密例程 |
| `FUN_004072c0` | `init_crypto_context` | CryptoAPI 上下文初始化和密钥导入 |
| `FUN_00407220` | `cleanup_crypto_context` | 加密上下文清理 |
| `FUN_00401e60` | `schedule_file_encryption` | 文件任务调度 |
| `FUN_004021b0` | `walk_directory_recursive` | 递归目录遍历 |
### 文件处理工作流
`encrypt_file` 以字符串 `Start encrypt file: %ws` 开始。该函数接收一个文件路径,清除工作缓冲区,验证输入路径,通过 `CreateFileW` 打开目标,执行与加密相关的处理,随后使用 `MoveFileW` 重命名已处理的文件。
`schedule_file_encryption` 检查可用的工作线程槽位,将发现的文件路径复制到任务结构中,并使用 `CreateThread` 启动一个工作线程。如果所有槽位都被占用,调度器会短暂等待并重试。

*图 7:Ghidra 反编译视图,显示调度器逻辑和工作线程的创建。*
`file_worker_thread` 初始化线程局部上下文,准备加密状态,调用 `encrypt_file`,然后调用清理逻辑。这种设计表明它是一个多线程勒索软件工作流,旨在高效处理多个文件。
### 目录遍历和勒索说明逻辑
`walk_directory_recursive` 使用 `FindFirstFileW` 和 `FindNextFileW` 枚举文件和子目录。它跳过 `.` 和 `..`,将发现的文件传递给调度例程,并在处理完目录内容后创建勒索说明。

*图 8:Ghidra 反编译视图,显示与说明创建相关的 `CreateFileW` 和 `WriteFile` 逻辑。*
### 加密上下文
`init_crypto_context` 调用 `CryptAcquireContextA` 并通过 `CryptImportKey` 导入密钥材料。动态分析确认了一个标记为 `RSA1` 且密钥长度为 2048 位的 RSA 公钥 blob。

*图 9:使用 `CryptAcquireContextA` 和 `CryptImportKey` 的 CryptoAPI 初始化路径的 Ghidra 反编译视图。*
在 `CryptEncrypt` 周围观察到的缓冲区大小,包括 `0xF5` 输入大小模式和 `0x100` 输出缓冲区,与 RSA-2048 的使用一致。这表明非对称加密可能用于保护会话密钥或元数据,而不是直接加密整个文件内容。
## 动态分析
调试器断点集中在文件、进程、加密、网络资源和与恢复相关的 API 上:
```
CreateFileW
WriteFile
MoveFileW
DeleteFileW
CreateProcessA
CreateProcessW
CryptEncrypt
CryptImportKey
WNetEnumResourceA
SHEmptyRecycleBinA
```
对 ProcMon 进行了过滤,以使证据集中在恶意软件进程、子命令执行、文件创建、写入、重命名操作和恢复抑制工具上。

*图 10:用于将运行时观察集中于恶意软件进程和高价值操作上的 ProcMon 过滤器配置。*
### 进程和发现行为
该样本在启动 `cmd.exe` 侦察命令的 `CreateProcessA` 调用上停止。这些命令收集了系统信息、主机名数据、网络配置、ARP 和路由数据、活动网络连接、本地用户、运行中的服务、计划任务、基于服务的进程以及驱动程序信息。

*图 11:x32dbg 断点参数视图,显示运行时的 `cmd.exe /c ...` 发现命令。*
这种运行时行为证实了静态分析期间观察到的发现字符串。
### 网络资源枚举
该样本调用了 `WNetEnumResourceA`,确认了其试图枚举 Windows 网络资源。观察到的结果缓冲区包含与提供程序相关的条目,例如 WSD Network 和 Microsoft Terminal Services。
### 加密行为
该样本到达了 `CryptImportKey`,带有一个标记为 `RSA1` 的 RSA 公钥 blob。密钥长度与 2048 位一致。函数返回值指示导入成功,确认了 Windows CryptoAPI 的实际使用,而不仅仅是处于休眠状态的导入。
### 文件修改和扩展名附加
该样本到达了 `MoveFileW`,其参数显示从 `C:\BOOTSECT.BAK` 重命名为 `C:\BOOTSECT.BAK.flocked`。

*图 12:`MoveFileW` 参数的 x32dbg 运行时视图,显示附加 `.flocked` 扩展名。*
ProcMon 随后确认了涉及 `C:\bootTel.dat.flocked` 和 `C:\bootmgr.flocked` 的其他文件活动。

*图 13:显示 `SetRenameInformationFile` 和对 `C:\BOOTSECT.BAK.flocked` 访问的 ProcMon 证据。*
这些观察证实,该样本将 `.flocked` 附加到了已处理的文件中。
### 勒索说明创建
该样本为 `C:\Config.Msi\readme.txt` 调用了 `CreateFileW`。创建模式指示为 `CREATE_ALWAYS`。ProcMon 显示向该文件写入了 837 字节。说明文本告知受害者关于攻击的信息,提到了加密数据,提供了通过 Tor 进行联系的说明,并包含了一个受害者标识符。

*图 14:ProcMon 证据,显示 `C:\Config.Msi\readme.txt` 创建、837 字节的说明以及 `.flocked` 文件活动。*
### 注册表观察
在观察到的执行窗口期间,Regshot 比较并未显示出明确的注册表持久性机制。更改主要与标准 Windows 区域相关,例如 Microsoft 服务缓存数据、Explorer 会话设置、Shell Bags 或 BagMRU 以及与临时通知相关的条目。在常见的持久性位置(如 `Run`、`RunOnce`、`Services` 或 `Winlogon`)中,未确认存在明显的新条目。
## 行为时间线
| 阶段 | 行为 | 证据 |
| --- | --- | --- |
| 1. 启动和环境准备 | 初始化运行时状态并准备 worker 结构 | Ghidra 函数分析 |
| 2. 发生命令执行 | 启动 `cmd.exe` 命令,如 `systeminfo`、`hostname`、`ipconfig /all`、`net users`、`net start`、`tasklist /SVC` 和 `schtasks /query` | FLOSS 字符串和 `CreateProcessA` 断点 |
| 3. 驱动器和卷枚举 | 枚举本地驱动器和卷 | 静态导入,包括 `GetLogicalDriveStrings`、`GetDriveType`、`FindFirstVolume` |
| 4. 网络资源枚举 | 枚举 Windows 网络资源 | `WNetOpenEnum`、`WNetEnumResource` 以及动态 `WNetEnumResourceA` 观察 |
| 5. 加密上下文设置 | 获取 CryptoAPI 上下文并导入密钥材料 | Ghidra `init_crypto_context`;带有 `RSA1` blob 的动态 `CryptImportKey` 命中 |
| 6. 递归文件发现 | 使用 Windows 文件枚举 API 遍历目录 | Ghidra `walk_directory_recursive` 分析 |
| 7. 文件任务调度 | 将发现的文件排队以供工作线程处理 | Ghidra `schedule_file_encryption` 分析 |
| 8. 文件处理 | Worker 例程对单个路径调用 `encrypt_file` | Ghidra `file_worker_thread` 和 `encrypt_file` 分析 |
| 9. 文件重命名 | 将 `.flocked` 附加到已处理的文件中 | `MoveFileW` 断点和 ProcMon 观察 |
| 10. 勒索说明创建 | 创建并写入 `readme.txt` | `CreateFileW` 断点和 ProcMon 写入事件 |
| 11. 持久性检查 | 审查注册表差异以查找常见的持久性位置 | Regshot 比较;未确认明确的注册表持久性 |
在确认核心勒索软件行为后,执行被暂停。这在保留足以支持分类和检测开发的证据的同时,减少了不必要的破坏性活动。
## MITRE ATT&CK 映射
| 战术 | 技术ID | 技术 | 证据 | 置信度 |
| --- | --- | --- | --- | --- |
| 执行 | T1059.003 | 命令和脚本解释器:Windows 命令外壳 | 通过 `cmd.exe` 启动的侦察命令 | 高 |
| 发现 | T1082 | 系统信息发现 | `systeminfo`、`hostname`、`DRIVERQUERY` | 高 |
| 发现 | T1016 | 系统网络配置发现 | `ipconfig /all`、`route print`、`arp -A` | 高 |
| 发现 | T1049 | 系统网络连接发现 | `netstat -ano` | 高 |
| 发现 | T1087 | 账户发现 | `net users` | 高 |
| 发现 | T1007 | 系统服务发现 | `net start`、与服务相关的 API 使用 | 高 |
| 发现 | T1057 | 进程发现 | `tasklist /SVC` | 高 |
| 发现 | T1135 | 网络共享发现 | `WNetOpenEnum`、`WNetEnumResource`、`WNetEnumResourceA` | 高 |
| 防御规避 | T1027 | 混淆的文件或信息 | FLOSS 和 capa 指示了解码或混淆的字符串 | 中 |
| 影响 | T1486 | 数据加密以造成影响 | `Start encrypt file: %ws`、`CryptEncrypt`、`.flocked` 扩展名 | 高 |
| 影响 | T1490 | 抑制系统恢复 | `vssadmin.exe delete shadows /all /quiet` | 中 |

*图 15:capa 输出,显示了与 ATT&CK 相关的行为类别,用作映射的支持证据。*
高置信度映射与运行时观察、逆向工程的代码路径或直接的命令/API 证据相关联。中置信度映射由静态字符串和功能工具提供支持,但在受控运行期间并未完全执行完毕。
## 入侵指标
### 哈希
| 类型 | 值 |
| --- | --- |
| SHA256 | `b24680596a9a113f95535f526930b5415382c102cd5753d7392e780cdea0ed63` |
### 文件工件
| 指标 | 上下文 |
| --- | --- |
| `.flocked` | 附加到已处理文件中的扩展名 |
| `readme.txt` | 勒索说明文件名 |
| `C:\Config.Msi\readme.txt` | 观察到的勒索说明路径 |
| `C:\BOOTSECT.BAK.flocked` | 观察到的重命名文件 |
| `C:\bootTel.dat.flocked` | 观察到的重命名或修改过的文件 |
| `C:\bootmgr.flocked` | 观察到的重命名文件 |
### 命令工件
```
vssadmin.exe delete shadows /all /quiet
systeminfo
hostname
ipconfig /all
route print
arp -A
netstat -ano
net users
net start
tasklist /SVC
schtasks /query
DRIVERQUERY
```
### API 指标
```
CryptAcquireContextA
CryptImportKey
CryptEncrypt
WNetOpenEnum
WNetEnumResource
WNetEnumResourceA
CreateFileW
WriteFile
MoveFileW
CreateProcessA
CreateProcessW
CreateMutexA
SHEmptyRecycleBinA
```
## 检测机会
| 行为 | 检测逻辑 | 分析证据 |
| --- | --- | --- |
| 卷影副本删除 | 对带有 `delete shadows` 的 `vssadmin.exe` 发出警报,特别是带有 `/all` 和 `/quiet` 参数时 | 静态字符串和 capa 恢复抑制发现 |
| 侦察突发 | 当一个父进程在短时间内生成多个发现命令时发出警报 | 动态 `CreateProcessA` 观察 |
| 网络共享枚举 | 对来自未知可执行文件的 `WNetOpenEnum` 或 `WNetEnumResource` 可疑使用发出警报 | 静态导入和动态 `WNetEnumResourceA` 断点 |
| CryptoAPI 密钥导入和加密 | 关联来自未签名或未知可执行文件的 `CryptImportKey` 和 `CryptEncrypt` 使用情况 | 静态导入和动态 RSA 密钥导入 |
| 勒索软件扩展名附加 | 对重复添加 `.flocked` 的重命名操作发出警报 | 动态 `MoveFileW` 和 ProcMon 观察 |
| 勒索说明创建 | 对在文件重命名活动后创建 `readme.txt` 发出警报 | 动态创建 `C:\Config.Msi\readme.txt` |
实用的检测优先级:
1. 来自未知进程树的卷影副本删除。
2. 重复的 `.flocked` 重命名操作。
3. 文件重命名活动后的勒索说明创建。
4. 由同一父可执行文件生成的发现命令突发。
5. 网络资源枚举与 CryptoAPI 使用相结合。
### Sigma 风格的进程逻辑
```
title: Fog Ransomware Behavioral Indicators
id: 8f55df68-fec8-4f69-9c2d-14c8f65a7d91
status: experimental
description: Detects command-line and recovery-inhibition behavior observed during analysis of a Fog ransomware sample.
references:
- https://bazaar.abuse.ch/sample/b24680596a9a113f95535f526930b5415382c102cd5753d7392e780cdea0ed63/
author: Malware Analysis Portfolio
date: 2026-06-03
logsource:
product: windows
category: process_creation
detection:
shadow_delete:
Image|endswith: '\vssadmin.exe'
CommandLine|contains|all:
- 'delete'
- 'shadows'
recon_commands:
Image|endswith:
- '\cmd.exe'
CommandLine|contains:
- 'systeminfo'
- 'ipconfig /all'
- 'route print'
- 'arp -A'
- 'netstat -ano'
- 'net users'
- 'net start'
- 'tasklist /SVC'
- 'schtasks /query'
- 'DRIVERQUERY'
condition: shadow_delete or recon_commands
falsepositives:
- Administrative inventory scripts
- Backup or recovery maintenance scripts
- IT troubleshooting activity
level: medium
tags:
- attack.execution
- attack.t1059.003
- attack.discovery
- attack.impact
- attack.t1490
```
### YARA 分诊规则
```
rule Fog_Ransomware_Triage_Strings
{
meta:
description = "String-based triage rule derived from Fog ransomware sample analysis"
author = "Malware Analysis Portfolio"
date = "2026-06-03"
sample_sha256 = "b24680596a9a113f95535f526930b5415382c102cd5753d7392e780cdea0ed63"
confidence = "medium"
strings:
$encrypt_msg = "Start encrypt file: %ws" ascii wide
$shadow_delete = "vssadmin.exe delete shadows /all /quiet" ascii wide
$cmd_systeminfo = "systeminfo" ascii wide
$cmd_ipconfig = "ipconfig /all" ascii wide
$cmd_netstat = "netstat -ano" ascii wide
$cmd_tasks = "schtasks /query" ascii wide
$crypto1 = "CryptAcquireContextA" ascii wide
$crypto2 = "CryptImportKey" ascii wide
$crypto3 = "CryptEncrypt" ascii wide
$net_enum = "WNetEnumResource" ascii wide
condition:
uint16(0) == 0x5A4D and
(
$encrypt_msg or
$shadow_delete or
(2 of ($crypto*) and 2 of ($cmd_*)) or
($net_enum and 2 of ($cmd_*))
)
}
```
## 范围和局限性
分析在确认了核心勒索软件行为后有意停止。继续执行对于支持分类并不是必需的,并且可能会导致实验室虚拟机内部出现更广泛的文件修改。
以下方面未被完全执行:
- 跨大型文件语料库的完整加密完成。
- 完整的恢复抑制执行路径。
- 文件加密后的长时间网络观察。
- 完全引爆后的内存取证。
- 针对多个 Fog 变体的跨样本家族比较。
- 针对检测逻辑的大规模误报测试。
原始恶意软件、原始 ProcMon 日志、数据包捕获、内存转储、注册表导出和样本归档不包含在此仓库中。该仓库保留了合理的调查结果,而未分发不安全的工件或特定于主机的取证数据。
标签:云资产清单, 勒索软件, 威胁情报, 安全研究报告, 开发者工具, 恶意代码分析, 网络安全审计, 逆向工程, 配置文件