CVE-2014-4113_Win32k提权漏洞学习笔记
一.前言
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)成功。
總結(jié)
以上是生活随笔為你收集整理的CVE-2014-4113_Win32k提权漏洞学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【漏洞实战】从信息泄露到内网滲透
- 下一篇: 【网络安全】HTB靶机渗透系列之Snip