首页
社区
课程
招聘
[原创]CVE-2019-1215分析笔记
发表于: 2020-1-31 17:36 10178

[原创]CVE-2019-1215分析笔记

2020-1-31 17:36
10178

CVE-2019-1215是ws2ifsl.sys中的一处UAF漏洞,原POC中,主要通过提前释放+堆喷的方式,修改函数执行流程,造成任意内存写的作用。本文主要基于原POC介绍(https://www.anquanke.com/post/id/196893),进行一些深入的分析。


Windows 10 18362.30 x64


在驱动的DispatchCreate函数中,驱动根据上层传入的字符串,判断初始化的对象类型:

(1)NifsSct初始化SocketFile对象  对应的FSContext为sockedData

(2)NifsPvd初始化ProcessFile对象  对应的FSContext为procData


驱动通过FileObject的FSContext对象,区分对象是SocketFile还是ProcessFile

SocketFile: FSContext前4个字节为硬编码0x6B636F53   对应字符串 'kcoS'

ProcessFile: FSContext前4个字节为硬编码0x636F7250  对应字符串 'corP'

(1)CreateProcessFile函数中的 ProcessFile初始化



(2)CreateSocketFile函数中的 SocketFile初始化

释放的位置在DispatchClose函数中,驱动根据FSContext头4个字节的硬编码内容,分别进行释放操作



在调用CreateProcessFile初始化ProcessFile时,内部会调用InitializeRequestQueue初始化一个APC队列。位置为procData+0x30处


因此procData的主要结构如下,我们的目标,便是在提前释放后利用堆喷,修改KernelRoutine指向我们希望执行的函数(这个函数最好能够进行内存读写的功能)达到利用的目的

每次在向SocketFile下发读写操作时,驱动会调用DoSocketReadWrite函数,DoSocketReadWrite会先通过socketData获取procData,然后调用QueueRequest,最终调用SignalRequest利用procData中的KAPC分发APC。

提前关闭了ProcessFile句柄,会导致procData提前释放。但是在SocketFile如果之前有下发读写操作时,procData中的KAPC结构依然在使用,这样在下一次APC调度的时候,造成UAF。


(1)分配好ProcessFile和SocketFile

(2)提前释放ProcessFile,并往SocketFile中写数据

(3)利用堆喷,占坑PorcessFile释放的位置,其中的关键逻辑是伪造KAPC结构,避免系统检查异常导致蓝屏

(4)调用NtTestAlert强制分发APC,触发任意写,破坏token,之后注入winlogon完成提权。

1.分配好ProcessFile和SocketFile,没什么可说的


在驱动调用CreateProcessHandle初始化完后,procData的结构如下,大小为0x120


注意procData+0x30处的KAPC结构,初始化完毕以后如下。其中的RequestRundownRoutine函数是用来在APC调度完毕后做一些清理操作的函数,如释放DoSocketReadWrite分配的MDL内存,完成R3的IRP请求操作等。QueuedKernelRoutine则是接下来APC分发要调用的函数

2.关闭ProcessFile句柄,并往SocketFile中写数据,之后关闭SocketFile句柄,触发提前释放操作。从堆栈可以看出,其实是因为关闭了socketHandle,间接减少了proHandle的引用计数,触发了内存释放的操作。



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

最后于 2020-2-19 14:47 被我是哥布林编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享,学习了
2020-2-3 21:26
3
雪    币: 5317
活跃值: (3313)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
请问下哪里有POC阅读
2020-2-17 11:56
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
问一下 他这个理 为啥要减去0x48呢
UCHAR payload[0x120 - 0x48]; 是因为CreatePipe创建管道的时候 内部对象结构占用0x48大小字节吗
2020-2-18 08:44
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
.
最后于 2020-2-18 08:45 被killpy编辑 ,原因:
2020-2-18 08:44
0
雪    币: 746
活跃值: (2319)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
killpy 问一下 他这个理 为啥要减去0x48呢 UCHAR payload[0x120 - 0x48]; 是因为CreatePipe创建管道的时候 内部对象结构占用0x48大小字节吗
0x48为  池头部0x10+0x30Pipe头+尾部0x8
2020-2-18 17:20
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
我是哥布林 0x48为 池头部0x10+0x30Pipe头+尾部0x8
管道对象具体结构 你能发一下吗
2020-2-19 05:30
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
我是哥布林 0x48为 池头部0x10+0x30Pipe头+尾部0x8
x = 0xffffffffffffffff; // this is to be written, but it gets changed.. 
memcpy(payload + 0x38, &x, 8);
这段代码有什么用呢
2020-2-19 05:33
0
雪    币: 746
活跃值: (2319)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
killpy x = 0xffffffffffffffff; // this is to&nbsp ...
这段是改KAPC  0x38偏移,也就是NormalContext的,利用里面没有用到这个字段。管道对象具体结构目前没有具体分析。。只是关心它的结构大小对占坑的影响
最后于 2020-2-19 18:23 被我是哥布林编辑 ,原因:
2020-2-19 18:23
0
雪    币: 5317
活跃值: (3313)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
问个比较小白的问题,procData数据结构是怎么查的。。。。
2020-3-6 16:11
0
游客
登录 | 注册 方可回帖
返回
//