CVE-2014-4113本地提權測試


CVE-2014-4113本地提權漏洞分析
By Netfairy

前言

2014年10月14日, Crowdstrike和FireEye發表了一篇文章, 描述了一個新的針對Windows的提權漏洞. Crowdstrike的文章表明:這一新漏洞是在追蹤一個高度先進攻擊團隊颶風熊貓(HURRICANE PANDA)發現的, 這之前, 颶風熊貓利用此漏洞進行攻擊已至少五個月了.原文http://www.crowdstrike.com/blog/crowdstrike-discovers-use-64-bit-zero-day-privilege-escalation-exploit-cve-2014-4113-hurricane-panda/. 通用漏洞發布平台隨后披露了這個漏洞的部分細節, 該漏洞的CVE編號為CVE-2014-4113. 報告指出:Microsoft Windows下的 win32k.sys是Windows子系統的內核部分,是一個內核模式設備驅動程序,它包含有窗口管理器、后者控制窗口顯示和管理屏幕輸出等。如果Windows內核模式驅動程序不正確地處理內存中的對象,則存在一個特權提升漏洞。成功利用此漏洞的攻擊者可以運行內核模式中的任意代碼。攻擊者隨后可安裝程序;查看、更改或刪除數據;或者創建擁有完全管理權限的新帳戶。

 

環境
操作系統:windows XP SP3
漏洞文件:Win32k.sys 5.1.2600.6514
調試器:Windbg 6.11.1.404 && Olldbg &&IDA6.6
漏洞驗證
我在網上拿到了POC, 這個POC包含了兩個文件:Win32.exe和Win64.exe
 image1.png
先驗證漏洞是否存在, 打開控制台, 直接執行calc.exe
 image2.png
Calc.exe進程屬於用戶netfairy,然后在轉到Win32.exe所在目錄,,執行Win32.exe calc.exe
 image3.png

再看此時的calc.exe進程,是以SYSTEM權限運行的,所以這個win32.exe在XP SP3 下提權成功.

 

漏洞分析
粗略分析Win32.exe執行流
在調試機器用OD載入win32.exe並添加參數calc.exe. 程序進入主函數后調用的第一個函數是
 image4.png
OD對符號的識別不太好,用IDA反匯編這個函數
image5.png 
藍色部分是程序的執行流程。程序先調用
GetVersionExA
獲取系統版本信息,下面就cmp     [ebp+VersionInformation.dwMajorVersion], 5 等等進行一系列的比較。所以可以看看出這個函數的作用就是獲取目標系統版本並比較決定是否進行下一步的攻擊。接着main函數調用的第二個函數是
 image6.png
這個函數有點大,就不全貼出來了。總之這個函數首先調用LoadLibraryA加載ntdll.dll,接着調用GetProcAddress得到QuerySystemInformation地址函數的地址,接着調用LoadLibraryA得到ntkrnlpa.exe的地址,接着調用GetProcAddress得到LookupProcessByProcessId的地址,最后調用GetCurrentProcessId獲得當前進程的PID。
繼續執行,main函數調用的第三個函數是
 image7.png
一開始我就猜想這個函數創建的線程應該就是觸發漏洞提權的用的。因為Main在這之后就是一個CreateProcessA調用,顯然是執行shellcode的。跟進CreateThread看看,這個線程調用函數次序如下:
 image8.png
現在我們還不清楚漏洞是怎么觸發的,繼續往下執行,main函數調用CreateProcessA
 image9.png
通過傳入的命令行參數創建一個新的進程,該進程和win32.exe有相同的權限。如果前面一步提權成功,那么新創建的進程將擁有system權限。總結一下main函數執行流程以及每個函數的作用如下
 image10.png

要分析這個漏洞,只需要分析call    ds:CreateThread ; //觸發漏洞,提權 就好。

 

IDA&&Windbg漏洞詳細分析
靜態分析
先設置加載win32.exe時調試器中斷下來
 image11.png
然后bp $exentry斷在模塊入口點,如圖
 image12.png
但這里不是main函數入口點,繼續單步
 image13.png
這個就是main函數了。然后跟進main函數。下面不一一說。直接來到關鍵函數
 image14.png
 image15.png
繼續往下執行,TrackPopupMenu執行前
 image16.png
TrackPopupMenu執行后
 image17.png
可見是由TrackPopupMenu最終觸發了漏洞,這是從用戶層看到的,下面跟蹤TrackPopupMenu對應的內核函數win32k!xxxTrackPopupMenuEx
 image18.png
1. 在win32k!xxxTrackPopupMenuEx中進行一些列處理后,最終會調用win32k! xxxMNLoop
 image19.png
2. 跟進win32k! xxxMNLoop,函數又會調用win32k!xxxHandleMenuMessages
 image20.png
3. 繼續跟進win32k!xxxHandleMenuMessages,其會事先調win32k! xxxMNFindWindowFromPoint得到win32k! xxxSendMessage需要的菜單窗口對象指針ptagWND,之后再調用win32k! xxxSendMessage給菜單窗口發送消息。
4. 跟進wn32k! xxxMNFindWindowFromPoint,函數首先調用win32k! xxxSendMessage給菜單窗口發送0x1EB(MN_FINDWINDOWFROMPOINT)消息
 image21.png
在應用層,程序調用SetWindowsHookExA安裝了一個一個鈎子類型為4,也就是WH_CALLWNDPROC類型的鈎子(SetWindowsHookExA與鈎子類型見:https://msdn.microsoft.com/en-us/library/ms644990%28VS.85%29.aspx?f=255&MSPPError=-2147217396),應用層會攔截內核發來的0x1EB消息,鈎子處理函數如下
 image22.png
跟進SetWindowLongA處理函數,函數最終會調用EndMenu銷毀菜單窗口並返回0xFFFFFFFB
 image23.png
應用層代碼返回0xFFFFFFFB,執行流返回到內核win32k! xxxMNFindWindowFromPoint上下文
 image24.png
此時的eax應該為0xFFFFFFFB(一會我們調試的時候會看到),函數接着往下執行,最終0xFFFFFFFB會做為win32k! xxxMNFindWindowFromPoint的返回值
5. win32k! xxxMNFindWindowFromPoint執行完返回到win32k!xxxHandleMenuMessages上下文,對於前邊win32k! xxxMNFindWindowFromPoint的返回值0xFFFFFFB,程序沒有嚴格校驗它的返回值ptagWND,導致后邊把0xFFFFFFFB作為ptagWND傳給win32k! xxxSendMessage
 image25.png
而不幸的是win32k! xxxSendMessage又會調用ptagWND+0x60處的函數,也就是
call [0xFFFFFFB+0x60],即call [0x5B]。並且應用層會事先調用ZwAllocateVirtualMemory在0地址分配內存並在0x5B處寫入shelllcode的地址。
 image26.png
最后,結合前面的分析。給出一份直觀的程序流程圖

image27.png 

 

動態調試
動態調試需要在應用程和內核層同時下斷:
應用層:
004012E2 call    dword_40EBCC    ; ntdll!ZwAllocateVirtualMemory
004015FE call    ds:TrackPopupMenu
 image28.png
內核層:
BF938E11 call    xxxMNFindWindowFromPoint@12
BF9392F6 call    xxxSendMessage@16
 image29.png
其中poi(poi(poi(fs:0x124)+0x44)+0x84)代表當前執行進程的pid(win32.exe的pid為0xba4),要進行pid判斷是否為win32.exe進程,不然調試器老是斷在別的進程。
1. 調用ZwAllocateVirtualMemory前
 image30.png
調用后執行完
004012fb e876050000      call    image00400000+0x1876 (00401876)
 image31.png
可以看到0x5b保存了提權的shellcode的 地址
……
00401830 55              push    ebp
00401831 8bec            mov     ebp,esp
00401833 83ec08          sub     esp,8
00401836 60              pushad
……
2. 繼續運行到
 image32.png
控制權轉到內核
3. 轉到內核層,程序斷在win32k! xxxMNFindWindowFromPoint
 image33.png
4. win32k! xxxMNFindWindowFromPoint又會調用win32k! xxxSendMessage
image34.png
 
5. 最終win32k! xxxMNFindWindowFromPoint的返回值是0xFFFFFFFB
 image35.png
6. 最終程序會轉到0x5B保存的0x00401830執行
 image36.png
記住,此時處於內核層,所以程序可以執行所有特權指令。當然,你完全可以直接在這里執行shellcode。Win32.exe把提權代碼放到這里,可以把程序的權限提升至system,然后轉到用戶層
004017EE call    ds:CreateProcessA  
由CreateProcess創建的calc.exe自然也是system權限了。

 image37.png

 

總結

有對函數返回值進行進一步利用的,如call [retn+0xXX],一定要嚴格校驗返回值。以免攻擊者構造惡意的代碼控制返回值,進行進一步的漏洞利用。

 

參考
Windows內核提權漏洞CVE-2014-4113分析報告:http://drops.wooyun.org/papers/3324
CVE-2014-4113漏洞利用過程分析:http://drops.wooyun.org/papers/3331

CrowdStrike Discovers Use of 64-bit Zero-Day Privilege Escalation Exploit (CVE-2014-4113):http://www.crowdstrike.com/blog/crowdstrike-discovers-use-64-bit-zero-day-privilege-escalation-exploit-cve-2014-4113-hurricane-panda/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM