「内核对抗」gdrv.sys驱动漏洞分析
2023-11-10 10:0:59 Author: 黑客在思考(查看原文) 阅读量:28 收藏

    驱动程序是内核模式下的一个对象,当处于用户模式下时,需要一些中间方式来与驱动程序交互。为了做到这一点,需要看看它DEVICE_OBJECT是如何创建的。DEVICE_OBJECT通常有一个引用它的符号链接,允许客户端与驱动程序交互。该对象是客户端与之交互的对象。

    可以使用 IDA 来定位符号链接的名称。该DriverEntry函数类似于main()内核模式驱动程序中的函数。此外,DriverEntry函数原型化为接受指向 DEVICE_OBJECT的指针,查看DEVICE_OBJECT的Microsoft 文档,我们可以看到该结构的成员之一是指向DEVICE_OBJECT 的指针。


首先用Ghidra打开存在漏洞的驱动程序gdrv.sys(CVE-2018-19320),定位到入口点entry


\Device\GIO字符串用于调用来IoCreateDevice创建DEVICE_OBJECT


Entry中生成设备对象以及生成符号链接后,其中主要有两个设备控制请求


对应驱动代码类似于:

DriverObject->MajorFunction[IRP_MJ_XXX]

FUN_00012d10中,当IOCTL的值为0xC3502808IOCTL的也就是CTL_CODE这个宏,它用来定义三环的DeviceIoControl这个API的第二个参数


IOCTL的值为0xC3502808的时候,进入FUN_00012860


看到这个就是一个内存拷贝的操作,所有我们利用这个0xC3502808操作码,即可在三环和此漏洞驱动通信,达到任意内存读写的效果。

当然这个驱动程序现在已被众多杀软标记,但是结合ida、Ghidra等反编译工具以及gdrv-loader这个利用代码来学习驱动的加载、r3和驱动通信、定位DSE、关闭DSE等利用手法和机制是非常有学习价值的,具体的漏洞利用这个代码里非常清楚,包括了如何定位DSE,然后关闭和恢复,这种方式因为PG的存在可能会导致BSOD

gdrv-loader:https://github.com/v1k1ngfr/gdrv-loader/

这种老生常谈的vuln driver利用方式有:

  • 可以用来Disable DSE,从而达到加载自己未签名驱动的效果。

  • 还可以用来Disable Callback,从而屏蔽监控。


具体更多资料可以参考星球内资料学习:

关于驱动类资料随便截几张图展示(当然星球内驱动利用相关知识只是冰山一角

加入链接


文章来源: http://mp.weixin.qq.com/s?__biz=MzI5NzU0MTc5Mg==&mid=2247484928&idx=1&sn=181f076697f8c90fd0c55e6907e76736&chksm=ecb2cfcfdbc546d9f40f6131ec8474d97416f883ab605f8e2d295ee16bae123a66307c1244fb&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh