0x00 前言
本篇是HEVD系列的最后一片学习文章,这段时间,通过阅读前人文章,自己分析源码,调试文件,小有收获。
感谢前人的付出与分享,让新手能很快的上手,握爪。
实验环境:Win10专业版+VMware Workstation 15 Pro+Win7 x86 sp1
实验工具:VS2015+Windbg+KmdManager+DbgViewer
0x01 漏洞原理
类型混淆漏洞,顾名思义,通过分析代码逻辑,使得原先不可利用的类型变量或者缓冲区,修改其类型后,变得可以利用。
先来看看漏洞函数:
1 | NTSTATUS TriggerTypeConfusion( |
明显的,可以看到在漏洞函数中,不安全的版本中不恰当地使用了内核结构体联合体,未重新初始化联合体中的callback成员,导致直接默认使用ObjectType的值,当,ObjectType指向恶意代码,则被利用。
1 | typedef struct _KERNEL_TYPE_CONFUSION_OBJECT |
0x02 漏洞利用
核心思路:
Ring3 用户结构体成员objectType赋值为payload地址。
1 | typedef struct _USER_TYPE_CONFUSION_OBJECT { |
DeviceIoControl进入驱动
1 | DeviceIoControl(hFile, |
上面构造的结构体传入驱动程序,驱动程序用申请的_KERNEL_TYPE_CONFUSION_OBJECT结构内存进行接收。
而在处理callback成员时,不进行初始化,当内核中调用callback函数时,则内核执行利用代码。
1 | NTSTATUS |
具体利用代码可参考这里,利用结果如下:
0x03 漏洞反思
安全版本中,提到了及时初始化回调函数成员的方法。
1 | KernelTypeConfusionObject->Callback = &TypeConfusionObjectCallback; |
题外话:最近学习中,刚好看到一个类型混淆的利用,在18-8174中,Vbs脚本里通过精心构造内存,将0x08 BSRT混淆,0x200C,实现内存任意读写,感兴趣的童鞋可以研究下。
0x04 后记
基础部分先到这里啦,后面有新的成果,还会继续分享。继续前进,冲冲冲