Microsoft CVE-2021-40449漏洞分析与利用
字数 1883 2025-08-09 09:46:33
CVE-2021-40449漏洞分析与利用教学文档
1. 漏洞概述
CVE-2021-40449是Windows内核中的一个提权漏洞,存在于Win32kfull.sys驱动中,与Windows窗口管理和图形化设备接口相关。该漏洞允许普通权限用户提升至SYSTEM权限。
受影响系统版本
- Windows Server 2004/20H2 (Server Core Installation)
- Windows 10 Version 1607/1809/1909/2004/20H2/21H1
- Windows 7 for 32/64-bit Systems Service Pack 1
- Windows Server 2008/2012/2016/2019/2022
- Windows 11 for ARM64-based/x64-based Systems
- Windows 8.1/RT 8.1
2. 技术背景知识
2.1 UAF (Use After Free)漏洞
- 定义:在堆上动态分配的空间被释放后仍被使用
- 利用关键点:
- free()调用后指针是否被重置
- 后续malloc()是否可能分配到被释放区域
- 利用未被重置的指针进行攻击
2.2 相关数据结构
- HDC:Handle to Device Context,图形设备信息对象的句柄
- PDC对象:打印机设备上下文对象
2.3 C++命名空间
- 用于区分不同库中相同名称的函数、类、变量
- 语法:
namespace namespace_name { // 代码声明 } - 引用:
name::code
3. 漏洞成因分析
3.1 漏洞位置
- 位于
win32kfull!NtGdiResetDC函数中 - 具体问题在
win32kfull!GreResetDCInternal调用win32kbase!hdcOpenDCW时
3.2 漏洞触发流程
NtGdiResetDC调用GreResetDCInternalGreResetDCInternal调用用户态的hdcOpenDCW- 在回调期间,攻击者可对相同句柄再次调用
NtGdiResetDC - 导致PDC对象被释放但仍被使用
3.3 关键代码点
v11+0xAB8:可设置为任意执行函数v11+0x708和(new_dcobj[0] + 6) + 0x708i64:可在用户态修改的参数- 最终导致任意地址读写
4. 漏洞利用技术
4.1 利用准备
- 获取exp自身token对象地址
- 筛选
PoolFlag="ThNm"的堆 - 使用pooltag.txt识别数据类型
- 筛选
4.2 利用步骤
步骤1:Hook打印机驱动回调表
SetupUsermodeCallbackHook()
- 枚举可用打印机并获取驱动信息
- 遍历每个驱动,找到目标函数并修改回调表
步骤2:创建全局DC对象
CreateDC()
- 保存返回的HDC句柄
步骤3:首次调用ResetDC
ResetDC(hDC)
- 触发
NtDgiResetDC和GreResetDCInternal - 获取HDC对应的PDC对象
- 调用
hdcOpenDCW
步骤4:执行Hook函数
- 关键点:
malloc()可能分配到被释放区域free()不会清除内存内容
- 在回调中:
- 设置
globals::should_trigger = true - 再次调用
ResetDC传入相同HDC - 导致PDC对象被释放但结构错误
- 设置
步骤5:完成第二次ResetDC调用
- 执行流程:
_guard_dispatch_icall_nop→jmp raxrax = *(rbx+0xAD0)- RBX来自用户层传入的HDC创建的DCOBJ指针
- 此时PDC对象已被释放但未被检查
- 可实现任意内核函数调用
步骤6:提权操作
- 设置token的0x40位置Privileges
- 为winlogon进程添加
SE_DEBUG_PRIVILEGE权限 - 通过
TheadName泄露内核地址空间 - 调用
RtlSetAllBits设置Fake_RtlBitMapAddr - 通过堆喷射控制内存布局
- 最终实现指针利用和权限提升
4.3 注入技术
- 向winlogon注入启动cmd的shellcode
5. 防御与修复建议
5.1 官方补丁
- 微软已发布补丁,应及时安装
5.2 防御措施
- 监控可疑的ResetDC调用链
- 检测异常的打印机驱动回调修改
- 限制普通用户的设备上下文操作权限