一.前言
1.漏洞描述
該漏洞發(fā)生的位置是在驅(qū)動(dòng)文件Win32k.sys中的xxxHandleMenuMessage函數(shù)巡雨,產(chǎn)生的原因是沒有對(duì)該函數(shù)中調(diào)用的xxxMNFindWindowFromPoint函數(shù)的返回值進(jìn)行合法性驗(yàn)證揩抡,直接將其作為參數(shù)傳遞給后面的xxxSendMessage函數(shù)調(diào)用溯革,從而造成了提權(quán)漏洞兄裂。
2.實(shí)驗(yàn)環(huán)境
- 操作系統(tǒng): Win7 x86 sp1 專業(yè)版
- 編譯器: Visual Studio 2017
- 調(diào)試器: IDA Pro爆哑,WinDbg
二.漏洞分析
1.靜態(tài)分析
通過IDA直接查看xxxHandleMenuMessage函數(shù)液茎,可以在其中看到野宜,在該函數(shù)中太防,會(huì)首先調(diào)用xxxMNFindWindowFromPoint函數(shù)肩刃,然后將該函數(shù)的返回值作為第一個(gè)參數(shù)被下面的xxxSendMessage函數(shù)調(diào)用,該函數(shù)會(huì)發(fā)送一個(gè)0xED的消息杏头。
xxxSendMessage函數(shù)是通過調(diào)用xxxSendMessageTimeout函數(shù)來實(shí)現(xiàn)的盈包,而在xxxSendMessageTimeout中會(huì)有如下的代碼:
此時(shí)esi保存的就是xxxSendMessage第一個(gè)參數(shù)的值,也就是說此時(shí)esi=iRet醇王。因此呢燥,如果xxxMNFindWindowFromPoint函數(shù)的返回值為-5的話,那么寓娩,此時(shí)call dword ptr [esi + 0x60]就會(huì)是call dword ptr [-5 + 0x60]叛氨,就等于call dword ptr [0x5B]。此時(shí)棘伴,可以通過在0x5B處保存要執(zhí)行的ShellCode的地址寞埠,那么此處的call dword ptr [esi+0x60]就會(huì)執(zhí)行指定的ShellCode。
而在xxxMNFindWindowFromPoint函數(shù)中焊夸,會(huì)調(diào)用xxxSendMessage來發(fā)送一個(gè)0x1EB的消息仁连。如果xxxSendMessage函數(shù)的返回值非0的話(比如-5),那么該返回值就會(huì)作為xxxMNFindWindowFromPoint函數(shù)的返回值返回回去阱穗。
這里IDA反編譯的結(jié)果出了問題饭冬,在反匯編的代碼中是可以看到使鹅,此處的xxxSendMessage函數(shù)發(fā)送的消息是0x1EB的消息:
2.動(dòng)態(tài)分析
運(yùn)行exp,在xxxMNFindWindowFromPoint函數(shù)發(fā)送消息的地址下斷點(diǎn)
\
中斷以后昌抠,調(diào)用函數(shù)發(fā)送消息患朱,然后查看返回值可以看到此時(shí)的返回值就是-5
繼續(xù)運(yùn)行到xxxMNFindWindowFromPoint函數(shù)返回前,可以看到此時(shí)的返回值為-5
繼續(xù)向下運(yùn)行到xxxSendMessageTimeout調(diào)用函數(shù)處的call dword ptr [esi + 60h]炊苫,可以看到此時(shí)的esi等于-5裁厅,而0x5B保存了要執(zhí)行的ShellCode的地址
繼續(xù)運(yùn)行,就會(huì)運(yùn)行ShellCode的代碼完成提權(quán)
三.漏洞利用
【→所有資源關(guān)注我侨艾,私信回復(fù)“資料”獲取←】
1姐直、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2、電子書籍(白帽子)
3蒋畜、安全大廠內(nèi)部視頻
4声畏、100份src文檔
5、常見安全面試題
6姻成、ctf大賽經(jīng)典題目解析
7插龄、全套工具包
8、應(yīng)急響應(yīng)筆記
想要成功觸發(fā)該漏洞科展,需要使用TrackPopupMenu函數(shù)均牢,該函數(shù)定義如下:
其中第一個(gè)參數(shù)hMenu是一個(gè)pop-up菜單,第六個(gè)參數(shù)hWnd則是擁有該菜單的窗口句柄才睹,因此在exp中要?jiǎng)?chuàng)建好這些窗口徘跪,然后調(diào)用函數(shù)觸發(fā)漏洞:
同時(shí),在主窗口的處理函數(shù)中琅攘,也需要進(jìn)行判斷垮庐。如果窗口處于空閑狀態(tài),需要通過PostMessage函數(shù)來模擬鼠標(biāo)和鍵盤的操作坞琴,這樣才能成功發(fā)送0x1EB的消息來達(dá)到漏洞點(diǎn):
為了讓xxxSendMessage函數(shù)返回-5觸發(fā)漏洞哨查,還需要通過SetWindowHook來加入鉤子函數(shù),
在鉤子函數(shù)中剧辐,攔截0x1EB的消息寒亥,通過SetWindowLongA函數(shù)來修改菜單窗口的屬性。這里的第二個(gè)參數(shù)傳入的是GWL_WNDPROC荧关,意味著修改的是窗口的處理函數(shù)
在窗口處理函數(shù)中溉奕,如果接收的消息是0x1EB的消息,則調(diào)用EndMenu函數(shù)銷毀窗口且返回-5來觸發(fā)漏洞
最后忍啤,由于在xxxSendMessageTimeout中還有如下的驗(yàn)證:
此時(shí)的p就是傳遞的-5加勤,所以在0地址申請(qǐng)內(nèi)存成功以后,除了將0x5B地址的內(nèi)容修改為ShellCode的地址外,還需要將0x3和0x11處的數(shù)據(jù)修改為如下數(shù)據(jù):
四.運(yùn)行結(jié)果
最后在系統(tǒng)上運(yùn)行結(jié)果如下胸竞,可以看到提權(quán)成功欺嗤。