利用“进程注入”实现无文件复活 WebShell
字数 2104 2025-08-18 11:37:19
利用进程注入实现无文件复活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 关键代码实现
// 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方法进行修改,原因:
- 位于HTTP请求调用栈上层
- 与具体URL解耦
- 可直接访问ServletRequest和ServletResponse
3.2 字节码修改技术
使用Javassist工具修改字节码(相比ASM更易用):
- 在
internalDoFilter方法开始处插入恶意代码 - 通过密码字段区分正常请求和恶意请求
- 实现多种功能分支
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 复活流程
- 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后门技术的演进方向,具有强隐蔽性和持久化能力。安全团队需要深入了解其原理,才能有效防御此类高级威胁。本文介绍的技术不仅适用于渗透测试,也为防御方提供了宝贵的研究素材。