CVE-2014-4113_Win32k提权漏洞学习笔记
一.前言
1.漏洞描述
該漏洞發生的位置是在驅動文件Win32k.sys中的xxxHandleMenuMessage函數,產生的原因是沒有對該函數中調用的xxxMNFindWindowFromPoint函數的返回值進行合法性驗證,直接將其作為參數傳遞給后面的xxxSendMessage函數調用,從而造成了提權漏洞。
2.實驗環境
- 操作系統: Win7 x86 sp1 專業版
- 編譯器: Visual Studio 2017
- 調試器: IDA Pro,WinDbg
二.漏洞分析
1.靜態分析
通過IDA直接查看xxxHandleMenuMessage函數,可以在其中看到,在該函數中,會首先調用xxxMNFindWindowFromPoint函數,然后將該函數的返回值作為第一個參數被下面的xxxSendMessage函數調用,該函數會發送一個0xED的消息。
xxxSendMessage函數是通過調用xxxSendMessageTimeout函數來實現的,而在xxxSendMessageTimeout中會有如下的代碼:
此時esi保存的就是xxxSendMessage第一個參數的值,也就是說此時esi=iRet。因此,如果xxxMNFindWindowFromPoint函數的返回值為-5的話,那么,此時call dword ptr [esi + 0x60]就會是call dword ptr [-5 + 0x60],就等于call dword ptr [0x5B]。此時,可以通過在0x5B處保存要執行的ShellCode的地址,那么此處的call dword ptr [esi+0x60]就會執行指定的ShellCode。
而在xxxMNFindWindowFromPoint函數中,會調用xxxSendMessage來發送一個0x1EB的消息。如果xxxSendMessage函數的返回值非0的話(比如-5),那么該返回值就會作為xxxMNFindWindowFromPoint函數的返回值返回回去。
這里IDA反編譯的結果出了問題,在反匯編的代碼中是可以看到,此處的xxxSendMessage函數發送的消息是0x1EB的消息:
2.動態分析
運行exp,在xxxMNFindWindowFromPoint函數發送消息的地址下斷點
\
中斷以后,調用函數發送消息,然后查看返回值可以看到此時的返回值就是-5
繼續運行到xxxMNFindWindowFromPoint函數返回前,可以看到此時的返回值為-5
繼續向下運行到xxxSendMessageTimeout調用函數處的call dword ptr [esi + 60h],可以看到此時的esi等于-5,而0x5B保存了要執行的ShellCode的地址
繼續運行,就會運行ShellCode的代碼完成提權
三.漏洞利用
【→所有資源關注我,私信回復“資料”獲取←】
1、網絡安全學習路線
2、電子書籍(白帽子)
3、安全大廠內部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經典題目解析
7、全套工具包
8、應急響應筆記
想要成功觸發該漏洞,需要使用TrackPopupMenu函數,該函數定義如下:
其中第一個參數hMenu是一個pop-up菜單,第六個參數hWnd則是擁有該菜單的窗口句柄,因此在exp中要創建好這些窗口,然后調用函數觸發漏洞:
同時,在主窗口的處理函數中,也需要進行判斷。如果窗口處于空閑狀態,需要通過PostMessage函數來模擬鼠標和鍵盤的操作,這樣才能成功發送0x1EB的消息來達到漏洞點:
為了讓xxxSendMessage函數返回-5觸發漏洞,還需要通過SetWindowHook來加入鉤子函數,
在鉤子函數中,攔截0x1EB的消息,通過SetWindowLongA函數來修改菜單窗口的屬性。這里的第二個參數傳入的是GWL_WNDPROC,意味著修改的是窗口的處理函數
在窗口處理函數中,如果接收的消息是0x1EB的消息,則調用EndMenu函數銷毀窗口且返回-5來觸發漏洞
最后,由于在xxxSendMessageTimeout中還有如下的驗證:
此時的p就是傳遞的-5,所以在0地址申請內存成功以后,除了將0x5B地址的內容修改為ShellCode的地址外,還需要將0x3和0x11處的數據修改為如下數據:
四.運行結果
最后在系統上運行結果如下,可以看到提權成功。
總結
以上是生活随笔為你收集整理的CVE-2014-4113_Win32k提权漏洞学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【漏洞实战】从信息泄露到内网滲透
- 下一篇: 【网络安全】HTB靶机渗透系列之Snip