记一次流量分析&代码分析-冰蝎v2.0.1
字数 2210 2025-08-11 17:40:32
冰蝎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解码)
- 使用相同方法解密返回密文
-
解密流程详解:
1. 冰蝎发送AES加密数据到webshell 2. webshell检测无GET提交的pass参数,调用openssl扩展解密 3. 解密得到载荷:assert|eval(base64_decode('...')) 4. 以"|"分隔载荷,将执行部分放入自定义类的__construct() 5. 实例化类触发构造函数,执行eval(base64_decode('...')) 6. 执行结果被加密后返回客户端
三、冰蝎特征检测
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})
- 上行:BASE64编码数据(
四、冰蝎源码分析
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使用不同密钥加密结果不同