作者:bigric3
作者博客:http://bigric3.blogspot.jp/2018/05/cve-2018-8120-analysis-and-exploit.html

5月15日ESET發文其在3月份捕獲了一個 pdf遠程代碼執行(cve-2018-4990)+windows本地權限提升(cve-2018-8120)的樣本。ESET發文后,我從vt上下載了這樣一份樣本(https://www.virustotal.com/#/file/6cfbebe9c562d9cdfc540ce45d09c8a00d227421349b12847c421ba6f71f4284/detection)。初步逆向,大致明確如外界所傳,該漏洞處于開發測試階段,不慎被上傳到了公網樣本檢測的網上,由ESET捕獲并提交微軟和adobe修補。測試特征字符串如下

定位樣本中關鍵的代碼并調試分析

可以知道漏洞產生于系統調用號為0x1226的內核函數NtUserSetImeInfoEx中,該函數調用SetImeInfoEx,在SetImeInfoEx內對參數1校驗疏忽,產生了空指針解引用漏洞,相關觸發代碼邏輯如下:

相較于目前較為主流的gdi提權技術,該樣本利用了安裝系統調用門來實現內核權限提升。

首先,通過指令sgdt指令獲取全局描述符表

申請0x400 bytes內存,構造調用門描述符

調用門描述符結構如下

調用門及mapping null page構造完畢后,開始觸發漏洞安裝調用門

此時寄存器數據如下

源數據如下

目的地址數據如下

可以看到安裝了自身callgate及Ring0Function。安裝完畢后(支持3環調用的CallGate),ring3程序調用調用門

找到對應的GDT表項

按照GDT表項的結構,分析樣本安裝的調用門描述符:

段選擇子cs的值為0x1a8;
對應的Ring0Function的offset低地址為0x51b4;
對應的Ring0Function的offset高地址為0x80b9;
DPL為3 & Gate Valid位為1

段選擇子cs對應的結構如下,RPL級別為0,特權級別

根據上述結構定位gdt段描述符項

段描述符結構如下

3,4,5,8個字節得到段基址為0x0,結合上面的Ring0Func,得到Ring0Func的物理地址

Ring0Function很簡單,直接ret,但此時ring3代碼已具有ring0權限,因為這里沒有恢復cs:

整個Far Pointer to Call Gate流程如下圖:

中斷在call far pointer,此時cs的值為0x1b

單步進入后,cs變為0x1a8(此時中斷在我雙機調試的windbg上)

如此替換本進程的token為system的token后,完成權限提升,最后恢復cs,并平衡堆棧后,再執行更多的ring3代碼,否則容易BSOD。

分析過程中,我近95%的按照樣本的思路還原了提權代碼。

Source code:

https://github.com/bigric3/cve-2018-8120

Thanks:


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