溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行Windows提權(quán)工具兼容性BUG定位及修復

發(fā)布時間:2021-12-22 21:40:57 來源:億速云 閱讀:226 作者:柒染 欄目:安全技術(shù)

本篇文章給大家分享的是有關(guān)如何進行Windows提權(quán)工具兼容性BUG定位及修復,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、背景介紹:

2018年5月微軟發(fā)布了針對Windows操作系統(tǒng)內(nèi)核組件漏洞(CVE-2018-8210)的補丁,該漏洞影響多個版本的操作系統(tǒng),成功利用漏洞可使得普通應(yīng)用程序以內(nèi)核權(quán)限執(zhí)行任意代碼。

筆者在6月對該漏洞進行分析并發(fā)布了漏洞分析和漏洞利用文章(地址),文中同時附帶了一份提權(quán)工具,支持WinXP、Win2003、Win7、Win2008等系統(tǒng)。后有網(wǎng)友回帖表示在Win7 x86系統(tǒng)下該利用工具無效,經(jīng)調(diào)試確認提權(quán)工具確實存在部分兼容性問題。本文將針對該問題進行補充說明,解決存在的兼容性問題。

CVE-2018-8120為緩沖區(qū)溢出漏洞,可造成內(nèi)核任意地址寫入。 前文中漏洞利用工具通過觸發(fā)漏洞,對內(nèi)核服務(wù)函數(shù)指針表進行修改,替換為一段修改當前進程Token的ShellCode地址。

二、 問題定位:

經(jīng)測試在Win7 x86確實無法實現(xiàn)提權(quán),現(xiàn)進行問題定位。設(shè)置雙機調(diào)試內(nèi)核環(huán)境,在關(guān)鍵的位置設(shè)置斷點,進行調(diào)試確認問題的原因。

漏洞利用工具調(diào)試

首先設(shè)置雙機調(diào)試環(huán)境,虛擬機安裝Win7 x86,真機安裝WinDbg進行內(nèi)核調(diào)試,在win32k! SetImeInfoEx ()設(shè)置斷點,查看提權(quán)工具是否可以成功調(diào)用漏洞函數(shù)。

如何進行Windows提權(quán)工具兼容性BUG定位及修復如何進行Windows提權(quán)工具兼容性BUG定位及修復

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

如何進行Windows提權(quán)工具兼容性BUG定位及修復

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

如何進行Windows提權(quán)工具兼容性BUG定位及修復

經(jīng)過單步跟蹤,發(fā)現(xiàn)可以觸發(fā)SetImeInfoEx()函數(shù)存在的緩沖區(qū)溢出漏洞,成功修改了指定的內(nèi)存數(shù)據(jù)。

漏洞利用工具通過覆蓋GDI內(nèi)核對象關(guān)鍵字段,實現(xiàn)任意內(nèi)核地址讀寫。繼續(xù)執(zhí)行漏洞利用工具,檢查是否成功修改內(nèi)核服務(wù)函數(shù)指針表HalDispatchTable。

如何進行Windows提權(quán)工具兼容性BUG定位及修復

進一步進行查看發(fā)現(xiàn),漏洞利用程序計算的HalDispatchTable內(nèi)存地址并不正確,導致漏洞利用程序沒有成功修改函數(shù)指針,提權(quán)ShellCode也就沒有得以執(zhí)行。

 NtQueryIntervalProfile()和HalDispatchTable

我們說明一下為什么修改HalDispatchTable后,可以執(zhí)行ShellCode。NtQueryIntervalProfile()是Ntdll.dll中導出的未公開的系統(tǒng)調(diào)用.它調(diào)用內(nèi)核可執(zhí)行程序ntosknl.exe導出的KeQueryIntervalProfile()函數(shù).如果我們反匯編這個函數(shù),可看到如下:

如何進行Windows提權(quán)工具兼容性BUG定位及修復

位于nt!HalDispatchTable+0x4地址上的函數(shù)會被KeQueryIntervalProfile()調(diào)用(看紅色方框).所以如果我們覆蓋那個地址上的指針-也就是說HalDispatchTable中的第二個指針-帶有我們ShellCode地址;然后我們調(diào)用函數(shù)NtQueryIntervalProfile(),將執(zhí)行我們的ShellCode。

三、解決問題:

前面已經(jīng)定位到問題,由于沒有正確的修改系統(tǒng)服務(wù)表的函數(shù)指針,導致提權(quán)的ShellCode沒有執(zhí)行?,F(xiàn)在的問題是找出原先計算過程中為什么會出錯,導致沒有計算出正確的地址。

如何計算HalDispatchTable表地址

HalDispatchTable由NT內(nèi)核文件導出,獲取該表地址只需要通過GetProcAddress()搜索NT內(nèi)核文件導出表即可,不過該函數(shù)在用戶態(tài)下,無法對內(nèi)核模塊進行搜索。

在我們的漏洞利用工具中,計算HalDispatchTable表主要是函數(shù)leakHal()函數(shù)完成的,下面看看該函數(shù)的流程:

如何進行Windows提權(quán)工具兼容性BUG定位及修復

該函數(shù)首先通過EnumDeviceDrivers()獲取到ntoskrnl.exe模塊的運行時基址,之后在用戶態(tài)加載ntoskrnl.exe并搜索HalDispatchTable表的導出地址,程序使用真實導出地址減去模塊基地址,獲得了該表相對于模塊基地址的偏移值。最后使用第一步獲取的ntoskrnl.exe的運行時基地址加上上面計算的偏移值,得出內(nèi)核中HalDispatchTable表的內(nèi)存地址。

NT內(nèi)核文件之ntoskrnl.exe

NT內(nèi)核文件是Windows的內(nèi)核關(guān)鍵組件,通常是指可執(zhí)行文件ntoskrnl.exe。但是微軟根據(jù)當前CPU的核心數(shù)量以及PAE開啟狀態(tài),加載不同的內(nèi)核可執(zhí)行文件。

如何進行Windows提權(quán)工具兼容性BUG定位及修復

如上圖所示,系統(tǒng)根據(jù)當前處理器的工作模式,加載不同的內(nèi)核文件。

解決方案

由于原先的代碼在計算HalDispatchTable表的時候,沒有考慮到微軟針對CPU設(shè)置加載不同版本內(nèi)核組件的問題,導致在部分系統(tǒng)上無法成功修改函數(shù)指針。

在代碼中加入檢測CPU設(shè)置的代碼,根據(jù)具體的設(shè)置,判斷內(nèi)核所加載的NT內(nèi)核組件,并計算HalDispatchTable的真實內(nèi)存地址即可。下面是補充的代碼:

如何進行Windows提權(quán)工具兼容性BUG定位及修復如何進行Windows提權(quán)工具兼容性BUG定位及修復

在原先的leakHal()代碼加入了DeteckKernel()函數(shù), 該函數(shù)檢測CPU數(shù)量和PAE開啟狀況,返回系統(tǒng)可能加載的內(nèi)核組件名稱。后續(xù)程序按原定的流程,加載該內(nèi)核組件,獲取HalDispatchTable表的內(nèi)存地址并修改。

最后調(diào)用NtQueryIntervalProfile()函數(shù),我們的ShellCode將以內(nèi)核權(quán)限執(zhí)行,以替換Token的方式進行提權(quán)。

如何進行Windows提權(quán)工具兼容性BUG定位及修復

以上就是如何進行Windows提權(quán)工具兼容性BUG定位及修復,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI