设为首页 加入收藏

TOP

.NET高级代码审计(第五课) .NET Remoting反序列化漏洞(二)
2019-09-17 19:07:14 】 浏览:81
Tags:.NET 高级 代码 审计 第五 Remoting 序列化 漏洞

使用下列三种重载方法实现传入参数SoapServerFormatterSinkProvider

  • 满足攻击者需求的第1个攻击重载方法是public HttpServerChannel(IDictionary properties, IServerChannelSinkProvider sinkProvider);

这里笔者用VulnerableDotNetHTTPRemoting项目中的VulnerableDotNetHTTPRemotingServer类来改写官方Demo 。IDictionary集合存放当前通道的配置信息,如图

  • 满足攻击者需求的第2个攻击重载方法是public HttpServerChannel(string name, int port, IServerChannelSinkProvider sinkProvider);

  • 满足攻击者需求的第3个攻击方法是位于HttpChannel类下的 public HttpChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)

VulnerableDotNetHTTPRemoting项目中用到就是第三种攻击方法,由于.NET Remoting客户端在攻击中用途不大,故笔者不做赘述。

0x04 打造Poc

国外研究者发现Microsoft.VisualStudio.Text.UI.Wpf.dll 中的Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties类实现了ISerializable接口,这个接口可以对序列化/反序列化的数据进行完全的控制,并且还避免了反射机制, 但有个问题Microsoft.VisualStudio.Text.UI.Wpf.dll需要安装VisualStudio ,在非开发主机上不会安装,但研究者后来发现Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties类在Windows默认安装的Microsoft.PowerShell.Editor.dll里也同样存在,反编译得到源码,

 

实现了ISerializable接口,ISerializable只有一个方法,即 GetObjectData,如果一个对象的类型实现了ISerializable接口,会构造出新的System.Runtime.Serialization.SerializationInfo对象,这个对象包含了要为对象序列化的值的集合。

GetObjectData方法的功能是调用SerializationInfo类型提供的SetType方法设置类型转换器,使用提供的AddValue多个重载方法来指定要序列化的信息,针对要添加的每个数据,都要调用一次AddValue,GetObjectData添加好所有必要的序列化信息后会返回到类型解析器,类型解析器获取已经添加到SerializationInfo对象的所有值,并把他们都序列化到流中,代码逻辑实现部分参考如下

TextFormattingRunProperties类中的ForegroundBrush属性支持XAML数据,攻击者可以引入《.NET高级代码审计(第一课) XmlSerializer反序列化漏洞》同样的攻击载荷,如下

又因为SoapServerFormatterSinkProvider类用SoapFormatter格式化器处理数据,所以客户端提交的数据肯定是SOAP消息,SOAP是基于XML的简易协议,让应用程序在HTTP上进行信息交换用的。为了给出标准的SOAP有效负载,笔者参考微软官方给的Demo

结合Soroush Dalili (@irsdl)给出的有效载荷,元素a1指向的命名空间正是TextFormattingRunProperties类所在空间地址

在<a1:TextFormattingRunProperties></a1:TextFormattingRunProperties>元素内添加了属性ForegroundBrush,在ForegroundBrush元素内带入ResourceDictionary,这样SOAP消息的攻击载荷主体就完成了。@irsdl给出的有效载荷如下

由于.NET Remoting只支持SOAP 1.1,所以要指定SOAPAction,说来也奇怪这个SOAPAction的值是个URI,但是这个URI不必对应实际的位置。SOAPAction Header选项在SOAP1.2版本已经移除。另外一点图上请求URI中的扩展名是rem,如果生产环境部署在IIS里,默认调用.NET应用模块IsapiModule来处理HttpRemoting,所以在白盒审计或者黑盒渗透的时候遇到rem扩展名,就得考虑可能开启了.NET Remoting应用。

还有一处需要注意,HTTP请求有个扩展方法M-POST,其中的其中的M表示Mandatory(必须遵循的,强制的),如果一个HTTP请求包含至少一个强制的扩充声明,那么这个请求就称为强制的请求。强制请求的请求方法名字必须带有“M-”前缀,例如,强制的POST方法称为M-POST,这样的请求方式或许能更好的躲避和穿透防护设备。

 

0x05 代码审计

5.1SoapServerFormatterSinkProvider

从SoapServerFormatterSinkProvider类分析来看,需要满足属性TypeFilterLevel的值等于TypeFilterLevel.Full,可触发的通道包括了HttpChannel类、HttpServerChannel类,这个攻击点的好处在于发送HTTP SOAP消息,可很好的穿透防火墙。

5.2BinaryServerFormatterSinkProvider

从BinaryServerFormatterSinkProvider类分析来看,也需要满足属性TypeFilterLevel的值等于TypeFilterLevel.Full,可触发的通道包括了TcpChannel类、TcpServerChannel类,这个攻击点可反序列化二进制文件,笔者由于时间仓促,暂时不做分析跟进,有兴趣的朋友可自行研究。

0x06 复盘

笔者将VulnerableDotNetHTTPRemoting项目部署到虚拟机,运行Server端,打开了本地端口1234

Burpsuite请求后成功弹出计算器,感谢Soroush Dalili (@irsdl)的分享。

0x07 总结

.NET Remoting技术已经出来很多年了,现在微软主推WCF来替代它,在开发中使用概率越来越低,从漏洞本身看只要没有设置SoapServerFormatterSinkProvider类属性TypeFilterLevel=Full就不会产生反序列化攻击(默认就是安全的)最

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇13.翻译系列:Code-First方式配置.. 下一篇EF生成实体自动添加数据库字段注..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目