美文网首页
As-Exploits v 1.2 更新

As-Exploits v 1.2 更新

作者: yzddMr6 | 来源:发表于2021-05-14 17:37 被阅读0次

    前言

    As-Exploits,中国蚁剑后渗透模块。

    目前插件的定位是蚁剑的一个微内核拓展模块,可以迅速做到payload的工程化,不用过多时间浪费在插件的结构上。目前的As-Exlpoits各部分之间基本做到了解耦,新增一个payload只需要两步:1.填写payload,2. 画一个表单。其余发包,回显处理等事情框架会自动帮你实现。想要自定义的话只需要继承父类然后重写对应方法即可。

    其中Payload部分很多借鉴了冰蝎哥斯拉的实现,向其开发者们表示感谢!

    支持列表

    模块名称\Shell类型 PHP ASPX JSP
    基本信息
    反弹Shell
    内存马
    内存马管理
    杀软识别
    提权辅助
    屏幕截图
    ShellCode加载器
    Jar加载器

    本次更新主要内容

    aspx增加屏幕截图模块

    我打我自己

    当然实战中需要较高权限。

    image.png

    因为在Jscript加载Assembly踩坑记里面解决了Jscript加载c#的问题,所以C#的payload理论上都可以加进去,更多其他的用法就看大家自己发挥了

    jsp增加Jar加载器模块

    打一个jar进去通常有两个用处:

    一是可以用来上传数据库驱动。

    二是把恶意类打入JVM中,后续只需要通过反射调用即可。哥斯拉的实现方式就是第一次就把所有的payload打入jvm中,后续通过反射调用。所以后续通信的流量包都非常的小,只需要传递参数即可。

    冰蝎跟哥斯拉都有类似的功能,研究了一下他们的实现。

    冰蝎

    冰蝎的加载jar功能内嵌于数据库连接部分,仅用于上传数据库驱动。首先把要打入的jdbc上传到目标的临时目录,然后再用URLClassLoader去加载,这里贴一下代码。

    net.rebeyond.behinder.ui.controller.DatabaseViewController#loadDriver

      private void loadDriver(String scriptType, String databaseType) throws Exception {
          String driverPath = "net/rebeyond/behinder/resource/driver/";
          Platform.runLater(() -> {
             this.statusLabel.setText("正在上传数据库驱动……");
          });
          String os = this.currentShellService.shellEntity.getString("os").toLowerCase();
          //根据系统型号选择临时目录
          String remoteDir = os.indexOf("windows") >= 0 ? "c:/windows/temp/" : "/tmp/";
          String libName = null;
          if (scriptType.equals("jsp")) { //根据类型选择数据库jdbc
             if (databaseType.equals("sqlserver")) {
                libName = "sqljdbc41.jar";
             } else if (databaseType.equals("mysql")) {
                libName = "mysql-connector-java-5.1.36.jar";
             } else if (databaseType.equals("oracle")) {
                libName = "ojdbc5.jar";
             }
          } else if (scriptType.equals("aspx")) {
             if (databaseType.equals("mysql")) {
                libName = "mysql.data.dll";
             } else if (databaseType.equals("oracle")) {
                libName = "Oracle.ManagedDataAccess.dll";
             }
          }
    
          byte[] driverFileContent = Utils.getResourceData(driverPath + libName);
          String remotePath = remoteDir + libName;
          //将jar先上传到临时目录
          this.currentShellService.uploadFile(remotePath, driverFileContent, true);
          Platform.runLater(() -> {
             this.statusLabel.setText("驱动上传成功,正在加载驱动……");
          });
          //将libPath传递给服务端加载
          JSONObject loadRes = this.currentShellService.loadJar(remotePath);
          if (loadRes.getString("status").equals("fail")) {
             throw new Exception("驱动加载失败:" + loadRes.getString("msg"));
          } else {
             Platform.runLater(() -> {
                if (scriptType.equals("jsp")) {
                   this.statusLabel.setText("驱动加载成功,请再次点击“连接”。");
                }
    
                this.statusLabel.setText("驱动加载成功。");
             });
          }
       }
    

    webshell获取到libPath然后用URLClassLoader去加载。

    net.rebeyond.behinder.payload.java.Loader

    image.png

    哥斯拉

    哥斯拉的操作就比较秀了。因为打入一个jar不像打入一个class一样,直接有defineClass方法去接收一个字节数组。据我的研究,没有直接接收一个jar的字节数组的方法。打入jar需要使用URLClassLoader这个类,大概有两种方式,一种是利用http协议,远程获取所要加载的jar。另一种是file协议,从本地路径去读取jar。

    每次都额外搭一个http当然不方便,并且目标还不一定出网。但是file协议的话还需要把jar写到磁盘中,文件就会落地,增加了被发现的风险。

    但是我们回过头想,既然通过file协议加载jar,肯定会有一个通过路径找到文件,然后把文件读取到内存的过程,如果我们能跳过这个根据路径找文件的过程,直接把文件的内容写到字节数组里不就可以文件不落地了吗?

    哥斯拉就是采用的这种做法,利用两个子类分别继承了URLStreamHandler跟URLConnection,然后利用反射模拟了读取文件的过程。

    创建了一种新的协议jarmembuff

    image.png

    然后把收到的jar文件的字节数组给放到变量里。

    image.png

    这样就实现了文件不落地,将jar打入内存的目的。

    本人在As-Exploits里也采用了这种做法。

    小实验

    这里做一个小实验

    写一个弹框测试类

    import java.io.IOException;
    
    public class calc {
        public calc() {
            try {
                Runtime.getRuntime().exec("calc");
            } catch (IOException var2) {
                var2.printStackTrace();
            }
    
        }
    }
    

    jar -cvf打包成jar

    开个web项目,写一个test.jsp如下。去查找calc这个类并且实例化。如果实例化成功则会弹出我们的计算器。

    <%
    
        Class.forName("calc").newInstance();
    
    %>
    

    在第一次访问的时候找不到这个类肯定会报错

    image.png

    然后打开插件,选择要打入的jar文件。这里可以点按钮选择,也可以直接在输入框输入绝对路径。

    image.png

    exploit!

    image.png

    再去刷新页面,弹出计算器。

    image.png

    支持返回包加密

    选择reverse解码器

    image.png

    返回包数据

    image.png

    内存马兼容Spring

    其中 内存马管理 以及AntSword类型内存马支持Tomcat(5-9)、Spring

    首先要Spring中默认没有pageContext的依赖,所以相关的依赖部分都要去除。蚁剑的jsp很早就不依赖pageContext了,相关文章以前也写过,不知道的同学可以翻一翻我的博客:yzddmr6.tk。

    这里有两个细节

    关于反射的坑

    在研究过程中可以发现哥斯拉中的payload基本都是用反射实现的,这样的好处就是可以不添加任何依赖。这也是为什么哥斯拉只有8m的原因。

    去除掉所有的pageContext后,在Spring中获取servlet没有问题,但是卸载的时候内存马管理模块报了一个这样的错误:

    <pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">15e0d5bERROR:// java.lang.NoSuchMethodException: org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.removeChild(org.apache.catalina.Container)adc1b2c</pre>

    定位一下问题出在这里

    image.png

    意思就是在StandardContext中找不到removeChild这个方法。

    调试一下发现,Spring中获取到的StandardContext示例为其一个子类,叫做TomcatEmbeddedContext。虽然Spring中内置了Tomcat,但这个是Spring特有的。

    image.png

    TomcatEmbeddedContext继承了StandardContext,并且没有对removeChild进行改写,如果父类有这个方法应该是可以调用的。

    那为什么会找不到方法呢?这里要提一下反射中getMethods 跟getDeclaredMethods 的区别:

    getMethods 获取所有公有方法(包括父类方法)

    getDeclaredMethods 获取本类中的所有方法 (只拿本类中的)

    哥斯拉中用的getDeclaredMethod,也就是只能获取到本类中的方法,自然反射拿不到父类的removeChild。

    所以解决办法要么把getDeclaredMethod换成getMethod,因为removeChild本来就是public的,要么就直接调用removeChild方法,不采用反射。在这里我采用了后者。

    image.png

    在内存马模块同理,这里直接全部改了,不再用反射。

    addServletMapping的兼容性问题

    要注意的是,在添加servlet的过程中,会涉及到addServletMapping函数的兼容性问题,并且很多文章中并没有仔细分析具体的版本号。这里贴一下我研究的结果:

    tomcat7 只能addServletMapping

    tomcat8 addServletMapping/addServletMappingDecoded都可以

    tomcat9 只能addServletMappingDecoded

    在这里要么用反射,两种方法都try一下。在这里提供一个更好的解决办法,使用ApplicationServletRegistration这个类。ApplicationServletRegistration对wrapper做了封装,自动会处理两种方法的兼容性。

    Spring下运行截图

    获取Servlet

    image.png

    打入蚁剑内存马

    image.png

    再次获取Servlet,发现已经有了,并且在第一位。

    image.png

    连接成功

    image.png

    卸载Servlet

    image.png

    卸载后再次获取Servlet列表

    image.png

    虽然我们可以通过setLoadOnStartup把servlet放在第一位,但是面对需要鉴权的shiro等目标打入一个servlet内存马还是有不小的局限性。所以目前filter内存马依旧是主流。但是蚁剑是支持listener类型的,listener的优先级还在filter之上。所以以后可能直接跳过filter,直接加入listener的payload。

    现有模块介绍

    基本信息

    获取当前服务端信息。

    支持类型:php/jsp/aspx

    php

    image

    jsp

    image

    aspx

    image

    反弹Shell

    跟MSF联动

    支持类型:php/jsp/aspx

    Payload目前支持以下类型:

    • java/meterpreter/reverse_tcp

    • java/shell/reverse_tcp

    • java/meterpreter/bind_tcp

    • java/shell/bind_tcp

    • php/meterpreter/reverse_tcp

    • php/shell/reverse_tcp

    • php/meterpreter/bind_tcp

    • php/shell/bind_tcp

    • windows/meterpreter/reverse_tcp

    • windows/x64/meterpreter/reverse_tcp


      image

    内存马

    一键打入内存Webshell,由于时间仓促,目前仅支持Servlet型内存马。

    支持类型:jsp

    可打入的内存马种类:

    • AntSword

    • Behinder

    • Godzilla-Base64

    • reGerog
      组件名称为注册的Servlet的名称,可以起一个具有迷惑性的名字来隐藏自己。
      其中AntSword类型支持Tomcat(5-9)、Spring。


      image

    打入哥斯拉内存马

    打入Godzilla-Base64内存马

    image

    在哥斯拉中连接成功

    image

    杀软识别

    数据来源是key师傅的项目:avList

    通过tasklist /svc获取当前进程列表,识别出其中的杀软。

    支持类型:php/jsp/aspx

    目前支持手动跟自动两种获取方式:

    • 自动获取
      自动执行tasklist /svc并分析回显数据。

    • 手动获取
      手动输入tasklist /svc的结果。

      image

    提权辅助

    通过systeminfo来获取补丁信息,从而给出提权建议。

    支持类型:php/jsp/aspx

    同样支持手动跟自动两种获取方式。

    image

    屏幕截图

    获取目标当前屏幕截图。

    支持类型:jsp/aspx

    image

    ShellCode加载器

    加载shellcode至内存运行。(shellcode为hex格式,且不能有多余空格或换行)

    支持类型:aspx

    以msf为例:msfvenom生成hex格式的shellcode

    image

    粘贴进输入框,点击exploit

    image

    收到Meterpreter会话

    image

    Jar加载器

    加载Jar到JVM内存中。过程中文件不落地,可用于上传数据库驱动等。

    支持类型:jsp

    image

    注意事项

    本插件仅供合法的渗透测试以及爱好者参考学习,请勿用于非法用途,否则自行承担相关责任。

    相关文章

      网友评论

          本文标题:As-Exploits v 1.2 更新

          本文链接:https://www.haomeiwen.com/subject/mihkjltx.html