- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- CVE-2020-1362的漏洞如何處理
本篇文章給大家分享的是有關(guān)CVE-2020-1362之如何處理漏洞,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習,希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著(zhù)小編一起來(lái)看看吧。
WalletService 服務(wù)是 windows 上用來(lái)持有錢(qián)包客戶(hù)端所使用的對象的一個(gè)服務(wù),只存在 windows 10 中。
CVE-2020-1362是 WalletService 在處理 CustomProperty 對象的過(guò)程中出現了越界讀寫(xiě),此漏洞可以導致攻擊者獲得管理員權限,漏洞評級為高危。
微軟在 2020 年 7 月更新對漏洞發(fā)布補丁。
1.復現環(huán)境:windows 10 專(zhuān)業(yè)版 1909 (內部版本號 18363.815)
2.設置 WalletService 服務(wù)啟動(dòng)類(lèi)型為自動(dòng)
3.調試環(huán)境:windbg -psn WalletService 即可。
漏洞點(diǎn)是設置 CustomProperty 對象的 Group 的 get 方法和 set 方法沒(méi)有檢查邊界。
1.get 方法的 a2 參數沒(méi)有檢查邊界導致可以泄露堆上的一些地址。
2.set 方法的 a2 參數沒(méi)有檢查邊界,可以覆蓋到對象的虛表指針,從而控制程序流。
創(chuàng )建 CustomProperty 對象
WalletService 服務(wù)由 WalletService.dll 提供,WalletService.dll 實(shí)際上是一個(gè)動(dòng)態(tài)鏈接庫形式的 Com 組件,由 svchost.exe 加載。我們可以在自己寫(xiě)的程序(下面稱(chēng)為客戶(hù)端)中使用 CoCreateInstance() 或者 CoGetClassObject() 等函數來(lái)創(chuàng )建對象,通過(guò)調用獲得的對象的類(lèi)方法來(lái)使用服務(wù)提供的功能。
如何創(chuàng )建出漏洞函數對應的對象呢?最簡(jiǎn)單的辦法是下載 msdn 的符號表,然后看函數名。
我們想要創(chuàng )建出 CustomProperty 對象,ida 搜索一下,發(fā)現有兩個(gè)創(chuàng )建該對象的函數:Wallet::WalletItem::CreateCustomProperty() 和 Wallet::WalletXItem::CreateCustomProperty()。
所以我們創(chuàng )建一個(gè) CustomProperty 需要一個(gè) WalletXItem 對象或者 WalletItem 對象,那么使用哪個(gè)呢?繼續用 ida 搜索 CreateWalletItem 或者 CreateWalletXItem,會(huì )發(fā)現只有 CreateWalletItem。
那到這里我們需要一個(gè) WalletX 對象,繼續用 ida 搜索會(huì )發(fā)現找不到 CreateWalletX,但是如果搜索 WalletX,會(huì )發(fā)現有個(gè) WalletXFactory::CreateInstance(),如果有過(guò) Com 組件開(kāi)發(fā)經(jīng)驗的同學(xué)就會(huì )知道,這個(gè)是個(gè)工廠(chǎng)類(lèi)創(chuàng )建接口類(lèi)的函數,上面提到的 CoCreateInstance() 函數會(huì )使 WalletService 調用這個(gè)函數來(lái)創(chuàng )建出接口類(lèi)返回給客戶(hù)端。
那么如何調用 WalletXFactory::CreateInstance() 并創(chuàng )建出 WalletX 對象呢?我們需要在客戶(hù)端使用 CoCreateInstance() 。
HRESULT CoCreateInstance( REFCLSID rclsid, // CLSID,用于找到工廠(chǎng)類(lèi) LPUNKNOWN pUnkOuter, // 設置為 NULL 即可 DWORD dwClsContext, // 設置為 CLSCTX_LOCAL_SERVER,一個(gè)宏 REFIID riid, // IID, 提供給工程類(lèi),用于創(chuàng )建接口類(lèi)實(shí)例 LPVOID *ppv // 接口類(lèi)實(shí)例指針的地址 );
1.首先,我們需要 WalletXFactory 的 CLSID,可以使用 OLEViewDotNet 這個(gè)工具查看。
2.其次,我們需要一個(gè) WalletX 的 IID,這個(gè)可以用 ida 直接看 WalletXFactory::CreateInstance() 這個(gè)函數。
有了 WalletXFactory 的 CLSID 和 WalletX 的 IID,然后在客戶(hù)端調用 CoCreateInstance(),WalletService 就會(huì )調用 CLSID 對應的工廠(chǎng)類(lèi) WalletXFactory 的 CreateInstance(), 創(chuàng )建出 IID 對應的 WalletX 對象,并返回對象給客戶(hù)端。
然后按照上面的分析,使用 WalletX::CreateWalletItem() 創(chuàng )建出 WalletItem 對象,然后使用 WalletItem::CreateCustomProperty() 創(chuàng )建出 CustomProperty 對象。
對于上面的步驟有疑問(wèn)的同學(xué)可以去學(xué)一學(xué) Com 組件開(kāi)發(fā),尤其是進(jìn)程外組件開(kāi)發(fā)。
由于同一個(gè)動(dòng)態(tài)庫,在不同的進(jìn)程,它的加載基址也是一樣的,我們可以知道所有dll里面的函數的地址,所以可以獲得偽造的虛表里面的函數地址。
那么把虛表放哪里呢?直接想到的是放堆上。
但如果我們繼續分析,會(huì )發(fā)現,CustomProperty 類(lèi)里面有一個(gè) string 對象,并且可以使用 CustomProperty::SetLabel() 對 string 類(lèi)進(jìn)行修改,所以,我們可以通過(guò)修改 string 類(lèi)里面的 beg 指針 和 end 指針,然后調用 CustomProperty::SetLabel() 做到任意地址寫(xiě)。
有了任意地址寫(xiě),我們選擇把虛表放在 WalletService.dll 的 .data 節區,以避免放在堆上可能破壞堆上的數據導致程序崩潰。
使用偽造 vtable 并覆蓋虛表指針的辦法,我們可以通過(guò)調用虛函數控制 WalletService 的程序流到任意地址了。
那么怎么提權呢?在 windows 服務(wù)提權中,通常的辦法是把程序流控制到可以執行 LoadLibrary() 等函數來(lái)加載一個(gè)由我們自己編寫(xiě)的動(dòng)態(tài)鏈接庫,因為在加載 dll 的時(shí)候會(huì )執行 dll 里面的 DllMain(),這個(gè)方法是最強大的也是最實(shí)用的。
這里使用漏洞提交者的方法,把虛表的某個(gè)地址覆蓋成 dxgi.dll 里面的 ATL::CComObject\::`vector deleting destructor(),因為這個(gè)函數調用的 LoadLibraryExW() 會(huì )使用一個(gè)全局變量作為想要加載的 dll 的路徑。
我們可以通過(guò)上面的 SetLabel() 進(jìn)行任意地址寫(xiě),修改上圖的全局變量 Src,使其指向我們自己實(shí)現的動(dòng)態(tài)鏈接庫的路徑,然后調用對應的虛表函數,使程序流執行到 LoadLibrarExW() 即可。
在 DllMain() 里面寫(xiě)上我們希望以高權限執行代碼,然后調用虛表里面對應的函數是 WalletService 的程序流運行到 LoadLibraryEx() 即可。
注意,因為 windows 服務(wù)運行在后臺,所以需要在 DllMain() 里面使用命名管道或者 socket 等技術(shù)來(lái)進(jìn)行回顯或者交互,其次由于執行的是 LoadLibraryExW(),所以這里的 dll 路徑要使用寬字符。
在控制虛表函數程序流到 LoadLibraryExW() 時(shí),需要繞過(guò)下面兩個(gè) check。
第一個(gè)是需要設置 this+0x80 這個(gè)地址的值,使得下面的 and 操作為 true。
第二個(gè)是要調整 qword_C5E88 和 qword_C5E80 是下面的變量 v4 指向具有寫(xiě)權限的內存。
可以獲得管理員權限
可以看到,打了補丁之后,get 方法和 set 方法都對 a2 參數添加了邊界檢測。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站