实战+分析 | .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 的微信,获取更多有关本书的详细内容!