作者:Leeqwind
作者博客:https://xiaodaozhi.com/exploit/56.html
本文將對 CVE-2016-0165 (MS16-039) 漏洞進行一次簡單的分析,並嘗試構造其漏洞利用和內核提權驗證代碼,以及實現對應利用樣本的檢測邏輯。分析環境為 Windows 7 x86 SP1 基礎環境的虛擬機,配置 1.5GB 的內存。
本文分為三篇:
從 CVE-2016-0165 說起:分析、利用和檢測(上)
從 CVE-2016-0165 說起:分析、利用和檢測(中)
從 CVE-2016-0165 說起:分析、利用和檢測(下)
0x6 提權
前面的章節實現了由用戶進程控制的任意內存地址讀寫的能力,接下來將通過該能力實現內核提權。提權,意味着進程特權級的提升,提權之後當前進程擁有的權限將高於提權之前,將可執行在原本特權級別下所無法執行的很多操作,並能夠訪問原本由於 ACL 或完整性校驗機制限制所不能訪問的特定文件、註冊表或進程等對象。
Token
在 Windows 系統中的內核提權通常方法是將目標進程的 Token
結構數據或指針替換成 System
進程等系統進程的 Token
結構數據或指針。這樣一來進程將以系統進程的身份執行任何行為,所有需要校驗令牌的操作都將可以暢通無阻地進行。
第一步首先需要定位到 NT 執行體模塊的內存地址。操作系統為我們提供了枚舉內核模塊的 EnumDeviceDrivers
函數。該函數用於獲取系統中的所有設備驅動程序的加載地址。NT 執行體模塊作為第一內核模塊,其地址會出現在地址數組的第一個元素中。
DWORD_PTR xxGetNtoskrnlAddress(VOID) { DWORD_PTR AddrList[500] = { 0 }; DWORD cbNeeded = 0; EnumDeviceDrivers((LPVOID *)&AddrList, sizeof(AddrList), &cbNeeded); return AddrList[0]; }
清單 6-1 獲取內核執行體模塊地址的驗證代碼片段
在 NT 執行體模塊中存在 PsInitialSystemProcess
導出變量,在系統啟動時 PspInitPhase0
函數執行期間該導出變量被賦值為 System
進程的 EPROCESS
地址。那麼接下來只要獲得 PsInitialSystemProcess
變量在 NT 執行體模塊中的偏移,就可以計算出其在當前系統環境中的絕對線性地址。
DWORD_PTR xxGetSysPROCESS(VOID) { DWORD_PTR Module = 0x00; DWORD_PTR NtAddr = 0x00; Module = (DWORD_PTR)LoadLibraryA("ntkrnlpa.exe"); NtAddr = (DWORD_PTR)GetProcAddress((HMODULE)Module, "PsInitialSystemProcess"); FreeLibrary((HMODULE)Module); NtAddr = NtAddr - Module; Module = xxGetNtoskrnlAddress(); if (Module == 0x00) { return 0x00; } NtAddr = NtAddr + Module; if (!xxPointToGet(NtAddr, &NtAddr, sizeof(DWORD_PTR))) { return 0x00; } return NtAddr; }
清單 6-2 獲取 System 進程 EPROCESS 對象基地址的驗證代碼
在當前 32 位的 Windows 7 操作系統環境下,由於是單核 CPU 並且支持 PAE 機制,所以系統加載的 NT 執行體是 ntkrnlpa.exe
模塊。獲得 PsInitialSystemProcess
變量的地址后,通過前面實現的任意內核地址讀取功能獲取該地址存儲的數值,成功后就得到了 System
進程的進程體 EPROCESS
的基地址。
[9] Kernel Pool Exploitation on Windows 7
https://media.blackhat.com/bh-dc-11/Mandt/BlackHat_DC_2011_Mandt_kernelpool-wp.pdf
[10] SURFOBJ structure
https://msdn.microsoft.com/en-us/library/windows/hardware/ff569901(v=vs.85).aspx
[11] THE BMP FILE FORMAT
[12] Microsoft 安全公告 MS16-039 – 嚴重
https://technet.microsoft.com/library/security/ms16-039