1. 前言
本篇主要分析哥斯拉工具生成以及二开方面的内容。
2. 剖析
这里主要关注的点,是加密器方面,在哥斯拉默认的加密器中,有常见的AES BASES64...加密方式
所以为了实现自己的一套加密器,要分析哥斯拉源码的大体以及生成逻辑。
本文主要讲解Java加密器的内容,在下图中,是哥斯拉默认的加密器,位置在:shells.cryptions.JavaAes
当然JavaTest是本人自己测试加的。
在找到路径之后,把哥斯拉启动,可以发现在 core#ApplicationContext中进行了初始化
而以下可以发现,发现了scanCryption方法。根据方法名大致可以猜出是扫描的意思,之后放到了一个map中。
既然知道了大致的逻辑,就搞一个测试的加密器,看看哥斯拉能不能加载。这里直接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; } }
这里用最简单的办法,直接生成出这个类
Copy进去即可
之后启动哥斯拉你会发现,提示被感染相关。原jar和修改后的jar校验值校验不上。
问题不大,在征求完Beichen师傅能不能nop掉校验并写成文章,Beichen师傅同意了。
打开jadx,搜索关键字定位一下
成功定位,可以发现如下为校验,是一个很简单的判断,原hash和启动的hash做一个对比来判断。
都多余了,直接删掉即可。然后老方法替换掉该类文件
自定义的加载器至此就加载了
点击生成,会定位到该类中,前面是一些初始化的东西。关注该按钮点击事件,其实就是生成这里,这里会进行加载一些class
core.ui.component.dialog#GenerateShellLoder
看生成界面这里
在点击生成之后,会获取到密码 密钥等信息
而在ApplicationContext.getCryption(selectedPayload, selectedCryption);方法中,可以看见获取了加密器的class并进行了实例化。
而后就会进入,刚才实例化生成类的generate方法,这里用的JavaAES_BASE64,在前面已经搞了一自定义的加载器,如果选择自定义加载器,就会跑到JavaTest的generate方法
继续往下走,就是一个保存操作,可以看见生成的shell都是根据template目录中的模板进行替换完后
模板内容如下:
替换完之后就会返回成data
至此Webshell生成的流程,以及自定义加密器的流程就简单分析完了
3.结尾
至于流量方面的东西,画个大饼,后续有空在谈