在今年年初,研究人员Markus Wulftange(@mwulftange)曾报告过Microsoft SharePoint中的一个远程代码执行漏洞(RCE),该漏洞的CVE编号为CVE-2019-0604。而在今年的九月初,Markus又在SharePoint中发现了另外三个新的远程代码执行漏洞,即CVE-2019-1295,CVE-2019-1296和CVE-2019-1257。在这篇文章中,我们将对最后一个漏洞,也就是CVE-2019-1257(ZDI-19-812)进行详细分析。目前,所有版本的SharePoint都会受到该漏洞的影响,微软方面也将该漏洞的可利用等级评估为最高等级,这也就意味着在不久的将来,会有很多网络犯罪分子利用该漏洞实施攻击。
这个漏洞存在于微软SharePoint中的业务数据(BDC)连接服务之中,由于自定义的BDC模型中可以使用任意的方法参数类型,从而导致Microsoft SharePoint 2016中的业务数据连接(BDC)服务容易受到XmlSerializer流的任意反序列化的攻击。早在2017年的Black Hat黑帽黑客大会上,研究人员Alvaro Muñoz和Oleksandr Mirosh就曾介绍过如何通过对XmlSerializer流进行任意反序列化并实现任意代码执行【参考文档:https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf】。
SharePoint允许使用业务数据连接模型文件格式(MS-BDCMFFS)数据格式来指定自定义的BDC模型,这种规范中的部分内容为方法和参数定义。下面给出的是微软提供的样本:
上述代码定义了一个名叫GetCustomer的方法,它负责封装一个名叫sp_GetCustomer的程序,这两者的输入参数(Direction=”In”)和返回参数(Direction=”Return”)都使用了各自对应类型的描述来定义。
在上述样本中,输入参数的原始类型为System.Int32,这就没什么大问题。但如果定义的BDC模型参数类型为Microsoft.BusinessData.Runtime.DynamicType,就会出现问题了。这种方案的好处在于允许开发人员灵活地通过该参数传递不同类型的值,但坏处就是为反序列化的调用方提供了任意的XmlSerializer流。
我们的测试设备为Microsoft SharePoint Server 2016,并且安装了KB4464594,操作系统版本为64位的Windows Server 2016 update 14393.3025。
漏洞利用步骤及过程如下:
1、管理员首先需要自定义一个BDC模型,其中包括一个参数类型为Microsoft.BusinessData.Runtime.DynamicType的方法。针对自定义的BDC模型,程序会使用数据库模型样本来作为模板对其进行大规模简化:
2、接下来,管理员需要通过SharePoint管理中心|应用管理|管理服务应用程序|业务数据连接服务来上传BDC模型。当然了,这个操作也可以通过PowerShell来完成:
3、然后,攻击者就可以调用这个方法了,并通过函数参数来传递攻击Payload:
在SharePoint服务器上,你将会发现生成了两个cmd.exe实例以及一个win32calc.exe实例,它们都会以SharePoint应用程序池的身份运行。
如果你想要查看代码路径的话,你可以把调试器绑定到SharePoint应用程序的w3wp.exe上,并在system.web.dll上设置断点。
我们可以通过System.Web.dll!System.Web.UI.ObjectStateFormatter.Deserialize来查看调用堆栈:
需要注意的是,即便是你能够成功利用该漏洞并实施攻击,你也无法拿到服务器端的管理员权限,不过攻击者可以利用该漏洞在SharePoint应用程序池以及SharePoint服务器账号的上下文环境中执行他们的代码。根据微软方面的描述,他们已经在9月份推送的补丁中修复了此漏洞。
1、https://docs.microsoft.com/en-us/openspecs/sharepoint_protocols/ms-bdcmffs/0c568f71-36de-4a89-b44f-cab48609b86a 2、https://twitter.com/thezdi
* 参考来源:zerodayinitiative,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM