内核攻防-(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驱动,可以找到任意读写模块的漏洞点:
- 关键结构体包含两个可控指针:
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位后变为0x20083:访问权限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
表示系统中的句柄:
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
- 通过
NtQuerySystemInformation获取指定PID的基地址 - 定位到
_EPROCESS结构体中的Token字段
6.2 获取当前进程Token
关键步骤:
- 获取当前进程ID:
GetCurrentProcessId() - 遍历进程链表查找当前进程
- 返回当前进程结构体地址
进程链表遍历代码示例:
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. 完整利用流程
- 开启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等)需要考虑绕过