欢迎光临本站!

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞

来源:原创    更新时间:2019-07-31 21:12:48    编辑:星谷下载    浏览:542


前言:

传送门:Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出

这是 Windows kernel exploit 系列的第三部分,这一篇我们介绍任意内存覆盖漏洞,也就是 Write-What-Where 漏洞,和前面一样,看此文章之前你需要有以下准备:
Windows 7 x86 sp1虚拟机

配置好windbg等调试工具,建议配合VirtualKD使用

HEVD+OSR Loader配合构造漏洞环境


漏洞原理

任意内存覆盖漏洞

从 IDA 中我们直接分析HEVD.sys中的TriggerArbitraryOverwrite函数,乍一看没啥毛病,仔细分析发现v1,v2这俩指针都没有验证地址是否有效就直接拿来用了,这是内核态,胡乱引用可是要蓝屏的。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


我们从ArbitraryOverwrite.c源码文件入手,直接定位关键点。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


如果你不清楚ProbeForRead函数的话,这里可以得到很官方的解释(永远记住官方文档是最好的),就是检查用户模式缓冲区是否实际驻留在地址空间的用户部分中,并且正确对齐,相当于检查一块内存是否正确。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


和我们设想的一样,从刚才上面的对比处可以很清楚的看出,在安全的条件下,我们在使用两个指针的时候对指针所指向的地址进行了验证,如果不对地址进行验证,在内核空间中访问到了不该访问的内存那很可能就会蓝屏。

通过这一点我们就可以利用,既然是访问内存,那我们让其访问我们shellcode的位置即可达到提权的效果,那么怎么才能访问到我们的shellcode呢?


漏洞利用

利用原理

控制码

知道了漏洞的原理之后我们开始构造exploit,前面我们通过分析IrpDeviceIoCtlHandler函数可以逆向出每个函数对应的控制码。

然而这个过程我们可以通过分析HackSysExtremeVulnerableDriver.h自己计算出控制码,源码中的定义如下:

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞

下面解释一下如何计算控制码,CTL_CODE这个宏负责创建一个独特的系统I/O(输入输出)控制代码(IOCTL),计算公式如下:

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞

通过python我们就可以计算出控制码(注意对应好位置)。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


因为WRITE_WHAT_WHERE结构如下,一共有8个字节,前四个是 what ,后四个是 where ,所以我们申请一个buf大小为8个字节传入即可用到 what 和 where 指针。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


下面我们来测试一下我们的猜测是否正确。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


在 windbg 中如果不能显示出 dbgprint 中内容的话输入下面的这条命令即可显示。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


我们运行刚才生成的程序,如我们所愿,这里已经成功调用了ArbitraryOverwriteIoctlHandler函数并且修改了 What 和 Where 指针。

当然我们不能只修改成 0x41414141,我们所希望的是把what指针覆盖为shellcode的地址,where指针修改为能指向shellcode地址的指针。

Where & What 指针

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


这里的where指针我们希望能够覆盖到一个安全可靠的地址,我们在windbg中反编译一下NtQueryIntervalProfile+0x62这个位置。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


上面可以发现,0x84159ed6这里会调用到一个函数KeQueryIntervalProfile,我们继续跟进。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


上面的0x840cc438处会有一个指针数组,这里就是我们shellcode需要覆盖的地方,为什么是这个地方呢?这是前人发现的,这个函数在内核中调用的很少,可以安全可靠地覆盖,而不会导致计算机崩溃。

Windows Kernel Exploit 内核漏洞学习 -任意内存覆盖漏洞


对于初学者而言就把这个地方当公式用吧,下面简单看一下HalDispatchTable这个内核服务函数指针表,结构如下:

我们需要很清楚的知道,我们刚才在找什么,我们就是在找where指针的位置,所以我们只需要把where的位置放在HalDispatchTable+0x4处就行了,而what指针我们希望的是存放shellcode的位置。


评论区

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

相关内容

点击排行

随机新闻

评论排行榜