作者:360 Vulcan Team 晏子霜
原文鏈接:https://vul.360.net/archives/83
前言:
2021 年 4 月 14 日至 15 日,卡巴斯基技術檢測到一波針對多家公司的高度針對性攻擊。更仔細的分析表明,所有這些攻擊都利用了一系列 Google Chrome 和 Microsoft Windows 零日漏洞(CVE-2021-31956)。雖然我們無法在 Chrome 網絡瀏覽器中檢索用于遠程代碼執行 (RCE) 的漏洞,但我們能夠找到并分析用于逃離沙箱并獲取系統權限的特權提升 (EoP) 漏洞,并且它利用了兩個不同的Microsoft Windows 操作系統內核。
——引用自卡巴斯基[1]
該漏洞使用了WNF模塊來完成任意地址讀寫以及越界讀寫操作,所以筆者最近對Windows Kernel的 WNF 模塊進行了一系列研究,發現WNF模塊對于漏洞利用有非常大的幫助(Paged Pool)。
本文對 Windows 中的 WNF 在實用功能上不做討論,僅對我們關心的漏洞利用進行討論。
漏洞利用:
在逆向NtosKrnl.exe 后筆者發現,WNF_Object結構是保存在Paged Pool中的一個固定大小 (0xC0|0xD0) 的內核池,該結構由函數Nt!ExpWnfCreateNameInstance 創建并初始化,該函數在R3中也可以通過Ntdll!NtCreateWnfStateName調用。


在WNF_Object結構中最重要的就是WNF_Object+0x58處的StateData結構指針,該指針在WNF_Object結構初始化時并未定義,而是在后續使用nt!ExpNtUpdateWnfStateData函數更新StateData時使用了nt! ExpWnfWriteStateData函數更新StateData數據時經過一些判斷,來確定是否 創建 Or 修改 StateData的內容。

StateData結構的大小為我們傳入的數據內容+0x10,這里的0x10為方便管理Data所創建的,結構如下。(其中 StateData為動態長度)
Struct StateDataObject {
+0x00 UINT Flag;
+0x04 UINT MaxLength;
+0x08 UINT UseLength;
+0x0c UINT NON;
+0x10 CHAR StateData[1];
};
有限制的任意地址讀寫以及相對應的越界讀寫:
也就是說只要修改了WNF_Object+0x58處的StateData指針,即可獲取一個有限制的任意地址讀寫。
有限制的任意地址寫:
? 修改StateData指針之后獲取一個有限制的任意地址讀寫的原因是因為WNF_Object+0x58 處保存的是 StateData的結構指針,而不是單純的數據,其結構在前幾節已經介紹過了,具體修改StateData的代碼如下。(nt! ExpWnfWriteStateData)

可以看到復制時不單單復制了StateData的內容,并且會相對應的修改目前使用的長度以及其他信息,所以筆者認為這是獲取到了一個有限制的任意地址寫。
有限制的任意地址讀:
既然任意地址寫都有限制了,那任意地址讀是否也是如同任意地址寫一樣,是有限制的呢? 答案是,確實是這樣的,任意地址讀也有一些相應的限制,請看代碼。(nt!ExpWnfReadStateData)

在讀取時,雖然不會修改當前StateData結構的任何屬性,但是該函數會完整的讀取StateData數據段的全部內容。
也就是說如果我們將StateData的指針修改后用其進行任意地址讀則需要注意StateData的UseLength,他的長度則代表了復制的總長度,如果我們Copy的長度低于UseLength,則會返回錯誤代碼。
StateData Object的越界讀寫:
與此同時筆者也發現既然任意地址讀寫的限制都由StateData 結構中MaxLength 、UseLength的引發,但是換一種思路思考的話,也可以推斷出如果修改了MaxLength以及UseLength,可以獲取一個無限制的越界讀寫(OOBRW)。
如果布局得當則可以在Ntoskrnl模塊中復現Win32k經典利用手法BitMap以及Palette在Windows10 1709之前的驕傲成績。
WNF_Object 信息泄露造成的危害:
在WNF_Object創建時,會在WNF_Object + 0x98處 存放當前進程EPROCESS的地址,只要布局得當,則可以使用前幾節的內容StateData的越界讀并聯合其任意地址讀寫,讀出當前進程EPROCESS的地址,并使用任意地址讀來讀取EPROCESS->Token的指針來獲取當前進程Token的地址,對其使用任意地址寫來覆蓋Token中的SEP_TOKEN_PRIVILEGES結構位來開啟當前進程所有的權限,來完成一次完整的漏洞利用,甚至不需要任何一個信息泄露的漏洞!!!!



[1]卡巴斯基對該漏洞的介紹:https://securelist.com/puzzlemaker-chrome-zero-day-exploit-chain/102771/
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1693/
暫無評論