内核攻防-(3)任意读写驱动漏洞分析及Exp编写
字数 1836 2025-08-22 12:23:30

内核攻防:任意读写驱动漏洞分析及Exp编写

1. HEVD驱动项目介绍

HEVD (HackSys Extreme Vulnerable Driver) 是一个专门设计用于内核漏洞研究和学习的驱动项目,包含多种类型的内核漏洞实现。

项目地址:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver

2. 漏洞分析

2.1 漏洞点定位

通过IDA Pro逆向分析HEVD驱动,可以找到任意读写模块的漏洞点:

  • 关键结构体包含两个可控指针:wherewhat
  • 这两个指针完全由用户控制,没有进行充分的验证

2.2 IOCTL计算

触发漏洞需要正确的IOCTL代码,但直接传入的0x802与逆向出来的IOCTL不同,因为Windows系统对IOCTL进行了规范计算。

IOCTL计算宏展开式解析:

  1. (0x00000022) << 16:设备类型FILE_DEVICE_UNKNOWN为0x22,移位16位后变为0x2200000
  2. (0) << 14:方法为METHOD_NEITHER,移位后值为0
  3. (0x802) << 2:功能代码0x802移位2位后变为0x2008
  4. 3:访问权限FILE_ANY_ACCESS为3

2.3 IDA Pro辅助分析

可以使用IDA Pro插件DriverBuddyReloaded(支持IDA 9.0)来解析IOCTL代码:

  1. DispatchDeviceControl函数下按CTRL+ALT+F
  2. 插件会显示IOCTL代码信息

也可以使用Python脚本枚举0x800-0x900范围内的Function编号,找到目标函数的计算后哈希值。

3. 提权原理

利用内核漏洞进行提权的核心思路:

  1. 通过漏洞获取内核空间的读取权限
  2. 定位PID 4(System进程)对应的_EPROCESS结构体
  3. 提取其中的Token(系统最高权限)
  4. 利用写权限将该Token注入到当前进程
  5. 启动一个以SYSTEM权限运行的命令行(cmd.exe)

4. 关键数据结构

4.1 _SYSTEM_HANDLE

表示系统中的句柄:

typedef struct _SYSTEM_HANDLE {
    ULONG ProcessId;           // 拥有该句柄的进程ID
    UCHAR ObjectTypeNumber;    // 对象类型枚举值
    UCHAR Flags;               // 句柄标志
    USHORT Handle;             // 系统资源句柄值
    PVOID Object;              // 关联对象的指针
    ULONG GrantedAccess;       // 访问权限
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

4.2 _SYSTEM_HANDLE_INFORMATION

包含系统句柄信息:

typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG HandleCount;         // 系统中句柄数量
    SYSTEM_HANDLE Handles[1];  // 句柄数组
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

4.3 _SYSTEM_INFORMATION_CLASS

定义查询系统信息的类别:

typedef enum _SYSTEM_INFORMATION_CLASS {
    SystemHandleInformation = 16  // 请求系统句柄信息
} SYSTEM_INFORMATION_CLASS;

4.4 _WRITE_WHAT_WHERE

描述内存写入操作:

typedef struct _WRITE_WHAT_WHERE {
    PULONG_PTR What;  // 指向要写入数据的指针
    PULONG_PTR Where; // 指向目标内存位置的指针
} WRITE_WHAT_WHERE, *PWRITE_WHAT_WHERE;

5. 任意读写函数实现

5.1 任意写函数

关键代码实现:

payload->What = (PULONG_PTR)&value;  // 要写入的数据地址
payload->Where = (PULONG_PTR)addr;   // 目标地址

重要说明

  • 必须传递value的地址(&value)而不是value本身
  • 驱动中的TriggerArbitraryWrite函数通过*Where = *What执行写入操作

5.2 任意读函数

实现思路与写函数类似,只是方向相反。

6. 获取进程信息

6.1 获取PID 4的Token

  1. 通过NtQuerySystemInformation获取指定PID的基地址
  2. 定位到_EPROCESS结构体中的Token字段

6.2 获取当前进程Token

关键步骤:

  1. 获取当前进程ID:GetCurrentProcessId()
  2. 遍历进程链表查找当前进程
  3. 返回当前进程结构体地址

进程链表遍历代码示例:

do {
    // 读取下一个进程的地址
    next = arbitrary_read(driver, ((uint64_t)current + ActiveProcessLinks_off));
    current = (uint64_t*)(next - ActiveProcessLinks_off);
    
    // 读取当前进程ID
    curPid = arbitrary_read(driver, ((uint64_t)current + UniqueProcessId_off));
    
    if (curPid == pid) {
        found = 1;
        break;
    }
} while (current != SYSTEM);

7. 完整利用流程

  1. 开启HEVD驱动
  2. 运行Exploit程序
  3. Exploit执行以下操作:
    • 打开驱动设备获取句柄
    • 计算正确的IOCTL代码
    • 利用任意读功能查找System进程的Token
    • 利用任意写功能将Token复制到当前进程
    • 启动SYSTEM权限的cmd.exe

8. 相关工具和资源

  1. IDA Pro插件:https://github.com/VoidSec/DriverBuddyReloaded
  2. EPROCESS偏移量项目:https://github.com/I3r1h0n/eprocess_offsets
  3. HEVD驱动项目:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver

9. 注意事项

  1. 内核漏洞利用具有高风险,可能导致系统崩溃
  2. 在实际环境中使用需要充分考虑稳定性和兼容性
  3. 不同Windows版本内核结构可能有所不同
  4. 现代Windows系统有更多防护机制(如KASLR, SMEP等)需要考虑绕过
内核攻防:任意读写驱动漏洞分析及Exp编写 1. HEVD驱动项目介绍 HEVD (HackSys Extreme Vulnerable Driver) 是一个专门设计用于内核漏洞研究和学习的驱动项目,包含多种类型的内核漏洞实现。 项目地址:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver 2. 漏洞分析 2.1 漏洞点定位 通过IDA Pro逆向分析HEVD驱动,可以找到任意读写模块的漏洞点: 关键结构体包含两个可控指针: where 和 what 这两个指针完全由用户控制,没有进行充分的验证 2.2 IOCTL计算 触发漏洞需要正确的IOCTL代码,但直接传入的0x802与逆向出来的IOCTL不同,因为Windows系统对IOCTL进行了规范计算。 IOCTL计算宏展开式解析: (0x00000022) << 16 :设备类型 FILE_DEVICE_UNKNOWN 为0x22,移位16位后变为0x2200000 (0) << 14 :方法为 METHOD_NEITHER ,移位后值为0 (0x802) << 2 :功能代码0x802移位2位后变为0x2008 3 :访问权限 FILE_ANY_ACCESS 为3 2.3 IDA Pro辅助分析 可以使用IDA Pro插件 DriverBuddyReloaded (支持IDA 9.0)来解析IOCTL代码: 在 DispatchDeviceControl 函数下按 CTRL+ALT+F 插件会显示IOCTL代码信息 也可以使用Python脚本枚举0x800-0x900范围内的Function编号,找到目标函数的计算后哈希值。 3. 提权原理 利用内核漏洞进行提权的核心思路: 通过漏洞获取内核空间的读取权限 定位PID 4(System进程)对应的 _EPROCESS 结构体 提取其中的Token(系统最高权限) 利用写权限将该Token注入到当前进程 启动一个以SYSTEM权限运行的命令行(cmd.exe) 4. 关键数据结构 4.1 _ SYSTEM_ HANDLE 表示系统中的句柄: 4.2 _ SYSTEM_ HANDLE_ INFORMATION 包含系统句柄信息: 4.3 _ SYSTEM_ INFORMATION_ CLASS 定义查询系统信息的类别: 4.4 _ WRITE_ WHAT_ WHERE 描述内存写入操作: 5. 任意读写函数实现 5.1 任意写函数 关键代码实现: 重要说明 : 必须传递 value 的地址( &value )而不是 value 本身 驱动中的 TriggerArbitraryWrite 函数通过 *Where = *What 执行写入操作 5.2 任意读函数 实现思路与写函数类似,只是方向相反。 6. 获取进程信息 6.1 获取PID 4的Token 通过 NtQuerySystemInformation 获取指定PID的基地址 定位到 _EPROCESS 结构体中的Token字段 6.2 获取当前进程Token 关键步骤: 获取当前进程ID: GetCurrentProcessId() 遍历进程链表查找当前进程 返回当前进程结构体地址 进程链表遍历代码示例: 7. 完整利用流程 开启HEVD驱动 运行Exploit程序 Exploit执行以下操作: 打开驱动设备获取句柄 计算正确的IOCTL代码 利用任意读功能查找System进程的Token 利用任意写功能将Token复制到当前进程 启动SYSTEM权限的cmd.exe 8. 相关工具和资源 IDA Pro插件:https://github.com/VoidSec/DriverBuddyReloaded EPROCESS偏移量项目:https://github.com/I3r1h0n/eprocess_ offsets HEVD驱动项目:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver 9. 注意事项 内核漏洞利用具有高风险,可能导致系统崩溃 在实际环境中使用需要充分考虑稳定性和兼容性 不同Windows版本内核结构可能有所不同 现代Windows系统有更多防护机制(如KASLR, SMEP等)需要考虑绕过