记一次流量分析&代码分析-冰蝎v2.0.1
字数 2210 2025-08-11 17:40:32

冰蝎v2.0.1流量分析与代码分析技术文档

一、冰蝎通信机制概述

1.1 基本通信流程

冰蝎是一种Webshell管理工具,其通信分为两个主要阶段:

  1. 密钥协商阶段

    • 客户端通过GET/POST请求服务端
    • 服务端生成128位随机数,MD5高16位作为密钥
    • 密钥存入session并返回给客户端
    • 客户端重复此过程直到满足特定条件确定最终密钥
  2. 加密通信阶段

    • 客户端使用AES/XOR加密待执行命令
    • 服务端解密并执行命令
    • 执行结果经AES加密后返回客户端

1.2 密钥生成机制

  • 服务端使用随机数MD5的高16位作为密钥
  • 密钥存储在会话的SESSIONID中
  • 客户端会保存密钥和响应报文中的set-cookie值
  • 密钥格式:16位小写字母+数字组合(^[a-fA-F0-9]{16}$)

二、流量分析技术

2.1 流量捕获与分析

  1. 使用Wireshark捕获数据包

    • 可观察到密钥协商和加密通信全过程
    • 密钥协商阶段可在响应体中看到明文密钥
  2. HTTP流追踪

    • 可查看完整的客户端-服务器通信过程
    • 第一次访问:GET方式提交随机数,服务器返回16位密钥
    • 第二次访问:相同方式更新密钥

2.2 流量解密方法

  1. 解密工具

    • AES在线解码工具
    • BASE64在线解码工具
  2. 解密步骤

    • 从请求密钥的数据包中获取密钥
    • 获取请求密文和返回密文
    • 使用密钥解密请求密文(先AES解密,再BASE64解码)
    • 使用相同方法解密返回密文
  3. 解密流程详解

    1. 冰蝎发送AES加密数据到webshell
    2. webshell检测无GET提交的pass参数,调用openssl扩展解密
    3. 解密得到载荷:assert|eval(base64_decode('...'))
    4. 以"|"分隔载荷,将执行部分放入自定义类的__construct()
    5. 实例化类触发构造函数,执行eval(base64_decode('...'))
    6. 执行结果被加密后返回客户端
    

三、冰蝎特征检测

3.1 可绕过特征

  1. Accept字段

    • 默认值:Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2
    • 存在于所有通信阶段
  2. UserAgent字段

    • 内置十余种UserAgent,每次连接随机选择
    • 同一IP访问同一URL使用多个列表中的UserAgent可视为特征
  3. 长连接

    • 默认使用Keep-Alive
    • 请求头/响应头中带有:Connection: Keep-Alive

3.2 非可绕过特征

  1. 密钥传递URL参数

    • URI只有一个key-value参数
    • Key:10位以下字母数字(shell密码)
    • Value:2-3位随机纯数字
    • 正则:\.(php|jsp|asp|aspx)\?(\w){1,10}=\d{2,3} HTTP/1.1
  2. 加密通信URL参数

    • 无URL参数
    • 正则:\.(php|jsp|asp|jspx|asa) HTTP/1.1
  3. 加密数据特征

    • 上行:BASE64编码数据(\r\n\r\n[a-zA-Z\d\+\/]{20,}
    • 下行:加密二进制数据([^\w\s>w]{2}[^\w\s>a-zA-Z\d]{2}

四、冰蝎源码分析

4.1 核心代码结构

  1. 主要包结构

    • net.rebeyond.behinder:核心功能实现
    • core包:主要逻辑代码
    • Crypt.java/Decrypt.java:服务端语言加解密
    • Params.java:不同语言payload处理
  2. 关键类分析

    • BasicInfoUtils:获取服务器基本信息
    • ShellService:核心服务类
    • Utils:包含getKeyAndCookie等关键方法

4.2 核心功能实现

  1. 密钥协商

    • Utils.getKeyAndCookie方法获取密钥
    • 循环调用getRawKey并进行异或操作确定最终密钥
  2. payload生成

    • 使用ASM框架动态修改class文件
    • 对payload进行AES加密和BASE64编码
    • 通过POST发送加密payload
  3. 上传机制

    • 上传class字节码
    • 通过classloader.defineClass转换为Class
    • 实例化类获取PageContext及相关对象

4.3 加密机制实现

  1. 加密方式

    • Java/.Net:默认支持AES
    • PHP:需开启openssl扩展
    • v2.0+:PHP环境动态选择加密方式
  2. 加密流程

    • 根据服务端语言选择加密方法
    • 不支持AES时调用ASP的XOR加密代码
    • 加密后进行BASE64编码传输

五、检测与防御建议

5.1 检测方法

  1. 请求特征检测

    • 方法:Request.method=GET
    • URL:Request.url=/[\w.]*.[a-zA-Z]{3,4}\?\w{0,20}=\d{0,10}
    • 响应:Response.body.startwith=\w{16}
  2. 多特征联合检测

    • 结合Accept、UserAgent、Content-Length等特征
    • 关注同一IP的异常访问模式

5.2 防御建议

  1. 网络层防御

    • 监控异常HTTP头字段
    • 检测长连接和特定Content-Length
  2. 应用层防御

    • 限制动态脚本执行权限
    • 监控异常的文件上传和class加载行为
  3. 日志分析

    • 记录和分析密钥协商请求
    • 监控BASE64编码数据的异常传输

六、版本差异分析

6.1 v1.0与v2.0.1区别

  1. 请求包差异

    • v1.0:较简单的密钥请求格式
    • v2.0.1:增加了更多混淆特征
  2. 加密改进

    • v2.0+对PHP环境不再强制依赖openssl
    • 动态选择加密方式增强隐蔽性
  3. 检测难点

    • 加密数据难以提取固定特征
    • 相同payload使用不同密钥加密结果不同
冰蝎v2.0.1流量分析与代码分析技术文档 一、冰蝎通信机制概述 1.1 基本通信流程 冰蝎是一种Webshell管理工具,其通信分为两个主要阶段: 密钥协商阶段 : 客户端通过GET/POST请求服务端 服务端生成128位随机数,MD5高16位作为密钥 密钥存入session并返回给客户端 客户端重复此过程直到满足特定条件确定最终密钥 加密通信阶段 : 客户端使用AES/XOR加密待执行命令 服务端解密并执行命令 执行结果经AES加密后返回客户端 1.2 密钥生成机制 服务端使用随机数MD5的高16位作为密钥 密钥存储在会话的SESSIONID中 客户端会保存密钥和响应报文中的set-cookie值 密钥格式:16位小写字母+数字组合( ^[a-fA-F0-9]{16}$ ) 二、流量分析技术 2.1 流量捕获与分析 使用Wireshark捕获数据包 : 可观察到密钥协商和加密通信全过程 密钥协商阶段可在响应体中看到明文密钥 HTTP流追踪 : 可查看完整的客户端-服务器通信过程 第一次访问:GET方式提交随机数,服务器返回16位密钥 第二次访问:相同方式更新密钥 2.2 流量解密方法 解密工具 : AES在线解码工具 BASE64在线解码工具 解密步骤 : 从请求密钥的数据包中获取密钥 获取请求密文和返回密文 使用密钥解密请求密文(先AES解密,再BASE64解码) 使用相同方法解密返回密文 解密流程详解 : 三、冰蝎特征检测 3.1 可绕过特征 Accept字段 : 默认值: Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2 存在于所有通信阶段 UserAgent字段 : 内置十余种UserAgent,每次连接随机选择 同一IP访问同一URL使用多个列表中的UserAgent可视为特征 长连接 : 默认使用Keep-Alive 请求头/响应头中带有: Connection: Keep-Alive 3.2 非可绕过特征 密钥传递URL参数 : URI只有一个key-value参数 Key:10位以下字母数字(shell密码) Value:2-3位随机纯数字 正则: \.(php|jsp|asp|aspx)\?(\w){1,10}=\d{2,3} HTTP/1.1 加密通信URL参数 : 无URL参数 正则: \.(php|jsp|asp|jspx|asa) HTTP/1.1 加密数据特征 : 上行:BASE64编码数据( \r\n\r\n[a-zA-Z\d\+\/]{20,} ) 下行:加密二进制数据( [^\w\s>w]{2}[^\w\s>a-zA-Z\d]{2} ) 四、冰蝎源码分析 4.1 核心代码结构 主要包结构 : net.rebeyond.behinder :核心功能实现 core 包:主要逻辑代码 Crypt.java / Decrypt.java :服务端语言加解密 Params.java :不同语言payload处理 关键类分析 : BasicInfoUtils :获取服务器基本信息 ShellService :核心服务类 Utils :包含 getKeyAndCookie 等关键方法 4.2 核心功能实现 密钥协商 : Utils.getKeyAndCookie 方法获取密钥 循环调用 getRawKey 并进行异或操作确定最终密钥 payload生成 : 使用ASM框架动态修改class文件 对payload进行AES加密和BASE64编码 通过POST发送加密payload 上传机制 : 上传class字节码 通过 classloader.defineClass 转换为Class 实例化类获取PageContext及相关对象 4.3 加密机制实现 加密方式 : Java/.Net:默认支持AES PHP:需开启openssl扩展 v2.0+:PHP环境动态选择加密方式 加密流程 : 根据服务端语言选择加密方法 不支持AES时调用ASP的XOR加密代码 加密后进行BASE64编码传输 五、检测与防御建议 5.1 检测方法 请求特征检测 : 方法: Request.method=GET URL: Request.url=/[\w.]*.[a-zA-Z]{3,4}\?\w{0,20}=\d{0,10} 响应: Response.body.startwith=\w{16} 多特征联合检测 : 结合Accept、UserAgent、Content-Length等特征 关注同一IP的异常访问模式 5.2 防御建议 网络层防御 : 监控异常HTTP头字段 检测长连接和特定Content-Length 应用层防御 : 限制动态脚本执行权限 监控异常的文件上传和class加载行为 日志分析 : 记录和分析密钥协商请求 监控BASE64编码数据的异常传输 六、版本差异分析 6.1 v1.0与v2.0.1区别 请求包差异 : v1.0:较简单的密钥请求格式 v2.0.1:增加了更多混淆特征 加密改进 : v2.0+对PHP环境不再强制依赖openssl 动态选择加密方式增强隐蔽性 检测难点 : 加密数据难以提取固定特征 相同payload使用不同密钥加密结果不同