
Strumento client-server per caricare ed eseguire remotamente bytecode Java tramite ClassLoader e API Reflect, con crittografia ChaCha20 e connessione keepalive.
Questo strumento ti permette di inviare bytecode Java sotto forma di file class ai tuoi client (o potenziali obiettivi) da caricare ed eseguire utilizzando Java ClassLoader insieme all'API Reflect. Il client riceve il file class dal server e restituisce il rispettivo output di esecuzione. I payload devono essere scritti in Java e compilati prima di avviare il server.
Lo strumento è stato testato utilizzando OpenJDK 11 con JRE Java Package, sia su Windows che su Linux (versione zip portatile). La versione di Java deve essere 11 o successiva a causa delle dipendenze.
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
Supponendo di avere il seguente payload Hello World nel file 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;
}
}
Poi dovresti compilare e produrre il rispettivo file Payload.class.
Per eseguire il processo server in ascolto sulla porta 1337 su tutte le interfacce di rete:
$ 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=
Lato client, puoi usare lo stesso pacchetto JAR con il flag -client e utilizzare la chiave simmetrica generata dal server. Specifica l'indirizzo IP e la porta del server a cui connetterti. Puoi anche cambiare il nome della classe e il metodo della classe (i valori predefiniti sono rispettivamente Payload e String exec()). Inoltre, puoi specificare -keepalive per far sì che il client continui a richiedere il file class dal server mantenendo la connessione.
$ 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
Fai riferimento a https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/ per un post del blog relativo allo sviluppo di questo strumento.
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