前言
紧接上文,开始继续分析生成的shell。下篇分析shell的连接过程。
shell分析
把生成的jspshell拖到ide里面格式化一下,开摆。
我这里就从上往下开始分析。
开始是定义了三个变量:
1. aes密钥(md5取前16位,后面用于流量加密)、
2. 密码(后面作为http参数传递payload),
3. md5标识(由pass+key通过md5生成,后面会用于标识区分命令执行结果)
接着是定义了一个名为X的类加载,里面简单粗暴定义一个Q方法用于加载类。
后面紧跟着x方法,这是aes加解密一体的方法。加密解密由传入的参数m控制。
接着往下看,就是md5加密和base64编码解码方法
再往下就到了核心代码,这里我都加了注释,可以很容易看懂。
首先是获取由生成shell定义的pass作为参数,接收传入的payload进行解密。
如果我生成的密码设置为safe6那么传入的payload就是safe6=xxxxxxxxxxxxxxxxxxxxxxxxxx
用burp简单抓包看看,我生成的shell默认密码就是pass,默认的我没改。
把数据解密,之后开始判断session里面有没有payload,如果没有就调用上面的自定义加载器把payload加载到内存,并把对应的class对象保存到session里面,方便后续使用。
这个payload具体是什么后面的文章会讲到。这里就简单提一嘴,shell所有核心功能都在payload里面。
要是payload存在,把收到的,解密后的数据存入request。然后取出第一次存入session里面的payload进行初始化
这里需要重点关注,第一次连接发过来的payload(shell初始化发送),后续都是围着这个payload转。
随后就调用payload的equals和toString方法。这两个都被重写了,后续文章会讲到。
还需要注意下toString方法,也就是执行返回的结果,前后会插入两个标识(md5分成了两半)。文章开头有讲到。
具体返回的数据包如下。
从这里就可以知道哥斯拉shell流量很大的一个特征就是返回包首尾都一样。
最后
1.生成的shell是固定的,可以改造成多种形式的shell,让生成的shell自带免杀。
2. 从流量也能明显猜出是哥斯拉,第一次连接会发一个大的payload,之后每次请求,返回包流量头尾固定。
原文始发于微信公众号(safe6安全的成长日记):哥斯拉源码分析(二)jsp shell分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论