1. 项目概述与核心价值
最近在安全研究圈里,CVE-2024-26229这个编号的热度不低。它不是一个简单的远程代码执行漏洞,而是一个典型的本地权限提升漏洞,也就是我们常说的“提权”。对于渗透测试人员、红队队员或者系统安全研究员来说,拿到一个普通用户权限的Shell只是第一步,如何从“低权限”跃升到“高权限”,才是真正考验技术深度和工具链完整性的关键环节。PostExpKit,从名字就能看出来,是一个“后渗透利用工具包”,它的核心价值就在于,当你在一个目标系统上站稳脚跟后,它能为你提供一套系统化的、经过验证的提权路径和利用工具,帮你高效地完成权限升级。
CVE-2024-26229的具体细节,比如它影响哪个驱动、哪个服务,我们稍后会详细拆解。但更重要的是理解这类漏洞的通用价值:它们往往存在于操作系统内核、驱动程序或者高权限服务中,由于代码逻辑缺陷,允许低权限用户通过精心构造的输入,诱使高权限进程执行恶意代码,从而将自身权限提升至SYSTEM(Windows)或root(Linux)。复现这类漏洞,远不止是运行一个EXP脚本那么简单。它涉及到对漏洞原理的深刻理解、对目标环境的精准适配、对利用链的稳定构造,以及对可能触发的防御机制的绕过。PostExpKit这类工具集的价值,就在于它把这些复杂、琐碎且容易出错的工作进行了封装和流程化,让安全研究人员能更专注于漏洞分析和利用逻辑本身,而不是反复折腾环境配置和编译错误。
这篇文章,我就以PostExpKit对CVE-2024-26229的复现测试为引子,深入聊聊在实战中,我们是如何一步步分析、准备、利用并最终验证一个本地提权漏洞的。无论你是刚入门的安全爱好者,还是有一定经验的从业者,希望这些从实际踩坑中总结出来的思路和细节,能给你带来一些实实在在的参考。
2. 漏洞原理深度解析:CVE-2024-26229到底是怎么回事?
在动手之前,我们必须先搞清楚我们要利用的究竟是什么。CVE-2024-26229是一个存在于特定Windows驱动程序中的漏洞。根据公开的分析,它属于“竞争条件”漏洞的一种,更具体地说,可能涉及“Use-After-Free”或“Double Fetch”等问题在驱动对象句柄管理上的体现。
2.1 驱动程序与用户态交互的桥梁
Windows驱动程序运行在内核模式,拥有最高的系统权限。用户态的程序(我们的普通权限程序)通过一个叫做“设备对象”的接口与驱动通信。当我们用
CreateFile
打开一个驱动暴露的设备名(如
\\.\VulnerableDriver
)并获得一个句柄后,就可以通过
DeviceIoControl
这个函数,向驱动发送控制代码和输入/输出缓冲区,进行交互。
这里就存在一个关键环节:驱动需要验证来自用户态的数据。因为用户态的数据是可以被恶意篡改的。一个常见的漏洞模式是,驱动在验证一次数据后,在没有充分锁定的情况下,又再次使用(Fetch)了同一块用户态内存的数据。如果在这两次读取之间,用户态程序通过另一个线程快速修改了这块内存的内容,驱动第二次读取到的就是被篡改后的、未经验证的数据,从而导致不可预期的行为,比如越界读写内核内存。这就是“Double Fetch”漏洞。
2.2 CVE-2024-26229的可能攻击面
虽然完整的漏洞公告和细节通常由厂商或研究者披露,但基于“提权”和“驱动”这两个关键词,我们可以合理推测CVE-2024-26229的利用链大致如下:
- 定位脆弱驱动 :首先需要知道是哪个.sys文件出了问题。这通常通过分析补丁对比、系统上已加载的驱动列表,或者监控哪些驱动提供了允许低权限用户访问的设备对象来发现。
-
理解IOCTL接口
:找到驱动暴露了哪些控制代码。每个
DeviceIoControl调用都有一个唯一的控制代码。漏洞就隐藏在某个或某几个特定控制码的处理函数中。 -
构造竞争条件
:漏洞的核心是竞争。我们需要编写一个程序,至少创建两个线程:
-
线程A:通过合法的
DeviceIoControl调用,触发驱动的脆弱代码路径,让驱动第一次读取我们的输入缓冲区并进行初步验证。 - 线程B:在驱动第一次读取之后、第二次读取之前的极短时间窗口内,快速修改输入缓冲区的内容,将其指向我们想要攻击的内核地址或写入恶意数据。
-
线程A:通过合法的
- 实现任意地址读写 :如果竞争成功,驱动第二次读取了我们篡改后的指针,就可能用内核权限去读写我们指定的任意内存地址。这是提权的基石。通过读写内核的关键数据结构,比如进程的令牌,我们就能将当前进程的权限提升到SYSTEM。
注意 :竞争条件漏洞的利用稳定性是最大的挑战。时间窗口可能极短,成功率并非100%。在实战中,往往需要多次尝试,或者通过一些技巧(如堆喷射、占用CPU核心)来增大竞争成功的概率。
2.3 PostExpKit的整合思路
PostExpKit这类工具包,并不会从零开始让你做上述所有分析。它的工作模式通常是:
- 信息收集模块 :自动识别系统版本、已安装补丁、已加载驱动,并匹配其内置的漏洞数据库,快速告诉你“当前系统可能受CVE-2024-26229影响”。
- 利用链封装 :将研究人员已经编写好的、针对该漏洞的利用代码(EXP)进行封装,处理好了诸如驱动设备名查找、IOCTL码确定、竞争线程构造等繁琐步骤。
- 通用提权模块 :即使某个特定EXP失败了,它可能还内置了其他备选方案,比如利用其他已知漏洞、检查错误的服务配置、寻找可写路径等,提供多条提权路径。
理解了原理,我们才能在使用工具时知其所以然,在工具失效时知道如何手动排查,甚至自己动手修改EXP以适应特定环境。
3. 复现环境搭建与前期准备
“工欲善其事,必先利其器”。复现一个内核级提权漏洞,环境搭建至关重要。一个配置不当的环境,可能导致漏洞无法触发、系统蓝屏崩溃,甚至影响宿主机。
3.1 虚拟机环境选择与配置
强烈建议在虚拟机中进行所有提权漏洞的复现测试。
- 虚拟机软件 :VMware Workstation 或 VirtualBox 均可。我个人更习惯VMware,快照功能更便捷。
-
操作系统镜像
:
- 你需要一个 未打补丁 的Windows版本。CVE-2024-26229有它的影响范围,比如Windows 10 21H2 或 Windows 11 22H2 的某个特定版本。你需要根据漏洞公告,寻找对应的、未集成该补丁的ISO镜像。MSDN订阅或者一些合法的镜像存档站点是获取来源。
- 切勿在生产环境或日常使用的电脑上测试!
-
虚拟机配置
:
- 内存 :至少4GB,推荐8GB。内核调试可能需要较多内存。
- 硬盘 :使用动态分配的磁盘即可,40GB以上。
- 网络 :初始配置为“NAT”或“仅主机模式”,隔离测试环境。
- 处理器 : 务必开启虚拟化引擎(Intel VT-x/EPT 或 AMD-V/RVI) 。这对64位系统及后续可能用到的调试器性能至关重要。
- 快照 :安装好纯净系统后,立即创建一个名为“Clean Install”的快照。这是你的黄金还原点。
3.2 必要软件与工具安装
在虚拟机内部,需要安装以下工具:
-
编译开发环境
:
- Visual Studio 2019/2022 :用于编译C/C++的EXP代码。社区版即可。
- Windows SDK 和 WDK :这是重中之重。WDK包含了驱动开发所需的头文件、库和工具。版本必须与你的目标Windows版本匹配或兼容。安装时注意勾选“调试工具”。
-
调试器
:
- WinDbg Preview :从Microsoft Store安装。这是现代Windows内核调试的首选工具,界面更友好。
- 配置内核调试:这需要修改虚拟机配置和系统启动项。通常通过串行端口(命名管道)实现。这是一个关键且容易出错的步骤,需要仔细按照官方文档操作。配置成功后,你可以在宿主机上用WinDbg连接虚拟机进行内核级调试。
-
系统准备
:
-
关闭驱动签名强制
:在测试环境中,为了方便加载测试驱动或漏洞利用程序可能需要的驱动,需要关闭这个限制。在管理员权限的CMD中执行:
重启生效。注意,这会降低系统安全性,仅用于测试环境。bcdedit /set testsigning on bcdedit /set nointegritychecks on - 关闭Windows Defender实时保护 :防止利用程序被误杀。在测试期间临时关闭即可。
-
关闭驱动签名强制
:在测试环境中,为了方便加载测试驱动或漏洞利用程序可能需要的驱动,需要关闭这个限制。在管理员权限的CMD中执行:
-
PostExpKit部署
:
-
将PostExpKit工具包上传到虚拟机中。通常它是一个包含多个目录的压缩包,例如:
PostExpKit/ ├── bin/ # 编译好的可执行文件 ├── src/ # 源代码 ├── exploits/ # 漏洞利用模块,CVE-2024-26229的EXP应在此 ├── scripts/ # 辅助脚本 └── README.md - 仔细阅读README,了解其基本用法和依赖。
-
将PostExpKit工具包上传到虚拟机中。通常它是一个包含多个目录的压缩包,例如:
3.3 信息收集与漏洞匹配
在运行任何利用程序之前,先用手动或工具进行侦察。
-
手动检查系统信息
:
查看具体的系统版本和已安装的补丁列表。对比CVE-2024-26229的公告,看相关补丁是否已安装。systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" /C:"修补程序" -
使用PostExpKit的信息收集模块
:
这些命令会自动化地收集信息,并与内置数据库比对,给出当前环境是否可能存在漏洞的评估。# 假设PostExpKit的主程序是postexpkit.exe postexpkit.exe --sysinfo postexpkit.exe --enum-drivers postexpkit.exe --check-vuln CVE-2024-26229
实操心得 :虚拟机快照是你的“时间机器”。在关键步骤前后(如安装完工具、配置好调试、运行EXP前)务必创建快照。一旦系统蓝屏或利用失败导致环境混乱,可以瞬间回滚,节省大量重装系统的时间。
4. 利用过程逐步拆解与实战操作
假设通过信息收集,确认当前环境存在CVE-2024-26229漏洞,并且PostExpKit内置了对应的利用模块(例如
cve-2024-26229.exe
)。下面我们一步步拆解执行过程。
4.1 第一阶段:执行利用程序
通常,利用程序需要管理员权限运行,因为需要与驱动设备通信(尽管最终目标是提升到SYSTEM,但初始的通信句柄获取可能需要一定权限)。在实战中,你可能已经通过其他手段获得了管理员权限,现在要突破到SYSTEM。
- 普通用户命令行 :首先,我们模拟一个已获得管理员权限的命令行窗口。
-
运行EXP
:
# 切换到PostExpKit的exploits目录 cd C:\Tools\PostExpKit\exploits # 运行针对该CVE的利用程序 cve-2024-26229.exe -
观察输出
:一个设计良好的EXP会给出清晰的反馈。
-
[+]开头的行表示成功步骤,如[+] Found vulnerable driver device: \\.\HackSysExtremeVulnerableDriver -
[-]开头的行表示失败或错误。 -
[*]开头的行表示信息或正在进行中的操作,如[*] Creating race condition threads... -
最终,如果成功,你会看到类似
[+] Success! Spawning SYSTEM shell...的提示,然后一个新的命令窗口会以SYSTEM权限弹出。
-
4.2 第二阶段:内核调试器视角下的动态分析
仅仅运行成功是不够的。如果你想深入学习,必须结合内核调试器。在运行EXP之前,确保宿主机上的WinDbg已经通过串行管道连接到了虚拟机。
-
设置断点
:如果你通过逆向分析知道了脆弱驱动中漏洞函数的地址,可以在WinDbg中设置断点。
或者,你可以更通用地,在驱动分发例程(Dispatch Routine)中针对特定IOCTL码下断点。# 假设脆弱函数在驱动HackSys.sys的地址0xfffff801`12345678 bp /p @$proc fffff801`12345678 -
运行EXP并触发断点
:在虚拟机中运行EXP,WinDbg会在断点处中断。此时,你可以:
-
!process 0 0:查看当前进程信息。 -
kv:查看调用栈,理解代码执行路径。 -
r:查看寄存器状态。 -
dd/dq:查看内存内容。 -
单步执行(
t,p),观察竞争条件是如何发生的,以及用户态缓冲区内容何时被修改。
-
-
观察利用成功瞬间
:当EXP成功完成任意地址写,修改了当前进程的令牌后,你可以通过命令验证:
你会看到当前进程的Token值从一个普通用户进程的Token,变成了一个系统进程(如!process -1 0 # 显示当前进程的详细信息,关注Token字段System进程)的Token地址。
4.3 第三阶段:权限维持与清理
拿到SYSTEM权限的Shell后,你通常需要做一些事情:
-
转储凭证
:使用
mimikatz或sekurlsa::logonpasswords来提取内存中的密码哈希或明文密码。 -
创建后门账户
:
net user backdoor P@ssw0rd! /add net localgroup administrators backdoor /add - 安装持久化后门 :例如,通过SC创建服务、修改注册表启动项等。
- 清理痕迹 :根据PostExpKit的设计,一些利用程序可能会在内存中留下痕迹,或者创建了临时文件。检查EXP的源码或文档,看是否需要手动清理。同时,检查系统日志(Event Viewer)中是否有明显的错误报告,但内核漏洞利用通常不会在应用日志中留下太多痕迹,更多是可能产生蓝屏转储文件。
注意事项 :在测试环境中,蓝屏是家常便饭。当发生蓝屏时,虚拟机将暂停。此时,宿主机上的WinDbg会捕获到“BugCheck”信息,并显示错误代码和可能的原因。这是分析利用为何失败(例如,写了不可写的内存地址)的宝贵信息。认真阅读蓝屏信息,并搜索错误代码,是进阶学习的必经之路。
5. 常见问题排查与稳定性优化实录
在实际复现过程中,你几乎一定会遇到各种问题。下面是我总结的一些常见坑点和解决思路。
5.1 利用程序编译失败
问题
:从PostExpKit的
src
目录编译EXP时,报错“找不到
ntddk.h
”或“
IoCreateDevice
未定义”。
原因与解决 :
- WDK环境未正确配置 :确保Visual Studio中已安装并选择了正确的WDK版本。在VS中,创建一个新的“Empty Driver”项目,看看是否能正常编译。如果不能,需要修复WDK安装。
-
项目属性设置错误
:在EXP的VC++项目属性中,
Configuration Properties->General->Windows SDK Version和Platform Toolset需要选择正确的版本。C/C++->General->Additional Include Directories需要添加WDK的include路径,如C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\km(路径中的版本号需根据你的WDK调整)。 -
代码本身依赖特定环境
:有些EXP可能依赖旧版WDK的某些特性。尝试在项目属性中定义宏
_WIN64和_AMD64_(对于64位系统),并设置C/C++->Preprocessor->Preprocessor Definitions。
5.2 利用程序运行无反应或失败
问题
:运行
cve-2024-26229.exe
后,程序立刻退出,或者提示“找不到设备”、“访问被拒绝”、“漏洞利用失败”。
排查步骤 :
-
检查驱动是否存在
:
或者使用工具如sc query type= driver | findstr "SERVICE_NAME"DriverView或WinObj查看\\.\下的设备对象,确认目标驱动设备名是否正确。 -
检查权限
:即使以管理员运行,某些驱动也可能有更强的ACL限制。尝试使用
PsExec以SYSTEM权限运行(如果你有其他途径):PsExec64.exe -s -i cve-2024-26229.exe -
检查系统版本匹配
:EXP可能是为特定Windows版本编译的。使用
ver命令确认版本,并与EXP设计的目标版本对比。不匹配可能导致利用失败。 -
开启调试输出
:很多EXP支持 verbose 模式。尝试:
查看更详细的错误信息。cve-2024-26229.exe -v cve-2024-26229.exe --debug -
使用Process Monitor
:运行
Procmon,设置过滤器为Process Name是cve-2024-26229.exe,然后运行EXP。观察它打开了哪些文件、注册表项,以及失败时的最后一个操作是什么,通常能精确定位问题。
5.3 竞争条件利用成功率低
问题 :EXP运行后,偶尔能成功,但大部分时间失败,或者直接导致系统不稳定。
优化策略 :
-
调整竞争参数
:查看EXP源码,通常会有一些可调参数,比如线程优先级、循环次数、等待时间等。尝试增加竞争线程的优先级(
SetThreadPriority),或者增加尝试次数。 -
绑定CPU核心
:将利用进程和它的竞争线程绑定到同一个CPU核心上,可以减少线程调度的不确定性,增大竞争成功的概率。可以使用
SetThreadAffinityMask函数。 - 优化“喷射”技术 :如果利用涉及内核堆喷射(Heap Spraying)来布局内存,可能需要调整喷射对象的大小、数量和填充内容,以更精准地命中目标内存布局。
- 系统负载 :关闭不必要的后台程序,减少系统负载,让竞争线程的执行更可预测。
5.4 系统蓝屏崩溃
问题 :运行EXP后,虚拟机立即蓝屏。
分析步骤 :
-
连接内核调试器
:这是必须的。蓝屏后,WinDbg会显示
BugCheck信息,例如PAGE_FAULT_IN_NONPAGED_AREA (50)或SYSTEM_SERVICE_EXCEPTION (3b)。 -
分析崩溃转储
:即使没有实时调试,系统也会生成
MEMORY.DMP或Minidump。用WinDbg打开它,执行!analyze -v,调试器会给出一个自动分析报告,指出可能出错的驱动和代码位置。 -
常见原因
:
- 地址错误 :EXP试图读写的内核地址无效或不可访问。检查EXP中关于目标地址的计算逻辑。
- 内存池损坏 :UAF漏洞利用不当,可能导致释放的内存被其他内核组件使用,从而造成损坏。
- 驱动未加载 :EXP尝试与一个不存在的驱动设备通信,或者驱动处理IOCTL时内部状态异常。
- 缩小范围 :在WinDbg中,在EXP的关键函数(如触发IOCTL的函数)和驱动入口点设置断点,单步跟踪,观察在哪个步骤之后发生了崩溃。
5.5 提权成功后操作受限
问题 :获得了SYSTEM权限的CMD,但执行某些命令(如添加用户)失败。
原因与解决 :
-
令牌完整性级别
:虽然权限是SYSTEM,但进程的完整性级别可能不是“SYSTEM”。使用
whoami /groups查看。某些敏感操作需要更高的完整性级别。可以尝试通过explorer.exe启动一个新的SYSTEM进程(例如使用psexec -s -i启动一个新CMD),通常能获得完整的权限。 - 用户账户控制残留影响 :在某些情况下,即使以SYSTEM运行,UAC的虚拟化机制可能仍有影响。确保你在真正的SYSTEM上下文中操作。
为了更直观,我将上述常见问题与排查思路汇总成下表:
| 问题现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| 编译错误 | WDK未安装/配置错误,项目设置不对 |
1. 验证WDK安装和VS集成。
2. 检查项目属性中的SDK、工具集、包含目录。 3. 检查代码中的平台宏定义。 |
| 运行失败(无设备) | 驱动未加载,设备名错误,权限不足 |
1. 使用
sc query
或
WinObj
确认驱动状态和设备名。
2. 尝试以SYSTEM权限运行(PsExec -s)。 3. 检查EXP代码中的设备名常量。 |
| 运行失败(利用失败) | 系统版本/补丁不匹配,竞争条件未触发 |
1. 核对系统版本和补丁。
2. 使用
-v
参数查看详细输出。
3. 用Process Monitor监控进程行为。 |
| 成功率低 | 竞争时间窗口难把握,系统干扰大 |
1. 调整EXP中的竞争参数(线程优先级、循环数)。
2. 将进程绑定到特定CPU核心。 3. 关闭非必要后台程序,减少系统负载。 |
| 系统蓝屏 | 内核地址访问违规,内存池损坏 |
1.
必须使用内核调试器
(WinDbg)。
2. 分析
BugCheck
代码和
!analyze -v
报告。
3. 在关键函数设断点,单步跟踪至崩溃点。 |
| 提权后操作受限 | 令牌完整性级别不足,UAC虚拟化影响 |
1.
whoami /groups
查看完整性级别。
2. 通过
psexec -s -i
等方式开启一个新的SYSTEM会话。
|
6. 从复现到理解:漏洞研究的方法论延伸
成功复现CVE-2024-26229只是一个开始。PostExpKit这样的工具降低了操作门槛,但作为安全研究者,我们的目标应该是超越工具,深入理解漏洞的本质。这里分享一些从这次复现测试中可以延伸开去的学习方法。
6.1 逆向分析与补丁对比
要真正理解一个漏洞,最直接的方法是看代码。
-
获取有漏洞和无漏洞的驱动文件
:如果该驱动是微软官方提供的,你可以从不同版本的Windows更新包(
cab或msu文件)中提取出打补丁前后的.sys文件。工具如7-Zip和expand命令可以解压这些包。 - 使用反汇编工具 :IDA Pro或Ghidra是行业标准。将两个版本的驱动文件分别加载进去。
-
进行补丁对比
:
-
二进制对比
:使用
BinDiff(IDA插件)或Ghidra的版本跟踪功能,直接对比两个二进制文件,高亮显示被修改的函数和代码块。 -
手动分析
:关注那些处理IOCTL请求的函数(通常名为
DeviceControl或DispatchDeviceControl)。对比修改前后,看哪里增加了校验、哪里修改了锁机制、哪里修复了多次获取用户态指针的逻辑。CVE-2024-26229的修复很可能是在一个ProbeForRead或锁操作附近。
-
二进制对比
:使用
- 重建利用思路 :通过分析补丁,反向推导出原始的漏洞逻辑。这能极大地锻炼你的漏洞挖掘和利用链构造能力。
6.2 编写自己的利用代码
当你理解了漏洞原理和补丁细节后,可以尝试不依赖PostExpKit中现成的EXP,自己编写利用代码。
- 搭建最小化POC :首先编写一个能稳定触发漏洞(比如导致驱动崩溃或异常行为)的概念验证代码。这不需要完成完整的提权,只需证明漏洞存在。
- 构造信息泄露 :许多现代提权漏洞需要先泄露一个内核地址,以绕过KASLR。研究如何利用这个漏洞实现信息泄露。
- 实现任意地址读写原语 :将漏洞转化为稳定的“读/写”内核任意地址的能力。这是最核心的一步。
-
完成权限提升
:利用任意写,修改当前进程的
EPROCESS结构中的Token成员,将其替换为System进程的Token地址。 - 考虑缓解措施绕过 :现代Windows有CFG、ACG、KDP等保护机制。你的利用代码可能需要额外步骤来绕过它们,例如通过已知的内核函数指针来绕过CFG。
这个过程极具挑战性,但也是从“工具使用者”成长为“研究者”的必经之路。
6.3 融入自动化渗透测试流程
在真实的红队评估中,提权不是孤立的。PostExpKit的价值在于它可以被集成到更大的自动化框架中。
- 作为C2插件 :可以将PostExpKit的模块或编译好的EXP,上传到已控主机,并通过C2通道(如Metasploit、Cobalt Strike)远程执行。C2框架可以自动判断目标系统类型,选择最合适的提权模块。
- 自动化信息收集与匹配 :编写脚本,在获取初始立足点后,自动运行系统信息收集命令,将结果与本地漏洞数据库比对,自动选择并尝试对应的提权EXP。
- 权限维持集成 :在提权成功后,自动执行预设的后渗透动作,如转储哈希、添加用户、安装后门等,形成完整的攻击链。
通过这次对CVE-2024-26229的复现测试,我们不仅掌握了一个具体漏洞的利用方法,更重要的是一套应对本地提权漏洞的通用方法论:从环境搭建、原理分析、工具使用,到问题排查和深度研究。工具永远在迭代,漏洞也总在出现,但这套分析问题、动手实践、排查调试的底层能力,才是安全研究人员最宝贵的资产。下次当你遇到一个新的CVE编号时,希望你能自信地打开虚拟机,开始你的探索之旅。

9376

被折叠的 条评论
为什么被折叠?



