.NET Remoting反序列化漏洞分析与复现
一、漏洞概述
.NET Remoting应用程序在特定配置下存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerFormatterSinkProvider类作为信道接收器,并且将TypeFilterLevel属性设置为Full时,攻击者可以利用反序列化漏洞实现远程代码执行(RCE)。
二、.NET Remoting基础概念
2.1 基本定义
.NET Remoting是一种分布式应用解决方案,允许不同AppDomain(应用程序域)之间进行通信,通信可以发生在:
- 同一进程中的不同AppDomain
- 同一系统中的不同进程
2.2 信道类型
.NET Remoting提供三种信道类型:
-
IpcChannel:
- 使用Windows进程间通信(IPC)系统
- 仅限同一计算机上的应用程序域之间通信
- 比TCP或HTTP信道更快
-
TcpChannel:
- 基于Socket传输
- 默认使用二进制格式序列化
- 适用于局域网,传输性能高
-
HttpChannel:
- 使用HTTP协议传输
- 使用SOAP格式序列化
- 适用于广域网,可穿透防火墙
三、漏洞原理分析
3.1 关键组件
-
SoapServerFormatterSinkProvider:
- 实现IServerChannelSinkProvider接口
- 使用SoapFormatter格式化器序列化对象
- 包含关键属性TypeFilterLevel
-
TypeFilterLevel属性:
- Low(默认):仅支持基本远程处理功能相关类型
- Full:支持所有类型,存在安全风险
3.2 攻击条件
服务端配置必须满足以下条件之一:
-
使用HttpServerChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full)
public HttpServerChannel(IDictionary properties, IServerChannelSinkProvider sinkProvider)public HttpServerChannel(string name, int port, IServerChannelSinkProvider sinkProvider)
-
使用HttpChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full)
public HttpChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)
四、漏洞利用
4.1 利用链
利用Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties类:
- 实现了ISerializable接口
- 包含ForegroundBrush属性支持XAML数据
- 存在于Microsoft.VisualStudio.Text.UI.Wpf.dll或Microsoft.PowerShell.Editor.dll中
4.2 攻击载荷构造
SOAP消息格式示例:
<a1:TextFormattingRunProperties xmlns:a1="http://schemas.microsoft.com/2003/10/Serialization/">
<ForegroundBrush xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary>
<!-- XAML恶意代码 -->
</ResourceDictionary>
</ForegroundBrush>
</a1:TextFormattingRunProperties>
4.3 攻击请求特征
-
请求方法:
- 常规POST
- 或M-POST(强制POST)
-
请求头:
- 必须包含SOAPAction头
- 值可以是任意URI
-
请求URI:
- 通常以.rem为扩展名
- IIS默认使用IsapiModule处理.rem请求
五、漏洞复现
5.1 环境搭建
-
创建服务端:
- 使用HttpChannel或HttpServerChannel
- 配置SoapServerFormatterSinkProvider(TypeFilterLevel.Full)
- 绑定端口(如1234)
-
创建远程对象:
- 继承MarshalByRefObject
- 使用WellKnown激活模式(SingleTon或SingleCall)
5.2 攻击步骤
- 构造恶意SOAP消息
- 发送HTTP请求到服务端
- 方法:POST或M-POST
- 头:SOAPAction:任意URI
- 内容:恶意SOAP载荷
- 触发反序列化执行恶意代码
六、防御措施
-
避免使用TypeFilterLevel.Full:
- 保持默认的TypeFilterLevel.Low
- 仅在绝对必要时使用Full级别
-
替换技术:
- 使用WCF替代.NET Remoting
- WCF提供更安全的通信机制
-
输入验证:
- 对传入的SOAP消息进行严格验证
- 限制可反序列化的类型
-
网络防护:
- 限制访问.rem端点的客户端
- 监控异常的SOAP请求
七、扩展攻击面
-
BinaryServerFormatterSinkProvider:
- 类似SoapServerFormatterSinkProvider
- 用于TcpChannel/TcpServerChannel
- 同样受TypeFilterLevel属性影响
-
其他实现ISerializable的可利用类:
- 除TextFormattingRunProperties外
- 寻找其他可控的序列化类
八、总结
.NET Remoting反序列化漏洞的核心在于SoapServerFormatterSinkProvider的TypeFilterLevel配置不当,攻击者可以通过精心构造的SOAP消息实现远程代码执行。虽然.NET Remoting已逐渐被WCF取代,但在遗留系统中仍可能存在此漏洞,安全人员应重点关注相关配置和端点。