From 4611dc639c2799f9706f45731ba70f3b715894e6 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sun, 20 Jul 2025 13:08:05 +0800 Subject: [PATCH] docs: update README --- CONTRIBUTING.md | 35 +++-- README.md | 326 +++--------------------------------------- docs/BuildOnLocal.md | 106 ++++++++++++++ docs/Compatibility.md | 84 +++++++++++ docs/SDKUsage.md | 90 ++++++++++++ 5 files changed, 320 insertions(+), 321 deletions(-) create mode 100644 docs/BuildOnLocal.md create mode 100644 docs/Compatibility.md create mode 100644 docs/SDKUsage.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 425ebdca..180439ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,19 +1,27 @@ +## Contribute + +> 你的任何反馈以及 issue 交流都是对当前项目的贡献 + +> It will be so nice if you want to contribute. 🎉 + +1. 如果你有高超的 Docker 环境构建技术,可以尝试添加 CVE 相关的集成测试用例。 +2. 如果你有高超的内存马编写技术,可以尝试添加一个内存马试试。 +3. 如果你有丰富的实战经验,可以尝试写写 issue 来提提建议。 + ### 目录结构 -- bom: 依赖版本管理,不用写到处写版本号就是舒服 - boot:使用 SpringBoot 为 UI 提供生成服务 -- common:bytebuddy 等工具类存放 +- memshell-party-common:bytebuddy/asm 等工具类存放 - generator:内存马生成核心 -- deserialize:反序列化相关 gadget +- packer:常见漏洞 payload 生成 - integration-test:集成测试用例 -- memshell:内存功能类以及注入器(为保证兼容性够高,所以单独弄出来) -- memshell-java8:Spring 相关的存在 lambda 表达式所以单独弄出来 -- tools/behinder:冰蝎简易连接器 -- tools/godzilla:哥斯拉简易连接器 -- tools/suo5:Suo5 简易连接器 +- memshell:内存功能类以及注入器 +- memshell-agent:Agent 内存马 playground,可参考 asm/javassist/bytebuddy 编写 Agent 内存马 +- tools/*:内存马简易连接器,用于测试内存马注入之后是否可用 - web:使用 react 开发的 Web UI - vul/vul-webapp:简易的 javax.servlet 靶场 - vul/vul-webapp-expression:简易的表达式注入、SSTI 注入相关靶场 +- vul/vul-webapp-deserialize:简易的反序列化相关靶场 - vul/vul-webapp-jakarta:简易的 jakarta.servlet 靶场 - vul/springboot*: springboot 相关靶场 @@ -28,12 +36,15 @@ # 运行集成测试用例,谨慎运行,用例太多了 ./gradlew :integration-test:test --info -# 仅运行 tomcat 下的集成测试用例 +# 仅运行 tomcat 下的集成测试用例(需要先构建靶场) +./gradlew :vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war ./gradlew :integration-test:test --tests '*.tomcat.*' -# 仅运行 jetty 下的集成测试用例 + +# 仅运行 jetty 下的集成测试用例(需要先构建靶场) +./gradlew :vul:vul-webapp:war :vul:vul-webapp-jakarta:war ./gradlew :integration-test:test --tests '*.jetty.*' -# 构建 war 包 +# 构建靶场 war 包 ./gradlew :vul:vul-webapp:war ./gradlew :vul:vul-webapp-jakarta:war ./gradlew :vul:vul-webapp-expression:war @@ -57,7 +68,7 @@ UI 采用的 React SPA + SpringBoot,构建时需要先将 React 前端项目 ### Contribute Code -> 参考 GitHub Docs, https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project +> 参考 GitHub Docs,https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project 1. fork 当前项目 2. git clone 自己 fork 后的项目 diff --git a/README.md b/README.md index dd5bdcfd..4ac74956 100644 --- a/README.md +++ b/README.md @@ -27,17 +27,6 @@ > 由于本人仅是安全产品研发,无实战经验,如使用或实现有相关疑问或者适配请求可提 issue 或加入 TG > 交流群,欢迎一起学习交流 -MemShellParty 是一款可本地部署的一键生成常见中间件框架内存马的可视化平台,并且致力于打造内存马的全方位的学习平台。 -在遍地是轮子的时代,是时候造车,带着大伙加速冲冲冲了。 - -希望你能从这个项目学会或尝试做的: - -1. 学会编写常见中间件框架的内存马。 -2. 学会使用 [Testcontainers](https://testcontainers.com/) 做 Java 应用的集成测试。 -3. 学会使用 GitHub Actions 编写 CI/CD,编写 CHANGELOG 并通过 CI 自动发布 Release。 -4. 尝试使用 [Byte Buddy](https://bytebuddy.net/) 生成类,编写 Agent。 -5. 尝试使用 Gradle 构建 Java 项目(platform 编写依赖版本管理,toolchain 可以在根项目设置 JDK17 环境下也能完成 JDK6 源代码的编译) - ![normal_generator](asserts/normal_generator.png) ![agent_generator](asserts/agent_generator.png) @@ -45,9 +34,14 @@ MemShellParty 是一款可本地部署的一键生成常见中间件框架内存 ## 主要特性 - 无侵入性:生成的内存马不会影响目标中间件正常流量,即使同时注入十几个不同的内存马。 -- 高可用性:自带完备的 [CI 集成测试](https://github.com/ReaJason/MemShellParty/actions/workflows/test.yaml) -- 最小化:尽可能精简内存马大小,高效传输。 -- 强兼容性:覆盖攻防场景下常见中间件和框架。 +- 强兼容性:覆盖攻防场景下常见中间件和框架,以及 JDK 适配 JDK6 ~ JDK21。 +- 高可用性:对所有支持的中间件框架建立了全面的自动化测试矩阵,确保每一次生成的载荷都具备最高的可用性和稳定性,杜绝实战中的不确定性。 +- 极致轻量化:通过深度优化的字节码生成策略,MemShellParty 将内存马体积相较于 JMG 等传统工具进行了大幅缩小,常规内存马缩小了 + 30%,Agent 内存马采用 ASM 技术缩小了 80%。 +- 傻瓜一键化:内置针对主流表达式注入、反序列化、SSTI 等常见漏洞的载荷生成。系统会自动根据绕过 Java + 模块限制配置,动态生成最优攻击载荷。可实现常规漏洞下的一键注入。 +- 高灵活性:原生支持哥斯拉、冰蝎、蚁剑、Suo5、NeoreGeorg 等常用内存马功能,通过高度灵活的自定义内存马上传功能,可以将任何定制化载荷融入 + MemShellParty 的生成体系,打造最贴合自身战术需求的攻击平台。 ## 快速使用 @@ -55,7 +49,9 @@ MemShellParty 是一款可本地部署的一键生成常见中间件框架内存 > 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门 -可直接访问 [https://party.memshell.news](https://party.memshell.news)。每次 Release 都会自动部署最新的镜像。 +可访问(master 分支) [https://party.memshell.news](https://party.memshell.news)。每次 Release 都会自动部署最新的镜像。 + +对于正在开发的功能可访问(dev 分支) [https://dev-party.memshell.news](https://dev-party.memshell.news) 尝鲜体验。 ### 本地部署(推荐) @@ -84,302 +80,14 @@ docker rm -f memshell-party docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest ``` -### SDK 集成到现有工具中 +## User Guide -> 适合集成到已有工具中,实现内存马 payload 的生成,支持 JDK8 以上版本,v1.7.0 开始支持 +1. [适配情况](./docs/Compatibility.md) +2. [本地构建](./docs/BuildOnLocal.md) +3. [SDK 集成](./docs/SDKUsage.md) +4. [代码贡献](./CONTRIBUTING.md) -1. 添加依赖,Maven Or Gradle - -```xml - - - io.github.reajason - generator - 1.7.0 - -``` - -```groovy -// Gradle Repo -implementation 'io.github.reajason:generator:1.7.0' -``` - -2. 生成 Tomcat Godzilla Filter 内存马示例 - -```java -ShellConfig shellConfig = ShellConfig.builder() - .server(Server.Tomcat) - .shellTool(ShellTool.Godzilla) - .shellType(ShellType.FILTER) - .shrink(true) // 缩小字节码 - .debug(false) // 关闭调试 - .build(); - -InjectorConfig injectorConfig = InjectorConfig.builder() -// .urlPattern("/*") // 自定义 urlPattern,默认就是 /* -// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成 -// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成 - .build(); - -GodzillaConfig godzillaConfig = GodzillaConfig.builder() -// .pass("pass") -// .key("key") -// .headerName("User-Agent") -// .headerValue("test") - .build(); - -GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig); - -System.out.println("注入器类名:"+result.getInjectorClassName()); -System.out.println("内存马类名:"+result.getShellClassName()); - -System.out.println(result.getShellConfig()); -System.out.println(result.getShellToolConfig()); - -System.out.println("Base64 打包:"+Packers.Base64.getInstance().pack(result)); -System.out.println("脚本引擎打包:"+Packers.ScriptEngine.getInstance().pack(result)); -``` -3. 生成 Tomcat Godzilla AgentFilterChain 示例 -```java -ShellConfig shellConfig = ShellConfig.builder() - .server(Server.Tomcat) - .shellTool(ShellTool.Godzilla) - .shellType(ShellType.AGENT_FILTER_CHAIN) - .shrink(true) // 缩小字节码 - .debug(false) // 关闭调试 - .build(); - -InjectorConfig injectorConfig = InjectorConfig.builder() -// .urlPattern("/*") // 自定义 urlPattern,默认就是 /* -// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成 -// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成 - .build(); - -GodzillaConfig godzillaConfig = GodzillaConfig.builder() -// .pass("pass") -// .key("key") -// .headerName("User-Agent") -// .headerValue("test") - .build(); - -GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig); - -System.out.println("注入器类名:" + result.getInjectorClassName()); -System.out.println("内存马类名:" + result.getShellClassName()); - -System.out.println(result.getShellConfig()); -System.out.println(result.getShellToolConfig()); - -byte[] agentJarBytes = ((JarPacker) Packers.AgentJar.getInstance()).packBytes(result); -Files.write(Paths.get("agent.jar"), agentJarBytes); -``` -4. 封装统一生成接口可参考 [GeneratorController.java](boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java) - -## 适配情况 - -已兼容 Java6 ~ Java8、Java9、Java11、Java17、Java21 - -### 中间件以及框架 - -| Tomcat(5 ~ 11) | Jetty(6 ~ 11) | GlassFish(3 ~ 7) | Payara(5 ~ 6) | -|----------------------|------------------------|----------------------|----------------------| -| Servlet | Servlet | Filter | Filter | -| Filter | Filter | Listener | Listener | -| Listener | Listener | Valve | Valve | -| Valve | ServletHandler - Agent | FilterChain - Agent | FilterChain - Agent | -| ProxyValve | | | | -| FilterChain - Agent | | ContextValve - Agent | ContextValve - Agent | -| ContextValve - Agent | | | | - -| Resin(3 ~ 4) | SpringMVC | SpringWebFlux | XXL-JOB | -|---------------------|--------------------------|-----------------|--------------| -| Servlet | Interceptor | WebFilter | NettyHandler | -| Filter | ControllerHandler | HandlerMethod | | -| Listener | FrameworkServlet - Agent | HandlerFunction | | -| FilterChain - Agent | | NettyHandler | | - -| JBossAS(4 ~ 7) | JBossEAP(6 ~ 7) | WildFly(9 ~ 30) | Undertow | -|----------------------|----------------------------|------------------------|------------------------| -| Filter | Filter | Servlet | Servlet | -| Listener | Listener | Filter | Filter | -| Valve | Valve(6) | Listener | Listener | -| ProxyValve | | | | -| FilterChain - Agent | FilterChain - Agent (6) | ServletHandler - Agent | ServletHandler - Agent | -| ContextValve - Agent | ContextValve - Agent (6) | | | -| | ServletHandler - Agent (7) | | | - -| WebSphere(7 ~ 9) | WebLogic (10.3.6 ~ 14) | -|-----------------------|-------------------------| -| Servlet | Servlet | -| Filter | Filter | -| Listener | Listener | -| FilterManager - Agent | ServletContext - Agent | - -| BES(9.5.x) | TongWeb(6 ~ 8) | InforSuite AS (9 ~ 10) | -|----------------------|----------------------|------------------------| -| Filter | Filter | Filter | -| Listener | Listener | Listener | -| Valve | Valve | Valve | -| FilterChain - Agent | FilterChain - Agent | FilterChain - Agent | -| ContextValve - Agent | ContextValve - Agent | ContextValve - Agent | - -| Apusic AS (9 ~ 10) | Primeton(6.5) | -|---------------------|----------------------| -| Servlet | Filter | -| Filter | Listener | -| Listener | Valve | -| FilterChain - Agent | FilterChain - Agent | -| | ContextValve - Agent | - -### 内存马功能 - -- [x] [Godzilla 哥斯拉](https://github.com/BeichenDream/Godzilla) -- [x] [Behinder 冰蝎](https://github.com/rebeyond/Behinder) -- [x] 命令执行 -- [x] [Suo5](https://github.com/zema1/suo5) -- [x] [AntSword 蚁剑](https://github.com/AntSwordProject/antSword) -- [x] [Neo-reGeorg](https://github.com/L-codes/Neo-reGeorg) -- [x] Custom - -### 封装方式 - -- [x] BASE64 -- [x] GZIP BASE64 -- [x] JSP -- [x] JSPX -- [x] JAR -- [x] BCEL -- [x] 内置脚本引擎、Rhino 脚本引擎 -- [x] EL、SpEL、OGNL、Aviator、MVEL、JEXL、Groovy、JXPath、BeanShell -- [x] Velocity、Freemarker、JinJava -- [x] 原生反序列化(CB 和 CC 链) -- [x] Agent -- [x] XXL-JOB Executor -- [x] Hessian、Hessian2 反序列化(XSLT链) -- [ ] JNDI -- [ ] JDBC 连接 -- [ ] 其他常见反序列化 - -## 本地构建 - -### 源代码构建 - -> 适合想编写代码的小伙伴,使用 Git Clone 下载到本地,并构建前后端项目以供使用 - -首先需要下载 [bun](https://bun.sh/),这是一款用于构建前端服务的工具。 - -1. 使用 Git Clone 项目 - -```bash -git clone https://github.com/ReaJason/MemShellParty.git -``` - -2. 构建前端项目,build 结束会将静态资源自动移动到 Spring Boot 中以供使用 - -```bash -cd MemShellParty/web - -bun install - -bun run build -``` - -3. 构建后端项目,确保使用 JDK17 环境 - -```bash -cd MemShellParty/boot - -./gradlew :boot:bootjar -x test -``` - -构建完之后,可直接启动 jar 包,jar 包位于 `MemShellParty/boot/build/libs/boot-1.0.0.jar` - -```bash -cd MemShellParty/boot - -java -jar \ - --add-opens=java.base/java.util=ALL-UNNAMED \ - --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ - --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \ - build/libs/boot-1.0.0.jar -``` - -也可这基础上再继续构建容器来使用 - -```bash -cd MemShellParty/boot - -docker buildx build -t memshell-party:latest . --load - -docker run -it -d --name memshell-party -p 8080:8080 memshell-party:latest -``` - -### Dockerfile 一键构建 - -> 适合于希望构建自定义访问路径的小伙伴,例如 NGINX 反代的场景([#44](https://github.com/ReaJason/MemShellParty/issues/44)) - -下载项目根目录的 [Dockerfile](./Dockerfile) - -- VERSION: 版本信息,随意,建议用最新的 tag 号,仅作前端展示 -- ROUTE_ROOT_PATH: 前端根路由配置 -- CONTEXT_PATH: 后端访问前缀 - -```bash -# 基础构建 -docker buildx build \ - --build-arg VERSION=1.6.0 \ - -t memshell-party:latest . --load - -# 基础镜像启动,访问 127.0.0.1:8080 -docker run -it -d -p 8080:8080 memshell-party:latest - -# 自定义访问路径构建 -docker buildx build \ - --build-arg VERSION=1.6.0 \ - --build-arg ROUTE_ROOT_PATH=/memshell-party \ - --build-arg CONTEXT_PATH=/memshell-party \ - -t memshell-party:latest . --load - -# 自定义路径构建镜像启动,访问 127.0.0.1:8080/memshell-party -docker run -it -p 8080:8080 \ - -e BOOT_OPTS=--server.servlet.context-path=/memshell-party \ - memshell-party:latest -``` - -如果需要使用 NGINX 反代,请先使用自定义访问路径构建容器,并配置 NGINX 如下: - -其中 `location /memshell-party`、`ROUTE_ROOT_PATH=/memshell-party`、`CONTEXT_PATH=/memshell-party` 和 -`BOOT_OPTS=--server.servlet.context-path=/memshell-party` 都要一致才行。 - -```text -location /memshell-party { - proxy_pass http://127.0.0.1:8080; - proxy_set_header Host $http_host; - proxy_set_header X-Forwarded-By $server_addr:$server_port; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_http_version 1.1; - proxy_connect_timeout 3s; - proxy_read_timeout 300s; - proxy_send_timeout 300s; - proxy_buffer_size 16k; - proxy_buffers 8 64k; - proxy_busy_buffers_size 128k; -} -``` - -## Contribute - -> 你的任何反馈以及 issue 交流都是对当前项目的贡献 - -> It will be so nice if you want to contribute. 🎉 - -1. 如果你有高超的 Docker 环境构建技术,可以尝试添加 CVE 相关的集成测试用例。 -2. 如果你有高超的内存马编写技术,可以尝试添加一个内存马试试。 -3. 如果你有丰富的实战经验,可以尝试写写 issue 来提提建议。 - -项目结构目录、构建和编译可参考 [CONTRIBUTING.md](CONTRIBUTING.md)。 - -## Thanks +## Special Thanks - [pen4uin/java-memshell-generator](https://github.com/pen4uin/java-memshell-generator) diff --git a/docs/BuildOnLocal.md b/docs/BuildOnLocal.md new file mode 100644 index 00000000..f151855a --- /dev/null +++ b/docs/BuildOnLocal.md @@ -0,0 +1,106 @@ +## 本地构建 + +### 源代码构建 + +> 适合想编写代码的小伙伴,使用 Git Clone 下载到本地,并构建前后端项目以供使用 + +首先需要下载 [bun](https://bun.sh/),这是一款用于构建前端服务的工具。 + +1. 使用 Git Clone 项目 + +```bash +git clone https://github.com/ReaJason/MemShellParty.git +``` + +2. 构建前端项目,build 结束会将静态资源自动移动到 Spring Boot 中以供使用 + +```bash +cd MemShellParty/web + +bun install + +bun run build +``` + +3. 构建后端项目,确保使用 JDK17 环境 + +```bash +cd MemShellParty/boot + +./gradlew :boot:bootjar -x test +``` + +构建完之后,可直接启动 jar 包,jar 包位于 `MemShellParty/boot/build/libs/boot-1.0.0.jar` + +```bash +cd MemShellParty/boot + +java -jar \ + --add-opens=java.base/java.util=ALL-UNNAMED \ + --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ + --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \ + build/libs/boot-1.0.0.jar +``` + +也可这基础上再继续构建容器来使用 + +```bash +cd MemShellParty/boot + +docker buildx build -t memshell-party:latest . --load + +docker run -it -d --name memshell-party -p 8080:8080 memshell-party:latest +``` + +### Dockerfile 一键构建 + +> 适合于希望构建自定义访问路径的小伙伴,例如 NGINX 反代的场景([#44](https://github.com/ReaJason/MemShellParty/issues/44)) + +下载项目根目录的 [Dockerfile](./Dockerfile) + +- VERSION: 版本信息,随意,建议用最新的 tag 号,仅作前端展示 +- ROUTE_ROOT_PATH: 前端根路由配置 +- CONTEXT_PATH: 后端访问前缀 + +```bash +# 基础构建 +docker buildx build \ + --build-arg VERSION=1.6.0 \ + -t memshell-party:latest . --load + +# 基础镜像启动,访问 127.0.0.1:8080 +docker run -it -d -p 8080:8080 memshell-party:latest + +# 自定义访问路径构建 +docker buildx build \ + --build-arg VERSION=1.6.0 \ + --build-arg ROUTE_ROOT_PATH=/memshell-party \ + --build-arg CONTEXT_PATH=/memshell-party \ + -t memshell-party:latest . --load + +# 自定义路径构建镜像启动,访问 127.0.0.1:8080/memshell-party +docker run -it -p 8080:8080 \ + -e BOOT_OPTS=--server.servlet.context-path=/memshell-party \ + memshell-party:latest +``` + +如果需要使用 NGINX 反代,请先使用自定义访问路径构建容器,并配置 NGINX 如下: + +其中 `location /memshell-party`、`ROUTE_ROOT_PATH=/memshell-party`、`CONTEXT_PATH=/memshell-party` 和 +`BOOT_OPTS=--server.servlet.context-path=/memshell-party` 都要一致才行。 + +```text +location /memshell-party { + proxy_pass http://127.0.0.1:8080; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-By $server_addr:$server_port; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_http_version 1.1; + proxy_connect_timeout 3s; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + proxy_buffer_size 16k; + proxy_buffers 8 64k; + proxy_busy_buffers_size 128k; +} +``` \ No newline at end of file diff --git a/docs/Compatibility.md b/docs/Compatibility.md new file mode 100644 index 00000000..227cf1c1 --- /dev/null +++ b/docs/Compatibility.md @@ -0,0 +1,84 @@ +## 适配情况 + +已兼容 Java6 ~ Java8、Java9、Java11、Java17、Java21 + +### 中间件以及框架 + +| Tomcat(5 ~ 11) | Jetty(6 ~ 11) | GlassFish(3 ~ 7) | Payara(5 ~ 6) | +|----------------------|------------------------|----------------------|----------------------| +| Servlet | Servlet | Filter | Filter | +| Filter | Filter | Listener | Listener | +| Listener | Listener | Valve | Valve | +| Valve | ServletHandler - Agent | FilterChain - Agent | FilterChain - Agent | +| ProxyValve | | | | +| FilterChain - Agent | | ContextValve - Agent | ContextValve - Agent | +| ContextValve - Agent | | | | + +| Resin(3 ~ 4) | SpringMVC | SpringWebFlux | XXL-JOB | +|---------------------|--------------------------|-----------------|--------------| +| Servlet | Interceptor | WebFilter | NettyHandler | +| Filter | ControllerHandler | HandlerMethod | | +| Listener | FrameworkServlet - Agent | HandlerFunction | | +| FilterChain - Agent | | NettyHandler | | + +| JBossAS(4 ~ 7) | JBossEAP(6 ~ 7) | WildFly(9 ~ 30) | Undertow | +|----------------------|----------------------------|------------------------|------------------------| +| Filter | Filter | Servlet | Servlet | +| Listener | Listener | Filter | Filter | +| Valve | Valve(6) | Listener | Listener | +| ProxyValve | | | | +| FilterChain - Agent | FilterChain - Agent (6) | ServletHandler - Agent | ServletHandler - Agent | +| ContextValve - Agent | ContextValve - Agent (6) | | | +| | ServletHandler - Agent (7) | | | + +| WebSphere(7 ~ 9) | WebLogic (10.3.6 ~ 14) | +|-----------------------|-------------------------| +| Servlet | Servlet | +| Filter | Filter | +| Listener | Listener | +| FilterManager - Agent | ServletContext - Agent | + +| BES(9.5.x) | TongWeb(6 ~ 8) | InforSuite AS (9 ~ 10) | +|----------------------|----------------------|------------------------| +| Filter | Filter | Filter | +| Listener | Listener | Listener | +| Valve | Valve | Valve | +| FilterChain - Agent | FilterChain - Agent | FilterChain - Agent | +| ContextValve - Agent | ContextValve - Agent | ContextValve - Agent | + +| Apusic AS (9 ~ 10) | Primeton(6.5) | +|---------------------|----------------------| +| Servlet | Filter | +| Filter | Listener | +| Listener | Valve | +| FilterChain - Agent | FilterChain - Agent | +| | ContextValve - Agent | + +### 内存马功能 + +- [x] [Godzilla 哥斯拉](https://github.com/BeichenDream/Godzilla) +- [x] [Behinder 冰蝎](https://github.com/rebeyond/Behinder) +- [x] 命令执行 +- [x] [Suo5](https://github.com/zema1/suo5) +- [x] [AntSword 蚁剑](https://github.com/AntSwordProject/antSword) +- [x] [Neo-reGeorg](https://github.com/L-codes/Neo-reGeorg) +- [x] Custom + +### 封装方式 + +- [x] BASE64 +- [x] GZIP BASE64 +- [x] JSP +- [x] JSPX +- [x] JAR +- [x] BCEL +- [x] 内置脚本引擎、Rhino 脚本引擎 +- [x] EL、SpEL、OGNL、Aviator、MVEL、JEXL、Groovy、JXPath、BeanShell +- [x] Velocity、Freemarker、JinJava +- [x] 原生反序列化(CB 和 CC 链) +- [x] Agent +- [x] XXL-JOB Executor +- [x] Hessian、Hessian2 反序列化(XSLT链) +- [ ] JNDI +- [ ] JDBC 连接 +- [ ] 其他常见反序列化 \ No newline at end of file diff --git a/docs/SDKUsage.md b/docs/SDKUsage.md new file mode 100644 index 00000000..467bf063 --- /dev/null +++ b/docs/SDKUsage.md @@ -0,0 +1,90 @@ +## SDK 集成 + +> 适合集成到已有工具中,实现内存马 payload 的生成,支持 JDK8 以上版本,v1.7.0 开始支持 + +1. 添加依赖,Maven Or Gradle + +```xml + + + io.github.reajason + generator + 1.10.0 + +``` + +```groovy +// Gradle Repo +implementation 'io.github.reajason:generator:1.10.0' +``` + +2. 生成 Tomcat Godzilla Filter 内存马示例 + +```java +ShellConfig shellConfig = ShellConfig.builder() + .server(Server.Tomcat) + .shellTool(ShellTool.Godzilla) + .shellType(ShellType.FILTER) + .shrink(true) // 缩小字节码 + .debug(false) // 关闭调试 + .build(); + +InjectorConfig injectorConfig = InjectorConfig.builder() +// .urlPattern("/*") // 自定义 urlPattern,默认就是 /* +// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成 +// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成 + .build(); + +GodzillaConfig godzillaConfig = GodzillaConfig.builder() +// .pass("pass") +// .key("key") +// .headerName("User-Agent") +// .headerValue("test") + .build(); + +GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig); + +System.out.println("注入器类名:"+result.getInjectorClassName()); +System.out.println("内存马类名:"+result.getShellClassName()); + +System.out.println(result.getShellConfig()); +System.out.println(result.getShellToolConfig()); + +System.out.println("Base64 打包:"+Packers.Base64.getInstance().pack(result)); +System.out.println("脚本引擎打包:"+Packers.ScriptEngine.getInstance().pack(result)); +``` +3. 生成 Tomcat Godzilla AgentFilterChain 示例 +```java +ShellConfig shellConfig = ShellConfig.builder() + .server(Server.Tomcat) + .shellTool(ShellTool.Godzilla) + .shellType(ShellType.AGENT_FILTER_CHAIN) + .shrink(true) // 缩小字节码 + .debug(false) // 关闭调试 + .build(); + +InjectorConfig injectorConfig = InjectorConfig.builder() +// .urlPattern("/*") // 自定义 urlPattern,默认就是 /* +// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成 +// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成 + .build(); + +GodzillaConfig godzillaConfig = GodzillaConfig.builder() +// .pass("pass") +// .key("key") +// .headerName("User-Agent") +// .headerValue("test") + .build(); + +GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig); + +System.out.println("注入器类名:" + result.getInjectorClassName()); +System.out.println("内存马类名:" + result.getShellClassName()); + +System.out.println(result.getShellConfig()); +System.out.println(result.getShellToolConfig()); + +byte[] agentJarBytes = ((JarPacker) Packers.AgentJar.getInstance()).packBytes(result); +Files.write(Paths.get("agent.jar"), agentJarBytes); +``` +4. 封装统一生成接口可参考 [GeneratorController.java](boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java)