实战+分析 | .NET 分布式事务反序列化漏洞插件

实战+分析 | .NET 分布式事务反序列化漏洞插件

原创 专攻.NET安全的 dotNet安全矩阵 2025-03-31 08:25

图片

在分布式事务处理中,TransactionManager.Reenlist
 方法被用于重新注册事务的参与者,以确保事务状态的一致性。

然而,该方法内部调用了 BinaryFormatter
 进行反序列化,从而可能导致恶意代码执行。本文将深入解析该漏洞的利用方式,并展示如何构造攻击载荷,从而帮助安全研究人员理解该漏洞的危害,并提升防御能力。
本文内容节选自《.NET安全攻防指南》一书 第17章 .NET反序列化漏洞插件,感兴趣的读者可进一步阅读本书获取更多安全研究内容。

全书共计25章,总计1010页,分为上下册

横跨.NET Web代码审计与红队渗透两大领域。
原价258元,现限量优惠,
一套上下册仅售141元
,数量
有限,先到先得!

点击京东链接:
https://item.jd.com/10140917044329.html 
或者打开手机京东APP即可下单购买。

01. Reenlist基本介绍

在 .NET 框架中,System.Transactions.TransactionManager
 负责管理分布式事务,允许多个资源管理器参与同一个事务,并保证它们的一致性。

其中,TransactionManager.Reenlist方法用于在事务崩溃或中断后重新注册事务的参与者,确保事务状态得以恢复。例如,当数据库事务因网络中断而未能正确提交,事务管理器可在系统恢复后重新注册该事务,并尝试提交或回滚操作。

然而,该方法的 byte[]
 参数为二进制序列化数据,使用 BinaryFormatter
 进行反序列化,这为攻击者提供了一个利用点:如果传入恶意序列化数据,则可能导致代码执行漏洞。

02. 反序列化利用原理

在 TransactionManager.Reenlist 方法内部,核心处理逻辑如下,首先创建 MemoryStream:该方法首先使用 MemoryStream 读取传入的二进制数据,随后,从流中读取一个 32 位整数(int num),并检查其值是否为 1。如果不满足,则不会进入后续处理逻辑。

当 num == 1 时,进入 ReenlistTransaction 进行事务恢复。该方法最终调用 BinaryFormatter 进行反序列化,从而加载事务对象。为了构造有效的攻击载荷,我们可以使用 ysoserial.net 生成基于 TextFormattingRunProperties 的 BinaryFormatter 反序列化攻击载荷。

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

上述命令将生成一个 Base64 编码的恶意载荷,该载荷在反序列化时会触发 calc.exe 执行,生成的攻击载荷如图
17-12所示。


17-12
 yso生成
BinaryFormatter载荷

然后对
payload进行解码得到二进制数据
serializedData,将额外的信息添加到之前的事务注册数据中,具体实现代码如下所示。

byte[] serializedData = Convert.FromBase64String(payload);byte[] newSerializedData = new byte[serializedData.Length + 5];   serializedData.CopyTo(newSerializedData, 5);newSerializedData[0] = 1;TestMe myTransactionEnlistment = new TestMe();TransactionManager.Reenlist(Guid.NewGuid(), newSerializedData,   myTransactionEnlistment);

最后调用
TransactionManager.Reenlist
 方法重新注册事务参与者触发反序列化漏洞。

03. 反序列化原理分析

Reenlist方法通过创建一个

MemoryStream
 对象来读取传入的序列化数据,然后使用
binaryReader
 从流中读取一个

32
 位整数值,并将其存储在变量

num
 中,并且检查整数值是否为
1,也就是说第一位字节码必须是
1,因此在重组事务数据时使用了
newSerializedData[0]

=

1,如图
17-13所示。


17-13
 重组事务数据第
1位字节码

接着调用
oletxTransactionManager.ReenlistTransaction方法,用于有效性检查和获取相关资源,便于重新注册事务,如图
17-14所示。

图17-14
 ReenlistTransaction方法
重新注册事务

从图上调试显示进入核心方法
 “
oletxResourceManager.Reenlist”,内部调用了
BinaryFormatter格式化器

formatter,用于反序列化恢复事务对象信息,也因此加载恶意的攻击载荷触发了反序列化漏洞。调试运行时如图
17-15所示。


17-15
 运行时反序列化启动本地计算器

综上,我们深入分析了 TransactionManager.Reenlist 方法的工作原理,并通过构造恶意序列化数据,成功利用该方法触发反序列化漏洞,从而执行任意代码。本文内容摘自《.NET安全攻防指南》,书中包含更多关于 .NET 反序列化、内存利用、权限提升等安全研究的深度分析,欢迎安全研究人员阅读下单!

04. 本书内容总结

在《.NET安全攻防指南》上册中,我们不仅详细讲解了各类漏洞的基本原理和防范措施,还深入探讨了如何利用代码审计技术精准定位潜在的漏洞点。通过对比不同.NET框架下的敏感函数和方法,帮助读者提升代码审计的效率与准确性。同时,书中还介绍了一些实用的安全测试工具和插件,助力读者在实战中快速掌握核心技能。

在下册中,我们进一步探讨了.NET安全的进阶话题和实战技巧。结合丰富的案例和实战演练,帮助读者将理论知识有效转化为实战能力。此外,书中还介绍了最新的安全工具和插件,助力读者在.NET安全领域不断前行。

限量优惠!京东自营店分别购买上下册,只需141元(原价258元),数量有限,先到先得!

购买上册,点击京东链接:
https://item.jd.com/14396195.html 
或者打开手机京东APP即可下单购买。

购买下册,点击京东链接:https://item.jd.com/14965324.html 或者打开手机京东APP即可下单购买。

同时,欢迎大伙扫码添加 @ken 的微信,获取更多有关本书的详细内容!

图片