java-memshell-generator工具分析优化
字数 3198 2025-08-29 08:30:18
Java内存马生成器(java-memshell-generator)深度分析与使用指南
一、项目概述
java-memshell-generator(简称jMG)是一款功能强大的Java内存马生成工具,当前已在GitHub上获得1.8k stars。该项目支持多种主流Java中间件、框架和工具,能够生成各种类型的内存马,并提供多种输出格式。
1.1 支持范围
支持的中间件/框架:
- Tomcat
- Resin
- WebLogic
- Jetty
- WebSphere
- Undertow
- GlassFish
- JBoss
- Apusic(金蝶)
- BES(宝兰德)
- InforSuite(中创)
- TongWeb(东方通)
支持的工具:
- AntSword(蚁剑,测试版本2.1.15)
- Behinder(冰蝎,4.0.7)
- Godzilla(哥斯拉,4.0.1)
- Neo-reGeorg(5.1.0)
- Suo5(0.9.0)
- 自定义(Custom)
支持的内存马类型:
- Listener(监听器)
- Filter(过滤器)
- Interceptor(拦截器)
- HandlerMethod
- TomcatValve
支持的输出格式:
- BASE64
- BCEL
- BIGINTEGER
- CLASS
- JAR
- JAR_AGENT
- JSP
二、项目编译与结构
2.1 编译方法
mvn package assembly:single
编译成功后,会在release目录下生成相关jar包。
2.2 项目目录结构
jmg-extender/ # 拓展模块(尚未整合)
jmg-woodpecker/ # 原始jmg-cli(已废弃)
jmg-sdk/ # 接口层,整合各种工具的shell生成器
jmg-core/ # 核心代码
|- generator/ # 各种应用对应组件的注入器生成模板
|- config/ # 项目整体配置
|- util/ # 工具类(bypass、格式化输出等)
jmg-cli/ # 命令行界面
jmg-gui/ # 图形界面
jmg-behinder/ # 冰蝎工具支持
jmg-godzilla/ # 哥斯拉工具支持
jmg-neoregeorg/ # Neo-reGeorg支持
jmg-suo5/ # Suo5支持
jmg-antsword/ # 蚁剑支持
jmg-custom/ # 自定义支持
三、核心功能实现
3.1 Shell生成器(Shell Generator)
核心类:jmg.sdk.util.ShellGenerator#makeShell
根据传入的ToolType,构造不同类型的shellGenerator,最终执行对应makeShell方法获取内存马字节流。
3.1.1 通用流程
- 调用
initShell()初始化shell配置 - 调用
makeShell()获取内存马字节流 - 调用
modifyShell()使用Javassist修改内存马类
3.1.2 各工具实现
冰蝎(Behinder)实现:
initShell(): 初始化pass参数(默认随机6位字符串)makeShell(): 通过jmg.behinder.util.ShellUtil获取shell类名modifyShell(): 使用Javassist添加鉴权字段(pass, headerName, headerValue)
蚁剑(AntSword)、Suo5、Neo-reGeorg、Custom:
实现逻辑与冰蝎类似
3.2 注入器生成器(Injector Generator)
核心类:jmg.core.generator.InjectorGenerator#makeInjector
通过ServerType和ShellType参数,从InjectorUtil中获取对应的注入器类名,然后生成注入器字节码。
3.2.1 生成流程
- 修改
getBase64String()方法,返回内存马字节流的Base64形式 - 构造URL路径映射、类名等
- 可选添加BypassJDKModule功能
- 添加Gadget接口支持
3.2.2 Bypass实现
在generate方法中,如果设置了BypassJDKModule:
- 为注入器类添加
bypassJDKModule方法 - 修改构造方法,添加
bypassJDKModule()调用
3.2.3 Gadget支持
通过modifyForExploitation方法为注入器类添加接口,支持以下Gadget:
com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTransletorg.apache.xalan.xsltc.runtime.AbstractTranslet- Fastjson
- Groovy (需实现
ASTTransformation接口) - snakeyaml (需实现
ScriptEngineFactory接口)
3.3 模板实现
以TomcatFilterInjectorTpl为例:
-
注入器初始化:
- 静态代码域调用构造方法
- 获取Context上下文(适配不同Tomcat版本)
-
获取内存马实例:
- 调用
getBase64String()获取内存马字节流 - 使用
defineClass加载字节流 - 实例化为Filter对象
- 调用
-
添加内存马:
- 适配不同Tomcat版本
- 将Filter添加到应用服务中
3.4 格式化输出
jMGCodeApi类封装了字节流格式化输出的接口,generate方法根据参数输出对应格式的字节流。
四、工具使用
4.1 命令行版本(jmg-cli)
参数说明:
ToolType: [Godzilla, Behinder, AntSword, Suo5, NeoreGeorg]serverType: [Tomcat, SpringMVC, Jetty, Resin, WebLogic, WebSphere, Undertow, GlassFish, JBoss, Tongweb, Apusic, BES, InforSuite]shellTypes: [Listener, Filter, Interceptor]formatType: [BASE64, BCEL, BIGINTEGER, CLASS, JAR, JAR_AGENT, JSP]
命令列表:
help: 显示帮助信息list: 列出可用选项use: 选择特定工具/服务器/类型set: 设置参数值get: 获取当前参数值generate: 生成内存马并输出
4.2 图形界面版本(jmg-gui)
通过jmg.gui.form.jMGForm类实现图形化界面,监控各Label赋值来配置参数。
生成流程:
- 设置各项参数
- 点击Generate按钮
- 生成内存马和注入器字节流
- 通过
ResultUtil.resultOutput()输出结果
五、优化与扩展
5.1 已实现优化
- 为cli模块添加表达式语句封装功能
- 将Jexpr表达式功能从gui模块转移到
jmg.core.util.JExprUtil类 - 增强cli的Expr表达式功能
5.2 未来计划
- 更新主流Servlet类型内存马生成
- 整合jmg-extender模块
- 支持更多框架和自定义内存马
- 实现反序列化链Gadget与内存马的一键结合
六、技术要点总结
- 多工具支持:集成冰蝎、哥斯拉等主流工具的内存马生成
- 多中间件适配:支持十几种常见Java中间件和框架
- 灵活输出:提供6种不同格式的输出选项
- Bypass机制:内置JDK模块绕过功能
- Gadget集成:支持多种反序列化利用链
- 双重界面:同时提供CLI和GUI两种操作方式
七、使用示例
7.1 命令行生成Tomcat Filter内存马
java -jar jmg-cli.jar
jmg> use tool Godzilla
jmg> use server Tomcat
jmg> use shell Filter
jmg> set pass mypassword123
jmg> generate format BASE64
7.2 图形界面操作
- 启动jmg-gui.jar
- 在界面中选择:
- 工具类型: Behinder
- 服务器: Tomcat
- Shell类型: Filter
- 设置密码等参数
- 点击Generate按钮
- 复制生成的Base64 payload
八、注意事项
- 使用前请确保已安装Java运行环境
- 部分功能需要根据目标环境调整参数
- 生成的payload应谨慎使用,遵守法律法规
- 实际环境中可能需要根据具体版本做微调
九、参考资源
- 项目GitHub仓库
- 先知社区原文
- 各相关工具官方文档(冰蝎、哥斯拉等)
- Java内存马技术研究文献