freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【原创】2345内核拒绝服务漏洞分析(1)
FreeBuf_27674 2018-07-07 19:41:15 243155
所属地 四川省

概述

已经快2个月了吧,已经忘了是什么原因突然搞起了驱动漏洞,反正就是很有兴致地想挖掘一下驱动漏洞。

在网上了解了基本的驱动漏洞挖掘方法,主要是通过ioctl接口进行挖掘,已经有很多相关fuzz工具了,比如ioctlbfkDriver-Fuzzer等等。

kDriver-Fuzzer的作者k0keoyo在2017年收获了100多个CVE,很牛逼啊,这个已经2018年了,再来挖此种类型的驱动是不是已经晚了啊,心中苦涩啊。

不过毕竟也写了几年驱动程序了,不搞搞怎么也说不过去啊,所以开始干!

初学者嘛,还是找软柿子捏捏,什么微软、卡巴、小红伞、360、管家先还是别想了,很巧的知道了2345安全软件(此处想笑,毕竟为我贡献了不少...),先啥也不管,IDA一番...

很不幸的,没多久2345就被我弄翻了,嗯,听说该公司年代也挺久了,咋这么...

经过俩周手工和工具的连番蹂躏,发现2345安全软件驱动共10多个内核拒绝服务漏洞(某些也许可提权),也第一次感受到了拿CVE的感觉(其实怎么感觉都有点waterwater的)...

好,前言胡扯差不多就到这里了,本系列将拿2345中几个典型的原因造成的安全漏洞进行一番分析,希望对和我一样的初学者有一定帮助。

哦,当然,在连番联系2345客服催促之后,2345终于修复了所有漏洞,所以我才等到这个时候分享文章,分析一些细节应该对他们没什么影响了吧(不过,我可没有所有的都重新验证一遍,申明一下,大家不要拿来干坏事,出事了我概不负责!)

漏洞概况

2345安全软件的驱动2345NetFirewall.sys在ioctl(0x00222014)接口处理中,对输入数据校验不严格,可构造数据中包含非法地址导致访问违例,然后bsod拒绝服务。

漏洞分析

在IRP_MJ_DEVICE_CONTROL处理函数中,对0x222014接口进行处理时如下所示:

img

InputBuf是应用层传入的输入缓存内容,校验InputBuf是否为空,长度是否超过8字节,然后在memcpy位置直接取InputBuf第一个字段(0偏移)作为目标地址拷贝内容进去,这里未校验第一个字段值作为内存地址的合法性。

看到这里是不是有什么邪恶的想法了,把该字段置0,那么memcpy(0, xx, xx)不就bsod了。嗯,有点想多了,2345还是受过一些伤害做过一些自我修复的。

看下面,该段代码有异常处理保护,so,0地址bsod不成了(确认该处在3.6版本时被人法克了的,所以补了一下)。

img

既然0不行,那么其他地址还是可以的嘛,比如某些内核地址0x80000000,或者nt!HalDispatchTable(某些提权方式使用的地址)。

用下面的poc代码尝试了一下,bsod!


ctlcode = 0x222014;

NETFW_IOCTL_222014 buf_222014 = {0};

buf_222014.size = 1;

buf_222014.ptr = (DWORD*)0x80000000; //非法内核地址

if(!DeviceIoControl(h, ctlcode, &buf_222014, sizeof(NETFW_IOCTL_222014), &buf_222014, sizeof(NETFW_IOCTL_222014), &BytesReturned, NULL)) {

printf("[-] DeviceIoControl %x error: %d\n", ctlcode, GetLastError());

}

kd> dd 80000000

80000000  ???????? ???????? ???????? ????????

80000010  ???????? ???????? ???????? ????????

至此,该内核拒绝服务漏洞验证成功,替换未其他内核地址还是有希望提权的,这里不在深入研究。

结语

看完整篇,其实知道该漏洞真的很明显,很弱B是吧。但是基于某些原因(门槛?漏洞价值?),内核驱动这方面受到的关注较少,所以被虐的少了,开发人员重视程度也不够,所以对于参数的校验上就没那么认真严谨了!所以留下了这种弱X的洞洞被我捡漏。

当然,前面提到2345在3.6版本中已经被人干过,所以还是做了一定的工作的,除了加入了异常保护代码,对于ioctl接口调用也加入了一定的限制和校验。所以poc不是直接就调用接口就成功触发bsod的,而做了一定的前期工作来应对2345做的限制和保护。

这里不是重点,大致讲一下。在IRP_MJ_DEVICE_CONTROL处理函数中,首先会校验调用接口的进程是否在缓存的白名单进程中,但是呢2345又提供了ioctl接口来添加进程到白名单中,对该接口也没做什么其他的校验,所以很随意的调用成功,把自己的poc进程加入了白名单中,然后再调用漏洞接口触发bsod,完成!

另外,如果有兴趣也研究一些驱动此类漏洞的,并且对驱动编程不是很了解的,建议可以先简单学习一下简单驱动编写模板、ring3和ring0通信方式、驱动设备等等内容,推荐可以看看《Windows驱动开发技术详解》相关章节内容。

该系列后续会继续分析其他原因引起的漏洞,如有兴趣,敬请期待!

博客原文:https://anhkgg.github.io/vul-2345-1/


# 漏洞 # fuzz # 杀毒软件 # 拒绝服务攻击 # 内核漏洞
本文为 FreeBuf_27674 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
汉客儿
FreeBuf_27674 LV.2
anhkgg.github.io 公众号: 汉客儿
  • 14 文章数
  • 14 关注者
注入技术系列:一个批量验证DLL劫持的工具
2019-11-05
沙箱:概述
2019-10-10
程序员对私密聊天的乱想
2019-09-04