
Ferramenta cliente-servidor para carregar e executar remotamente bytecode Java via ClassLoader e API Reflect, com criptografia ChaCha20 e conexão keepalive.
Esta ferramenta permite-lhe enviar bytecode Java na forma de ficheiros de classe para os seus clientes (ou potenciais alvos) para carregar e executar usando Java ClassLoader juntamente com a API Reflect. O cliente recebe o ficheiro de classe do servidor e retorna o respetivo resultado da execução. As cargas úteis devem ser escritas em Java e compiladas antes de iniciar o servidor.
A ferramenta foi testada usando OpenJDK 11 com JRE Java Package, tanto no Windows como no Linux (versão portátil zip). A versão Java deve ser 11 ou superior devido a dependências.
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
Assumindo que tem a seguinte carga útil "Hello World" no ficheiro 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;
}
}
De seguida, deve compilar e produzir o respetivo ficheiro Payload.class.
Para executar o processo servidor a ouvir na porta 1337 em todas as interfaces de rede:
$ 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=
Do lado do cliente, pode usar o mesmo pacote JAR com a flag -client e usar a chave simétrica gerada pelo servidor.
Especifique o endereço IP e porta do servidor para se conectar. Pode também alterar o nome da classe e o método da classe (os predefinidos são Payload e String exec(), respetivamente). Adicionalmente, pode especificar -keepalive para manter o cliente a solicitar o ficheiro de classe do servidor enquanto mantém a ligação.
$ 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
Consulte https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/ para um artigo de blogue relacionado com o desenvolvimento desta ferramenta.
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