首页 / 资讯中心 / 文章详情

终极解析:BlueHammer 的 VSS 卷影复制技巧——FreezeVSS 如何用 HarddiskVolumeShadowCopy 冻结 Defender

终极解析:BlueHammer 的 VSS 卷影复制技巧——FreezeVSS 如何用 HarddiskVolumeShadowCopy 冻结 Defender ★ FEATURED ARTICLE
终极解析BlueHammer 的 VSS 卷影复制技巧——FreezeVSS 如何用 HarddiskVolumeShadowCopy 冻结 Defender【免费下载链接】BlueHammerRepository hosting the bluehammer vulnerability项目地址: https://gitcode.com/gh_mirrors/bl/BlueHammerBlueHammer 是一款研究 Windows Defender 防御机制的开源漏洞 PoC 项目。它的核心看点是FreezeVSS函数通过监听HarddiskVolumeShadowCopy卷影复制对象配合云文件同步根与批量 oplock 锁在 Defender 更新签名前将其冻结从而劫持其签名更新流程。本文将用小白也能懂的方式完整拆解这套 VSS 卷影复制技巧的实现思路。一、BlueHammer 是什么30 秒看懂项目背景BlueHammer 仓库见 README.md自述为 Repository hosting the bluehammer vulnerability托管 bluehammer 漏洞的仓库。作者以一种调侃的语气写道Im just really wondering what was the math behind their decision...这说明它针对的是 Windows Defender 签名更新流程中的一个设计缺陷Defender 在应用新引擎签名前会创建卷影副本VSS而这个环节可以被攻击者卡住使 Defender 长时间处于半冻结状态并被迫从攻击者指定的目录加载签名。仓库结构非常精简核心文件一览文件作用FunnyApp.cppPoC 主程序包含全部核心技巧windefend.idl逆向出的 Defender 私有 RPC 接口定义windefend_h.h / windefend_c.c / windefend_s.c由 IDL 生成的 RPC 存根代码offreg.h / offreg.lib离线注册表操作库用于离线攻击场景FunnyApp.sln / FunnyApp.vcxprojVisual Studio 工程文件FunnyApp.rc / resource.h资源脚本与资源定义 下文聚焦主角VSS 卷影复制相关的四段代码全部位于 FunnyApp.cpp 中标注为 Volume shadow copy functions 的区块。二、核心概念VSS 卷影复制与 HarddiskVolumeShadowCopy 速成在深入代码前先补齐两个必备知识点 1️⃣ 什么是 VSS 卷影复制Windows 的 Volume Shadow Copy Service卷影复制服务能在不中断系统运行的前提下为卷上的文件拍一张快照。Defender 更新引擎签名时会先做快照确保更新失败可以回滚。2️⃣ HarddiskVolumeShadowCopy 又是什么每个 VSS 快照在 Windows 内核的设备命名空间中都会注册一个设备对象名字固定形如\Device\HarddiskVolumeShadowCopy0、\Device\HarddiskVolumeShadowCopy1……也就是说只要枚举\Device目录就能实时发现系统里新出现的卷影副本——这正是 BlueHammer 抓住 Defender 更新时机的雷达。三、整体链路从检查更新到冻结 Defender 的 4 步流程BlueHammer 的主流程可以概括为一条流水线CheckForWDUpdates → GetUpdateFiles → TriggerWDForVS → RPC 调用 ServerMpUpdateEngineSignature (发现新签名) (下载解包) (冻结等快照) (骗 Defender 加载假签名)第 1 步检查更新— CheckForWDUpdates() 调用 Windows Update 组件查询是否存在 Microsoft Defender Antivirus 分类的 Definition Updates没有就每 30 秒轮询一次。第 2 步下载解包— GetUpdateFiles() 通过 WinInet 下载 Defender 官方更新包解析 PE 的.rsrc资源段抽出update.cab再用 FDI 库解包成签名文件列表。第 3 步冻结 捕获快照— TriggerWDForVS() 是本文主角内部调度下面两个线程。第 4 步RPC 劫持— 通过逆向出的私有接口windefend.idlUUIDc503f532-443a-4c69-8300-ccd1fbdb3839接口名IMpService77BDAF73调用Proc42_ServerMpUpdateEngineSignature把签名目录指向攻击者构造的路径Defender 便会加载伪造签名。下面逐个拆解 VSS 相关的两大技巧。四、技巧一用 NtQueryDirectoryObject 监听新的 HarddiskVolumeShadowCopy 目标一旦 Defender 为更新创建了新快照立刻拿到它的设备路径。实现位于 ShadowCopyFinderThread()思路分三层1. 快照基线枚举辅助函数 RetrieveCurrentVSSList() 先用NtOpenDirectoryObject打开\Device对象目录再用NtQueryDirectoryObject遍历其中所有对象筛选出TypeName为Device且名字以HarddiskVolumeShadowCopy开头见 第 1093-1098 行的条目形成一份运行前已有快照的基线链表LLShadowVolumeNames。2. 轮询发现新面孔主循环反复枚举\Device目录把当前枚举到的HarddiskVolumeShadowCopy*与基线对比第 1272-1296 行名字在基线里出现过 →continue跳过出现了基线之外的新名字→ 判定为新创建的快照拼出完整路径\Device\HarddiskVolumeShadowCopyN跳出循环。3. 验证快照可用拿到新路径后追加\Windows子路径用NtCreateFile尝试打开第 1323-1336 行如果返回STATUS_NO_SUCH_DEVICE就重试直到能成功打开——这说明快照已完成挂载可以安全使用。为什么用 NT 原生 API 而不是 Win32因为HarddiskVolumeShadowCopy对象位于内核对象命名空间Win32 的卷影 API如IVssCreateSnapshot无法直接枚举谁刚生成了新快照只能靠对象目录轮询这种硬桥硬上的方式。五、技巧二FreezeVSS 如何用云文件同步根冻结 Defender⭐ 这是 BlueHammer 最精妙的部分——FreezeVSS() 线程由 第 1723 行 创建。它的武器不是杀进程而是让 Defender 主动卡死在文件操作上。5.1 布下陷阱注册 Cloud Files 同步根Defender 引擎MsMpEng.exe即 WinDefend 服务进程在扫描和更新时会对临时目录做目录级访问而 Windows 的云文件Cloud Files / CF框架允许任何程序把目录注册为同步根并在有进程访问时收到回调。FreezeVSS做了如下准备以 PoC 自身所在目录为同步根调用CfRegisterSyncRootProviderName填了句大实话LIHATEMICROSOFT第 1473 行创建带FILE_FLAG_DELETE_ON_CLOSE的 GUID 命名锁文件通过CfConnectSyncRoot注册CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS回调第 1533 行。5.2 精准识别只冻结 Defender 进程回调函数 CfCallbackFetchPlaceHolders() 里有一处关键判断先用 GetWDPID() 打开服务控制管理器查出WinDefend服务的进程 ID再与回调上下文里的ProcessInfo-ProcessId比对第 1388 行。是 Defender 在访问→ 打印 Defender flagged.先等一个锁文件就绪事件见下再回复一个占位文件placeholder并故意挂起回调让 Defender 的文件操作阻塞在半路是其他进程→ 回复空占位数组快速放行避免误伤系统。5.3 双锁齐下批量 oplock 完成冻结在回调等待期间FreezeVSS主线程对锁文件发起FSCTL_REQUEST_BATCH_OPLOCK异步请求第 1556 行拿到ERROR_IO_PENDING后才SetEvent(hnotifylockcreated)唤醒回调。此时形成一道双重死锁Defender 的目录访问被 CF 回调卡住回调又在等 oplock 建立一旦 Defender或其更新流程触碰锁文件批量 oplock 请求会被打破。等到GetOverlappedResult返回FreezeVSS打印出标志性语句第 1570 行WD is frozen and the new VSS can be used.随后置位hvssready事件主线程就知道Defender 已被冻结新卷影快照可以安全利用了。六、技巧三EICAR 诱饵文件——如何让 Defender 乖乖创建快照光有雷达和锁还不够得让 Defender主动开始一次签名更新它会为更新创建 VSS 快照。TriggerWDForVS() 用了一个经典诱饵写 EICAR 测试文件第 1620-1665 行代码里把标准 EICAR 字符串反着存储用 rev() 函数运行时还原——既保证功能又避免静态字符串被扫描器直接命中抢占 RstrtMgr.dll 的批量 oplock第 1668-1693 行对%windir%\System32\RstrtMgr.dll独占打开并发起FSCTL_REQUEST_BATCH_OPLOCK把 oplock 当作Defender 动了的信号量再开一次 EICAR 文件第 1696-1698 行触发 Defender 检测行为oplock 随之打破PoC 确认 Defender 已上钩确认新快照等ShadowCopyFinderThread线程返回拿到新HarddiskVolumeShadowCopy路径启动 FreezeVSS用WaitForMultipleObjects同时等待线程退出和hvssready事件确保冻结成功才继续第 1732-1740 行。至此诱饵 → 快照 → 冻结三件套闭环完成。七、配套能力私有 RPC 接口与离线注册表VSS 技巧只是前半程冻结 Defender 后的后半程依赖两个配套模块 私有 RPC 接口windefend.idl 是逆向出的 Defender 内部 RPC 接口定义windefend_h.h 等由 MIDL 生成。PoC 在 CallWD() 中用RpcStringBindingComposeW以ncalrpc方式绑定接口IMpService77BDAF73调用Proc42_ServerMpUpdateEngineSignature把签名目录替换为\??\GLOBALROOT\Sessions\N\BaseNamedObjects\{GUID}\WDUpdateDirectory这类命名对象符号链接由 NtCreateSymbolicLinkObject 创建从而让 Defender 加载攻击者投放的新签名。 离线注册表工具offreg.h offreg.lib 提供离线注册表访问能力配合 FunnyApp.cpp 中的 SAM 解析逻辑bootkey 重排、AES-CBC 解密 LSA 密钥、SAM 库偏移解析可在获取 VSS 快照后直接对离线系统画像做密码哈希提取——这也是 BlueHammer 选择 VSS 路线的终极目的卷影副本 一个不受内存保护机制约束的离线系统镜像。八、安全启示普通用户与运维该如何防范虽然 BlueHammer 只是研究 PoCREADME 中作者还承认 There are few bugs in the PoC但它暴露的弱点值得警惕✅监控 VSS 异常活动定期用vssadmin list shadows或审计日志关注非系统组件创建的卷影副本✅保护 WinDefend 服务与关键 DLL利用 WDAC/AppLocker 限制对RstrtMgr.dll等系统文件的独占打开与 oplock 抢占✅审计云文件同步根注册CfRegisterSyncRoot是合法 API但恶意进程注册同步根并长期阻塞回调属于异常行为可通过进程回调检测✅及时更新 Defender 与系统本漏洞依赖Defender 会响应更新并创建快照这一行为链路官方修复后链路即失效。九、相关文件索引模块路径PoC 主程序全部核心逻辑FunnyApp.cppVSS 快照监听线程FunnyApp.cpp#L1169-L1350FreezeVSS 冻结线程FunnyApp.cpp#L1463-L1598TriggerWDForVS 总调度FunnyApp.cpp#L1601-L1762Defender RPC 接口定义windefend.idlRPC 客户端/服务器存根windefend_c.c · windefend_s.c离线注册表库offreg.h · offreg.lib项目说明README.md工程与资源FunnyApp.sln · FunnyApp.rc · resource.h⚠️ 本文为安全研究科普所有技术细节仅供理解 Windows Defender 防御机制与 VSS 卷影复制原理之用请勿将相关技术用于非法用途。【免费下载链接】BlueHammerRepository hosting the bluehammer vulnerability项目地址: https://gitcode.com/gh_mirrors/bl/BlueHammer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站