概述
已經快2個月了吧,已經忘了是什麼原因突然搞起了驅動漏洞,反正就是很有興致地想挖掘一下驅動漏洞。
在網上了解了基本的驅動漏洞挖掘方法,主要是通過ioctl接口進行挖掘,已經有很多相關fuzz工具了,比如ioctlbf、kDriver-Fuzzer等等。
kDriver-Fuzzer的作者k0keoyo在2017年收穫了100多個CVE,很牛逼啊,這個已經2018年了,再來挖此種類型的驅動是不是已經晚了啊,心中苦澀啊。
不過畢竟也寫了幾年驅動程序了,不搞搞怎麼也說不過去啊,所以開始幹!
初學者嘛,還是找軟柿子捏捏,什麼微軟、卡巴、小紅傘、360、管家先還是別想了,很巧的知道了2345安全軟件(此處想笑,畢竟爲我貢獻了不少…),先啥也不管,IDA一番…
很不幸的,沒多久2345就被我弄翻了,嗯,聽說該公司年代也挺久了,咋這麼…
經過倆周手工和工具的連番蹂躪,發現2345安全軟件驅動共10多個內核拒絕服務漏洞(某些也許可提權),也第一次感受到了拿CVE的感覺(其實怎麼感覺都有點waterwater的)…
好,前言胡扯差不多就到這裏了,本系列將拿2345中幾個典型的原因造成的安全漏洞進行一番分析,希望對和我一樣的初學者有一定幫助。
哦,當然,在連番聯繫2345客服催促之後,2345終於修復了所有漏洞,所以我纔等到這個時候分享文章,分析一些細節應該對他們沒什麼影響了吧(不過,我可沒有所有的都重新驗證一遍,申明一下,大家不要拿來幹壞事,出事了我概不負責!)
漏洞概況
- 軟件網址:http://safe.2345.cc/
- 版本:v3.7 X86
2345安全軟件的驅動2345NetFirewall.sys在ioctl(0x00222014)接口處理中,對輸入數據校驗不嚴格,可構造數據中包含非法地址導致訪問違例,然後bsod拒絕服務。
漏洞分析
在IRP_MJ_DEVICE_CONTROL處理函數中,對0x222014接口進行處理時如下所示:
InputBuf
是應用層傳入的輸入緩存內容,校驗InputBuf
是否爲空,長度是否超過8字節,然後在memcpy
位置直接取InputBuf
第一個字段(0偏移)作爲目標地址拷貝內容進去,這裏未校驗第一個字段值作爲內存地址的合法性。
看到這裏是不是有什麼邪惡的想法了,把該字段置0,那麼memcpy(0, xx, xx)
不就bsod了。嗯,有點想多了,2345還是受過一些傷害做過一些自我修復的。
看下面,該段代碼有異常處理保護,so,0地址bsod不成了(確認該處在3.6版本時被人法克了的,所以補了一下)。
既然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驅動開發技術詳解》相關章節內容。
該系列後續會繼續分析其他原因引起的漏洞,如有興趣,敬請期待!