
Outil client-serveur pour charger et exécuter à distance du bytecode Java via ClassLoader et l'API Reflect, avec chiffrement ChaCha20 et connexion keepalive.
Cet outil vous permet d'envoyer du bytecode Java sous forme de fichiers de classe à vos clients (ou cibles potentielles) pour les charger et les exécuter en utilisant Java ClassLoader avec l'API Reflect. Le client reçoit le fichier de classe du serveur et renvoie la sortie d'exécution respective. Les charges utiles doivent être écrites en Java et compilées avant de démarrer le serveur.
L'outil a été testé avec OpenJDK 11 et le package JRE Java, à la fois sur Windows et Linux (version portable zip). La version de Java doit être 11 ou supérieure en raison des dépendances.
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
En supposant que vous ayez la charge utile Hello World suivante dans le fichier 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;
}
}
Ensuite, vous devez compiler et produire le fichier Payload.class correspondant.
Pour exécuter le processus serveur écoutant sur le port 1337 sur toutes les interfaces réseau :
$ 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=
Côté client, vous pouvez utiliser le même package JAR avec l'option -client et utiliser la clé symétrique générée par le serveur.
Spécifiez l'adresse IP du serveur et le port de connexion. Vous pouvez également modifier le nom de la classe et la méthode de la classe (les valeurs par défaut sont respectivement Payload et String exec()). De plus, vous pouvez spécifier -keepalive pour que le client continue de demander le fichier de classe au serveur tout en maintenant la connexion.
$ 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
Consultez https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/ pour un article de blog lié au développement de cet outil.
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