Extenedi/DeleteShadowCopies

GitHub: Extenedi/DeleteShadowCopies

一个通过直接调用Windows VSS API删除系统影副本的C++概念验证工具,用于研究勒索软件如何阻止受害者恢复数据。

Stars: 0 | Forks: 0

# VSS 影副本删除工具 ## ⚠️ 严重警告:勒索软件组件 这是一个**影副本删除工具**,常用于勒索软件攻击以阻止受害者恢复数据。此代码**绝不应该**在隔离的研究环境之外执行,此处记录仅用于防御性安全目的。 ## 概述 一个 C++ 程序,用于删除 Windows 影副本(Volume Shadow Service 快照),且无需使用 `wmic` 或 `vssadmin` 等传统的命令行工具。该工具直接与 Windows VSS API 交互,以枚举和删除系统上的所有影副本。 **作者**: ORCA (@ORCx41) **日期**: 10/31/2022 **测试环境**: Windows 10 v10.0.19044 x64 ## 技术细节 ## 演示(创建): ![poc1](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d3f8c4e50c114131.png)
## 演示(删除): ![poc2](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/f9f7363263114133.png) ### 核心功能 该程序执行以下操作: 1. **COM 初始化** - 初始化组件对象模型 (COM) - 使用 `RPC_C_AUTHN_LEVEL_PKT_PRIVACY` 设置安全上下文 - 启用动态伪装以增强安全性 2. **VSS 组件创建** - 创建 `IVssBackupComponents` 接口 - 初始化 VSS 备份基础设施 - 将上下文设置为 `VSS_CTX_ALL`(所有影副本类型) 3. **影副本枚举** - 查询所有现有的影副本 - 使用 `IVssEnumObject` 遍历快照 - 检索元数据:SnapshotID, OriginalVolume, ProviderID 4. **影副本删除** - 单独删除每个快照 - 使用带有 `VSS_OBJECT_SNAPSHOT` 标志的 `DeleteSnapshots()` - 持续运行直到不存在更多影副本 ### 使用的主要 Windows API | API 函数 | 用途 | |--------------|---------| | `CoInitialize()` | 初始化 COM 库 | | `CoInitializeSecurity()` | 设置 COM 安全设置 | | `CreateVssBackupComponents()` | 创建 VSS 备份接口 | | `InitializeForBackup()` | 准备 VSS 进行备份操作 | | `SetContext()` | 定义 VSS 上下文范围 | | `SetBackupState()` | 配置备份状态 | | `Query()` | 枚举影副本 | | `DeleteSnapshots()` | 通过 ID 删除影副本 | | `VssFreeSnapshotPropertiesInternal()` | 释放快照属性内存 | ### 依赖项 ``` #include // VSS core definitions #include // VSS writer interface #include // VSS backup interface #include // VSS management #include // ATL COM smart pointers #pragma comment (lib, "VssApi.lib") #pragma comment (lib, "ResUtils.lib") ``` ## 工作原理 ### 执行流程 ``` 1. Initialize COM & Security ↓ 2. Create VSS Backup Components ↓ 3. Set VSS Context (VSS_CTX_ALL) ↓ 4. Set Backup State (Full Backup) ↓ 5. Query All Shadow Copies (GUID_NULL filter) ↓ 6. Enumerate Shadow Copies (IVssEnumObject) ↓ 7. For Each Shadow Copy: │ ├─ Display: SnapshotID, VolumeName, ProviderID │ └─ Call DeleteSnapshots(SnapshotID) ↓ 8. Repeat Until No More Copies ↓ 9. Exit ``` ### 输出示例 ``` [i] Deleting shadow copy: {a1b2c3d4-e5f6-7890-abcd-ef1234567890} on C:\ from the provider: {b5946137-7b9f-4925-af80-51abd60b20d5} [+] No More Shadow Copies Were Detected ``` ### 错误处理 | 错误代码 | 消息 | 含义 | |------------|---------|---------| | `E_ACCESSDENIED` | Please Run As Admin | 权限不足 | | `VSS_E_OBJECT_NOT_FOUND` | No Shadow Copies | 不存在快照 | | Generic HRESULT | Failed: 0x[code] | VSS API 错误 | ## 为什么这被用于勒索软件 ### 恢复阻止策略 勒索软件操作者删除影副本是为了: 1. **消除还原点** - 受害者无法使用系统还原 - 以前的文件版本被销毁 - Windows 恢复选项变得无用 2. **增加勒索压力** - 没有免费的恢复方法可用 - 受害者必须付款或永久丢失数据 - 备份删除对勒索软件的成功至关重要 3. **逃避检测**(为什么这个工具很重要) - 传统方法(`vssadmin delete shadows /all`)会触发警报 - `wmic shadowcopy delete` 受到严格监控 - 直接使用 API 可以绕过命令行检测 ### 使用此技术的勒索软件家族 - **Ryuk** - 在加密前删除 VSS - **Conti** - 复杂的 VSS 删除例程 - **Maze** - 多阶段影副本移除 - **REvil/Sodinokibi** - VSS 删除 + 引导程序攻击 - **LockBit** - 快速 VSS 移除以提高速度 - **BlackCat/ALPHV** - 基于 Rust 并使用 VSS API ## 检测与预防 ### 行为指标 **进程行为:** - 异常的 COM 对象创建 (`IVssBackupComponents`) - 来自非备份软件的 VSS API 调用 - 枚举所有影副本 - 大量影副本删除 **所需权限:** - 必须以管理员权限运行 - 需要 `SeBackupPrivilege` 和 `SeRestorePrivilege` - 如果未提升权限则触发 UAC ### 检测规则 **Sysmon 事件 ID:** - Event 1 (Process Creation) - 监控 VSS API 加载 - Event 7 (Image Loaded) - 可疑进程加载了 `VssApi.dll`, `ResUtils.dll` - Event 19/20/21 (WMI Events) - 与 VSS 相关的 WMI 活动 **Windows 事件日志:** - Event ID 8222 (VSS) - 影副本删除 - Event ID 536 (VSS) - 影副本卷服务错误 **EDR 遥测:** ``` Process: unknown.exe Loaded Modules: VssApi.dll, VSSAPI.DLL API Calls: - IVssBackupComponents::Query() - IVssBackupComponents::DeleteSnapshots() Network: None (local operation) ``` ### YARA 规则示例 ``` rule Ransomware_VSS_Deletion_API { meta: description = "Detects VSS shadow copy deletion via API" author = "Security Researcher" date = "2025-01-01" strings: $api1 = "CreateVssBackupComponents" ascii $api2 = "DeleteSnapshots" ascii $api3 = "IVssBackupComponents" ascii $api4 = "VSS_CTX_ALL" ascii $lib1 = "VssApi.lib" ascii $lib2 = "ResUtils.lib" ascii condition: uint16(0) == 0x5A4D and 3 of ($api*) and 1 of ($lib*) } ``` ### 缓解策略 **1. 权限限制** - 限制管理员帐户的使用 - 日常工作使用标准用户帐户 - 实施即时 (JIT) 管理员访问 **2. 应用程序白名单** - 仅允许授权的备份软件访问 VSS API - 阻止未知可执行文件加载 VssApi.dll **3. VSS 保护** - 通过组策略启用 VSS 访问限制 - 监控 VSS 服务 完整性 - 创建系统外备份 (3-2-1 规则) **4. 端点检测** - 部署具有勒索软件检测模块的 EDR - 对非标准进程使用 VSS API 发出警报 - 监控 COM 对象创建模式 **5. 网络分段** - 隔离具有离线备份的关键系统 - 防止横向移动到备份服务器 ## MITRE ATT&CK 映射 | 技术 ID | 技术名称 | 描述 | |-------------|----------------|-------------| | **T1490** | **Inhibit System Recovery** | 主要技术 - 删除影副本 | | T1106 | Native API | 直接使用 Windows VSS API | | T1059 | Command and Scripting Interpreter | 命令行工具的替代方案 | | T1486 | Data Encrypted for Impact | 通常与加密配对使用 | | T1529 | System Shutdown/Reboot | 通常在 VSS 删除之后进行 | **战术**: Impact **子技术**: T1490 (Inhibit System Recovery) ## 代码分析 ### 关键代码部分 **1. 管理员检查:** ``` hr = CreateVssBackupComponents(&m_pVssObject); if (hr == E_ACCESSDENIED){ printf("[!] Please Run As Admin To Delete Shadow Copies \n"); return -1; } ``` **2. 影副本查询:** ``` hr = m_pVssObject->Query(GUID_NULL, VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &pIEnumSnapshots); if (hr == VSS_E_OBJECT_NOT_FOUND) { printf("[i] There Is No Shadow Copies On This Machine \n"); return -1; } ``` **3. 删除循环:** ``` while (TRUE){ ULONG ulFetched; hr = pIEnumSnapshots->Next(1, &Prop, &ulFetched); if (ulFetched == 0) { printf("[+] No More Shadow Copies Were Detected \n"); break; } hr = m_pVssObject->DeleteSnapshots(Snap.m_SnapshotId, VSS_OBJECT_SNAPSHOT, FALSE, &lSnapshots, &idNonDeletedSnapshotID); } ``` ### 比较:传统方法 vs API 方法 | 方法 | 命令 | 检测难度 | |--------|---------|---------------------| | **传统** | `vssadmin delete shadows /all /quiet` | 容易 (命令行监控) | | **传统** | `wmic shadowcopy delete` | 容易 (WMI 事件日志) | | **本工具** | 直接 VSS API 调用 | 困难 (需要 API 监控) | ## 取证痕迹 ### 遗留的痕迹 **1. Windows 事件日志:** - **Event 8222** (VSS Provider) - "Shadow copy deleted" - **Event 536** (VSS) - "Volume Shadow Copy Service error" **2. 注册表键:** - `HKLM\SYSTEM\CurrentControlSet\Services\VSS\Diag` - VSS 诊断信息 - 可能包含上次影副本操作的时间戳 **3. VSS 日志:** - `C:\Windows\Logs\Vss\` - VSS 错误日志 - 检查带有时间戳的删除事件 **4. 预取文件:** - `C:\Windows\Prefetch\[PROGRAM_NAME].pf` - 显示程序执行历史 **5. 内存痕迹:** - 进程内存中的 COM 对象创建 - VSS API 调用堆栈跟踪 - 已加载的 DLL 痕迹 (VssApi.dll) ## 事件响应 ### 如果检测到此工具 **立即行动:** 1. **隔离系统** - 立即断开网络连接 - 如果加密正在进行则关闭电源 - 不要重启(保留内存证据) 2. **捕获易失性数据** - 内存转储 (使用 WinPMEM, DumpIt, Magnet RAM) - 正在运行的进程 (`tasklist /v`) - 网络连接 (`netstat -ano`) 3. **检查影副本状态** ``` vssadmin list shadows wmic shadowcopy list brief ``` 4. **保留日志** - 导出 VSS 事件日志 (Event ID 8222, 536) - 如果已部署,保存 Sysmon 日志 - 备份 Security 和 System 日志 5. **评估损害** - 检查加密是否已开始 - 在独立系统上验证备份完整性 - 识别入口点 (钓鱼邮件、RDP、漏洞) ### 恢复选项 **如果影副本仍然存在:** ``` # 列出可用的 shadow copies vssadmin list shadows # 从 shadow copy 还原 mklink /d C:\ShadowCopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[X]\ # 从 shadow copy 复制文件 robocopy C:\ShadowCopy\Users\[User]\Documents C:\Recovery\Documents /E ``` **如果所有副本已被删除:** - 从系统外备份恢复(磁带、云、物理隔离) - 在加密之前使用文件恢复工具 (recuva, photorec) - 联系专业数据恢复服务 - **不要支付赎金**(不保证解密) ### ⚖️ 法律警告 - **未经授权的使用是非法的**: 未经授权使用此工具违反计算机欺诈法律(CFAA, Computer Misuse Act 等)。 ## 与其他工具的比较 | 工具 | 方法 | 隐蔽性 | 速度 | 复杂度 | |------|--------|---------|-------|-----------| | **vssadmin** | Command-line | 低 | 快 | 简单 | | **wmic** | WMI | 低 | 快 | 简单 | | **PowerShell** | Scripting | 中 | 快 | 中等 | | **本工具** | Native API | 高 | 快 | 高 | | **Direct Driver** | Kernel-mode | 极高 | 极快 | 极高 | ## 技术规格 **编译要求:** - Visual Studio 2015+ 并支持 C++ - Windows SDK 10.0+ - ATL (Active Template Library) - VSS SDK 组件 **运行时要求:** - Windows Vista+ (VSS 2.0+) - 管理员权限 - Volume Shadow Copy Service 正在运行 **二进制特征:** - 语言: C++ - 架构: x86/x64 - 导入: VssApi.dll, ResUtils.dll, Ole32.dll - 子系统: Console - 典型大小: 50-100 KB (编译后)
标签:C++, COM接口操作, Windows VSS API, 中高交互蜜罐, 勒索软件, 备份恢复, 影子副本删除, 恶意软件开发, 情报收集, 数据擦除, 数据破坏, 漏洞研究, 私有化部署, 网络安全, 防御规避, 隐私保护