溫馨提示×

溫馨提示×

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

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

CVE-2020-1362的漏洞如何處理

發(fā)布時(shí)間:2021-09-13 09:36:59 來源:億速云 閱讀:153 作者:柒染 欄目:安全技術(shù)

本篇文章給大家分享的是有關(guān)CVE-2020-1362之如何處理漏洞,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

漏洞背景

WalletService 服務(wù)是 windows 上用來持有錢包客戶端所使用的對象的一個(gè)服務(wù),只存在 windows 10 中。

CVE-2020-1362是 WalletService 在處理 CustomProperty 對象的過程中出現(xiàn)了越界讀寫,此漏洞可以導(dǎo)致攻擊者獲得管理員權(quán)限,漏洞評級為高危。

微軟在 2020 年 7 月更新對漏洞發(fā)布補(bǔ)丁。

環(huán)境搭建

1.復(fù)現(xiàn)環(huán)境:windows 10 專業(yè)版 1909 (內(nèi)部版本號 18363.815)

2.設(shè)置 WalletService 服務(wù)啟動(dòng)類型為自動(dòng)

CVE-2020-1362的漏洞如何處理

3.調(diào)試環(huán)境:windbg -psn WalletService 即可。

漏洞原理與分析

漏洞點(diǎn)是設(shè)置 CustomProperty 對象的 Group 的 get 方法和 set 方法沒有檢查邊界。

1.get 方法的 a2 參數(shù)沒有檢查邊界導(dǎo)致可以泄露堆上的一些地址。CVE-2020-1362的漏洞如何處理

2.set 方法的 a2 參數(shù)沒有檢查邊界,可以覆蓋到對象的虛表指針,從而控制程序流。CVE-2020-1362的漏洞如何處理

漏洞利用過程

創(chuàng)建 CustomProperty 對象

WalletService 服務(wù)由 WalletService.dll 提供,WalletService.dll 實(shí)際上是一個(gè)動(dòng)態(tài)鏈接庫形式的 Com 組件,由 svchost.exe 加載。我們可以在自己寫的程序(下面稱為客戶端)中使用 CoCreateInstance() 或者 CoGetClassObject() 等函數(shù)來創(chuàng)建對象,通過調(diào)用獲得的對象的類方法來使用服務(wù)提供的功能。

如何創(chuàng)建出漏洞函數(shù)對應(yīng)的對象呢?最簡單的辦法是下載 msdn 的符號表,然后看函數(shù)名。

我們想要?jiǎng)?chuàng)建出 CustomProperty 對象,ida 搜索一下,發(fā)現(xiàn)有兩個(gè)創(chuàng)建該對象的函數(shù):Wallet::WalletItem::CreateCustomProperty() 和 Wallet::WalletXItem::CreateCustomProperty()。

CVE-2020-1362的漏洞如何處理

所以我們創(chuàng)建一個(gè) CustomProperty 需要一個(gè) WalletXItem 對象或者 WalletItem 對象,那么使用哪個(gè)呢?繼續(xù)用 ida 搜索 CreateWalletItem 或者 CreateWalletXItem,會(huì)發(fā)現(xiàn)只有 CreateWalletItem。

CVE-2020-1362的漏洞如何處理

那到這里我們需要一個(gè) WalletX 對象,繼續(xù)用 ida 搜索會(huì)發(fā)現(xiàn)找不到 CreateWalletX,但是如果搜索 WalletX,會(huì)發(fā)現(xiàn)有個(gè) WalletXFactory::CreateInstance(),如果有過 Com 組件開發(fā)經(jīng)驗(yàn)的同學(xué)就會(huì)知道,這個(gè)是個(gè)工廠類創(chuàng)建接口類的函數(shù),上面提到的 CoCreateInstance() 函數(shù)會(huì)使 WalletService 調(diào)用這個(gè)函數(shù)來創(chuàng)建出接口類返回給客戶端。

CVE-2020-1362的漏洞如何處理

那么如何調(diào)用 WalletXFactory::CreateInstance() 并創(chuàng)建出 WalletX 對象呢?我們需要在客戶端使用 CoCreateInstance() 。

HRESULT CoCreateInstance(
    REFCLSID rclsid, // CLSID,用于找到工廠類
    LPUNKNOWN pUnkOuter, // 設(shè)置為 NULL 即可
    DWORD dwClsContext, // 設(shè)置為 CLSCTX_LOCAL_SERVER,一個(gè)宏
    REFIID riid, // IID, 提供給工程類,用于創(chuàng)建接口類實(shí)例
    LPVOID *ppv // 接口類實(shí)例指針的地址
);

1.首先,我們需要 WalletXFactory 的 CLSID,可以使用 OLEViewDotNet 這個(gè)工具查看。

CVE-2020-1362的漏洞如何處理

2.其次,我們需要一個(gè) WalletX 的 IID,這個(gè)可以用 ida 直接看 WalletXFactory::CreateInstance() 這個(gè)函數(shù)。

CVE-2020-1362的漏洞如何處理

有了 WalletXFactory 的 CLSID 和 WalletX 的 IID,然后在客戶端調(diào)用 CoCreateInstance(),WalletService 就會(huì)調(diào)用 CLSID 對應(yīng)的工廠類 WalletXFactory 的 CreateInstance(), 創(chuàng)建出 IID 對應(yīng)的 WalletX 對象,并返回對象給客戶端。

然后按照上面的分析,使用 WalletX::CreateWalletItem() 創(chuàng)建出 WalletItem 對象,然后使用 WalletItem::CreateCustomProperty() 創(chuàng)建出 CustomProperty 對象。

對于上面的步驟有疑問的同學(xué)可以去學(xué)一學(xué) Com 組件開發(fā),尤其是進(jìn)程外組件開發(fā)。

偽造虛表,覆蓋附表指針

由于同一個(gè)動(dòng)態(tài)庫,在不同的進(jìn)程,它的加載基址也是一樣的,我們可以知道所有dll里面的函數(shù)的地址,所以可以獲得偽造的虛表里面的函數(shù)地址。

那么把虛表放哪里呢?直接想到的是放堆上。

但如果我們繼續(xù)分析,會(huì)發(fā)現(xiàn),CustomProperty 類里面有一個(gè) string 對象,并且可以使用 CustomProperty::SetLabel() 對 string 類進(jìn)行修改,所以,我們可以通過修改 string 類里面的 beg 指針 和 end 指針,然后調(diào)用 CustomProperty::SetLabel() 做到任意地址寫。

CVE-2020-1362的漏洞如何處理

有了任意地址寫,我們選擇把虛表放在 WalletService.dll 的 .data 節(jié)區(qū),以避免放在堆上可能破壞堆上的數(shù)據(jù)導(dǎo)致程序崩潰。

控制程序流到 LoadLibrary 函數(shù)

使用偽造 vtable 并覆蓋虛表指針的辦法,我們可以通過調(diào)用虛函數(shù)控制 WalletService 的程序流到任意地址了。

那么怎么提權(quán)呢?在 windows 服務(wù)提權(quán)中,通常的辦法是把程序流控制到可以執(zhí)行 LoadLibrary() 等函數(shù)來加載一個(gè)由我們自己編寫的動(dòng)態(tài)鏈接庫,因?yàn)樵诩虞d dll 的時(shí)候會(huì)執(zhí)行 dll 里面的 DllMain(),這個(gè)方法是最強(qiáng)大的也是最實(shí)用的。

這里使用漏洞提交者的方法,把虛表的某個(gè)地址覆蓋成 dxgi.dll 里面的 ATL::CComObject\::`vector deleting destructor(),因?yàn)檫@個(gè)函數(shù)調(diào)用的 LoadLibraryExW() 會(huì)使用一個(gè)全局變量作為想要加載的 dll 的路徑。

CVE-2020-1362的漏洞如何處理

我們可以通過上面的 SetLabel() 進(jìn)行任意地址寫,修改上圖的全局變量 Src,使其指向我們自己實(shí)現(xiàn)的動(dòng)態(tài)鏈接庫的路徑,然后調(diào)用對應(yīng)的虛表函數(shù),使程序流執(zhí)行到 LoadLibrarExW() 即可。

實(shí)現(xiàn)一個(gè)動(dòng)態(tài)鏈接庫

在 DllMain() 里面寫上我們希望以高權(quán)限執(zhí)行代碼,然后調(diào)用虛表里面對應(yīng)的函數(shù)是 WalletService 的程序流運(yùn)行到 LoadLibraryEx() 即可。

注意,因?yàn)?windows 服務(wù)運(yùn)行在后臺(tái),所以需要在 DllMain() 里面使用命名管道或者 socket 等技術(shù)來進(jìn)行回顯或者交互,其次由于執(zhí)行的是 LoadLibraryExW(),所以這里的 dll 路徑要使用寬字符。

其它

在控制虛表函數(shù)程序流到 LoadLibraryExW() 時(shí),需要繞過下面兩個(gè) check。

第一個(gè)是需要設(shè)置 this+0x80 這個(gè)地址的值,使得下面的 and 操作為 true。

CVE-2020-1362的漏洞如何處理

第二個(gè)是要調(diào)整 qword_C5E88 和 qword_C5E80 是下面的變量 v4 指向具有寫權(quán)限的內(nèi)存。

CVE-2020-1362的漏洞如何處理

漏洞利用結(jié)果

可以獲得管理員權(quán)限

CVE-2020-1362的漏洞如何處理

補(bǔ)丁前后對比

可以看到,打了補(bǔ)丁之后,get 方法和 set 方法都對 a2 參數(shù)添加了邊界檢測。

CVE-2020-1362的漏洞如何處理

CVE-2020-1362的漏洞如何處理

以上就是CVE-2020-1362之如何處理漏洞,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

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

AI