冰蝎,从入门到魔改(续)
字数 1622 2025-08-15 21:33:52
冰蝎工具深度分析与魔改指南
0x01 前言
本文是《冰蝎,从入门到魔改》的续篇,重点介绍冰蝎工具在JSP和ASP版本中的特征擦除与魔改方法。冰蝎作为一款流行的Webshell管理工具,其流量特征已被安全设备广泛识别,因此了解其工作原理并进行针对性修改对安全研究和防御都有重要意义。
0x02 通用特征分析
密钥交换时的URL参数
- 特征:密钥交换时Webshell默认密码为"pass",参数值为3位随机数字
- 修改方法:改为随机字符串而非数字
Header中的Content-Type
- 特征:
- GET请求会携带固定Content-type字段
- 原版值为固定非常见值
- 修改方法:
- GET请求改为常见浏览器值
- POST请求改为"text/html; charset=utf-8"或"text/x-www-form-urlencoded; charset=utf-8"
User-Agent
- 特征:内置17个较旧的User-Agent
- 修改方法:更新为较新版本的浏览器User-Agent
Accept字段
- 特征:Accept字段为固定非常见值
- 修改方法:改为常见浏览器值
二次密钥获取
- 特征:至少两次的GET形式获取密钥过程
- 修改方法:合并密钥获取过程
Response中返回密钥
- 特征:密钥直接以16位字符形式返回,Content-Length固定为16
- 修改方法:将密钥嵌入其他数据中返回
Cookie
- 特征:Cookie中携带非常规的Path参数内容
- 修改方法:去除异常Path参数
0x03 JSP版本深度分析
Webshell免杀原理
JSP版Webshell核心逻辑:
// 将客户端发来的字节码转为类并实例化
Class clazz = Class.forName("java.lang.Object");
Object obj = clazz.newInstance();
// 调用equals函数
obj.equals(request);
关键点:
- 使用常见的equals方法调用,看起来无害
- 实际通过重写equals方法执行恶意代码
客户端工作原理
- 通过
getData函数获取发送的数据 getParamedClass函数将类转为字节码- 被转成字节码的Cmd类重写了equals方法,内部调用RunCMD执行系统命令
Content-Type特征
- 特征:请求包中的Content-Type为"application/octet-stream"
- 修改方法:改为"text/html; charset=utf-8"或"text/x-www-form-urlencoded; charset=utf-8"
对抗RASP(OpenRASP)
RASP原理:
- 通过注入保护程序到应用中,实时检测和阻断攻击
- OpenRASP基于命令执行的调用堆栈来识别冰蝎
检测方法:
- 检测调用堆栈中的关键字"net.rebeyond.behinder.payload.java.Cmd.RunCMD"
绕过方法:
- 修改包名(复杂,需修改资源路径)
- 更优方案:仅修改RunCMD函数名称即可规避检测
实现步骤:
- 修改Cmd类中的RunCMD函数名
- 重新编译客户端
- 测试确认OpenRASP不再告警
0x04 ASP版本分析
常见问题与解决
连接报错问题:
- 现象:魔改版本连接时报500错误
- 原因:原版pass参数为数字(0为False,其他为True),魔改后改为字符串导致类型不匹配
- 解决方案:修改Webshell代码,判断pass值不为空字符串而非直接作为条件
' 原问题代码
If Request("pass") Then
' 修改后代码
If Request("pass") <> "" Then
Content-Type特征
- 同JSP版本问题
- 修改方法相同
0x05 总结与建议
- 特征消除:全面修改默认参数、请求头、响应格式等明显特征
- 对抗检测:
- 对于静态检测:修改类名、方法名、包结构
- 对于动态检测(RASP):修改关键函数名,混淆调用链
- 版本差异:注意不同语言版本(ASP/JSP/PHP)的特定问题
- 持续更新:关注冰蝎新版本特性,及时调整防御或修改策略
通过系统性地分析和修改,可以有效降低冰蝎工具被检测到的风险,同时也为防御方提供了检测思路。在攻防对抗中,理解工具原理是制定有效策略的基础。