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 通用流程

  1. 调用initShell()初始化shell配置
  2. 调用makeShell()获取内存马字节流
  3. 调用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

通过ServerTypeShellType参数,从InjectorUtil中获取对应的注入器类名,然后生成注入器字节码。

3.2.1 生成流程

  1. 修改getBase64String()方法,返回内存马字节流的Base64形式
  2. 构造URL路径映射、类名等
  3. 可选添加BypassJDKModule功能
  4. 添加Gadget接口支持

3.2.2 Bypass实现

generate方法中,如果设置了BypassJDKModule:

  1. 为注入器类添加bypassJDKModule方法
  2. 修改构造方法,添加bypassJDKModule()调用

3.2.3 Gadget支持

通过modifyForExploitation方法为注入器类添加接口,支持以下Gadget:

  • com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet
  • org.apache.xalan.xsltc.runtime.AbstractTranslet
  • Fastjson
  • Groovy (需实现ASTTransformation接口)
  • snakeyaml (需实现ScriptEngineFactory接口)

3.3 模板实现

TomcatFilterInjectorTpl为例:

  1. 注入器初始化:

    • 静态代码域调用构造方法
    • 获取Context上下文(适配不同Tomcat版本)
  2. 获取内存马实例:

    • 调用getBase64String()获取内存马字节流
    • 使用defineClass加载字节流
    • 实例化为Filter对象
  3. 添加内存马:

    • 适配不同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赋值来配置参数。

生成流程:

  1. 设置各项参数
  2. 点击Generate按钮
  3. 生成内存马和注入器字节流
  4. 通过ResultUtil.resultOutput()输出结果

五、优化与扩展

5.1 已实现优化

  1. 为cli模块添加表达式语句封装功能
  2. 将Jexpr表达式功能从gui模块转移到jmg.core.util.JExprUtil
  3. 增强cli的Expr表达式功能

5.2 未来计划

  1. 更新主流Servlet类型内存马生成
  2. 整合jmg-extender模块
  3. 支持更多框架和自定义内存马
  4. 实现反序列化链Gadget与内存马的一键结合

六、技术要点总结

  1. 多工具支持:集成冰蝎、哥斯拉等主流工具的内存马生成
  2. 多中间件适配:支持十几种常见Java中间件和框架
  3. 灵活输出:提供6种不同格式的输出选项
  4. Bypass机制:内置JDK模块绕过功能
  5. Gadget集成:支持多种反序列化利用链
  6. 双重界面:同时提供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 图形界面操作

  1. 启动jmg-gui.jar
  2. 在界面中选择:
    • 工具类型: Behinder
    • 服务器: Tomcat
    • Shell类型: Filter
  3. 设置密码等参数
  4. 点击Generate按钮
  5. 复制生成的Base64 payload

八、注意事项

  1. 使用前请确保已安装Java运行环境
  2. 部分功能需要根据目标环境调整参数
  3. 生成的payload应谨慎使用,遵守法律法规
  4. 实际环境中可能需要根据具体版本做微调

九、参考资源

  1. 项目GitHub仓库
  2. 先知社区原文
  3. 各相关工具官方文档(冰蝎、哥斯拉等)
  4. Java内存马技术研究文献
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 编译方法 编译成功后,会在 release 目录下生成相关jar包。 2.2 项目目录结构 三、核心功能实现 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.AbstractTranslet org.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内存马 7.2 图形界面操作 启动jmg-gui.jar 在界面中选择: 工具类型: Behinder 服务器: Tomcat Shell类型: Filter 设置密码等参数 点击Generate按钮 复制生成的Base64 payload 八、注意事项 使用前请确保已安装Java运行环境 部分功能需要根据目标环境调整参数 生成的payload应谨慎使用,遵守法律法规 实际环境中可能需要根据具体版本做微调 九、参考资源 项目GitHub仓库 先知社区原文 各相关工具官方文档(冰蝎、哥斯拉等) Java内存马技术研究文献