java-memshell-generator工具分析优化
多*瓜 安全工具 129浏览 · 2025-02-28 10:33

Project Introduction

目前该项目已有1.8k stars

官网介绍:

支持以下框架、组件、内存马类型、输出格式:

中间件
框架
工具 (测试版本)
内存马类型
输出格式
辅助模块
Tomcat
SpringMVC
AntSword
(2.1.15)
Listener
BASE64
专项漏洞封装
Resin
SpringWebFlux
Behinder
(4.0.7)
Filter
BCEL
表达式语句封装
WebLogic
Godzilla
(4.0.1)
Interceptor
BIGINTEGER
Jetty
Neo-reGeorg
(5.1.0)
HandlerMethod
CLASS
WebSphere
Suo5
(0.9.0)
TomcatValve
JAR
Undertow
Custom
JAR_AGENT
GlassFish
JS
Apusic(金蝶)
JSP
BES(宝兰德)
InforSuite(中创)
TongWeb(东方通)

项目编译:

mvn package assembly:single编译成功后,会在release目录下 生成如下jar包


Framework Introduction

项目代码整体目录如下

Plain Text
复制代码
使用的流程图大致如下:

jmg-extenderjmg-woodpecker 目前处于尚未整合阶段

jmg-entender :拓展,通过DFSEechoDNSLogHTTPLogSleep实现中间件/框架探测。

jmg-woodpecker:应该是最原始的jmg-cli,现已经废弃使用

jmg-sdk: 作为接口,整合冰蝎、哥斯拉等工具的shell Generator

jmg-core: 作为核心代码内核

具备 各种应用对应组件 的注入器生成模板

项目整体配置文件config配置

内存马 bypass、格式化输出等工具类编写

jmg-clijmg-gui

主要实现解析参数等逻辑,实现generate 得到payload

jmg-behinderjmg-godzillajmg-neoregeorgjmg-suo5jmg-antswordjmg-custom

作为工具类:copy这些工具实现内存马的相关代码,并将生成的内存马payload类字节流化

正常支持生成监听器类型、过滤器、拦截器类型等内存马
图片加载失败


Shell Generator

主要查看jmg.sdk.util.ShellGenerator#makeShell 方法

根据传入的ToolType,分别构造不同类型的shellGenerator最后执行对应makeShell方法,获取对应工具、服务类型的内存马

这些不同工具的shellGenrator均继承自jmg.core.generator.IShellGenerator接口

initShell 方法主要处理shell的相关配置信息情况

makeShell方法即为 获取内存马对应种类,调用modifyShell方法制作对应的 内存马字节流

modifyShell 方法通过javassit制作内存马字节流

Behinder

位于jmg-behinder模块

initShell()

初始化pass,如无参数传入,赋值为随机六位的字符串

makeShell()

通过目录下jmg.behinder.util.ShellUtil类下的方法获取对应的shellClassName

根据toolTypeshellType获取对应内存马类路径的相关hashMap表

之后获取诸如 jmg.behinder.memshell.BehinderInterceptor的内存马类包路径,通过modifyShell方法生成内存马字节码。最后将以下数据 保存到config

内存马字节流

内存马字节流长度

Base64形式的内存马字节流

modifyShell()

根据传入的shellClassName 制作对应的内存马字节流,并创建相关鉴权字段

首先通过pool.getCtClass(className)创建相关内存马的 class

之后添加字段pass,headerNameheaderValue作为内存马流量通信阶段鉴权

在之后根据传入的shell类型,添加新传入的方法

antSword

位于jmg-antsword模块

框架结构逻辑类似冰蝎

suo5

位于jmg-suo5模块

框架结构逻辑类似冰蝎

neregeorg

位于jmg-neregeorg模块

框架结构逻辑类似冰蝎

custom

位于jmg-custom模块

框架结构逻辑类似冰蝎

Injector Generator

jmg.core.generator.InjectorGenerator#makeInjector方法中

通过传入ServerTypeShellType两个参数的值,在InjectorUtil方法中通过维护两个HashMap,从而获取对应可供利用的注入器类的名字

之后会调用jmg.core.generator.InjectorGenerator.UtilPlus#generate方法,来对注入器的相关具体实现类进行修改、添加字节码、生成注入器字节码等操作。

首先通过javassit修改getBase64String方法 返回的值,为我们传入的内存马字节流的Base64形式,这个在后续注入器反射执行创建内存马会提到。之后就是构造常规的方法,Url路径映射、类名等操作,不再赘述

Bypass

书接上文,在generate方法中,如果设置了需要BypassJDKModule

首先给注入器类添加方法bypassJDKModule具体的bypass如下

最后修改注入器类的初始化构造方法Constructor,添加执行bypassJDKModule().

Gadget

byte[] bytes = new CtClassUtil(config, pool, ctClass).modifyForExploitation();通过调用modifyForExploitation来为对应的注入器类添加相关的接口目前支持添加以下四种Gadget

com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet

org.apache.xalan.xsltc.runtime.AbstractTranslet

Fastjson Groovy loadJar 的利用需要实现 ASTTransformation 接口

snakeyaml loadJar 的利用需要实现 ScriptEngineFactory 接口

这里的Gadget 意思即为,生成上述字节流后,作为字节流利用相关反序列化链的相关Gadget从而实现利用。

模板

模版的实现大同小异,这里以TomcatFilterInjectorTpl模板为例:

注入器类反射初始化

首先该注入器类在被反射初始化的时候,由于存在静态的代码域 会调用注入器的construtor方法

获取Context

首先调用getContext方法建相应的context通过线程Thread,获取创建过滤器所需要的相关上下文Context

针对不同版本的tomcat都做了相应的优化

获取内存马 实例化类

接着调用getFilter方法

通过调取getBase64String()方法返回内存马字节流。之后通过defineClass 方法加载内存马的字节流,生成对应内存马的class文件。最后实例化为filter过滤器

添加内存马到应用服务中

最后调用addFilter方法,适配tomcata的不同版本,定制不同的添加过滤器方法

Format Output

输出格式

jMGCodeApi主要封装了字节流格式化输出的各个接口

jmg.core.jMGCodeApi#generate方法中实现针对传入参数输出对应的字节流

Jexpr 表达式语句封装-优化

该表达式方法在原项目中只在gui模块实现了

我将其转移到到jmg.core.util.JExprUtil类中调用第三方库实现,对字节流表达式的封装执行。

并额外为cli提供了Expr表达式的功能优化效果如下:
图片加载失败


Tool

jmg-cli

参数部分

jmg/cli/Console.java#init()方法,会设置五种类型的参数

ToolType

Tools: [Godzilla, Behinder, AntSword, Suo5, NeoreGeorg]

serverType:

Servers: [Tomcat, SpringMVC, Jetty, Resin, WebLogic, WebSphere, Undertow, GlassFish, JBoss, Tongweb, Apusic, BES, InforSuite]

`shellTypes:

Shells: [Listener, Filter, Interceptor]

formatType:

Formats: [BASE64, BCEL, BIGINTEGER, CLASS, JAR, JAR_AGENT, JSP]

命令说明

help 说明:

支持list , use,set, get,generate等命令

list , use,set, get命令均是为了帮助设置内存马生成的相关参数

generate命令,可以将生成的内存马输出

此外,可以知道,cli版本的目前不支持表达式语句包装。 已实现优化

generate命令所对应方法,不再赘述

jmg-gui

jmg.gui.form.jMGForm类中,通过idea自身带的图形化界面相关组件,实现图形化,监控图形化界面中各个Label的赋值,从而实现对配置文件config各个参数的赋值。

参数赋值部分不再赘述,主要查看generate button 按钮之后的动作同样是生成内存马字节流、注入器字节流。最后ResultUtil.resultOutput()方法实现输出可用shell的相关信息

总结

更新:

cli模块增添了表达式语句封装

todo:

更新主流针对Servlet类型内存马生成

整合jmg-extender 模块到工具中

更新针对其他框架、种类的内存马方案,支持更多custom自定义化内存马生成

缺乏反序列化链 Gadget 与 (注入器/neicunma) 的结合

后续考虑:实现 反序列化链与内存马 一键结合。

Reference

https://github.com/pen4uin/java-memshell-generator

0 条评论
某人
表情
可输入 255

没有评论