2345內核拒絕服務漏洞(1)

概述

已經快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驅動開發技術詳解》相關章節內容。

該系列後續會繼續分析其他原因引起的漏洞,如有興趣,敬請期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章