点击蓝字 关注我们
日期:2021-11-23
作者:nothing
介绍:上次分析了冰蝎3的流量,正好看到
freebuf
上发了一篇哥斯拉的流量分析,没头没尾的,顺便分析了一下。
正好看到freebuf
上发了一篇哥斯拉的流量分析,经过跟踪分析,发现他只分析了第一个数据包,后面完全不是同一种加密方式,所以自己跟踪分析了一下Godzilla 3.03
版本的phpshell
的流量。
首先对godzilla.jar
包进行反编译,shell
的加密方法位置在:
"shells" packet->"cryptions" packet->"phpxor" packet->phpxor class
从代码中可以分析出,E
函数用来进行加密,发送的payload
内容先经过XOR
加密后,再将密文进行base64
编码,最后进行URL
编码,再发给客户端。
XOR
加密的密钥来自用户提供的密钥经过MD5
的32
位摘要后,取前16
位的值。
生成shell
脚本以后,内容如下: phpevalxor.php
phpxor.php
可以看到,evalxor
的脚本,是一个非常简单的一句话,下面xor
的脚本,单纯从代码来看,处理方式跟java
反编译后查看的代码运行流程是一样的,先base64
解码,再进行异或处理。处理代码如下:
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass='pass';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
真正对流量进行分析以后。。我才发现,单纯靠代码的来分析,真是太傻了,因为我根据代码的流程完全解密不了他的数据。
接下来的流量已phpxor
版本的shell
为例进行分析。
先看流量:
这是第一个TCP
数据包的内容:
HTTP
数据包进行解密,用上面看到的代码进行解密,代码如下:function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass = "数据包内容";
$key='3c6e0b8a9c15224a';
$data=encode(base64_decode($pass),$key);
解密后的内容如下:
感觉是注入了个大马到内存里,用来进行后续的操作,包含run、bypass_open_basedir、formatParameter、evalFunc
等二十多个功能函数,具备代码执行、文件操作、数据库操作等诸多功能。
第一个数据包没有返回包,接着看第二个数据包,请求内容为: DlMRWA1cL1gOVDc2MjRhRwZFEQ==
解码后的结果为 methodNametest
返回包内容为 11cd6a8758984163fL1tMGI4YTljMv79NDQm7r9PZzBiOA==6c37ac826a2a04bc
根据shell
内容,前16
位和后16
位都是md5
,中间的内容,才是命令执行完的结果,我按照常规方法去进行解密,发现解密不了。再回去重新翻生成的shell
文件,才发现,中间部分的内容,被一个叫run
的函数进行过处理以后,再进行输出的。
run
函数在第一个数据包向内存注入的大马中,分析一下流程:
关键的解码内容就在那个gzipdecode
的地方,说明返回包或者请求包,都有可能经过gzip
压缩,把处理函数提取到脚本里,综合完成的解码脚本如下:
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
function isGzipStream($bin){
if (strlen($bin)>=2){
$bin=substr($bin,0,2);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
switch ($typeCode) {
case 31139:
return true;
break;
default:
return false;
}
}else{
return false;
}
}
$pass = "";
$key='3c6e0b8a9c15224a';
$data=encode(base64_decode($pass),$key);
if(isGzipStream($data)){
echo "1\n";
echo gzdecode($data);
}
else{
echo $data;
}
请求包和返回包都可用此脚本进行解密。最终,对所有的内容进行解密后的结果如下:
test
包确认是否存活。basicinfo
,获取基本信息。cmdline
后面跟的是我执行的系统命令,返回www-data
。FiledirName
后面跟的是文件夹名称,返回文件夹内容列表。至此,phpxor
版本的shell
就分析完成,至于phpevalxor
版本的也很简单,大致流程一样,不过是先注入了一个phpxor
版本的shell
到内存里,然后再执行后续phpxor
版本shell
的功能罢了,依旧可以使用上述的解码脚本进行解码。哥斯拉的shell
加密过程实际上比冰蝎流程要复杂一些,相对来说也更保险一点。
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。
团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。
对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。