-
-
[原创]Windows Kernel Exploit 内核漏洞学习(5)-空指针解引用
-
发表于: 2019-7-23 13:50 7196
-
这是 Windows kernel exploit 系列的第五部分,前一篇我们讲了池溢出漏洞,这一篇我们讲空指针解引用,这篇和上篇比起来就很简单了,话不多说,进入正题,看此文章之前你需要有以下准备:
传送门:
[+] Windows Kernel Exploit 内核漏洞学习(0)-环境安装
[+] Windows Kernel Exploit 内核漏洞学习(1)-UAF
[+] Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出
[+] Windows Kernel Exploit 内核漏洞学习(3)-任意内存覆盖漏洞
[+] Windows Kernel Exploit 内核漏洞学习(4)-池溢出
我们还是先用IDA分析HEVD.sys
,大概看一下函数的流程,函数首先验证了我们传入UserBuffer
是否在用户模式下,然后申请了一块池,打印了池的一些属性之后判断UserValue
是否等于一个数值,相等则打印一些NullPointerDereference
的属性,不相等则将它释放并且置为NULL,但是下面没有做任何检验就直接引用了NullPointerDereference->Callback();
这显然是不行,的当一个指针的值为空时,却被调用指向某一块内存地址时,就产生了空指针引用漏洞
我们从源码NullPointerDereference.c
查看一下防护措施,安全的操作对NullPointerDereference
是否为NULL进行了检验,其实我们可以联想到上一篇的内容,既然是要引用0页内存,那都不用我们自己写触发了,直接构造好0页内存调用这个问题函数就行了
我们还是从控制码入手,在HackSysExtremeVulnerableDriver.h
中定位到相应的定义
然后我们用python计算一下控制码
我们验证一下我们的代码,我们先传入 buf = 0xBAD0B0B0 观察,构造如下代码
如我们所愿,这里因为 UserValue = 0xBAD0B0B0 所以打印了NullPointerDereference
的一些信息
我们还是用前面的方法申请到零页内存,只是我们这里需要修改shellcode指针放置的位置
shellcode还是注意需要堆栈的平衡,不然可能就会蓝屏,有趣的是,我在不同的地方测试的效果不一样,也就是说在运行exp之前虚拟机的状态不一样的话,可能效果会不一样(这一点我深有体会)
最后我们整合一下代码就可以提权了,总结一下步骤
提权效果如下,详细的代码参考这里
这个漏洞相对上一个算是很简单的了,上一个漏洞如果你很清楚的话这一个做起来就会很快,如果要学习相应的CVE可以参考CVE-2018-8120
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!