⚠️ 2022-07-24 - 自 Windows 10 21H2 10.0.19044.1826(2022年7月更新)起,PPLdump 中实现的利用方法__已不再有效__。NTDLL 中的一个补丁现在阻止 PPL 加载 已知 DLL。更多信息请参见此处。
本工具实现了一个 用户态 漏洞利用,最初由 James Forshaw(即 @tiraniddo)在这篇博文中讨论,用于以管理员身份 转储任意 PPL 的内存。
我撰写了两篇关于此工具的博文。第一部分介绍受保护进程的概念,第二部分讨论绕过技术本身。
直接运行可执行文件,无需任何参数,即可获得详细的帮助/使用说明。
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
描述:
通过用户态漏洞利用转储受保护进程轻量级(PPL)的内存
用法:
PPLdump.exe [-v] [-d] [-f] <进程名|进程ID> <转储文件>
参数:
进程名 要转储的进程名称
进程ID 要转储的进程ID
转储文件 输出转储文件的路径
选项:
-v (详细) 启用详细模式
-d (调试) 启用调试模式(隐含详细模式)
-f (强制) 绕过 DefineDosDevice 错误检查
示例:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
首先,PPL 是在 Windows 8.1 中引入的,因此旧版 Windows 显然不受支持。本项目主要针对 Windows 10(及其服务器版本),但我也在旧版本上测试过。您可以在同名部分找到我进行的测试汇总表。
其他 PPL 绕过工具通常通过数字签名的驱动程序在内核中执行任意代码。而本工具只涉及用户态技巧,并且(几乎)是没有实体文件的。
本工具利用了一个非常巧妙的技巧,最初由 James Forshaw 在 2018 年提出(见致谢)。它涉及使用 DefineDosDevice API 函数来欺骗系统创建任意的已知 DLL 条目。由于 PPL 不检查已知 DLL 的数字签名,因此稍后可用于执行 DLL 劫持攻击,在 PPL 内部执行任意代码。
虽然本工具在第二阶段执行 DLL 劫持攻击,但它不会在磁盘上创建新的 DLL 文件。相反,它利用 NTFS 事务来虚拟替换现有 DLL 的内容,这一技术直接受到 @_ForrestOrr 工作的启发(见致谢)。
简短的回答是“不会”。首先,它不涉及直接内核访问,因此从这一点上看没有蓝屏死机的风险。在最坏的情况下,工具可能无法删除创建的已知 DLL 条目,但这不会导致拒绝服务。它只会保留到下次机器重启。由于创建的条目只是一个指向不存在的节的符号链接,系统最终会回退到默认位置(即 System32 文件夹),因此不会影响机器上运行的其他程序。
| Windows 版本 | 内部版本号 | 版本 | 架构 | 管理员 | SYSTEM |
|---|---|---|---|---|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | 教育版 | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | 家庭版 | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |
⚠️ 该漏洞在完全更新的 Windows 8.1 / Server 2012 R2 上失败。我仍需找出是哪个补丁导致了错误。
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ 在 Windows 8.1 / Server 2012 R2 上,您可能还需要静态编译二进制文件(见下方“构建说明”)。
此 Visual Studio 解决方案包含两个项目(可执行文件和有效载荷 DLL),需要按特定顺序编译。所有内容均已预配置,因此您只需遵循以下简单说明。编译后的有效载荷 DLL 会自动嵌入到最终可执行文件中。
Release / x64 或 Release / x86。生成 > 生成解决方案。在 Windows 8.1 / Server 2012 R2 上,您可能需要静态编译二进制文件。
PPLdump 项目。配置属性 > C/C++ > 代码生成。多线程 (/MT) 作为 运行库 选项。