本篇文章給大家分享的是有關如何進行Windows提權工具兼容性BUG定位及修復,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
2018年5月微軟發布了針對Windows操作系統內核組件漏洞(CVE-2018-8210)的補丁,該漏洞影響多個版本的操作系統,成功利用漏洞可使得普通應用程序以內核權限執行任意代碼。
筆者在6月對該漏洞進行分析并發布了漏洞分析和漏洞利用文章(地址),文中同時附帶了一份提權工具,支持WinXP、Win2003、Win7、Win2008等系統。后有網友回帖表示在Win7 x86系統下該利用工具無效,經調試確認提權工具確實存在部分兼容性問題。本文將針對該問題進行補充說明,解決存在的兼容性問題。
CVE-2018-8120為緩沖區溢出漏洞,可造成內核任意地址寫入。 前文中漏洞利用工具通過觸發漏洞,對內核服務函數指針表進行修改,替換為一段修改當前進程Token的ShellCode地址。
經測試在Win7 x86確實無法實現提權,現進行問題定位。設置雙機調試內核環境,在關鍵的位置設置斷點,進行調試確認問題的原因。
首先設置雙機調試環境,虛擬機安裝Win7 x86,真機安裝WinDbg進行內核調試,在win32k! SetImeInfoEx ()設置斷點,查看提權工具是否可以成功調用漏洞函數。


確認是可以成功調用SetImeInfoEx()的,通過IDA反匯編查看該版本的SetImeInfoEx()函數確認漏洞存在。

在SetImeInfoEx()函數進行單步跟蹤,確認是否可以觸發漏洞

經過單步跟蹤,發現可以觸發SetImeInfoEx()函數存在的緩沖區溢出漏洞,成功修改了指定的內存數據。
漏洞利用工具通過覆蓋GDI內核對象關鍵字段,實現任意內核地址讀寫。繼續執行漏洞利用工具,檢查是否成功修改內核服務函數指針表HalDispatchTable。

進一步進行查看發現,漏洞利用程序計算的HalDispatchTable內存地址并不正確,導致漏洞利用程序沒有成功修改函數指針,提權ShellCode也就沒有得以執行。
NtQueryIntervalProfile()和HalDispatchTable
我們說明一下為什么修改HalDispatchTable后,可以執行ShellCode。NtQueryIntervalProfile()是Ntdll.dll中導出的未公開的系統調用.它調用內核可執行程序ntosknl.exe導出的KeQueryIntervalProfile()函數.如果我們反匯編這個函數,可看到如下:

位于nt!HalDispatchTable+0x4地址上的函數會被KeQueryIntervalProfile()調用(看紅色方框).所以如果我們覆蓋那個地址上的指針-也就是說HalDispatchTable中的第二個指針-帶有我們ShellCode地址;然后我們調用函數NtQueryIntervalProfile(),將執行我們的ShellCode。
前面已經定位到問題,由于沒有正確的修改系統服務表的函數指針,導致提權的ShellCode沒有執行?,F在的問題是找出原先計算過程中為什么會出錯,導致沒有計算出正確的地址。
HalDispatchTable由NT內核文件導出,獲取該表地址只需要通過GetProcAddress()搜索NT內核文件導出表即可,不過該函數在用戶態下,無法對內核模塊進行搜索。
在我們的漏洞利用工具中,計算HalDispatchTable表主要是函數leakHal()函數完成的,下面看看該函數的流程:

該函數首先通過EnumDeviceDrivers()獲取到ntoskrnl.exe模塊的運行時基址,之后在用戶態加載ntoskrnl.exe并搜索HalDispatchTable表的導出地址,程序使用真實導出地址減去模塊基地址,獲得了該表相對于模塊基地址的偏移值。最后使用第一步獲取的ntoskrnl.exe的運行時基地址加上上面計算的偏移值,得出內核中HalDispatchTable表的內存地址。
NT內核文件是Windows的內核關鍵組件,通常是指可執行文件ntoskrnl.exe。但是微軟根據當前CPU的核心數量以及PAE開啟狀態,加載不同的內核可執行文件。

如上圖所示,系統根據當前處理器的工作模式,加載不同的內核文件。
由于原先的代碼在計算HalDispatchTable表的時候,沒有考慮到微軟針對CPU設置加載不同版本內核組件的問題,導致在部分系統上無法成功修改函數指針。
在代碼中加入檢測CPU設置的代碼,根據具體的設置,判斷內核所加載的NT內核組件,并計算HalDispatchTable的真實內存地址即可。下面是補充的代碼:


在原先的leakHal()代碼加入了DeteckKernel()函數, 該函數檢測CPU數量和PAE開啟狀況,返回系統可能加載的內核組件名稱。后續程序按原定的流程,加載該內核組件,獲取HalDispatchTable表的內存地址并修改。
最后調用NtQueryIntervalProfile()函數,我們的ShellCode將以內核權限執行,以替換Token的方式進行提權。

以上就是如何進行Windows提權工具兼容性BUG定位及修復,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。