MemShellParty(由安全研究员 ReaJason 开发)是一款在红队攻防和安全研究中非常高效的 Java 内存马快速生成工具。它支持主流的 Web 中间件(Tomcat、SpringBoot、Jetty、WebLogic 等),并且涵盖了从 Filter、Servlet 到 Agent、Upgrade 等多种内存马形态。该工具采用了 Web UI 可视化界面,极大简化了手动构造字节码和适配不同中间件的繁琐流程。以下是它的具体使用指南与典型实战示例:
1. 快速部署与启动
MemShellParty 最推荐的运行方式是直接使用 Docker,无需本地配置复杂的 Java 编译环境。
bash
# 拉取并运行容器(将外部端口映射为 18080,避免与本地常用 Web 服务冲突)
docker run --pull=always --rm -it -d -p 18080:8080 --name memshell-party reajason/memshell-party:latest
启动成功后,使用浏览器访问本地的控制台:👉 http://127.0.0.1:18080
2. 核心配置矩阵(UI 选型指南)
进入界面后,你通常需要按顺序完成以下链条的配置:
| 配置维度 | 常见可选参数 | 实战避坑提示 |
|---|---|---|
| Target Middleware | Tomcat, SpringBoot, Jetty, WebLogic, JBoss, Resin | 必须严格匹配目标站点的 Web 容器类型。 |
| Target Version | Java 6 / Java 8 / Java 11 / Java 17 | 至关重要。目标环境是 JDK 8 就选 Java 8,否则盲目选用高版本会导致目标机抛出 UnsupportedClassVersionError 错误导致注入失败。 |
| Memshell Type | Filter, Listener, Servlet, Interceptor, Valve, Agent | 根据注入点(如反序列化、表达式注入)以及绕过防守方检测的需要进行选择。 |
| Payload Type | Behinder (冰蝎), Godzilla (哥斯拉), AntSword (蚁剑), Command (命令回显), Suo5 | 对应后续你用来连接该内存马的远控客户端或代理工具。 |
| Output Format | Base64, Hex, Class Bytes, JSP, Agent Jar | 根据你的漏洞利用链(如 Fastjson 链需要 Base64,JSP 上传需要纯源码或打包好的二进制)选择。 |
3. 典型应用场景示例
场景一:通过反序列化漏洞注入 Tomcat Filter 冰蝎马
这是攻防演练中最经典的组合,用于在存在 Java 反序列化(如 CommonsCollections 链)的 Tomcat 目标中打入常驻内存马。
配置生成:
- Middleware: 选择
Tomcat - Memshell Type: 选择
Filter - Payload Type: 选择
Behinder3或Behinder4(取决于你使用的冰蝎版本) - 高级配置:
- URL Pattern: 设置为
/favicon.ico或/js/chunk-*.js(强烈建议伪装成静态资源路径,避开/shell等敏感字眼)。 - Password/Secret: 保持冰蝎默认或自定义。
- URL Pattern: 设置为
- Output: 选择
Base64。
实战利用:
点击生成后,工具会输出一串已经过中间件 API 适配兼容的恶意类字节码 Base64 字符串。将其填入你的反序列化漏洞利用小工具(Gadget)中,触发 ClassLoader.defineClass() 方法,目标服务器即可在不重启的情况下动态加载并绑定该 Filter。接着直接用冰蝎连接你配置的 URL 即可。
场景二:利用 SpEL 表达式注入打入 Spring 拦截器命令回显马
针对 SpringBoot 架构中常见的表达式注入(如 Spring Cloud Function SpEL RCE)场景,生成轻量级的命令回显马。
配置生成:
- Middleware: 选择
SpringBoot - Memshell Type: 选择
Interceptor(拦截器) 或Controller(路由) - Payload Type: 选择
Command(自定义命令执行) - 高级配置:可在配置中指定触发 Header。例如只有当 HTTP 请求头中包含
X-Cmd-Token: bypass时,拦截器才会解析执行命令并回显,常规请求完全正常,以此隐蔽流量。 - Output: 选择
Class Bytes或通过内置转换器转为可用于表达式执行的 Payload。
实战利用:
注入成功后,你可以对目标站点的任意已有正常路由发送带有特定 Header 的请求,直接获取命令执行回显,无需重新开辟新的 URL 路径。
场景三:无回显/高强度防护环境下的 Java Agent 内存马落地
当目标系统存在 WAF 严密监控、传统 Filter/Servlet 容易被安全 Agent(如 RASP)动态查杀时,通过底层 Agent 技术进行深度隐藏。
配置生成:
- Memshell Type: 选择
Agent - Payload Type: 选择
Godzilla(哥斯拉) - Output: 选择
Agent Jar(工具会自动提供编译好的.jar文件供下载)。
实战利用:
在获得基础的文件上传或命令执行权限后,将生成的 agent.jar 上传至目标服务器临时目录。通过执行以下命令(或利用工具集成的 Attach 脚本)动态注入到目标 JVM 进程中:
bash
java -jar injector.jar <PID> agent.jar
这种方式由于直接修改了 JVM 层的类定义,隐蔽性极高,通常能够穿透大部分常规的应用层检查。
4. 实战进阶 Tips
💡 路由隐蔽策略 :不要盲目挂载到根路径(如 /*),这极易引发业务异常或被防守方流量审计一眼识破。推荐绑定到目标系统本身就大量存在的静态资源目录或者第三方依赖路径(如 /微服务名/actuator/.. 或 /assets/)。
💡 轻量化原则 :如果仅仅需要验证漏洞或者快速执行几条命令,Payload 优先选择 Command 选项,其生成的字节码体积远小于冰蝎、哥斯拉等完整的 Webshell 状态机,能大幅提高因传输长度限制(如 URL 长度限制、反序列化数据包限制)而导致注入失败的成功率。