前段时间在这里看到这个工具:哥斯拉Godzilla。团队小伙伴对称感兴趣,特意下载下来分析一下。
探寻原理
密码(pass)和密钥(key)
将jsp shell格式调整一下,分析。发现key取前16位md5值硬编码保存
生成密码(post参数)和密钥(key)的校验md5值
认证代码分析
使用“测试连接”功能,分析认证,返回为空
对应代码,将post值进行b64解密后吗,使用x函数解密,再提取payload
x函数是aes的加解密功能,加解密密钥(xc)就是key的md5前16位
因此,正确的key就是正确的加解密密钥,try内代码执行不出错就表示认证通过
md5使用
根据分析发现返回时,先取校验MD5值的前16位返回,再返回shell的aes+b64数据,最后取校验后16位返回,猜测返回包解密是根据这个来的
某个返回包
拦截一下返回,将C改成A
提示初始化失败
jar返回处理
使用jadx-gui打开一下工具jar包,在源码中找到返回包处理函数
查看一下jsp使用
继续分析调用方式,随意查看一个,返回处理过的数据内容
jar内加解密
搜索aes字符串,查找解密方法,发现在cryption下的javaaes中有解密函数
可以看到程序将shell配置按jsp shell代码流程生成的校验md5值,并且拆分成2个16位字符串,让本地加解密配置与jsp shell一一对应
关键函数
加解密函数和校验md5值查找函数
具体实现,从返回包中截取shell内容
到此发现前面总结错误,返回包内的md5值只用于认证密码和密钥,并不用于解密数据内容,程序解密是根据本地配置参数来的。
payload内容
修改jsp shell代码,使其输出base64编码的数据
“进入”功能的某个返回包
base64解码一下
继续分析发现,在“进入”操作时post数据30多KB是在加载各个函数功能
因为后续的操作是直接调用的函数,下图是调用“getBasicsInfo”函数
jar内搜索一下
思考
参考哥斯拉利用
加密:AES
编码:Base64
认证:MD5
我们可以选择异或方式来处理
先异或再编码,使用md5认证:XOR+base64+MD5
先编码再异或,使用sha1认证:base64+XOR+sha1
其他只要是能还原的都行(哔哔:“凯撒位移”),也许能用gzip格式来处理数据?
过流量检测的方式很多,主要还是上传的shell不被查杀,使用的内存加载方式实现,tql。相关技术介绍可以看这个《浅谈哥斯拉内存Shell技术》。