作者:紅雨滴團隊
原文鏈接:https://mp.weixin.qq.com/s/6mT0O9eur5-VEs0rbV0-mg

概述

APT 攻擊(Advanced Persistend Thread,高級持續性威脅)是利用先進的攻擊手段對特定的目標進行長期持續性網絡攻擊的攻擊形式。APT 攻擊形式相對于其他攻擊形式更為高級和先進,其高級性主要體現在精準的信息收集、高度的隱蔽性以及針對于各種復雜系統或應用程序的漏洞利用等方面。

為了更加全面的理解漏洞在APT 攻擊中所扮演的角色。奇安信威脅情報中心紅雨滴團隊聚焦于部分真實APT 攻擊活動中所使用的各類Windows系統本地提權漏洞,簡要分析這些漏洞原理、利用方式。

在本報告中,奇安信威脅情報中心會以Windows權限提升漏洞作為論述主體,通過研究這些提權漏洞在APT 攻擊活動中所扮演的角色并對漏洞威脅性做出簡單評定。

最后,基于之前章節的分析和闡述,我們針對APT 組織使用漏洞發展趨勢進行總結并提出一些預防建議。由于所涉及到的APT 攻擊活動數量較多,且所涉及的APT 活動中使用的提權漏洞也存在一定的重復性,所以本報告以其中影響較大、知名度較高的幾次攻擊事件為例進行分析介紹。

漏洞、CVE以及本地提權漏洞(LPE)

漏洞通常指計算機系統安全方面的缺陷,使得系統或其他應用數據的保密性、完整性、可用性、訪問控制等方面面臨威脅。這里的計算機系統既包括軟件系統如操作系統、應用軟件,又包括硬件。本文所指系統特指Windows 操作系統。

CVE 是通用漏洞披露(Common Vulnerabilities and Exposures)的簡寫,是指代已經公開披露的各種計算機安全漏洞,由 MITRE corporation 監管。我們通常談論的CVE 指的是分配給每個安全漏洞的CVE ID 編號,該變化由CAN(CVE 編號管理機構分配)。本文提及漏洞皆存在對應的CVE 記錄。

而計算機安全漏洞主要分為拒絕服務、代碼執行、內存溢出、特權獲取、信息泄露、SQL 注入等等,本文著重描述Windows權限提升漏洞,也即本地提權漏洞(Local privilege escalation,簡稱LPE)。

01

摩訶草APT組織以巴基斯坦空軍演習為誘餌展開攻擊活動

相關活動概要

摩訶草APT組織(APT-C-09)在2021年1月左右以巴基斯坦空軍演習為誘餌文檔發起的攻擊活動中,通過惡意文檔釋放FakeJLI后門,嘗試在特殊目錄下創建文件并刪除以檢查是否處于office沙箱保護模式下,并根據判斷結果選擇是否進行提權操作。

如果當前惡意進程屬于WOW64進程,則使用CVE-2016-7255進行提權,反之則使用CVE-2019-0808 進行提權。以下是對兩個漏洞的技術細節分析介紹。

CVE-2016-7255

漏洞概述

2016年12月2日,谷歌研究員在對Pawn Storm 間諜組織實施的攻擊活動研究中發現了一個內核提權漏洞,并在披露漏洞后的短時間內微軟發布系統安全更新。該漏洞被多個APT 組織在攻擊活動中使用。

CVE-2016-7255 是由于win32k!xxxNextWindow 函數未對win32k!tagWND對象內成員有效性就行檢測,導致可以構造內核空間任意地址寫,最終實現本地提權。

漏洞原理

CVE-2016-7255 漏洞是由于內核函數win32k!xxxNextWindow 函數對win32k!tagWND 對象內成員有效性未做判斷,導致攻擊者可以利用惡意構造的對象實現對內核任意地址寫入數據。

通過對比補丁前后的代碼變化,可以發現在win32k!xxxNextWindow 函數的流程中,出現了一處對比代碼的變化。

圖片

通過對比補丁前后win32k.sys 文件的反編譯版本可以發現這里主要增加了對于(_BYTE )(pwndActivateNext + 0x37) & 0xC0) != 0x40的參數驗證。

圖片

通過分析得知,此處的pwndActivateNext 是通過GetNextQueueWindow 函數返回,該函數原型如下。

圖片

函數返回應該PWND 值,該值為tagWND 結構指針,通過前文中補丁對比可知,在函數win32k!xxxNextWindow 內會對該對象+0xC0 處的值進行校驗,通過windbg 可知該處的成員為spmenu,是一個tagMENU 結構對象。由于未對該處的值有效性進行檢測,導致此處的值可以通過SetWindowLongPtr 函數進行控制。

圖片

漏洞利用

通過分析發現,該漏洞只能修改一位,而不能實現任意地址寫入,所以利用對PML4的自引用地址的值進行與0x4 異或修改訪問權限實現用戶層對內核層的讀寫,之后通過覆蓋haldispatchtable+offset處的代碼為shellcode以實現劫持,最后調用NtQueryIntervalProfile 方法實現內核態shellcode 執行以替換當前進程TOKEN 為SYSTEM TOKEN 值實現提權。

CVE-2019-0808

漏洞概述

2019年3月7日,谷歌威脅分析小組披露了兩個0-day 漏洞,其中包括CVE-2019-0808。據微軟稱,CVE-2019-0808 漏洞允許攻擊者提升本地權限并在內核模式下執行任意代碼。谷歌表示該漏洞只影響Windows 7 和Windows Server 2008 系統版本,同時該漏洞結合Chrome RCE(CVE-2019-5786)已經被應用于真實的APT攻擊中。

CVE-2019-0808 產生的原因是在函數win32k!xxxMNFindWindowFromPoint 接收到窗口過程函數返回的菜單窗口對象后,對于win32!tagPOPUPMENU 對象成員未做有效性檢測,導致可能存在對象成員為空的情況,進而導致在win32k!xxxMNUpdateDraggingInfo 函數內觸發零指針解引用異常。

漏洞原理

通過目前網絡上的資料不難知道,該漏洞產生的原因是win32k.sys 內部函數xxxMNFindWindowFromPoint對tagPOPUPMENU 對象成員有效性判斷不足導致后續代碼出現空指針解引用異常觸發漏洞。通過在測試主機(windows 7 sp1)執行POC 文件觸發Crash 并查看調用堆棧如下:

圖片

不難看出當執行到win32k!xxxMNUpdateDraggingInfo+0x9e 處時,產生了異常,定位此處,發現是對rdx+0x34 處地址訪問時產生。

圖片

通過查看堆棧調用,觸發漏洞的大致函數執行流程如下:

圖片

通過以上的調試,基本知曉了POC 的編寫邏輯及基本的漏洞成因。此處使用的POC 代碼由ze0r 編寫并開源于github。

通過分析POC 源碼,可知漏洞觸發流程大致如下:

第一步:創建兩個菜單對象hMenuRoot 和hMenuSub 并將其設置為無模式,即當菜單處于活動狀態時,無菜單模式消息循環。并且將hMenuRoot 設置為主下拉菜單,hMenuSub 設置為其子菜單。

第二步:設置上述菜單信息使之具有拖拽功能。

第三步:設置全局鉤子消息以攔截WM_MN_FINDMENUWINDOWFROMPOINT 消息,該消息由xxxMNFindWindowFromPoint 函數發出。

第四步:通過調用NtUserMNDragOver 函數進入漏洞觸發流程。

第五步:當進入到NtUserMNDragOver 函數內后,就開始上面圖示的流程執行,程序流執行到win32k!xxxMNMouseMove 函數內,會調用win32k!xxxMNFindWindowsFromPoint 函數用于確定鼠標位于哪個窗口,在該函數內會發送MN_FINDMENUWINDOWFROMPOINT 消息事件,由于在第三步設置了全局鉤子攔截該消息事件,所以程序流回到用戶層代碼會進入到HOOK 函數POC!WindowHookProc() 內,通過SetWindowsLongPtr 函數為菜單窗口設置一個新的窗口過程函數,并在函數內部返回我們構造的hWndFakeMenu。

第六步:在第五步執行完成后,xxxMNFindWindowFromPoint 函數獲取窗口句柄并傳入窗口對象xxxMNUpdateDraggingInfo內,但是此時的對象已經是我們偽造的hWndFakeMenu 對象,并且該對象多數成員值為0,造成代碼異常。

通過上述對POC 的分析,可以將上面漏洞觸發流程進一步細化為下圖:

圖片

漏洞利用

通過上述對漏洞產生原因及觸發的調試,我們來看看該漏洞是如何進行利用的。由上述可知,該漏洞產生的原因是空指針解引用,所以利用該漏洞首先是解決空指針異常。在Windows 7 系統版本的計算機上,解決空指針異常可以使用NtAllocateVirtualMemory 函數來分配零頁內存。

之后需要讓程序執行流程進入到if 分支中,需要對零頁地址數據進行構造。

圖片

此處代碼實際上是MNGetpItem 方法,該方法傳入兩個參數,分別是tagPOPUPMENU 結構指針和UINT 類型的索引值,該值為uDraggingIndex,表示當前正在拖動的項的索引值。通過資料查詢,該值可以從tagMSG 的wParam 獲取,所以我們可以在用戶層設置此處的值。

將此處的值進行修改并進入到if 分支,通過分析后續流程,我們定位到xxxMNSetGapState 函數,在改函數內調用了類似于MNGetpItem 函數,在上述分析中可以知道該函數的返回值是可以由用戶層控制的,所以利用這一點可以實現任意地址與下面的0x40000000 的值進行或運算。

圖片

有了上述的基礎,我們可以利用內核地址泄露和窗口對象噴射技術通過尋找兩個內存位置相鄰的對象,修改窗口對象附加長度的值為0x400000000,并再次修改第二個窗口對象的strName.Buffer 指針,最后設置strName 的方式實現任意地址寫。

寫入shellcode 后利用tagWND. bServerSideWindowProc字段置位實現窗口過程函數在內核模式下執行,實現提權。

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0808

http://www.bjnorthway.com/856/

https://ti.qianxin.com/blog/articles/Summary-and-analysis-of-APT-attack-activities-in-South-Asia-in-January-2021/

02

蔓靈花APT組織在針對國內攻擊活動中使用Windoows內核提權0 day漏洞

相關活動概要

2020年12月中旬國內某安全廠商披露了蔓靈花(又名Bitter)針對國內科研機構、政府部門發起的APT 活動,并在此次分析中發現了一個使用未知Windows 內核提權漏洞進行本地提權的惡意組件。以下是對該漏洞的技術細節分析介紹。

CVE-2021-1732

漏洞概述

CVE-2021-1732于2021年2月蔓靈花針對國內科研機構及政府部門的攻擊活動中首次被發現,該漏洞利用Windows 操作系統win32k 內核模塊一處用戶態回調干擾函數正常執行流程,并在可控流程內篡改窗口對象數據造成后續代碼執行異常,從而觸發漏洞。

漏洞原理

CVE-2021-1732 漏洞位于win32kfull.sys 內,當win32kfull! xxxCreateWindowEx 函數回調xxxClientAllocWindowsClassExtraBytes時進行干預,通過混淆console 窗口和普通窗口,使得回調函數返回內核態執行時觸發內核對象越界訪問。

正常情況下,窗口的創建過程如圖所示:

圖片

用戶調用CreateWindowsEx 函數并逐步向下執行,通過系統調用機制由用戶態進入內核態,并逐層向下,當窗口對象(atgWND)的擴展數據大小值為0時,win32kfull!xxxCreateWindowsEx 函數執行用戶回調xxxClientAllocWindowsClassExtraBytes 函數為窗口對象擴展數據申請所需內存。

在完成回調后,返回值將傳遞給窗口對象的tagWND.pWxtraBytes 屬性。但是由于對該值未作有效判定,導致攻擊者可以通過特定函數(NtCallbackReturn)修改tagWND. pWxtraBytes 的值為可控的offset,并且在這之前通過調用NtUserConsoleControl 函數修改tagWND 的擴展數據保存方式為桌面堆,最終實現基于內核態桌面堆起始地址可控offset 的越界讀寫。

圖片

通過上述描述,最終窗口創建的流程如下:

圖片

漏洞利用

根據POC 可知,利用該漏洞可以實現將tagWND 對象的擴展數據設置為任意可控offset,從而獲取指定的內核地址,通過SetWindowLong 函數實現對這些地址的數據修改;通過構建虛假的spmenu 對象配合SetWindowLong 修改指定tagWND 對象的spmenu 為虛假的spmenu再借助函數GetMenuBarInfo 實現任意地址讀;最后通過內核地址泄露定位到EPROCESS 結構地址,并使用EPROCESS 鏈查找system 進程,獲取system 進程token 并實現替換從而實現提權。

03

在針對中東地區的攻擊活動中使用Windows內核提權漏洞

相關活動概要

CVE-2018-8453是卡巴斯基實驗室于2018年8月份在一系列針對中東地區進行APT攻擊的活動中捕獲到的Windows提權0day漏洞,該漏洞與Windows窗口管理和圖形設備接口相關(win32kfull.sys)。

通過控制窗口對象銷毀時在xxxFreeWindow函數中回調fnDWORD的hook函數,可以在win32kfull!xxxSBTrackInit中實現對pSBTrack的UseAfterFree,從而進行提權。以下是對該漏洞的技術細節分析介紹。

CVE-2018-8453

漏洞概述

該漏洞產生的原因是win32kfull!NtUserSetWindowFNID函數存在缺陷:在對窗口對象設置FNID時沒有檢查窗口對象是否已經被釋放,導致可以對一個已經被釋放了的窗口(FNID_FREED:0x8000)設置一個新的FNID,通過利用win32kfull!NtUserSetWindowFNID的這一缺陷,從而可以達到UAF,導致漏洞的利用。

漏洞原理

POC流程如下:

圖片

Hook KernelCallbackTable中的回調后,通過向滾動條發送WM_LBUTTONDOWN消息觸發調用xxxSBTraackInit函數,因為對一個滾動條進行鼠標左擊時,會觸發調用win32kfull!xxxSBTrackInit函數,這里會調用xxxSBTrackLoop循環獲取鼠標消息,直到釋放鼠標左鍵或者收到其它消息,才會退出xxxSBTrackLoop函數。

xxxSBTrackInit中調用xxxSBTrackLoop回調fnDWORD_hook時,調用DestoryWindow(g_hMAINWND), 這樣會導致調用win32kfull!xxxFreeWindow,因為我們在注冊主窗口類的時候設置了主窗口類的cbWndExtra不為0,那么在win32kfull!xxxFreeWindow中會調用xxxClientFreeWindowClassExtraBytes函數來釋放主窗口類的額外數據。

圖片

上圖這個函數會回調KernelCallbackTable[126],就會進入我們的第二個hook函數中去。

在進入第二個hook函數fnClientFreeWindowClassExtraBytesCallBack_hook后我們必須手動調用NtUserSetWindowFNID(g_hMAINWND,spec_fnid)設置主窗口的FNID(spec_fnid的取值范圍從0x2A1到0x2AA,這里我們將spec_find設置為0x2A2即可)。同時申請一個新的滾動條:g_hSBWNDNew,并調用SetCapture(g_hSBWNDNew)設置當前線程捕獲鼠標消息的窗口是g_hSBWNDNew。

圖片

由于主窗口被Destory,那么xxxSBTrackLoop會返回,繼續執行HMAssignmentUnLock(&pSBTrack->spwndNotify)解除對主窗口的引用。從而導致主窗口被徹底釋放,這會導致再一次的調用xxxFreeWindow,當調用了xxxFreeWindow之后,窗口的FNID就會打上0x8000標記。

圖片

當再次進入fnDWORD_hook函數時就是我們最后一次回到R3的時機了,這個時候如果調用SendMessage(g_hSBWNDNew,WM_CANCLEMODE) 就會調用xxxEndScroll來釋放pSBTrack。

圖片

由于POC程序是單線程,而每個線程信息是屬于線程的,所以線程創建的所有窗口也都指向同一線程信息結構。即使SBTrack隸屬的Scrollbar窗口已經釋放了,只要還是同一線程創建的新窗口,pSBTrack也還是原來的。

由于我們是向新創建滾動條g_hSBWNDNew發送的WM_CANCLEMODE消息,且之前就調用SetCaputure(g_hSBWNDNew)設置當前線程捕獲鼠標消息的窗口為g_hSBTWNDNew,所以qp->spwndCapture==pwnd也會滿足。

因此上圖中的if判斷會通過,并最終執行UserFreePool(pSBTrack)將pSBTrack給釋放掉,從而造成返回執行HMAssignmentUnLock(&pSBTrack->spwndSB)時,pSBTrack就已經被釋放掉了。最終造成了對pSBTrack的Use After Free。

漏洞利用

由于我們可以通過hook KernelCallbackTable中的回調函數來控制win32kfull!xxxSBTrackInit中的pSBTrack被提前釋放,造成對pSBTrack的Use After Free。之后則可以通過池風水噴射技術占用被提前釋放掉的pSBTrack實現有限次的任意內存減1或減2。這個有限次的任意內存減1或減2配合桌面堆泄露技術和GDI Palette Abuse技術就可以實現任意內存讀寫。

總結

APT 攻擊事件隨著技術的發展也逐漸由早期單一化逐漸演變為目前的復雜化,而同時隨著計算機軟件系統安全防護技術的提升,軟件漏洞開始成為APT 組織攻擊活動中重要組成部分,在整個攻擊活動中扮演著“突破者”的角色。之所以形容其為“突破者”,在于漏洞利用模塊多為突破系統防護或沙箱最終實現對目標系統的攻擊。

奇安信威脅情報中心收集整理了眾多APT 攻擊活動并從中例舉了如“摩訶草”、“蔓靈花”等組織曾發起的攻擊活動,分析這些攻擊活動中所使用到的系統(Windows 系統)漏洞并簡述其原理及利用,以求從另一個視角看待這些攻擊:若漏洞不存在,攻擊是否達成?

通過文章簡述分析,我們清楚的看到這些漏洞在整個攻擊事件中所扮演的重要角色,同時我們也應該認識到,及時的抹除這些漏洞即安裝系統補丁對于避免這些攻擊事件的重要性。

奇安信紅雨滴團隊呼吁相關用戶,及時安裝系統更新,并定期更新安全防護系統,能有效防止遭受此類攻擊。

APT活動相關Windows提權漏洞附表

攻擊活動 相關APT組織 涉及漏洞
“摩訶草”APT組織以巴基斯坦空軍演習為誘餌展開攻擊活動 摩訶草 CVE-2016-7255CVE-2019-0808
“蔓靈花”APT組織在針對國內攻擊活動中使用Windoows內核提權0 day漏洞 蔓靈花 CVE-2021-1732
SandCat APT組織在實際攻擊中使用最新Windows在野提權漏洞 SandCat CVE-2018-8589CVE-2019-0797
針對中東地區的Windows內核提權漏洞利用分析 CVE-2018-8453
APT31組織在實際攻擊中使用CVE-2017-0005漏洞進行提權 APT31 CVE-2017-0005
APT28組織在實際攻擊中使用CVE-2016-7255,CVE-2017-0263漏洞進行提權 APT28 CVE-2016-7255CVE-2017-0263
Turla組織在實際攻擊中使用CVE-2017-0001漏洞進行提權 Turla CVE-2017-0001

參考鏈接

[1] https://nvd.nist.gov/vuln/detail/CVE-2016-7255

[2] https://doxygen.reactos.org/d8/d33/arch_2amd64_2winldr_8c.html

[3] https://ti.qianxin.com/blog/articles/Summary-and-analysis-of-APT-attack-activities-in-South-Asia-in-January-2021/

[4] https://www.mcafee.com/blogs/other-blogs/mcafee-labs/digging-windows-kernel-privilege-escalation-vulnerability-cve-2016-7255/

[5] https://www.sohu.com/a/211497788_764248

[6] https://ti.qianxin.com/blog/articles/cve-2018-8453-win32k-elevation-of-privilege-vulnerability-targeting-the-middle-east/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1753/