From 8c14631478dac6334dfba42c5068db2d481424a7 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 17 Jan 2026 18:11:32 +0800 Subject: [PATCH] refactor: probe integration-test --- integration-test/script/bes_pid.sh | 2 - .../javaweb/integration/ContainerTool.java | 32 -- .../probe/AbstractProbeContainerTest.java | 217 ++++++++++++ .../integration/probe/ProbeTestConfig.java | 325 ++++++++++++++++++ .../glassfish/GlassFish3ContainerTest.java | 110 +----- .../glassfish/GlassFish4ContainerTest.java | 110 +----- .../glassfish/GlassFish501ContainerTest.java | 105 +----- .../glassfish/GlassFish510ContainerTest.java | 104 +----- .../glassfish/GlassFish6ContainerTest.java | 104 +----- .../glassfish/GlassFish7ContainerTest.java | 110 +----- .../probe/jbossas/Jboss423ContainerTest.java | 102 ++---- .../probe/jbossas/Jboss510ContainerTest.java | 99 +----- .../probe/jbossas/Jboss610ContainerTest.java | 99 +----- .../probe/jbossas/Jboss711ContainerTest.java | 99 +----- .../jbosseap/JbossEap6ContainerTest.java | 91 ++--- .../jbosseap/JbossEap7ContainerTest.java | 104 +----- .../jbosseap/JbossEap81ContainerTest.java | 98 +----- .../probe/jetty/Jetty10ContainerTest.java | 101 +----- .../probe/jetty/Jetty11ContainerTest.java | 102 +----- .../probe/jetty/Jetty12ee10ContainerTest.java | 90 +---- .../probe/jetty/Jetty12ee11ContainerTest.java | 90 +---- .../probe/jetty/Jetty12ee8ContainerTest.java | 96 +----- .../probe/jetty/Jetty12ee9ContainerTest.java | 90 +---- .../probe/jetty/Jetty61ContainerTest.java | 101 +----- .../probe/jetty/Jetty75ContainerTest.java | 95 +---- .../probe/jetty/Jetty76ContainerTest.java | 95 +---- .../probe/jetty/Jetty81ContainerTest.java | 97 +----- .../probe/jetty/Jetty92ContainerTest.java | 94 +---- .../probe/jetty/Jetty93ContainerTest.java | 95 +---- .../probe/jetty/Jetty94ContainerTest.java | 95 +---- .../probe/payara/Payara5201ContainerTest.java | 111 +----- .../payara/Payara520225ContainerTest.java | 105 +----- .../payara/Payara620222ContainerTest.java | 100 ++---- .../probe/resin/Resin3116ContainerTest.java | 97 +----- .../probe/resin/Resin318ContainerTest.java | 103 +----- .../probe/resin/Resin4058ContainerTest.java | 97 +----- .../probe/resin/Resin4067ContainerTest.java | 97 +----- .../SpringBoot2WebFluxContainerTest.java | 57 +-- .../SpringBoot3WebFluxContainerTest.java | 57 +-- .../SpringBoot1ContainerTest.java | 84 ++--- .../SpringBoot2ContainerTest.java | 81 +---- .../SpringBoot2JettyContainerTest.java | 75 +--- .../SpringBoot2UndertowContainerTest.java | 76 ++-- .../SpringBoot2WarContainerTest.java | 89 ++--- .../SpringBoot3ContainerTest.java | 82 +---- .../probe/struct2/Struct2ContainerTest.java | 71 ++-- .../probe/tomcat/Tomcat10ContainerTest.java | 111 +----- .../probe/tomcat/Tomcat11ContainerTest.java | 95 +---- .../tomcat/Tomcat11JRE21ContainerTest.java | 94 +---- .../probe/tomcat/Tomcat5ContainerTest.java | 118 ++----- .../probe/tomcat/Tomcat6ContainerTest.java | 106 +----- .../probe/tomcat/Tomcat7ContainerTest.java | 113 ++---- .../probe/tomcat/Tomcat8ContainerTest.java | 108 +----- .../probe/tomcat/Tomcat9ContainerTest.java | 106 ++---- .../weblogic/WebLogic1036ContainerTest.java | 103 +----- .../weblogic/WebLogic12214ContainerTest.java | 103 +----- .../weblogic/WebLogic14110ContainerTest.java | 97 +----- .../weblogic/WebLogic14120ContainerTest.java | 36 ++ .../websphere/OpenLiberty18ContainerTest.java | 104 +----- .../websphere/OpenLiberty20ContainerTest.java | 104 +----- .../websphere/OpenLiberty22ContainerTest.java | 103 +----- .../websphere/OpenLiberty25ContainerTest.java | 103 +----- .../websphere/WebSphere855ContainerTest.java | 103 +----- .../websphere/WebSphere905ContainerTest.java | 98 +----- .../websphere7/WebSphere700ContainerTest.java | 88 ++--- .../probe/wildfly/Wildfly18ContainerTest.java | 98 +----- .../probe/wildfly/Wildfly23ContainerTest.java | 97 +----- .../probe/wildfly/Wildfly30ContainerTest.java | 97 +----- .../probe/wildfly/Wildfly36ContainerTest.java | 97 +----- .../probe/wildfly/Wildfly9ContainerTest.java | 98 +----- 70 files changed, 1798 insertions(+), 5116 deletions(-) delete mode 100755 integration-test/script/bes_pid.sh create mode 100644 integration-test/src/test/java/com/reajason/javaweb/integration/probe/AbstractProbeContainerTest.java create mode 100644 integration-test/src/test/java/com/reajason/javaweb/integration/probe/ProbeTestConfig.java create mode 100644 integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14120ContainerTest.java diff --git a/integration-test/script/bes_pid.sh b/integration-test/script/bes_pid.sh deleted file mode 100755 index fc979244..00000000 --- a/integration-test/script/bes_pid.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -pgrep -f 'ASMain|GlassFishMain' | tr -d '\n' \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/ContainerTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/ContainerTool.java index 7d23419d..25ada484 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/ContainerTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/ContainerTool.java @@ -28,13 +28,6 @@ public class ContainerTool { public static final MountableFile springBoot3WebfluxJarFile = MountableFile.forHostPath(Path.of("..", "vul", "vul-springboot3-webflux", "build", "libs", "vul-springboot3-webflux.jar").toAbsolutePath()); public static final Path neoGeorgDockerfile = Path.of("..", "assets", "neoreg", "Dockerfile").toAbsolutePath(); - public static final Path springBoot1Dockerfile = Path.of("..", "vul", "vul-springboot1", "Dockerfile").toAbsolutePath(); - public static final Path springBoot2Dockerfile = Path.of("..", "vul", "vul-springboot2", "Dockerfile").toAbsolutePath(); - public static final Path springBoot2JettyDockerfile = Path.of("..", "vul", "vul-springboot2-jetty", "Dockerfile").toAbsolutePath(); - public static final Path springBoot2UndertowDockerfile = Path.of("..", "vul", "vul-springboot2-undertow", "Dockerfile").toAbsolutePath(); - public static final Path springBoot2WebfluxDockerfile = Path.of("..", "vul", "vul-springboot2-webflux", "Dockerfile").toAbsolutePath(); - public static final Path springBoot3Dockerfile = Path.of("..", "vul", "vul-springboot3", "Dockerfile").toAbsolutePath(); - public static final Path springBoot3WebfluxDockerfile = Path.of("..", "vul", "vul-springboot3-webflux", "Dockerfile").toAbsolutePath(); public static final MountableFile jattachFile = MountableFile.forHostPath(Path.of("..", "assets", "agent", "jattach-linux")); public static final MountableFile tomcatPid = MountableFile.forHostPath(Path.of("script", "tomcat_pid.sh")); @@ -42,7 +35,6 @@ public class ContainerTool { public static final MountableFile resinPid = MountableFile.forHostPath(Path.of("script", "resin_pid.sh")); public static final MountableFile jbossPid = MountableFile.forHostPath(Path.of("script", "jboss_pid.sh")); public static final MountableFile glassfishPid = MountableFile.forHostPath(Path.of("script", "glassfish_pid.sh")); - public static final MountableFile besPid = MountableFile.forHostPath(Path.of("script", "bes_pid.sh")); public static final MountableFile apusicPid = MountableFile.forHostPath(Path.of("script", "apusic_pid.sh")); public static final MountableFile jettyPid = MountableFile.forHostPath(Path.of("script", "jetty_pid.sh")); public static final MountableFile webspherePid = MountableFile.forHostPath(Path.of("script", "websphere_pid.sh")); @@ -57,28 +49,4 @@ public class ContainerTool { log.info("container started, app url is : {}", url); return url; } - - public static String getUrlFromSpringBoot(GenericContainer container) { - int port = container.getMappedPort(8080); - String host = container.getHost(); - String url = "http://" + host + ":" + port; - log.info("container started, app url is : {}", url); - return url; - } - - public static String getUrlFromWebLogic(GenericContainer container) { - int port = container.getMappedPort(7001); - String host = container.getHost(); - String url = "http://" + host + ":" + port + "/app"; - log.info("container started, app url is : {}", url); - return url; - } - - public static String getUrlFromWAS(GenericContainer container) { - int port = container.getMappedPort(9080); - String host = container.getHost(); - String url = "http://" + host + ":" + port + "/app"; - log.info("container started, app url is : {}", url); - return url; - } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/AbstractProbeContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/AbstractProbeContainerTest.java new file mode 100644 index 00000000..a681933f --- /dev/null +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/AbstractProbeContainerTest.java @@ -0,0 +1,217 @@ +package com.reajason.javaweb.integration.probe; + +import com.reajason.javaweb.Server; +import com.reajason.javaweb.integration.ProbeAssertion; +import com.reajason.javaweb.integration.ShellAssertion; +import com.reajason.javaweb.integration.VulTool; +import com.reajason.javaweb.memshell.MemShellResult; +import com.reajason.javaweb.memshell.ShellTool; +import com.reajason.javaweb.memshell.ShellType; +import com.reajason.javaweb.packer.Packers; +import com.reajason.javaweb.probe.payload.FilterProbeFactory; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import net.bytebuddy.jar.asm.Opcodes; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.ImageFromDockerfile; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Abstract base class for probe container tests. + * Provides common test methods that are shared across all probe tests. + * + * @author ReaJason + * @since 2024/12/4 + */ +@Slf4j +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public abstract class AbstractProbeContainerTest { + + /** + * Subclasses must provide their configuration. + */ + protected abstract ProbeTestConfig getConfig(); + + /** + * Subclasses must provide their container instance. + */ + protected abstract GenericContainer getContainer(); + + /** + * Helper to build a container from config. + */ + protected static GenericContainer buildContainer(ProbeTestConfig config) { + GenericContainer container = new GenericContainer<>(config.getImageName()); + + if (config.getWarFile() != null && StringUtils.isNotBlank(config.getWarDeployPath())) { + container.withCopyToContainer(config.getWarFile(), config.getWarDeployPath()); + } + + if(config.getJarFile() != null && StringUtils.isNotBlank(config.getJarDeployPath())){ + container.withCopyFileToContainer(config.getJarFile(), config.getJarDeployPath()); + } + + if (config.getWaitStrategy() != null) { + container.waitingFor(config.getWaitStrategy()); + } else if (StringUtils.isNotBlank(config.getHealthCheckPath())) { + container.waitingFor(Wait.forHttp(config.getHealthCheckPath())); + } + + container.withExposedPorts(config.getExposedPort()); + + if (config.isPrivilegedMode()) { + container.withPrivilegedMode(true); + } + if(config.getCommand() != null){ + container.withCommand(config.getCommand()); + } + + return container; + } + + /** + * Get the URL based on the configured strategy. + */ + protected String getUrl() { + GenericContainer container = getContainer(); + ProbeTestConfig config = getConfig(); + int port = container.getMappedPort(config.getExposedPort()); + String host = container.getHost(); + + String url = "http://" + host + ":" + port; + String contextPath = config.getContextPath(); + if (StringUtils.isNotBlank(contextPath)) { + if (!contextPath.startsWith("/")) { + contextPath = "/" + contextPath; + } + url += contextPath; + } + + log.info("container started, app url is: {}", url); + return url; + } + + @AfterAll + void tearDown() { + GenericContainer container = getContainer(); + if (container != null) { + log.info(container.getLogs()); + } + } + + // ==================== Test Methods ==================== + + @Test + protected void testJDK() { + doTestJDK(); + } + + /** + * Subclasses can override testJDK() with @RetryingTest(3) and call this method. + */ + protected void doTestJDK() { + String url = getUrl(); + String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); + assertEquals(getConfig().getExpectedJdkVersion(), data); + } + + @Test + @SneakyThrows + void testBasicInfo() { + String url = getUrl(); + String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); + Files.writeString( + Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), + data); + } + + @Test + void testServerDetection() { + String url = getUrl(); + String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); + assertEquals(getConfig().getServer(), data); + } + + @Test + @SneakyThrows + protected void testCommandReqHeaderResponseBody() { + Assumptions.assumeTrue(getConfig().isSupportsCommand(), + "Command test not supported for this server"); + String url = getUrl(); + ProbeAssertion.responseCommandIsOk(url, getConfig().getServer(), getConfig().getTargetJdkVersion()); + } + + @Test + @SneakyThrows + protected void testScriptEngineReqHeaderResponseBody() { + Assumptions.assumeTrue(getConfig().isSupportsScriptEngine(), + "ScriptEngine test not supported for this server"); + String url = getUrl(); + ProbeAssertion.responseScriptEngineIsOk(url, getConfig().getServer(), getConfig().getTargetJdkVersion()); + } + + @Test + @SneakyThrows + void testBytecodeReqParamResponseBody() { + Assumptions.assumeTrue(getConfig().isSupportsBytecode(), + "Bytecode test not supported for this server"); + String url = getUrl(); + ProbeAssertion.responseBytecodeIsOk(url, getConfig().getServer(), getConfig().getTargetJdkVersion()); + if (getConfig().isSupportsBytecodeWithoutPrefix()) { + ProbeAssertion.responseBytecodeWithoutPrefixIsOk(url, getConfig().getServer(), getConfig().getTargetJdkVersion()); + } + } + + @Test + void testFilterProbe() { + Assumptions.assumeTrue(getConfig().isSupportsFilterProbe(), + "Filter probe test not supported for this server"); + String url = getUrl(); + String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(getConfig().getServer())); + ShellAssertion.assertFilterProbeIsRight(data); + } + + @Test + protected void testFilterFirstInject() { + Assumptions.assumeTrue(getConfig().isSupportsFilterProbe(), + "Filter first inject test not supported for this server"); + String url = getUrl(); + ProbeTestConfig config = getConfig(); + + String shellType = config.isJakarta() ? ShellType.JAKARTA_FILTER : ShellType.FILTER; + MemShellResult memShellResult = shellInjectIsOk( + url, + config.getServer(), + shellType, + ShellTool.Command, + getConfig().getTargetJdkVersion(), + Packers.BigInteger, + getContainer()); + + String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(config.getServer())); + List filter = ProbeAssertion.getFiltersForContext(data, "/app"); + String filterName = ProbeAssertion.extractFilterName(filter.get(0)); + assertEquals(filterName, memShellResult.getShellClassName()); + } + + @Test + @SneakyThrows + protected void testCommandReqHeaderResponseBodySpring() { + Assumptions.assumeTrue(getConfig().isSupportsSpringWebMvc(), + "Spring WebMVC test not supported for this server"); + String url = getUrl(); + ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, getConfig().getTargetJdkVersion()); + } +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/ProbeTestConfig.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/ProbeTestConfig.java new file mode 100644 index 00000000..0fcca35c --- /dev/null +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/ProbeTestConfig.java @@ -0,0 +1,325 @@ +package com.reajason.javaweb.integration.probe; + +import com.reajason.javaweb.Server; +import com.reajason.javaweb.integration.ContainerTool; +import lombok.Builder; +import lombok.Getter; +import net.bytebuddy.jar.asm.Opcodes; +import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.MountableFile; + +import java.nio.file.Path; + +/** + * Configuration class for probe container tests. + * Uses builder pattern similar to ContainerTestConfig. + * + * @author ReaJason + * @since 2024/12/4 + */ +@Getter +@Builder +public class ProbeTestConfig { + private final String imageName; + private final String server; + private final String expectedJdkVersion; + + @Builder.Default + private final int targetJdkVersion = Opcodes.V1_8; + + @Builder.Default + private final int exposedPort = 8080; + + @Builder.Default + private final String contextPath = "/app"; + + @Builder.Default + private final String healthCheckPath = "/app"; + + private final WaitStrategy waitStrategy; + + private final MountableFile warFile; + private final String warDeployPath; + + private final MountableFile jarFile; + private final String jarDeployPath; + + private final String command; + + @Builder.Default + private final boolean privilegedMode = false; + + @Builder.Default + private final boolean supportsScriptEngine = false; + + @Builder.Default + private final boolean supportsFilterProbe = true; + + @Builder.Default + private final boolean supportsCommand = true; + + @Builder.Default + private final boolean supportsBytecode = true; + + @Builder.Default + private final boolean supportsSpringWebMvc = false; + + @Builder.Default + private final boolean supportsBytecodeWithoutPrefix = false; + + @Builder.Default + private final boolean jakarta = false; + + // Factory methods for common server configurations + + public static ProbeTestConfigBuilder tomcat(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Tomcat) + .warFile(ContainerTool.warFile) + .warDeployPath("/usr/local/tomcat/webapps/app.war") + .supportsScriptEngine(true) + .supportsBytecodeWithoutPrefix(true); + } + + public static ProbeTestConfigBuilder tomcatJakarta(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Tomcat) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath("/usr/local/tomcat/webapps/app.war") + .supportsBytecodeWithoutPrefix(true) + .jakarta(true); + } + + public static ProbeTestConfigBuilder jetty(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Jetty) + .warFile(ContainerTool.warFile) + .warDeployPath("/var/lib/jetty/webapps/app.war"); + } + + public static ProbeTestConfigBuilder jettyJakarta(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Jetty) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath("/var/lib/jetty/webapps/app.war") + .jakarta(true) + .supportsBytecode(false); + } + + public static ProbeTestConfigBuilder jettyOld(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.Jetty) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder glassfish(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.GlassFish) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder glassfishJakarta(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.GlassFish) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath(warDeployPath) + .jakarta(true); + } + + public static ProbeTestConfigBuilder payara(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.GlassFish) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder payaraJakarta(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.GlassFish) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath(warDeployPath) + .jakarta(true); + } + + public static ProbeTestConfigBuilder weblogic(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.WebLogic) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath) + .exposedPort(7001); + } + + public static ProbeTestConfigBuilder websphere(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.WebSphere) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath) + .exposedPort(9080) + .privilegedMode(true); + } + + public static ProbeTestConfigBuilder openLiberty(String imageName) { + return builder() + .imageName(imageName) + .server(Server.WebSphere) + .warFile(ContainerTool.warFile) + .warDeployPath("/config/dropins/app.war") + .exposedPort(9080); + } + + public static ProbeTestConfigBuilder wildfly(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Undertow) + .warFile(ContainerTool.warFile) + .warDeployPath("/opt/jboss/wildfly/standalone/deployments/app.war"); + } + + public static ProbeTestConfigBuilder wildflyJakarta(String imageName) { + return builder() + .imageName(imageName) + .server(Server.Undertow) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath("/opt/jboss/wildfly/standalone/deployments/app.war") + .jakarta(true); + } + + public static ProbeTestConfigBuilder jboss(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.JBoss) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder jbossEap(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.Undertow) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder jbossEapJakarta(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.Undertow) + .warFile(ContainerTool.warJakartaFile) + .warDeployPath(warDeployPath) + .jakarta(true); + } + + public static ProbeTestConfigBuilder resin(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.Resin) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder springboot(String imageName, MountableFile jarFile) { + return builder() + .imageName(imageName) + .jarFile(jarFile) + .jarDeployPath("/app/app.jar") + .command("java -jar /app/app.jar") + .server(Server.Tomcat) + .contextPath("") + .healthCheckPath("/test") + .supportsFilterProbe(false) + .supportsSpringWebMvc(true); + } + + public static ProbeTestConfigBuilder springbootJetty(String imageName, MountableFile jarFile) { + return builder() + .imageName(imageName) + .jarFile(jarFile) + .jarDeployPath("/app/app.jar") + .command("java -jar /app/app.jar") + .server(Server.Jetty) + .contextPath("") + .healthCheckPath("/test") + .supportsFilterProbe(false) + .supportsSpringWebMvc(true); + } + + public static ProbeTestConfigBuilder springbootUndertow(String imageName, MountableFile jarFile) { + return builder() + .imageName(imageName) + .jarFile(jarFile) + .jarDeployPath("/app/app.jar") + .command("java -jar /app/app.jar") + .server(Server.Undertow) + .contextPath("") + .healthCheckPath("/test") + .supportsFilterProbe(false) + .supportsSpringWebMvc(true); + } + + public static ProbeTestConfigBuilder springwebflux(String imageName, MountableFile jarFile) { + return builder() + .imageName(imageName) + .jarFile(jarFile) + .jarDeployPath("/app/app.jar") + .command("java -jar /app/app.jar") + .server(Server.SpringWebFlux) + .contextPath("") + .healthCheckPath("/test") + .supportsFilterProbe(false) + .supportsCommand(false) + .supportsBytecode(false); + } + + public static ProbeTestConfigBuilder tongweb(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.TongWeb) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder bes(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.BES) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder apusic(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.Apusic) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder inforsuite(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.InforSuite) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } + + public static ProbeTestConfigBuilder primeton(String imageName, String warDeployPath) { + return builder() + .imageName(imageName) + .server(Server.GlassFish) + .warFile(ContainerTool.warFile) + .warDeployPath(warDeployPath); + } +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish3ContainerTest.java index c4420452..096294a9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish3ContainerTest.java @@ -1,110 +1,36 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish3ContainerTest { - public static final String imageName = "reajason/glassfish:3.1.2.2-jdk6"; +public class GlassFish3ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfish( + "reajason/glassfish:3.1.2.2-jdk6", + "/usr/local/glassfish3/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/glassfish3/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*(deployed|done).*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @AfterAll - static void teardown() { - log.info(container.getLogs()); - } - - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish4ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish4ContainerTest.java index 4aa50733..41dc5593 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish4ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish4ContainerTest.java @@ -1,110 +1,36 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish4ContainerTest { - public static final String imageName = "reajason/glassfish:4.1.2-quick"; +public class GlassFish4ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfish( + "reajason/glassfish:4.1.2-quick", + "/usr/local/glassfish4/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_271|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/glassfish4/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*(deployed|done).*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @AfterAll - static void tearDown() { - System.out.println(container.getLogs()); - } - - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_271|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish501ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish501ContainerTest.java index 8ae93a7a..8ebc733a 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish501ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish501ContainerTest.java @@ -1,103 +1,36 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish501ContainerTest { - public static final String imageName = "reajason/glassfish:5.0.1"; +public class GlassFish501ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfish( + "reajason/glassfish:5.0.1", + "/usr/local/glassfish5/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_411|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/glassfish5/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*(deployed|done).*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_411|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish510ContainerTest.java index 6ab04672..67f55bcd 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish510ContainerTest.java @@ -1,104 +1,36 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish510ContainerTest { - public static final String imageName = "reajason/glassfish:5.1.0"; +public class GlassFish510ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfish( + "reajason/glassfish:5.1.0", + "/usr/local/glassfish5/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_411|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/glassfish5/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*(deployed|done).*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_411|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish6ContainerTest.java index 9e2e1bab..3da3b006 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish6ContainerTest.java @@ -1,104 +1,36 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish6ContainerTest { - public static final String imageName = "reajason/glassfish:6.2.6-jdk11"; +public class GlassFish6ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfishJakarta( + "reajason/glassfish:6.2.6-jdk11", + "/usr/local/glassfish6/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|11.0.16|55") + .targetJdkVersion(Opcodes.V11) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/glassfish6/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*(deployed|done).*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|11.0.16|55", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V11); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V11); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V11, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish7ContainerTest.java index 4ea29603..751c8a91 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/glassfish/GlassFish7ContainerTest.java @@ -1,110 +1,38 @@ package com.reajason.javaweb.integration.probe.glassfish; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class GlassFish7ContainerTest { - public static final String imageName = "reajason/glassfish:7.0.20-jdk17"; +public class GlassFish7ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.glassfishJakarta( + "reajason/glassfish:7.0.20-jdk17", + "/usr/local/glassfish7/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|17.0.2|61") + .targetJdkVersion(Opcodes.V17) + .waitStrategy(Wait.forLogMessage(".*JMXService.*", 1)) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/glassfish7/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forLogMessage(".*JMXService.*", 1)) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forHttp("/app/test")); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); - } - - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.2|61", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V17, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss423ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss423ContainerTest.java index d8a633d1..85b03e2a 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss423ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss423ContainerTest.java @@ -1,99 +1,37 @@ package com.reajason.javaweb.integration.probe.jbossas; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Jboss423ContainerTest { - public static final String imageName = "reajason/jboss:4-jdk6"; +public class Jboss423ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jboss( + "reajason/jboss:4-jdk6", + "/usr/local/jboss/server/default/deploy/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/server/default/deploy/app.war") - .withEnv("JAVA_OPTS", "-Xms128m -Xmx512m -XX:MaxPermSize=128M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG) + .withEnv("JAVA_OPTS", "-Xms128m -Xmx512m -XX:MaxPermSize=128M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.JBoss, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.JBoss)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.JBoss, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss510ContainerTest.java index 137188b0..c68cff03 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss510ContainerTest.java @@ -1,97 +1,36 @@ package com.reajason.javaweb.integration.probe.jbossas; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Jboss510ContainerTest { - public static final String imageName = "reajason/jboss:5-jdk6"; +public class Jboss510ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jboss( + "reajason/jboss:5-jdk6", + "/usr/local/jboss/server/web/deploy/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/server/web/deploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.JBoss, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.JBoss)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.JBoss, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss610ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss610ContainerTest.java index 2f1bf21b..cf055e45 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss610ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss610ContainerTest.java @@ -1,97 +1,36 @@ package com.reajason.javaweb.integration.probe.jbossas; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Jboss610ContainerTest { - public static final String imageName = "reajason/jboss:6-jdk7"; +public class Jboss610ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jboss( + "reajason/jboss:6-jdk7", + "/usr/local/jboss/server/jbossweb-standalone/deploy/app.war") + .expectedJdkVersion("JDK|1.7.0_17|51") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/server/jbossweb-standalone/deploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.7.0_17|51", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.JBoss, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.JBoss)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.JBoss, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss711ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss711ContainerTest.java index 1f738b53..28a77b66 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss711ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbossas/Jboss711ContainerTest.java @@ -1,97 +1,36 @@ package com.reajason.javaweb.integration.probe.jbossas; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Jboss711ContainerTest { - public static final String imageName = "reajason/jboss:7-jdk7"; +public class Jboss711ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jboss( + "reajason/jboss:7-jdk7", + "/usr/local/jboss/standalone/deployments/app.war") + .expectedJdkVersion("JDK|1.7.0_17|51") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.7.0_17|51", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.JBoss, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.JBoss)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.JBoss, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap6ContainerTest.java index 96a0119b..61c235df 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap6ContainerTest.java @@ -2,29 +2,22 @@ package com.reajason.javaweb.integration.probe.jbosseap; import com.reajason.javaweb.Server; import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import com.reajason.javaweb.memshell.MemShellResult; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.List; -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -32,63 +25,41 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class JbossEap6ContainerTest { - public static final String imageName = "reajason/jboss:eap-6-jdk8"; +public class JbossEap6ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jboss( + "reajason/jboss:eap-6-jdk8", + "/usr/local/jboss/standalone/deployments/app.war") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; } @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } + protected void testFilterFirstInject() { + String url = getUrl(); + MemShellResult memShellResult = shellInjectIsOk( + url, + getConfig().getServer(), + ShellType.FILTER, + ShellTool.Command, + Opcodes.V1_6, + Packers.BigInteger, + getContainer()); - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.JBoss, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.JBoss, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.JBoss)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.JBoss, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); List filter = ProbeAssertion.getFiltersForContext(data, "/app"); String filterName = ProbeAssertion.extractFilterName(filter.get(0)); diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap7ContainerTest.java index dfc03547..b7ecfb7d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap7ContainerTest.java @@ -1,104 +1,36 @@ package com.reajason.javaweb.integration.probe.jbosseap; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class JbossEap7ContainerTest { - public static final String imageName = "reajason/jboss:eap-7-jdk8"; +public class JbossEap7ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jbossEap( + "reajason/jboss:eap-7-jdk8", + "/usr/local/jboss/standalone/deployments/app.war") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jboss/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap81ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap81ContainerTest.java index 94ec51ac..e65ad7dc 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap81ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jbosseap/JbossEap81ContainerTest.java @@ -1,98 +1,36 @@ package com.reajason.javaweb.integration.probe.jbosseap; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class JbossEap81ContainerTest { - public static final String imageName = "reajason/jboss:eap-8.1-jdk17"; +public class JbossEap81ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jbossEapJakarta( + "reajason/jboss:eap-8.1-jdk17", + "/usr/local/jboss/standalone/deployments/app.war") + .expectedJdkVersion("JDK|17.0.15|61") + .targetJdkVersion(Opcodes.V17) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/jboss/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.15|61", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty10ContainerTest.java index 47f33454..29e7788a 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty10ContainerTest.java @@ -1,103 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty10ContainerTest { - public static final String imageName = "jetty:10.0.25-jre11"; +public class Jetty10ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jetty("jetty:10.0.25-jre11") + .expectedJdkVersion("JRE|11.0.28|55") + .targetJdkVersion(Opcodes.V11) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|11.0.28|55", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V11); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V11); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V11, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty11ContainerTest.java index b68cd3e4..1bc821a9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty11ContainerTest.java @@ -1,103 +1,35 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty11ContainerTest { - public static final String imageName = "jetty:11.0.25-jre17"; +public class Jetty11ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyJakarta("jetty:11.0.25-jre17") + .expectedJdkVersion("JRE|17.0.16|61") + .targetJdkVersion(Opcodes.V17) + .supportsBytecode(true) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|17.0.16|61", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V17, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee10ContainerTest.java index ff6fe052..6cd80311 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee10ContainerTest.java @@ -1,92 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty12ee10ContainerTest { - public static final String imageName = "reajason/jetty:12.0-jre21-ee10"; +public class Jetty12ee10ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyJakarta("reajason/jetty:12.0-jre21-ee10") + .expectedJdkVersion("JRE|21.0.9|65") + .targetJdkVersion(Opcodes.V21) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|21.0.9|65", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V21); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - shellInjectIsOk(url, Server.Jetty, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V21, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertThat(filterName, anyOf(startsWith("org.eclipse.jetty.servlet.handlers"))); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee11ContainerTest.java index b0a86dc7..708263dc 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee11ContainerTest.java @@ -1,92 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty12ee11ContainerTest { - public static final String imageName = "reajason/jetty:12.1-jre21-ee11"; +public class Jetty12ee11ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyJakarta("reajason/jetty:12.1-jre21-ee11") + .expectedJdkVersion("JDK|21.0.9|65") + .targetJdkVersion(Opcodes.V21) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|21.0.9|65", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V21); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - shellInjectIsOk(url, Server.Jetty, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V21, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertThat(filterName, anyOf(startsWith("org.eclipse.jetty.servlet.handlers"))); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee8ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee8ContainerTest.java index 91b99f25..0a8f622e 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee8ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee8ContainerTest.java @@ -1,96 +1,36 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty12ee8ContainerTest { - public static final String imageName = "reajason/jetty:12.0-jre21-ee8"; +public class Jetty12ee8ContainerTest extends AbstractProbeContainerTest { + + // Jetty 12 ee8 uses javax.servlet (not Jakarta), so we use jetty() factory + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jetty("reajason/jetty:12.0-jre21-ee8") + .expectedJdkVersion("JRE|21.0.9|65") + .targetJdkVersion(Opcodes.V21) + .supportsBytecode(false) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|21.0.9|65", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V21); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, Opcodes.V21, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee9ContainerTest.java index 837ef319..de7b1766 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty12ee9ContainerTest.java @@ -1,92 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty12ee9ContainerTest { - public static final String imageName = "reajason/jetty:12.0-jre21-ee9"; +public class Jetty12ee9ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyJakarta("reajason/jetty:12.0-jre21-ee9") + .expectedJdkVersion("JRE|21.0.9|65") + .targetJdkVersion(Opcodes.V21) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|21.0.9|65", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V21); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - shellInjectIsOk(url, Server.Jetty, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V21, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertThat(filterName, anyOf(startsWith("org.eclipse.jetty.servlet.handlers"))); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty61ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty61ContainerTest.java index c5391900..659af9d1 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty61ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty61ContainerTest.java @@ -1,103 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty61ContainerTest { - public static final String imageName = "reajason/jetty:6.1-jdk6"; +public class Jetty61ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyOld("reajason/jetty:6.1-jdk6", "/usr/local/jetty/webapps/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty75ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty75ContainerTest.java index 16b34dc1..7d5f4086 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty75ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty75ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty75ContainerTest { - public static final String imageName = "reajason/jetty:7.5.4-jdk6"; +public class Jetty75ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyOld("reajason/jetty:7.5.4-jdk6", "/usr/local/jetty/webapps/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty76ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty76ContainerTest.java index 8e237b81..a2fb6e34 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty76ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty76ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty76ContainerTest { - public static final String imageName = "reajason/jetty:7.6-jdk6"; +public class Jetty76ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jettyOld("reajason/jetty:7.6-jdk6", "/usr/local/jetty/webapps/app.war") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty81ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty81ContainerTest.java index 5c3080e1..654e91b4 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty81ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty81ContainerTest.java @@ -1,97 +1,36 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty81ContainerTest { - public static final String imageName = "reajason/jetty:8.1-jdk7"; +public class Jetty81ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .jettyOld("reajason/jetty:8.1-jdk7", + "/usr/local/jetty/webapps/app.war") + .expectedJdkVersion("JDK|1.7.0_17|51") + .targetJdkVersion(Opcodes.V1_7) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.7.0_17|51", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_7); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_7); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty92ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty92ContainerTest.java index 6243f585..e0d74733 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty92ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty92ContainerTest.java @@ -1,98 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty92ContainerTest { +public class Jetty92ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jetty("jetty:9.2-jre7") + .expectedJdkVersion("JRE|1.7.0_221|51") + .targetJdkVersion(Opcodes.V1_7) + .build(); - public static final String imageName = "jetty:9.2-jre7"; @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.7.0_221|51", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_7); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_7); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty93ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty93ContainerTest.java index a05d4b25..7d21e331 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty93ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty93ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty93ContainerTest { - public static final String imageName = "reajason/jetty:9.3"; +public class Jetty93ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jetty("reajason/jetty:9.3") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty94ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty94ContainerTest.java index 5a4c96d3..6d0df506 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty94ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/jetty/Jetty94ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.jetty; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/7 */ -@Slf4j @Testcontainers -public class Jetty94ContainerTest { - public static final String imageName = "jetty:9.4.57-jre8"; +public class Jetty94ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.jetty("jetty:9.4.57-jre8") + .expectedJdkVersion("JRE|1.8.0_462|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/var/lib/jetty/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_462|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Jetty, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Jetty)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara5201ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara5201ContainerTest.java index 54c6c218..1eb5a333 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara5201ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara5201ContainerTest.java @@ -1,109 +1,36 @@ package com.reajason.javaweb.integration.probe.payara; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class Payara5201ContainerTest { - public static final String imageName = "reajason/payara:5.201"; +public class Payara5201ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.payara( + "reajason/payara:5.201", + "/usr/local/payara5/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_151|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/payara5/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*JMXService.*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); - } - - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_151|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara520225ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara520225ContainerTest.java index 30b3e629..c2850fdb 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara520225ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara520225ContainerTest.java @@ -1,103 +1,36 @@ package com.reajason.javaweb.integration.probe.payara; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class Payara520225ContainerTest { - public static final String imageName = "reajason/payara:5.2022.5"; +public class Payara520225ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.payara( + "reajason/payara:5.2022.5", + "/usr/local/payara5/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_432|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/payara5/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forLogMessage(".*JMXService.*", 1)); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_432|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara620222ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara620222ContainerTest.java index a8d2779e..f8937687 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara620222ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/payara/Payara620222ContainerTest.java @@ -1,31 +1,23 @@ package com.reajason.javaweb.integration.probe.payara; -import com.reajason.javaweb.Server; import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import com.reajason.javaweb.memshell.MemShellResult; import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; +import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.List; -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -33,70 +25,44 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * @author ReaJason * @since 2024/12/12 */ -@Slf4j @Testcontainers -public class Payara620222ContainerTest { - public static final String imageName = "reajason/payara:6.2022.2-jdk11"; +public class Payara620222ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.payaraJakarta( + "reajason/payara:6.2022.2-jdk11", + "/usr/local/payara6/glassfish/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|11.0.25|55") + .targetJdkVersion(Opcodes.V11) + .waitStrategy(Wait.forLogMessage(".*JMXService.*", 1)) + .build(); @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/payara6/glassfish/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forLogMessage(".*JMXService.*", 1)) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @BeforeAll - static void setup() { - container.waitingFor(Wait.forHttp("/app/test")); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; } @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|11.0.25|55", data); - } + protected void testFilterFirstInject() { + String url = getUrl(); + String shellType = getConfig().isJakarta() ? ShellType.JAKARTA_FILTER : ShellType.FILTER; + MemShellResult memShellResult = shellInjectIsOk( + url, + getConfig().getServer(), + shellType, + ShellTool.Command, + Opcodes.V11, + Packers.BigInteger, + getContainer()); - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.GlassFish, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.GlassFish, Opcodes.V11); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.GlassFish, Opcodes.V11); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.GlassFish, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V11, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.GlassFish)); + String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(getConfig().getServer())); List filter = ProbeAssertion.getFiltersForContext(data, "/app"); String filterName = ProbeAssertion.extractFilterName(filter.get(0)); assertEquals(filterName, memShellResult.getShellClassName()); diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin3116ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin3116ContainerTest.java index f2c99dec..346e2309 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin3116ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin3116ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.resin; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Resin3116ContainerTest { - public static final String imageName = "reajason/resin:3.1.16"; +public class Resin3116ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.resin("reajason/resin:3.1.16", "/usr/local/resin3/webapps/app.war") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/resin3/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Resin, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Resin, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Resin, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Resin, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin318ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin318ContainerTest.java index 6e928ec4..575f75ad 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin318ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin318ContainerTest.java @@ -1,103 +1,34 @@ package com.reajason.javaweb.integration.probe.resin; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Resin318ContainerTest { - public static final String imageName = "reajason/resin:3.1.8-jdk7"; +public class Resin318ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.resin("reajason/resin:3.1.8-jdk7", "/usr/local/resin3/webapps/app.war") + .expectedJdkVersion("JDK|1.7.0_17|51") + .targetJdkVersion(Opcodes.V1_7) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/resin3/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.7.0_17|51", data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Resin, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Resin, Opcodes.V1_7); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Resin, Opcodes.V1_7); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Resin, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4058ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4058ContainerTest.java index 5d9d40ab..6704dc1b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4058ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4058ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.resin; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Resin4058ContainerTest { - public static final String imageName = "reajason/resin:4.0.58"; +public class Resin4058ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.resin("reajason/resin:4.0.58", "/usr/local/resin4/webapps/app.war") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/resin4/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Resin, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Resin, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Resin, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Resin, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4067ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4067ContainerTest.java index ec2ffcd3..7ba98899 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4067ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/resin/Resin4067ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.resin; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Resin4067ContainerTest { - public static final String imageName = "reajason/resin:4.0.67-jdk11"; +public class Resin4067ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.resin("reajason/resin:4.0.67-jdk11", "/usr/local/resin4/webapps/app.war") + .expectedJdkVersion("JDK|11.0.16|55") + .targetJdkVersion(Opcodes.V11) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/resin4/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|11.0.16|55", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Resin, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Resin, Opcodes.V11); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Resin, Opcodes.V11); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Resin, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Resin)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot2WebFluxContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot2WebFluxContainerTest.java index 1d937b11..16a12e5d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot2WebFluxContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot2WebFluxContainerTest.java @@ -1,57 +1,34 @@ package com.reajason.javaweb.integration.probe.springwebflux; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot2WebfluxDockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot2WebFluxContainerTest { - public static final String imageName = "springboot2-webflux"; +public class SpringBoot2WebFluxContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springwebflux("eclipse-temurin:8u472-b08-jdk", ContainerTool.springBoot2WebfluxJarFile) + .expectedJdkVersion("JDK|1.8.0_472|52") + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot2WebfluxDockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_472|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.SpringWebFlux, data); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot3WebFluxContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot3WebFluxContainerTest.java index 6d76aed1..b218b574 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot3WebFluxContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebflux/SpringBoot3WebFluxContainerTest.java @@ -1,57 +1,34 @@ package com.reajason.javaweb.integration.probe.springwebflux; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot3WebfluxDockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot3WebFluxContainerTest { - public static final String imageName = "springboot3-webflux"; +public class SpringBoot3WebFluxContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springwebflux("eclipse-temurin:17.0.17_10-jdk", ContainerTool.springBoot3WebfluxJarFile) + .expectedJdkVersion("JDK|17.0.17|61") + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot3WebfluxDockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.17|61", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.SpringWebFlux, data); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java index 909eb3c9..01b0699d 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java @@ -1,80 +1,36 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot1Dockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot1ContainerTest { - public static final String imageName = "springboot1"; +public class SpringBoot1ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springboot("eclipse-temurin:8u472-b08-jdk", ContainerTool.springBoot1JarFile) + .expectedJdkVersion("JDK|1.8.0_472|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot1Dockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_472|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBodySpring() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_6); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java index 7e32f2a7..4aa2b52a 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java @@ -1,81 +1,36 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot2Dockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot2ContainerTest { - public static final String imageName = "springboot2"; +public class SpringBoot2ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springboot("eclipse-temurin:8u472-b08-jdk", ContainerTool.springBoot2JarFile) + .expectedJdkVersion("JDK|1.8.0_472|52") + .targetJdkVersion(Opcodes.V1_6) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot2Dockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_472|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBodySpring() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_6); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java index b93661e9..0f0403f2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java @@ -1,74 +1,37 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot2JettyDockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot2JettyContainerTest { - public static final String imageName = "springboot2-jetty"; +public class SpringBoot2JettyContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springbootJetty("eclipse-temurin:8u472-b08-jdk", ContainerTool.springBoot2JettyJarFile) + .expectedJdkVersion("JDK|1.8.0_472|52") + .targetJdkVersion(Opcodes.V1_6) + .supportsSpringWebMvc(false) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot2JettyDockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_472|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Jetty, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.Jetty, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Jetty, Opcodes.V1_6); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java index 0f28d517..a8eaa5c8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java @@ -1,73 +1,37 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot2UndertowDockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot2UndertowContainerTest { - public static final String imageName = "springboot2-undertow"; +public class SpringBoot2UndertowContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springbootUndertow("eclipse-temurin:8u472-b08-jdk", ContainerTool.springBoot2UndertowJarFile) + .expectedJdkVersion("JDK|1.8.0_472|52") + .targetJdkVersion(Opcodes.V1_6) + .supportsSpringWebMvc(false) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot2UndertowDockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_472|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V1_6); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java index b79bba33..cc1ffc5b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java @@ -1,81 +1,48 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.junitpioneer.jupiter.RetryingTest; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; import static com.reajason.javaweb.integration.ContainerTool.springBoot2WarFile; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot2WarContainerTest { - public static final String imageName = "tomcat:8-jre8"; +public class SpringBoot2WarContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("tomcat:8-jre8") + .warFile(springBoot2WarFile) + .expectedJdkVersion("JRE|1.8.0_402|52") + .targetJdkVersion(Opcodes.V1_6) + .supportsSpringWebMvc(true) + .supportsScriptEngine(false) + .supportsFilterProbe(false) + .supportsBytecodeWithoutPrefix(false) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(springBoot2WarFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; + } + + @Override @RetryingTest(3) - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_402|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBodySpring() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_6); + protected void testJDK() { + doTestJDK(); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java index 4295cf77..5bed9282 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java @@ -1,80 +1,36 @@ package com.reajason.javaweb.integration.probe.springwebmvc; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.ContainerTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromSpringBoot; -import static com.reajason.javaweb.integration.ContainerTool.springBoot3Dockerfile; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/22 */ @Testcontainers -@Slf4j -public class SpringBoot3ContainerTest { - public static final String imageName = "springboot3"; +public class SpringBoot3ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .springboot("eclipse-temurin:17.0.17_10-jdk", ContainerTool.springBoot3JarFile) + .expectedJdkVersion("JDK|17.0.17|61") + .targetJdkVersion(Opcodes.V17) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(new ImageFromDockerfile() - .withDockerfile(springBoot3Dockerfile)) - .waitingFor(Wait.forHttp("/test")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.17|61", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromSpringBoot(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V17); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBodySpring() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromSpringBoot(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V17); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/struct2/Struct2ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/struct2/Struct2ContainerTest.java index a1c8a570..0017b5be 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/struct2/Struct2ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/struct2/Struct2ContainerTest.java @@ -2,72 +2,59 @@ package com.reajason.javaweb.integration.probe.struct2; import com.reajason.javaweb.Server; import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import net.bytebuddy.jar.asm.Opcodes; import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; import static com.reajason.javaweb.integration.ContainerTool.struct2WarFile; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Struct2ContainerTest { - public static final String imageName = "tomcat:8-jre8"; +public class Struct2ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("tomcat:8-jre8") + .warFile(struct2WarFile) + .expectedJdkVersion("JRE|1.8.0_402|52") + .targetJdkVersion(Opcodes.V1_8) + .supportsBytecode(false) + .supportsFilterProbe(false) + .supportsBytecodeWithoutPrefix(false) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(struct2WarFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_402|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } + @Override + protected GenericContainer getContainer() { + return container; + } + + @Override @Test @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); + protected void testCommandReqHeaderResponseBody() { + String url = getUrl(); ProbeAssertion.responseCommandIsOk(url, Server.Struct2, Opcodes.V1_8); } + @Override @Test @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); + protected void testScriptEngineReqHeaderResponseBody() { + String url = getUrl(); ProbeAssertion.responseScriptEngineIsOk(url, Server.Struct2, Opcodes.V1_8); } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat10ContainerTest.java index e57561a0..84b87bb3 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat10ContainerTest.java @@ -1,112 +1,35 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat10ContainerTest { - public static final String imageName = "tomcat:10.1.44-jre11"; +public class Tomcat10ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcatJakarta("tomcat:10.1.44-jre11") + .expectedJdkVersion("JRE|11.0.28|55") + .targetJdkVersion(Opcodes.V11) + .supportsScriptEngine(true) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|11.0.28|55", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V11); - } - - @Test - @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseScriptEngineIsOk(url, Server.Tomcat, Opcodes.V11); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V11); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V11, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - log.info(data); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11ContainerTest.java index c39ee2c8..d31c93f8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11ContainerTest.java @@ -1,99 +1,34 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat11ContainerTest { +public class Tomcat11ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcatJakarta("tomcat:11.0.10-jre17") + .expectedJdkVersion("JRE|17.0.16|61") + .targetJdkVersion(Opcodes.V17) + .build(); - public static final String imageName = "tomcat:11.0.10-jre17"; @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|17.0.16|61", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V17, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - log.info(data); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11JRE21ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11JRE21ContainerTest.java index 5ef6766c..32b3f38f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11JRE21ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat11JRE21ContainerTest.java @@ -1,100 +1,34 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat11JRE21ContainerTest { +public class Tomcat11JRE21ContainerTest extends AbstractProbeContainerTest { - public static final String imageName = "tomcat:11.0.10-jre21"; + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcatJakarta("tomcat:11.0.10-jre21") + .expectedJdkVersion("JRE|21.0.8|65") + .targetJdkVersion(Opcodes.V21) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|21.0.8|65", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V21); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V21); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V21, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - log.info(data); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat5ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat5ContainerTest.java index 7650005d..7ba9a23e 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat5ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat5ContainerTest.java @@ -1,112 +1,42 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.junitpioneer.jupiter.RetryingTest; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat5ContainerTest { - public static final String imageName = "reajason/tomcat:5-jdk6"; - @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); +public class Tomcat5ContainerTest extends AbstractProbeContainerTest { - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("reajason/tomcat:5-jdk6") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + + @Container + public static final GenericContainer container = buildContainer(CONFIG); + + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; } // 存在首次请求,Tomcat 无法通过 req.getParameter 拿到参数的情况,因此需要重试 + @Override @RetryingTest(3) - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + protected void testJDK() { + doTestJDK(); } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseScriptEngineIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat6ContainerTest.java index 5db6b1bc..13574049 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat6ContainerTest.java @@ -1,104 +1,34 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat6ContainerTest { - public static final String imageName = "reajason/tomcat:6-jdk6"; +public class Tomcat6ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("reajason/tomcat:6-jdk6") + .expectedJdkVersion("JDK|1.6.0_45|50") + .targetJdkVersion(Opcodes.V1_6) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0_45|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseScriptEngineIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_6); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat7ContainerTest.java index a258ac13..966cade8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat7ContainerTest.java @@ -1,106 +1,41 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.junitpioneer.jupiter.RetryingTest; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat7ContainerTest { - public static final String imageName = "tomcat:7.0.85-jre7"; +public class Tomcat7ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("tomcat:7.0.85-jre7") + .expectedJdkVersion("JRE|1.7.0_171|51") + .targetJdkVersion(Opcodes.V1_7) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; + } + + @Override @RetryingTest(3) - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.7.0_171|51", data); + protected void testJDK() { + doTestJDK(); } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_7); - } - - @Test - @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseScriptEngineIsOk(url, Server.Tomcat, Opcodes.V1_7); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_7); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat8ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat8ContainerTest.java index f525fe38..8f0208d2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat8ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat8ContainerTest.java @@ -1,108 +1,34 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat8ContainerTest { - public static final String imageName = "tomcat:8-jre8"; +public class Tomcat8ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("tomcat:8-jre8") + .expectedJdkVersion("JRE|1.8.0_402|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_402|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString( - Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), - data); + @Override + protected GenericContainer getContainer() { + return container; } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testScriptEngineReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseScriptEngineIsOk(url, Server.Tomcat, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V1_8); - ProbeAssertion.responseBytecodeWithoutPrefixIsOk(url, Server.Tomcat, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); - } -} \ No newline at end of file +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat9ContainerTest.java index 32c89c70..5e1278f1 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/tomcat/Tomcat9ContainerTest.java @@ -1,98 +1,42 @@ package com.reajason.javaweb.integration.probe.tomcat; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.junitpioneer.jupiter.RetryingTest; -import org.objectweb.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/4 */ -@Slf4j @Testcontainers -public class Tomcat9ContainerTest { - public static final String imageName = "tomcat:9.0.8-jre9"; +public class Tomcat9ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.tomcat("tomcat:9.0.8-jre9") + .expectedJdkVersion("JRE|9.0.4|53") + .targetJdkVersion(Opcodes.V9) + .supportsScriptEngine(false) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/usr/local/tomcat/webapps/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; + } + + @Override @RetryingTest(3) - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|9.0.4|53", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Tomcat, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V9); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Tomcat, Opcodes.V9); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Tomcat, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Tomcat)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + protected void testJDK() { + doTestJDK(); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic1036ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic1036ContainerTest.java index 1e84d875..043dc72b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic1036ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic1036ContainerTest.java @@ -1,103 +1,36 @@ package com.reajason.javaweb.integration.probe.weblogic; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWebLogic; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/24 */ @Testcontainers -@Slf4j -public class WebLogic1036ContainerTest { - public static final String imageName = "reajason/weblogic:10.3.6"; +public class WebLogic1036ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.weblogic( + "reajason/weblogic:10.3.6", + "/opt/oracle/wls1036/user_projects/domains/base_domain/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_342|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/oracle/wls1036/user_projects/domains/base_domain/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(7001); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - log.info(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebLogic, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWebLogic(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebLogic, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic12214ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic12214ContainerTest.java index 096f3f98..6593a5e7 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic12214ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic12214ContainerTest.java @@ -1,103 +1,36 @@ package com.reajason.javaweb.integration.probe.weblogic; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWebLogic; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/24 */ @Testcontainers -@Slf4j -public class WebLogic12214ContainerTest { - public static final String imageName = "reajason/weblogic:12.2.1.4"; +public class WebLogic12214ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.weblogic( + "reajason/weblogic:12.2.1.4", + "/u01/oracle/user_projects/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_411|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/u01/oracle/user_projects/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(7001); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_411|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebLogic, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWebLogic(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebLogic, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14110ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14110ContainerTest.java index 0c025bfe..478f9924 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14110ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14110ContainerTest.java @@ -1,97 +1,36 @@ package com.reajason.javaweb.integration.probe.weblogic; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWebLogic; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/24 */ @Testcontainers -@Slf4j -public class WebLogic14110ContainerTest { - public static final String imageName = "reajason/weblogic:14.1.1.0"; +public class WebLogic14110ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.weblogic( + "reajason/weblogic:14.1.1.0", + "/u01/oracle/user_projects/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_391|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/u01/oracle/user_projects/domains/domain1/autodeploy/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(7001); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_391|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebLogic, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWebLogic(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebLogic, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrlFromWebLogic(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWebLogic(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebLogic, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebLogic)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14120ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14120ContainerTest.java new file mode 100644 index 00000000..5d83f73f --- /dev/null +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/weblogic/WebLogic14120ContainerTest.java @@ -0,0 +1,36 @@ +package com.reajason.javaweb.integration.probe.weblogic; + +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +/** + * @author ReaJason + * @since 2024/12/24 + */ +@Testcontainers +public class WebLogic14120ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.weblogic( + "reajason/weblogic:14.1.2.0-jdk17", + "/u01/oracle/user_projects/domains/domain1/autodeploy/app.war") + .expectedJdkVersion("JDK|1.8.0_391|52") + .targetJdkVersion(Opcodes.V17) + .build(); + + @Container + public static final GenericContainer container = buildContainer(CONFIG); + + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; + } + + @Override + protected GenericContainer getContainer() { + return container; + } +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty18ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty18ContainerTest.java index 3181b87c..82c9fc02 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty18ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty18ContainerTest.java @@ -1,106 +1,40 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class OpenLiberty18ContainerTest { - public static final String imageName = "open-liberty:18.0.0.4-webProfile8"; +public class OpenLiberty18ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .openLiberty("open-liberty:18.0.0.4-webProfile8") + .expectedJdkVersion("JRE|1.8.0_211|52") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .privilegedMode(true) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/config/dropins/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_211|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty20ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty20ContainerTest.java index 05989000..6e76fbb0 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty20ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty20ContainerTest.java @@ -1,107 +1,39 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class OpenLiberty20ContainerTest { - public static final String imageName = "open-liberty:20.0.0.12-full-java8-openj9"; +public class OpenLiberty20ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.openLiberty("open-liberty:20.0.0.12-full-java8-openj9") + .expectedJdkVersion("JRE|1.8.0_292|52") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .privilegedMode(true) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/config/dropins/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_292|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - log.info(data); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty22ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty22ContainerTest.java index 5d7ea706..e9510099 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty22ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty22ContainerTest.java @@ -1,106 +1,39 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class OpenLiberty22ContainerTest { - public static final String imageName = "open-liberty:22.0.0.12-full-java11-openj9"; +public class OpenLiberty22ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.openLiberty("open-liberty:22.0.0.12-full-java11-openj9") + .expectedJdkVersion("JRE|11.0.19|55") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .privilegedMode(true) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/config/dropins/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|11.0.19|55", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty25ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty25ContainerTest.java index 80d07639..bec807c7 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty25ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/OpenLiberty25ContainerTest.java @@ -1,106 +1,39 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class OpenLiberty25ContainerTest { - public static final String imageName = "open-liberty:25.0.0.12-full-java17-openj9"; +public class OpenLiberty25ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.openLiberty("open-liberty:25.0.0.12-full-java17-openj9") + .expectedJdkVersion("JRE|17.0.17|61") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .privilegedMode(true) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/config/dropins/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|17.0.17|61", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere855ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere855ContainerTest.java index 4b4226ab..80b86850 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere855ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere855ContainerTest.java @@ -1,105 +1,40 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class WebSphere855ContainerTest { - public static final String imageName = "reajason/websphere:8.5.5.24"; +public class WebSphere855ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.websphere( + "reajason/websphere:8.5.5.24", + "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") + .expectedJdkVersion("JDK|1.8.0_371|52") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @AfterAll - public static void tearDown() { - System.out.println(container.getLogs()); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_371|52", data); - } - - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere905ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere905ContainerTest.java index 2e5d51b7..529fe6cc 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere905ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere/WebSphere905ContainerTest.java @@ -1,100 +1,40 @@ package com.reajason.javaweb.integration.probe.websphere; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; import net.bytebuddy.jar.asm.Opcodes; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class WebSphere905ContainerTest { - public static final String imageName = "reajason/websphere:9.0.5.17"; +public class WebSphere905ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.websphere( + "reajason/websphere:9.0.5.17", + "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") + .expectedJdkVersion("JDK|1.8.0_381|52") + .targetJdkVersion(Opcodes.V1_8) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_381|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseCommandIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrlFromWAS(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.WebSphere, Opcodes.V1_8); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, org.objectweb.asm.Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere7/WebSphere700ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere7/WebSphere700ContainerTest.java index d1167fca..2b504611 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere7/WebSphere700ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/websphere7/WebSphere700ContainerTest.java @@ -1,86 +1,42 @@ package com.reajason.javaweb.integration.probe.websphere7; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrlFromWAS; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author ReaJason * @since 2024/12/21 */ @Testcontainers -@Slf4j -public class WebSphere700ContainerTest { - public static final String imageName = "reajason/websphere:7.0.0.21"; +public class WebSphere700ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.websphere( + "reajason/websphere:7.0.0.21", + "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") + .expectedJdkVersion("JDK|1.6.0|50") + .targetJdkVersion(Opcodes.V1_6) + .supportsCommand(false) + .supportsBytecode(false) + .waitStrategy(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) + .build(); + @Container - public final static GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/monitoredDeployableApps/servers/server1/app.war") - .waitingFor(Wait.forHttp("/app/").forPort(9080).withStartupTimeout(Duration.ofMinutes(5))) - .withExposedPorts(9080) - .withPrivilegedMode(true); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.6.0|50", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.WebSphere, data); - } - - - @Test - void testFilterProbe() { - String url = getUrlFromWAS(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrlFromWAS(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.WebSphere, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.WebSphere)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly18ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly18ContainerTest.java index 282a399c..ca0186c2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly18ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly18ContainerTest.java @@ -1,97 +1,35 @@ package com.reajason.javaweb.integration.probe.wildfly; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Wildfly18ContainerTest { - public static final String imageName = "jboss/wildfly:18.0.1.Final"; +public class Wildfly18ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .wildfly("jboss/wildfly:18.0.1.Final") + .expectedJdkVersion("JDK|11.0.5|55") + .targetJdkVersion(Opcodes.V11) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/jboss/wildfly/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|11.0.5|55", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly23ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly23ContainerTest.java index 8f7cdfb9..1c631974 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly23ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly23ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.wildfly; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Wildfly23ContainerTest { - public static final String imageName = "jboss/wildfly:23.0.2.Final"; +public class Wildfly23ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.wildfly("jboss/wildfly:23.0.2.Final") + .expectedJdkVersion("JDK|11.0.8|55") + .targetJdkVersion(Opcodes.V11) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/jboss/wildfly/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|11.0.8|55", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly30ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly30ContainerTest.java index e7d7b07a..23ad2e0e 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly30ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly30ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.wildfly; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Wildfly30ContainerTest { - public static final String imageName = "quay.io/wildfly/wildfly:30.0.1.Final-jdk17"; +public class Wildfly30ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.wildflyJakarta("quay.io/wildfly/wildfly:30.0.1.Final-jdk17") + .expectedJdkVersion("JDK|17.0.9|61") + .targetJdkVersion(Opcodes.V17) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/opt/jboss/wildfly/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.9|61", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V17, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly36ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly36ContainerTest.java index 9993dd30..3106d078 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly36ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly36ContainerTest.java @@ -1,97 +1,34 @@ package com.reajason.javaweb.integration.probe.wildfly; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warJakartaFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Wildfly36ContainerTest { - public static final String imageName = "quay.io/wildfly/wildfly:36.0.0.Final-jdk21"; +public class Wildfly36ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig.wildflyJakarta("quay.io/wildfly/wildfly:36.0.0.Final-jdk21") + .expectedJdkVersion("JDK|21.0.6|65") + .targetJdkVersion(Opcodes.V21) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warJakartaFile, "/opt/jboss/wildfly/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|21.0.6|65", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V17); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.JAKARTA_FILTER, ShellTool.Command, Opcodes.V17, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly9ContainerTest.java index f4306b5e..171288ad 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/wildfly/Wildfly9ContainerTest.java @@ -1,33 +1,12 @@ package com.reajason.javaweb.integration.probe.wildfly; -import com.reajason.javaweb.Server; -import com.reajason.javaweb.integration.ProbeAssertion; -import com.reajason.javaweb.integration.ShellAssertion; -import com.reajason.javaweb.integration.VulTool; -import com.reajason.javaweb.integration.probe.DetectionTool; -import com.reajason.javaweb.memshell.MemShellResult; -import com.reajason.javaweb.memshell.ShellTool; -import com.reajason.javaweb.memshell.ShellType; -import com.reajason.javaweb.packer.Packers; -import com.reajason.javaweb.probe.payload.FilterProbeFactory; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.objectweb.asm.Opcodes; +import com.reajason.javaweb.integration.probe.AbstractProbeContainerTest; +import com.reajason.javaweb.integration.probe.ProbeTestConfig; +import net.bytebuddy.jar.asm.Opcodes; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -import static com.reajason.javaweb.integration.ContainerTool.getUrl; -import static com.reajason.javaweb.integration.ContainerTool.warFile; -import static com.reajason.javaweb.integration.ShellAssertion.shellInjectIsOk; -import static org.junit.jupiter.api.Assertions.assertEquals; - /** * Wildfly - DockerHub * Wildfly - Quay @@ -35,66 +14,25 @@ import static org.junit.jupiter.api.Assertions.assertEquals; * @author ReaJason * @since 2024/12/10 */ -@Slf4j @Testcontainers -public class Wildfly9ContainerTest { - public static final String imageName = "jboss/wildfly:9.0.1.Final"; +public class Wildfly9ContainerTest extends AbstractProbeContainerTest { + + private static final ProbeTestConfig CONFIG = ProbeTestConfig + .wildfly("jboss/wildfly:9.0.1.Final") + .expectedJdkVersion("JDK|1.8.0_191|52") + .targetJdkVersion(Opcodes.V1_8) + .build(); + @Container - public static final GenericContainer container = new GenericContainer<>(imageName) - .withCopyToContainer(warFile, "/opt/jboss/wildfly/standalone/deployments/app.war") - .waitingFor(Wait.forHttp("/app")) - .withExposedPorts(8080); + public static final GenericContainer container = buildContainer(CONFIG); - @Test - void testJDK() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_191|52", data); + @Override + protected ProbeTestConfig getConfig() { + return CONFIG; } - @Test - @SneakyThrows - void testBasicInfo() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getBasicInfoPrinter()); - Files.writeString(Paths.get("src", "test", "resources", "infos", this.getClass().getSimpleName() + "BasicInfo.txt"), data); - } - - @Test - void testServerDetection() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", DetectionTool.getServerDetection()); - assertEquals(Server.Undertow, data); - } - - @Test - @SneakyThrows - void testCommandReqHeaderResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseCommandIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - @SneakyThrows - void testBytecodeReqParamResponseBody() { - String url = getUrl(container); - ProbeAssertion.responseBytecodeIsOk(url, Server.Undertow, Opcodes.V1_8); - } - - @Test - void testFilterProbe() { - String url = getUrl(container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - ShellAssertion.assertFilterProbeIsRight(data); - } - - @Test - void testFilterFirstInject() { - String url = getUrl(container); - MemShellResult memShellResult = shellInjectIsOk(url, Server.Undertow, ShellType.FILTER, ShellTool.Command, Opcodes.V1_6, Packers.BigInteger, container); - String data = VulTool.post(url + "/b64", FilterProbeFactory.getBase64ByServer(Server.Undertow)); - List filter = ProbeAssertion.getFiltersForContext(data, "/app"); - String filterName = ProbeAssertion.extractFilterName(filter.get(0)); - assertEquals(filterName, memShellResult.getShellClassName()); + @Override + protected GenericContainer getContainer() { + return container; } }