今年早些时候,研究员Markus Wulftange(@mwulftange)报告了Microsoft SharePoint中的一个远程代码执行(RCE)漏洞,该漏洞最终被修补编号为CVE-2019-0604 。9月,Microsoft修复了Markus报告的其他三个SharePoint RCE:CVE-2019-1295,CVE-2019-1296和CVE-2019-1257。该博客更详细地介绍了最后一个CVE,也称为ZDI-19-812。此漏洞会影响所有受支持的SharePoint版本,并获得Microsoft最高的Exploit Index评分。
0x01 漏洞详情
由于自定义BDC模型定义中的任意方法参数类型,Microsoft SharePoint 2016中的业务数据连接(BDC)服务容易受到XmlSerializer数据流的反序列化的攻击。如AlvaroMuñoz和Oleksandr Mirosh在其Black Hat 2017 演讲中所示,对XmlSerializer数据流进行反序列化可以导致任意代码执行。
SharePoint允许使用业务数据连接模型文件格式(MS-BDCMFFS)数据格式来指定自定义BDC模型。该规范的一部分是方法和参数的定义,这是Microsoft提供的示例代码:奇热影视
定义了一个名为GetCustomer的方法,该方法包装了一个名为sp_GetCustomer(请参阅RdbCommandText属性)的存储过程。输入参数(Direction="In")和返回参数(Direction="Return")都使用各自的类型描述进行定义。
在上面显示的示例中,输入参数的原始类型为System.Int32,这是安全的。如果定义了具有type参数的BDC模型,则会出现Microsoft.BusinessData.Runtime.DynamicType问题。这样做是为了允许调用者灵活地为该参数传递许多不同类型的值。结果就导致XmlSerializer调用者提供的任意数据流可以反序列化。
0x02 漏洞利用
已在安装了KB4464594的Microsoft SharePoint Server 2016上测试了此漏洞,在Windows Server 2016更新14393.3025的64位版本上运行。
为了演示利用,需要执行以下步骤:
1:管理员必须定义一个自定义BDC模型,ktv其中包括带有类型为参数的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.UI.ObjectStateFormatter.Deserialize将显示以下调用堆栈:
0x03 结论
成功利用此漏洞不会获得管理员权限,但是它使攻击者可以在SharePoint应用程序池和SharePoint服务器帐户的上下文中执行其代码。根据Microsoft的说法,xise他们通过更正SharePoint如何检查应用程序包的源标记的方式在9月补丁中发布了此漏洞。
9月发行版还包括一个补丁程序,用于修复Azure DevOps(ADO)和Team Foundation Server(TFS)中的漏洞,该漏洞可能允许攻击者在TFS或ADO服务帐户的上下文中在服务器上执行代码。我们将在不久的将来提供该漏洞的其他详细信息。