利用“进程注入”实现无文件复活 WebShell
字数 2104 2025-08-18 11:37:19

利用进程注入实现无文件复活WebShell技术详解

1. 技术背景与原理概述

传统的WebShell是以文件形式存在于Web容器目录中的恶意脚本文件,容易被安全设备检测和清除。本文介绍了一种基于进程注入的内存WebShell技术(memShell),通过直接修改Web容器进程的内存实现无文件驻留,并利用Java Instrumentation机制实现功能注入和持久化。

1.1 核心优势

  • 无文件落地:不依赖磁盘文件,完全驻留在内存中
  • 隐蔽性强:绕过传统文件扫描和防篡改系统
  • 通用性强:不依赖特定URL路径,适用于各种请求
  • 持久化能力:通过ShutdownHook实现服务重启后自动复活

1.2 技术原理

  1. Java Instrumentation:动态修改已加载类的字节码
  2. 进程注入:将恶意代码注入到Web容器进程
  3. 关键类劫持:修改ApplicationFilterChain处理流程
  4. 持久化机制:利用ShutdownHook实现自动复活

2. Java Instrumentation技术详解

Java Instrumentation是Java SE5引入的机制,允许在JVM启动后动态修改已加载或未加载的类,包括类的属性和方法。

2.1 核心组件

  • Agent:独立于应用程序的监控程序
  • ClassFileTransformer:类文件转换器接口
  • Instrumentation:提供类操作和转换的API

2.2 工作流程示例

  1. 创建普通Java程序(Example工程)
  2. 创建Agent程序(Agent工程)
  3. 创建Agent启动器(AgentStarter工程)
  4. 通过VirtualMachine.attach()将Agent注入目标JVM
  5. Agent修改目标类的字节码

2.3 关键代码实现

// Agent入口类
public class AgentEntry {
    public static void agentmain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new Transformer(), true);
        // 重转换目标类
        inst.retransformClasses(targetClass);
    }
}

// 类转换器
public class Transformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className, 
                          Class<?> classBeingRedefined,
                          ProtectionDomain protectionDomain,
                          byte[] classfileBuffer) {
        // 修改目标类的字节码
        return modifiedBytecode;
    }
}

3. 内存WebShell实现细节

3.1 关键类选择

选择org.apache.catalina.core.ApplicationFilterChain类的internalDoFilter方法进行修改,原因:

  1. 位于HTTP请求调用栈上层
  2. 与具体URL解耦
  3. 可直接访问ServletRequest和ServletResponse

3.2 字节码修改技术

使用Javassist工具修改字节码(相比ASM更易用):

  1. internalDoFilter方法开始处插入恶意代码
  2. 通过密码字段区分正常请求和恶意请求
  3. 实现多种功能分支

3.3 核心功能实现

if (pass_the_world!=null&&pass_the_world.equals("rebeyond")) {
    if (model==null||model.equals("")) {
        // 显示帮助
    } else if (model.equalsIgnoreCase("exec")) {
        // 命令执行
    } else if (model.equalsIgnoreCase("connectback")) {
        // 反向连接
    } else if (model.equalsIgnoreCase("urldownload")) {
        // URL下载
    } else if (model.equalsIgnoreCase("list")) {
        // 文件列表
    } else if (model.equalsIgnoreCase("download")) {
        // 文件下载
    } else if (model.equalsIgnoreCase("upload")) {
        // 文件上传
    } else if (model.equalsIgnoreCase("proxy")) {
        // SOCKS代理
    } else if (model.equalsIgnoreCase("chopper")) {
        // 菜刀一句话
    }
}

4. 持久化与复活机制

4.1 ShutdownHook机制

在JVM关闭时执行预设操作:

Thread t = new Thread() {
    public void run() {
        // 1. 将jar包写入磁盘
        // 2. 重新注入
    }
};
Runtime.getRuntime().addShutdownHook(t);

4.2 复活流程

  1. JVM关闭时触发ShutdownHook
  2. 将内存中的jar包写入临时目录
  3. 执行java -jar重新注入
  4. 形成闭环持久化

4.3 跨平台处理

  • Linux:直接删除文件
  • Windows:需要特殊处理文件锁定
    1. 释放专用exe程序
    2. 遍历进程文件句柄
    3. 使用DuplicateHandle关闭句柄
    4. 删除文件

5. 完整植入流程

  1. 上传inject.jar和agent.jar到任意目录
  2. 执行java -jar inject.jar
  3. inject.jar查找并注入Web容器JVM进程
  4. agent.jar执行:
    • 修改ApplicationFilterChain.internalDoFilter
    • 将jar包读入内存
    • 初始化访问memShell
    • 删除磁盘上的jar包
  5. 通过任意URL访问memShell
  6. JVM关闭时自动复活

6. 功能说明

6.1 基本功能

  • 命令执行/anyurl?pass_the_world=xxx&model=exec&cmd=whoami
  • 文件管理:上传、下载、列表
  • 反向连接:建立反向Shell
  • URL下载:从指定URL下载文件

6.2 高级功能

  1. 内嵌reGeorg:实现SOCKS5代理
    • 需要修改reGeorgSocksProxy.py支持带参数URL
  2. 菜刀一句话:兼容中国菜刀客户端
  3. 帮助系统:无model参数时显示使用说明

7. 防御与检测建议

7.1 防御措施

  1. 限制JVM attach权限
  2. 监控ShutdownHook添加行为
  3. 检测异常的类重定义操作
  4. 加强JVM安全策略配置

7.2 检测方法

  1. 检查JVM加载的异常Agent
  2. 监控ApplicationFilterChain类修改
  3. 分析HTTP请求中的异常参数
  4. 检测异常的ShutdownHook线程

8. 扩展与变种

  1. 其他容器适配
    • JBOSS、WebLogic等只需修改关键类
  2. 其他语言实现
    • 类似原理可应用于PHP、.NET等环境
  3. 功能扩展
    • 增加更多渗透测试功能
    • 实现模块化加载

9. 参考实现

GitHub项目地址:https://github.com/rebeyond/memShell

10. 总结

内存WebShell技术代表了Web后门技术的演进方向,具有强隐蔽性和持久化能力。安全团队需要深入了解其原理,才能有效防御此类高级威胁。本文介绍的技术不仅适用于渗透测试,也为防御方提供了宝贵的研究素材。

利用进程注入实现无文件复活WebShell技术详解 1. 技术背景与原理概述 传统的WebShell是以文件形式存在于Web容器目录中的恶意脚本文件,容易被安全设备检测和清除。本文介绍了一种基于进程注入的内存WebShell技术(memShell),通过直接修改Web容器进程的内存实现无文件驻留,并利用Java Instrumentation机制实现功能注入和持久化。 1.1 核心优势 无文件落地 :不依赖磁盘文件,完全驻留在内存中 隐蔽性强 :绕过传统文件扫描和防篡改系统 通用性强 :不依赖特定URL路径,适用于各种请求 持久化能力 :通过ShutdownHook实现服务重启后自动复活 1.2 技术原理 Java Instrumentation :动态修改已加载类的字节码 进程注入 :将恶意代码注入到Web容器进程 关键类劫持 :修改ApplicationFilterChain处理流程 持久化机制 :利用ShutdownHook实现自动复活 2. Java Instrumentation技术详解 Java Instrumentation是Java SE5引入的机制,允许在JVM启动后动态修改已加载或未加载的类,包括类的属性和方法。 2.1 核心组件 Agent :独立于应用程序的监控程序 ClassFileTransformer :类文件转换器接口 Instrumentation :提供类操作和转换的API 2.2 工作流程示例 创建普通Java程序(Example工程) 创建Agent程序(Agent工程) 创建Agent启动器(AgentStarter工程) 通过VirtualMachine.attach()将Agent注入目标JVM Agent修改目标类的字节码 2.3 关键代码实现 3. 内存WebShell实现细节 3.1 关键类选择 选择 org.apache.catalina.core.ApplicationFilterChain 类的 internalDoFilter 方法进行修改,原因: 位于HTTP请求调用栈上层 与具体URL解耦 可直接访问ServletRequest和ServletResponse 3.2 字节码修改技术 使用Javassist工具修改字节码(相比ASM更易用): 在 internalDoFilter 方法开始处插入恶意代码 通过密码字段区分正常请求和恶意请求 实现多种功能分支 3.3 核心功能实现 4. 持久化与复活机制 4.1 ShutdownHook机制 在JVM关闭时执行预设操作: 4.2 复活流程 JVM关闭时触发ShutdownHook 将内存中的jar包写入临时目录 执行java -jar重新注入 形成闭环持久化 4.3 跨平台处理 Linux :直接删除文件 Windows :需要特殊处理文件锁定 释放专用exe程序 遍历进程文件句柄 使用DuplicateHandle关闭句柄 删除文件 5. 完整植入流程 上传inject.jar和agent.jar到任意目录 执行 java -jar inject.jar inject.jar查找并注入Web容器JVM进程 agent.jar执行: 修改ApplicationFilterChain.internalDoFilter 将jar包读入内存 初始化访问memShell 删除磁盘上的jar包 通过任意URL访问memShell JVM关闭时自动复活 6. 功能说明 6.1 基本功能 命令执行 : /anyurl?pass_the_world=xxx&model=exec&cmd=whoami 文件管理 :上传、下载、列表 反向连接 :建立反向Shell URL下载 :从指定URL下载文件 6.2 高级功能 内嵌reGeorg :实现SOCKS5代理 需要修改reGeorgSocksProxy.py支持带参数URL 菜刀一句话 :兼容中国菜刀客户端 帮助系统 :无model参数时显示使用说明 7. 防御与检测建议 7.1 防御措施 限制JVM attach权限 监控ShutdownHook添加行为 检测异常的类重定义操作 加强JVM安全策略配置 7.2 检测方法 检查JVM加载的异常Agent 监控ApplicationFilterChain类修改 分析HTTP请求中的异常参数 检测异常的ShutdownHook线程 8. 扩展与变种 其他容器适配 : JBOSS、WebLogic等只需修改关键类 其他语言实现 : 类似原理可应用于PHP、.NET等环境 功能扩展 : 增加更多渗透测试功能 实现模块化加载 9. 参考实现 GitHub项目地址:https://github.com/rebeyond/memShell 10. 总结 内存WebShell技术代表了Web后门技术的演进方向,具有强隐蔽性和持久化能力。安全团队需要深入了解其原理,才能有效防御此类高级威胁。本文介绍的技术不仅适用于渗透测试,也为防御方提供了宝贵的研究素材。