前言
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
![]()
先驗證漏洞是否存在, 打開控制台, 直接執行calc.exe

Calc.exe進程屬於用戶netfairy,然后在轉到Win32.exe所在目錄,,執行Win32.exe calc.exe

再看此時的calc.exe進程,是以SYSTEM權限運行的,所以這個win32.exe在XP SP3 下提權成功.
漏洞分析
粗略分析Win32.exe執行流
在調試機器用OD載入win32.exe並添加參數calc.exe. 程序進入主函數后調用的第一個函數是
![]()
OD對符號的識別不太好,用IDA反匯編這個函數
藍色部分是程序的執行流程。程序先調用
GetVersionExA
獲取系統版本信息,下面就cmp [ebp+VersionInformation.dwMajorVersion], 5 等等進行一系列的比較。所以可以看看出這個函數的作用就是獲取目標系統版本並比較決定是否進行下一步的攻擊。接着main函數調用的第二個函數是
![]()
這個函數有點大,就不全貼出來了。總之這個函數首先調用LoadLibraryA加載ntdll.dll,接着調用GetProcAddress得到QuerySystemInformation地址函數的地址,接着調用LoadLibraryA得到ntkrnlpa.exe的地址,接着調用GetProcAddress得到LookupProcessByProcessId的地址,最后調用GetCurrentProcessId獲得當前進程的PID。
繼續執行,main函數調用的第三個函數是

一開始我就猜想這個函數創建的線程應該就是觸發漏洞提權的用的。因為Main在這之后就是一個CreateProcessA調用,顯然是執行shellcode的。跟進CreateThread看看,這個線程調用函數次序如下:

現在我們還不清楚漏洞是怎么觸發的,繼續往下執行,main函數調用CreateProcessA

通過傳入的命令行參數創建一個新的進程,該進程和win32.exe有相同的權限。如果前面一步提權成功,那么新創建的進程將擁有system權限。總結一下main函數執行流程以及每個函數的作用如下

要分析這個漏洞,只需要分析call ds:CreateThread ; //觸發漏洞,提權 就好。
IDA&&Windbg漏洞詳細分析
靜態分析
先設置加載win32.exe時調試器中斷下來

然后bp $exentry斷在模塊入口點,如圖

但這里不是main函數入口點,繼續單步

這個就是main函數了。然后跟進main函數。下面不一一說。直接來到關鍵函數


繼續往下執行,TrackPopupMenu執行前

TrackPopupMenu執行后

可見是由TrackPopupMenu最終觸發了漏洞,這是從用戶層看到的,下面跟蹤TrackPopupMenu對應的內核函數win32k!xxxTrackPopupMenuEx

1. 在win32k!xxxTrackPopupMenuEx中進行一些列處理后,最終會調用win32k! xxxMNLoop

2. 跟進win32k! xxxMNLoop,函數又會調用win32k!xxxHandleMenuMessages

3. 繼續跟進win32k!xxxHandleMenuMessages,其會事先調win32k! xxxMNFindWindowFromPoint得到win32k! xxxSendMessage需要的菜單窗口對象指針ptagWND,之后再調用win32k! xxxSendMessage給菜單窗口發送消息。
4. 跟進wn32k! xxxMNFindWindowFromPoint,函數首先調用win32k! xxxSendMessage給菜單窗口發送0x1EB(MN_FINDWINDOWFROMPOINT)消息

在應用層,程序調用SetWindowsHookExA安裝了一個一個鈎子類型為4,也就是WH_CALLWNDPROC類型的鈎子(SetWindowsHookExA與鈎子類型見:https://msdn.microsoft.com/en-us/library/ms644990%28VS.85%29.aspx?f=255&MSPPError=-2147217396),應用層會攔截內核發來的0x1EB消息,鈎子處理函數如下

跟進SetWindowLongA處理函數,函數最終會調用EndMenu銷毀菜單窗口並返回0xFFFFFFFB

應用層代碼返回0xFFFFFFFB,執行流返回到內核win32k! xxxMNFindWindowFromPoint上下文

此時的eax應該為0xFFFFFFFB(一會我們調試的時候會看到),函數接着往下執行,最終0xFFFFFFFB會做為win32k! xxxMNFindWindowFromPoint的返回值
5. win32k! xxxMNFindWindowFromPoint執行完返回到win32k!xxxHandleMenuMessages上下文,對於前邊win32k! xxxMNFindWindowFromPoint的返回值0xFFFFFFB,程序沒有嚴格校驗它的返回值ptagWND,導致后邊把0xFFFFFFFB作為ptagWND傳給win32k! xxxSendMessage

而不幸的是win32k! xxxSendMessage又會調用ptagWND+0x60處的函數,也就是
call [0xFFFFFFB+0x60],即call [0x5B]。並且應用層會事先調用ZwAllocateVirtualMemory在0地址分配內存並在0x5B處寫入shelllcode的地址。

最后,結合前面的分析。給出一份直觀的程序流程圖
動態調試
動態調試需要在應用程和內核層同時下斷:
應用層:
004012E2 call dword_40EBCC ; ntdll!ZwAllocateVirtualMemory
004015FE call ds:TrackPopupMenu
![]()
內核層:
BF938E11 call xxxMNFindWindowFromPoint@12
BF9392F6 call xxxSendMessage@16
![]()
其中poi(poi(poi(fs:0x124)+0x44)+0x84)代表當前執行進程的pid(win32.exe的pid為0xba4),要進行pid判斷是否為win32.exe進程,不然調試器老是斷在別的進程。
1. 調用ZwAllocateVirtualMemory前

調用后執行完
004012fb e876050000 call image00400000+0x1876 (00401876)

可以看到0x5b保存了提權的shellcode的 地址
……
00401830 55 push ebp
00401831 8bec mov ebp,esp
00401833 83ec08 sub esp,8
00401836 60 pushad
……
2. 繼續運行到
![]()
控制權轉到內核
3. 轉到內核層,程序斷在win32k! xxxMNFindWindowFromPoint

4. win32k! xxxMNFindWindowFromPoint又會調用win32k! xxxSendMessage
5. 最終win32k! xxxMNFindWindowFromPoint的返回值是0xFFFFFFFB

6. 最終程序會轉到0x5B保存的0x00401830執行

記住,此時處於內核層,所以程序可以執行所有特權指令。當然,你完全可以直接在這里執行shellcode。Win32.exe把提權代碼放到這里,可以把程序的權限提升至system,然后轉到用戶層
004017EE call ds:CreateProcessA
由CreateProcess創建的calc.exe自然也是system權限了。
總結
有對函數返回值進行進一步利用的,如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/


