
क्लाइंट-सर्वर टूल जो ClassLoader और Reflect API के माध्यम से दूरस्थ रूप से Java बाइटकोड को लोड और निष्पादित करता है, ChaCha20 एन्क्रिप्शन और keepalive connection के साथ।
यह उपकरण आपको अपने क्लाइंट्स (या संभावित लक्ष्यों) को Java बाइटकोड को क्लास फ़ाइलों के रूप में भेजने की अनुमति देता है, ताकि Java ClassLoader और Reflect API का उपयोग करके लोड और निष्पादित किया जा सके। क्लाइंट सर्वर से क्लास फ़ाइल प्राप्त करता है और संबंधित निष्पादन आउटपुट लौटाता है। पेलोड को Java में लिखा जाना चाहिए और सर्वर शुरू करने से पहले संकलित किया जाना चाहिए।
उपकरण का परीक्षण OpenJDK 11 और JRE Java पैकेज के साथ Windows और Linux दोनों पर किया गया है (ज़िप पोर्टेबल संस्करण)। निर्भरताओं के कारण 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
मान लीजिए कि आपके पास Payload.java फ़ाइल में निम्नलिखित Hello World पेलोड है:
//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=
क्लाइंट पक्ष पर, आप -client फ्लैग के साथ उसी JAR पैकेज का उपयोग कर सकते हैं और सर्वर द्वारा उत्पन्न सममित कुंजी का उपयोग कर सकते हैं।
कनेक्ट करने के लिए सर्वर IP पता और पोर्ट निर्दिष्ट करें। आप क्लास का नाम और क्लास मेथड भी बदल सकते हैं (डिफ़ॉल्ट क्रमशः Payload और String exec() हैं)। इसके अतिरिक्त, आप कनेक्शन बनाए रखते हुए क्लाइंट को सर्वर से क्लास फ़ाइल का अनुरोध करते रखने के लिए -keepalive निर्दिष्ट कर सकते हैं।
$ 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