
استغلال لثغرة CVE-2023-22518 في Atlassian Confluence. يوفر شرحًا تفصيليًا للثغرة، بما في ذلك إعداد البيئة، وتحليل السبب الجذري عبر المقارنة، وخطوات الاستغلال للحصول على وصول إداري.
CVE-2023-22518 في Confluence
CVE-2023-22518 : تم وصف هذه الثغرة بأنها "ثغرة في التفويض غير الصحيح في قاعدة البيانات وخوادم Confluence". تؤثر على الإصدارات المحلية (On-premises) من منتجات Atlassian.
إعداد البيئة استخدم الإصدار المصاب 8.0.4 رابط التحميل: https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.0.4-x64.exe

اختر Trial Installation، ثم انقر على الرابط للحصول على مفتاح التجربة المجانية (free trial key). بعد ذلك قم بإعداد الكتلة (cluster): اختر non-cluster

بعد ذلك انتقل إلى إعداد قاعدة البيانات (setup database) -> اختر MySQL

اتبع الإرشادات:

قم بتكوين قاعدة البيانات، وأنشئ المستخدم وكلمة مرور للجدول.
CREATE DATABASE securedb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'admin123'@'localhost' IDENTIFIED BY 'supersecure';
GRANT ALL PRIVILEGES ON securedb.* TO 'admin123'@'localhost';
GRANT SUPER ON *.* TO 'your_username'@'your_host';
FLUSH PRIVILEGES;
ثم قم بتعديل /etc/mysql/my.cnf. أضف الأسطر التالية:
transaction-isolation = READ-COMMITTED
log_bin_trust_function_creators = 1

ثم أعد تشغيل MySQL وConfluence. بعد ذلك انتقل إلى صفحة الإعداد على localhost:8090 واستخدم قاعدة البيانات التي أنشأتها لملء البيانات.

تحقق من نجاح الاتصال، ثم انقر فوق Next. بعد ذلك قم بالتسجيل (Sign up).

Debug
*Diff قارن ملفي jar من الإصدارين عبر IntelliJ. على وجه التحديد، قمت بمقارنة الإصدارين 8.0.4 و7.19.16. وفقًا للوصف، قارن ملف confluence.jar من الإصدارين معًا.

الفرق بين النسخة المصححة والنسخة غير المصححة هو @WebSudoRequired و @SystemAdminOnly.
WebSudoRequired هي ميزة لتعزيز أمان جلسات المسؤول. عند محاولة الوصول إلى الإدارة (admin)، سيطلب النظام إعادة إدخال كلمة المرور حتى لو كنت مسجلًا بالفعل في النظام. تضيف خطوة مصادقة إضافية لضمان الوصول الإداري.
SystemAdminOnly: هي ميزة تقتصر وظائف الإدارة على حسابات المسؤولين فقط. وهذا يضمن أن الحسابات المصرح لها فقط هي القادرة على تنفيذ العمليات المهمة التي تؤثر على النظام.
ضع نقطة توقف (breakpoint) عند الدالة validate() في RestoreAction.class

الدالة التي تحفظ الملف المرفوع باستخدام getRestoreFileFromUpload

يتم استخدام getExportDescriptor لفك ضغط (unzip) وقراءة محتويات ملف zip


ومع ذلك، بعد التصحيح (debug)، لم نتمكن بعد من العثور على السبب الجذري للثغرة.
السبب الموصوف في CVE هو ثغرة في التفويض. وهذا يقودنا إلى توجيه الاهتمام إلى الأبحاث حول ثغرات لغة Java أثناء عملية قيام المطورين بتحديد الصلاحيات.
نحوّل الانتباه إلى ملف struts.xml، حيث يحتوي هذا الملف على معلومات حول الإجراءات (actions) والتوجيه بناءً على مساحة الاسم (namespace) وكذلك المعترضات (interceptors).




نلاحظ أن مساحة الاسم /json تعزز وظائف مساحة الاسم /admin. لذلك، يمكن الوصول إلى المسارات المحددة لمساحة الاسم /admin أيضًا عبر مساحة الاسم /json.
في سياق مساحة الاسم /json، تتضمن عملية توجيه الطلب المرور عبر سلسلة من المعترضات (interceptors). أحد هذه المعترضات، المسمى WebSudoInterceptor، يقوم بإجراء فحص بناءً على URI الخاص بالطلب.
تحديدًا، يقوم WebSudoInterceptor بتنفيذ خطوات الفحص التالية:
إذا كان مسار الطلب هو /authenticate.action فسيتم تجاهله. إذا كان مسار الطلب هو /admin، فسيتحقق مما إذا كانت خاصية WebSudoNotRequired فارغة أم لا.
إذا تم إرسال طلب إلى '/json'، فسيتم تحويل الطلب إلى '/json/action' ليصل إلى '/setup/action' و'admin/action'. في هذه الثغرة، المسار الضعيف هو '/json/setup-restore.action?synchronous=true'.
التقط الطلب باستخدام Burp Suite، GET /json/setup-restore.action. ومع ذلك حصلنا على استجابة "Method Not Allowed". جرّب باستخدام POST /json/setup-restore.action?synchronous=true وحصلنا على استجابة 200.


ارفع الملف xmlexport-200123123001.zip

ثم تحقق من الاستجابة.

الآن يمكننا تسجيل الدخول باستخدام الحساب admin:admin

ونحصل على النتيجة التالية:
