yzddMr6's Blog

脚本小子


  • 首页

  • 分类

  • 标签

  • 归档

  • 知识星球

  • 关于

  • 搜索

As-Exploits v1.2更新

发表于 2021-03-26 更新于 2021-06-17 分类于 技术文章 阅读次数:
As-Exploits v1.2更新

前言

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

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

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

支持列表

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

本次更新主要内容

aspx增加屏幕截图模块

我打我自己

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

img

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

jsp增加Jar加载器模块

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

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

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

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

冰蝎

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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

img

哥斯拉

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

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

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

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

创建了一种新的协议jarmembuff

img

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

img

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

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

小实验

这里做一个小实验

写一个弹框测试类

1
2
3
4
5
6
7
8
9
10
11
12
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这个类并且实例化。如果实例化成功则会弹出我们的计算器。

1
2
3
4
5
<%

Class.forName("calc").newInstance();

%>

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

img

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

img

exploit!

img

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

img

支持返回包加密

选择reverse解码器

img

返回包数据

img

内存马兼容Spring

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

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

这里有两个细节

关于反射的坑

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

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

1
15e0d5bERROR:// java.lang.NoSuchMethodException: org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.removeChild(org.apache.catalina.Container)adc1b2c

定位一下问题出在这里

img

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

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

img

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

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

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

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

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

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

img

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

addServletMapping的兼容性问题

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

tomcat7 只能addServletMapping

tomcat8 addServletMapping/addServletMappingDecoded都可以

tomcat9 只能addServletMappingDecoded

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

Spring下运行截图

获取Servlet

img

打入蚁剑内存马

img

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

img

连接成功

img

卸载Servlet

img

卸载后再次获取Servlet列表

img

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

现有模块介绍

基本信息

获取当前服务端信息。

支持类型:php/jsp/aspx

php

img

jsp

img

aspx

img

反弹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
    img

内存马

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

支持类型:jsp

可打入的内存马种类:

  • AntSword

  • Behinder

  • Godzilla-Base64

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

打入哥斯拉内存马

打入Godzilla-Base64内存马

img

在哥斯拉中连接成功

img

杀软识别

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

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

支持类型:php/jsp/aspx

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

  • 自动获取
    自动执行tasklist /svc并分析回显数据。
  • 手动获取
    手动输入tasklist /svc的结果。
    img

提权辅助

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

支持类型:php/jsp/aspx

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

img

屏幕截图

获取目标当前屏幕截图。

支持类型:jsp/aspx

img

ShellCode加载器

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

支持类型:aspx

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

img

粘贴进输入框,点击exploit

img

收到Meterpreter会话

img

Jar加载器

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

支持类型:jsp

img

注意事项

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

本文标题:As-Exploits v1.2更新

文章作者:yzddMr6

发布时间:2021年03月26日 - 21:45

最后更新:2021年06月17日 - 23:12

原始链接:https://yzddmr6.com/posts/as-exploits-v12-update/

许可协议: 转载请保留原文链接及作者。

yzddMr6 wechat
欢迎加入我的知识星球
你的支持将是我更新的动力!
yzddMr6 微信支付

微信支付

As-Exploits内存马兼容Spring
ClassLoader的理解
  • 文章目录
  • 站点概览
yzddMr6

yzddMr6

慢就是快,少就是多。
61 日志
3 分类
12 标签
RSS
GitHub E-Mail 简书
友情链接
  • NaiveKun
  • Fi9coder
  • Sardinefish
  • Panda
  • 九世
  • LFY
  • EarthC
  • Ablustrund
  1. 1. 前言
  2. 2. 支持列表
  3. 3. 本次更新主要内容
    1. 3.1. aspx增加屏幕截图模块
    2. 3.2. jsp增加Jar加载器模块
      1. 3.2.1. 冰蝎
      2. 3.2.2. 哥斯拉
      3. 3.2.3. 小实验
    3. 3.3. 支持返回包加密
    4. 3.4. 内存马兼容Spring
      1. 3.4.1. 关于反射的坑
      2. 3.4.2. addServletMapping的兼容性问题
      3. 3.4.3. Spring下运行截图
  4. 4. 现有模块介绍
    1. 4.1. 基本信息
    2. 4.2. 反弹Shell
    3. 4.3. 内存马
      1. 4.3.1. 打入哥斯拉内存马
    4. 4.4. 杀软识别
    5. 4.5. 提权辅助
    6. 4.6. 屏幕截图
    7. 4.7. ShellCode加载器
    8. 4.8. Jar加载器
  5. 5. 注意事项
© 2022 yzddMr6
|