Skip to content

Latest commit

 

History

History
104 lines (94 loc) · 8.29 KB

File metadata and controls

104 lines (94 loc) · 8.29 KB

调用 MemShellParty 生成注入内存马字节码(MemShellPartyGadget)

  • 类别: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 等更细的生成选项。

链接标签

  • 入口 tagsBytecodeInjectEND —— 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 描述「管理工具的连接凭据」,由 parseShellToolConfigshellTool 多态生成——不同工具需要的字段不同(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 并返回空数组。

参数(@Param)

字段 名称 说明 默认 可选值
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)在被加载瞬间完成注入,因此必须搭配上游字节码装载器。
  • lambdaSuffixshrinkprobe 等选项体现其在对抗检测/验证注入方面更精细;如遇参数组合不支持,可改用原版工程生成后复制到 BytecodeFromBase64

所属预设链

usedInChains 为空——自由构件,未直接出现在 51 条预设链中。作为功能最全的内存马 sink,可替换任意命令执行 sink。

关联