首页
社区
课程
招聘
[原创]Windows Kernel Exploit 内核漏洞学习(1)-UAF
发表于: 2019-6-28 22:28 23353

[原创]Windows Kernel Exploit 内核漏洞学习(1)-UAF

2019-6-28 22:28
23353

最近重新开始了我的Windows内核之旅,这是我总结的Windows kernel exploit系列的第一部分,前一篇我们讲了如何配置环境,这一篇我们开始实战,从简单的UAF入手,为什么第一篇是UAF呢,因为我参考的是wjllz师傅的文章,他写的非常好,这里我记录一下自己的学习过程供大家参考,第一篇我尽量写的详细一些,实验环境是Windows 7 x86 sp1,研究内核漏洞是一件令人兴奋的事情,希望能通过文章遇到更多志同道合的朋友,看此文章之前你需要有以下准备:

首先我们要明白一个道理,运行一个普通的程序在正常情况下是没有系统权限的,但是往往在一些漏洞利用中,我们会想要让一个普通的程序达到很高的权限就比如系统权限,下面做一个实验,我们在虚拟机中用普通权限打开一个cmd然后断下来,用!dml_proc命令查看当前进程的信息

我们可以看到System的地址是 865ce8a8 ,cmd的地址是 87040ca0 ,我们可以通过下面的方式查看地址中的成员信息,这里之所以 +f8 是因为token的位置是在进程偏移为 0xf8 的地方,也就是Value的值,那么什么是token?你可以把它比做等级,不同的权限等级不同,比如系统权限等级是5级(最高),那么普通权限就好比是1级,我们可以通过修改我们的等级达到系统的5级权限,这也就是提权的基本原理,如果我们可以修改进程的token为系统的token,那么就可以提权成功,我们手动操作一次下面是修改前token值的对比

我们通过ed命令修改cmd token的值为system token

whoami命令发现权限已经变成了系统权限

我们将上面的操作变为汇编的形式如下

解释一下上面的代码,fs寄存器在Ring0中指向一个称为KPCR的数据结构,即FS段的起点与 KPCR 结构对齐,而在Ring0中fs寄存器一般为0x30,这样fs:[124h]就指向KPRCB数据结构的第四个字节。由于 KPRCB 结构比较大,在此就不列出来了。查看其数据结构可以看到第四个字节指向CurrentThead(KTHREAD类型)。这样fs:[124h]其实是指向当前线程的_KTHREAD

再来看看_EPROCESS的结构,+0xb8处是进程活动链表,用于储存当前进程的信息,我们通过对它的遍历,可以找到system的token,我们知道system的PID一直是4,通过这一点我们就可以遍历了,遍历到系统token之后替换就行了

如果你是一个pwn选手,那么肯定很清楚UAF的原理,简单的说,Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用。但是其实这里有以下几种情况:

而我们一般所指的 Use After Free 漏洞主要是后两种。此外,我们一般称被释放后没有被设置为 NULL 的内存指针为 dangling pointer。类比Linux的内存管理机制,Windows下的内存申请也是有规律的,我们知道ExAllocatePoolWithTag函数中申请的内存并不是胡乱申请的,操作系统会选择当前大小最合适的空闲堆来存放它。如果你足够细心的话,在源码中你会发现在UseUaFObject中存在g_UseAfterFreeObject->Callback();的片段,如果我们将Callback覆盖为shellcode就可以提权了

如果我们一开始申请堆的大小和UAF中堆的大小相同,那么就可能申请到我们的这块内存,假如我们又提前构造好了这块内存中的数据,那么当最后释放的时候就会指向我们shellcode的位置,从而达到提取的效果。但是这里有个问题,我们电脑中有许许多多的空闲内存,如果我们只构造一块假堆,我们并不能保证刚好能够用到我们的这块内存,所以我们就需要构造很多个这种堆,换句话说就是堆海战术吧,如果你看过0day安全这本书,里面说的堆喷射也就是这个原理。

根据上面我们已经得到提权的代码,相当于我们只有子弹没有枪,这样肯定是不行的,我们首先伪造环境

接下来我们进行堆喷射

你可能会疑惑上面的IO控制码是如何得到的,这是通过逆向分析IrpDeviceIoCtlHandler函数得到的,我们通过DeviceIoControl函数实现对驱动中函数的调用,下面原理相同

如果你不清楚DeviceIoControl函数的话可以参考官方文档

最后我们需要一个函数来调用 cmd 窗口检验我们是否提权成功

上面是主要的代码,详细的代码参考这里,最后提权成功

对于 UseAfterFree 漏洞的修复,如果你看过我写的一篇pwn-UAF入门的话,补丁的修复就很明显了,我们漏洞利用是在 free 掉了对象之后再次对它的引用,如果我们增加一个条件,判断对象是否为空,如果为空则不调用,那么就可以避免 UseAfterFree 的发生,而在FreeUaFObject()函数中指明了安全的措施,我们只需要把g_UseAfterFreeObject置为NULL

下面是在UseUaFObject()函数中的修复方案:

这一篇之后我会继续写windows-kernel-exploit系列2,主要还是研究HEVD中的其他漏洞,类似的UAF漏洞可以参考我研究的2014-4113,最后,吹爆wjllz师傅!

参考链接:

https://rootkits.xyz/blog/2018/04/kernel-use-after-free/

https://redogwu.github.io/2018/11/02/windows-kernel-exploit-part-1/

 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-7-17 10:00 被Thunder J编辑 ,原因: 添加链接
收藏
免费 8
支持
分享
最新回复 (13)
雪    币: 3181
活跃值: (1796)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很好的文章
2019-6-29 10:01
0
雪    币: 3677
活跃值: (3081)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
3
学习了!
2019-6-29 22:39
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主虚拟机里没装编译工具?
2019-6-29 23:28
0
雪    币: 3475
活跃值: (1350)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
petersonhz 楼主虚拟机里没装编译工具?
我是在实体机编译在虚拟机测试的,环境是VS2015
2019-6-30 23:28
0
雪    币: 1725
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
MARK
2019-7-8 09:08
0
雪    币: 635
活跃值: (1016)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
mark
2019-7-8 09:13
0
雪    币: 39
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果把DeviceIoControl里面的第二个参数十六进制转换成宏,会不会更好理解一点?
2019-8-2 10:39
0
雪    币: 3475
活跃值: (1350)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
9
MaxMadcc 如果把DeviceIoControl里面的第二个参数十六进制转换成宏,会不会更好理解一点?
完全可以,我的代码写的有点烂,后面有时间我会改成宏,谢谢建议
2019-8-2 11:33
0
雪    币: 25
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
关注
2019-8-28 10:32
0
雪    币: 973
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
少了池喷射吧。。。
2020-5-20 16:06
0
雪    币: 337
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
kd> e 87fd4b28 8ae01273
WriteVirtual: 87fd4b28 not properly sign extended
为什么我不能修改
2020-10-7 14:45
0
雪    币: 1492
活跃值: (1083)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
tboom kd> e 87fd4b28 8ae01273 WriteVirtual: 87fd4b28 not properly sign extended 为什么我不能修改
已经修改成功了
2021-8-17 11:22
0
雪    币: 65
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
tboom kd> e 87fd4b28 8ae01273 WriteVirtual: 87fd4b28 not properly sign extended 为什么我不能修改
解决了吗?怎么解决?
2023-11-20 10:31
0
游客
登录 | 注册 方可回帖
返回
//