
استغلال تنفيذ التعليمات البرمجية عن بُعد بدون مصادقة مسبقة لـ Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). يتضمن إعداد بيئة مفصلة، إنشاء حمولة، وتعليمات التصحيح عن بُعد لاختبار الاختراق.
CVE-2022-21445 (نقاط CVSS 9.8)، الثغرة هي إلغاء تشفير بيانات غير موثوق، تم تحديدها في مكون ADF Faces، ويمكن استغلالها عن بُعد دون الحاجة إلى مصادقة (pre-authentication) لتنفيذ RCE.
تم اكتشاف الثغرة بواسطة خبيرَي أمن سيبراني: PeterJson من VNG Corporation و Nguyen Jang من VNPT. ثم تلقت Oracle هذا التقرير في أكتوبر 2021، واستغرق الأمر 6 أشهر، أي حتى أبريل 2022، لإصدار التصحيح.
في هذه المقالة، يركز الاستغلال على Oracle Business Intelligence الإصدار 12.2.1.4.0
المتطلبات: تثبيت Windows 10+ Pro أو Windows Home (x64) مع ترخيص نشط، أو استخدام Windows Server (يفضل استخدام إصدارات Oracle)
الخطوة 1: تثبيت Java، الإصدار jdk 8u112 أو أحدث (8Ux)، رابط التحميل: JDKv8U112

الخطوة 2: تثبيت Oracle Database 19c، رابط التحميل: Oracle 19c
جهّز مجلدًا لتثبيت قاعدة البيانات، وأنشئ مسارًا كما يلي، ثم قم بفك ضغط ملف قاعدة البيانات الذي تم تحميله في هذا المسار C:\app\oracle\product\19c\db_home1
شغّل ملف setup.application بصلاحيات المسؤول

اتبع التعليمات خطوة بخطوة كما في دليل تثبيت DB
ملاحظة مهمة جدًا:
في الخطوة 8/17، تأكد من تحديد Create as Container database لإنشاء قاعدة بيانات قابلة للتوصيل (pluggable db) لخدمة عملية تثبيت Fusion Middleware القادمة

في الخطوة 9/17، اختر ترميز الأحرف Unicode (AL32UTF8)



الخطوة 3: تثبيت SQL Developer، الإصدار no-jre، رابط التحميل: SQLDev-NoJRE

شغّل ملف sqldeveloper.application بصلاحيات المسؤول

قم بتعيين المعلمات لاتصال جديد كما في الصورة أدناه، مع تغيير اسم المستخدم وكلمة المرور (كما في المثال أعلاه hr)، واسم المضيف (الافتراضي localhost)، والمنفذ (الافتراضي 1521)، وSID (وهو اسم قاعدة البيانات العام الذي تم تثبيته في الخطوة 2)

إذا ظهرت رسالة Success عند النقر على Test، فهذا يعني أن الاتصال ناجح، ثم انقر Connect
الخطوة 4: تثبيت Fusion Middleware Infrastructure (FMW) الإصدار 12.2.1.3.0، رابط التحميل FMW_ver_12.2.1.3.0

الخطوة 5: تثبيت Oracle Business Intelligence (OBIEE) الإصدار 12.2.1.4.0، رابط التحميل: OBIEE_ver_12.2.1.4.0
شغّل ملف setup_bi_platform-12.2.1.4.0_win64.exe بصلاحيات المسؤول

اتبع التعليمات خطوة بخطوة حسب دليل تثبيت OBIEE
ملاحظة: يجب أن يكون مسار BI مطابقًا للمسار الذي تم تثبيت FWM عليه، مثلاً هنا Oracle/Middleware/Oracle_Home

الخطوة 6: إعداد مخطط BI باستخدام أداة Repository Creation Utility (RCU)
في المسار C:\Oracle\Middleware\Oracle_Home\oracle_common\bin، شغّل ملف rcu.bat بصلاحيات المسؤول
اتبع الخطوات التالية بالتسلسل




الخطوة 7: إعداد متغيرات البيئة لـ OBIEE

الخطوة 8: إنشاء مجال BI (BI Domain)





في الخطوة 4، إذا أبلغ النظام عن فشل تسجيل الدخول، فتأكد من صحة كلمة مرور المجال
في الخطوة 8، إذا أظهر النظام خطأً كما في الصورة أدناه، فتحقق مما إذا كنت قد قمت بتنشيط ترخيص Windows وما إذا كان Windows يلبي المتطلبات الموضحة في قسم الشروط.
![]()
الخطوة 9: بعد الانتهاء من الإعداد، ادخل إلى مجال BI الذي تم إنشاؤه في المسار $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao
انسخ جميع ملفات jar الموجودة هنا إلى مجلد منفصل، وشاركها مع جهاز الهجوم (في بيئة المختبر، افعل ذلك، أما في الهجوم الفعلي، فيجب على جهاز الهجوم أيضًا تثبيت البيئة مثل جهاز الضحية للحصول على الكود المصدري)
أضف أيضًا مكتبة coherence.jar من المسار $Oracle_Home\coherence\lib إلى هذا المجلد.
هذا المجلد مهم جدًا لنجاح الحمولة (payload) لأن كل إصدار من FMW أو BI أو بيئة كل جهاز يختلف عادةً، لذا يلزم وجود الإصدار الصحيح لتقليل المخاطر أو الاستثناءات التي قد تظهر أثناء نقل الحمولة.
الخطوة 10 (فقط إذا كنت بحاجة إلى تصحيح الأخطاء عن بُعد (remote debug)، مع الإشارة إلى أنه في حالة الاختبار في بيئة حقيقية، لا يمكن إعداد جهاز الضحية حسب الرغبة، لذلك يحتاج المهاجم إلى إعداد جهاز الهدف على جهازه الخاص أيضًا لتمكين التصحيح عن بُعد والتحقق من الأخطاء)
تثبيت mozilla، إضافة Burp Proxy على المنفذ 8181
تشغيل Remote Debug من جانب خادم BI
الوصول إلى localhost:9500/console
في Domain Structure -> اختر bi -> Environment -> Servers

سيظهر خادمان: AdminServer الخاص بـ Weblogic و bi_server1 الخاص بـ BI

اختر Lock & Edit في الزاوية اليسرى العليا، وحدد bi_server1 لتعديل التكوين. ثم انتقل إلى Configuration -> Server start -> اسحب لأسفل إلى النهاية، اختر Advanced (إن وجد) -> اختر إدخال الوسائط (Arguments) -> أدخل معلمات التصحيح:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(يمكنك تجربة 0.0.0.0:5005 إذا حدث خطأ لاحقًا ولم يتم إعادة تشغيل bi_server1)
أدخل كلمة مرور Weblogic (التي تم تعيينها سابقًا في قسم تكوين BI Domain) -> Apply change & Restart
افتح Terminal Administrator -> انتقل إلى المسار $Oracle_Home\user_projects\domains\bi\bitools\bin وشغّل ./stop.cmd ثم ./start.cmd لإعادة تشغيل bi_server1. إذا لم يحدث خطأ أثناء إعادة التشغيل، فهذا يعني أن التصحيح قد تم فتحه وأنه يستمع على المنفذ 5005 كما هو موضح أعلاه. إذا حدث خطأ، فتحقق من معلمات التصحيح أعلاه للتأكد من عدم وجود مسافات زائدة أو خطأ في جزء العنوان.
الخطوة 1: قم بتحميل IntelliJ IDEA Ultimate، وقم بتنشيطه باستخدام كود موجود على GitHub.
الخطوة 2 (قم بهذه الخطوة فقط إذا ظهر خطأ أثناء الهجوم مثل 500 Server Error, ...، والذي يكون بسبب استثناء في الحمولة)
قم بتغيير إصدار jdk – sdk للمشروع ليتطابق مع إصدار جهاز الهدف (طريقة التثبيت كما في قسم جهاز الهدف - الخطوة 1)
أنشئ مشروعًا فارغًا لتحليل الكود المصدري، لخدمة التصحيح عن بُعد، 3. أضف جميع ملفات jar من المجلد المستلم من جهاز الهدف إلى هذا المشروع
Project Structure -> Modules -> اختر علامة + -> 1 JARS or Directories -> أضف مجلد jar بأكمله.


إعداد التصحيح عن بُعد
Run -> Edit Configurations -> + -> Remote JVM Debug

شغّل التصحيح عن بُعد، إذا ظهرت رسالة في وحدة التحكم: Connected … فهذا يعني النجاح.

الخطوة 3:
انسخ الكود من هذا المستودع إلى جهازك، واحذف ملف coherence.jar القديم في مجلد lib واستبدله بالملف الذي تلقيته من جهاز الهدف في الخطوة السابقة.
بعد ذلك، أضفه إلى مشروع يعمل بـ IntelliJ، وأضف ملفات jar الموجودة في lib مع اختيار Add as library
تحقق من اسم الفئة LambdaIdentity$.... بحيث يتطابق مع إصدار Weblogic، إذا كان هناك تغيير، فقم بإعادة تسمية الملف وتعديل اسمه.
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
قم بتعديل المسار إلى ملف LambdaIdentity$....class في ملف Main.java. للحصول على المسار الصحيح، هناك طريقتان: يمكنك تشغيل javac على ملف jar لتوليد ملف .class؛ أو يمكنك التعليق على كود الدالة main، ثم تشغيل المشروع بشكل طبيعي، ويمكن العثور على مسار ملف class في مجلد target.
تحقق من أن إصدار jdk و sdk للمشروع متطابق مع إصدار جهاز الهدف.
نجد ملف web.xml، يصف هذا الملف علاقات التعيين المتعلقة بـ servlet-mapping. "resources" هو servlet مرتبط بموارد النظام، ويحتوي على بيانات ومعلومات مهمة، لذا غالبًا ما يستهدفه المهاجمون.






تحليل الدالة findResource() في RemoteApplicationResourceLoader.class

ترجع هذه الدالة طريقة تحتوي على بروتوكول مخصص RAStreamHandler(). يقوم RAStreamHandler بإنشاء كائن URLConnection بقيمة جديدة RAURLConnection

الدالة RAURLConnection تستدعي _getPathBean

تحتوي الدالة _getPathBean على كائن bean يتم إنشاؤه عن طريق استدعاء الدالة getInstanceFromString() التي تعالج السلسلة النصية المستلمة لاستخراج المفاتيح المقابلة (filter).

سيتم تحويل سلسلة bean المدخلة عبر فئة SerializationUtils من تنسيق URL encoded إلى كائن URLEncoderPathBean. إذا كان كل شيء على ما يرام، فسيتم تمرير الإدخال التالي إلى الدالة fromURLEncodeString().


في حالة حدوث خطأ في سلسلة الإدخال، سيتم إلقاء استثناء. يأتي الاستثناء بشكل أساسي من المكتبة المستخدمة في الحمولة، إما بسبب اختلاف الإصدار أو بسبب مسار ملف Lambda الخاطئ.
في الدالة fromURLEncodedString()، يتم إرجاع دالة fromString مع معامل url، وكودها كما يلي:

في الدالة fromString، تتم قراءة البيانات عبر readObject() وإعادتها. يمكن ملاحظة أن الإدخال من البداية لا يتم تصفيته. يمر عبر العديد من الدوال ويتم في النهاية إلغاء تسلسله (deserialize) في fromString(). هذا هو sink الذي يخدم الاستغلال. بعد وجود sink، نحتاج الآن إلى إيجاد source.
لذلك، لاستدعاء الفئة المذكورة أعلاه، نحتاج إلى تعبير نمطي بالشكل “/.*/remote/(.*)”. وبناءً عليه، عندما يكون المسار أو عنوان URL المدخل بالشكل /em/afr/foo/remote/payload فإنه سيتطابق مع البنية المحددة في هذا الملف، وعندها سيتم استخدام RemoteApplicationResourceLoader كـ loader في doGet، وسيستدعي ملف الفئة المقابل oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader الدالة findResource() التي تم تجاوزها فيه. لذلك، إذا تم إرسال الحمولة إلى العنوان الصحيح، فسيتم نقل البيانات بسهولة دون مواجهة أي فلتر.
هذا هو عنوان URL النهائي المستخدم للاستغلال: __hostname:port/contextApp/afr/foo/remote/payload/__
حيث أن contextApp هو أحد المسارات التي تظهر عند تثبيت OBIEE حديثًا مثل /em; /bicomposer; ….
Foo عبارة عن سلسلة عشوائية.
Payload هي السلسلة الناتجة عن تشغيل الدالة Main للمشروع الهجومي المُعد.
### تحليل الكود المستخدم لإنشاء الـ payload
يتبع هذا المشروع سلسلة الأدوات (gadget chain) لـ CVE-2020-14644

الفئة LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A الموروثة من AbstractRemotable تُستخدم للتفاعل مع النظام عن بُعد.
باستخدام Java Reflection API، يمكن للمهاجم بسهولة الحصول على WorkAdapter من سلسلة التنفيذ الحالية.
ثم سيحصل على الحقل connectionHandler الخاص بـ WorkAdapter ويقوم باستعلام للحصول على ServletRequest و ServletResponse من connectionHandler.
بعد ذلك، يحصل على قيمة الرأس "cmd" من الطلب (ServletRequest)، ثم يتحقق إذا كانت "cmd" غير فارغة، ويقوم بتنفيذ أمر شل يتوافق مع نظام التشغيل الحالي (Windows أو Linux/Unix).
يقرأ النتيجة من أمر الشل ويرسل هذه النتيجة إلى الرد (ServletResponse).
إذا حدث أي خطأ أثناء التنفيذ، فسيتم طباعته على وحدة التحكم عبر طريقة printStackTrace().
المعرف الموجود خلف اسم الفئة LamdaIdentity يعتمد على إصدار خادم WebLogic، وهو سلسلة مشفرة وفقًا لقيمة تجزئة MD5 للفئة com.tangosol.internal.util.invoke.ClassIdentity، ولأن هذه الفئة تختلف في كل إصدار، كما ذكرنا، لضمان عدم حدوث خطأ في الـ payload، يجب التحقق من ذلك بعناية.
هنا، يتم أخذ متغير cmd من الرأس في الطلب الوارد، ثم يتم إضافته إلى الأمر Runtime.getRumtime.exec() أدناه، ويتم تشفيره وفك تشفيره بصيغة MD5 السداسية، وبعد إرساله إلى نظام OBIEE، سيعيد قيمة تم إلغاء تسلسلها (deserialized).
أخيرًا، في الدالة Main، يتم إنشاء كائن RemoteConstructor، ومن خلال مكتبة SerializationUtils يتم تحويله إلى سلسلة مشفرة بعنوان URL. سيتم إرسال هذه السلسلة مباشرة إلى عنوان URL المصدر، مما يتيح للمهاجمين إدراج الأمر __cmd__ حسب الرغبة.

## إعادة إنتاج الاستغلال


## المراجع
1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2
2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316
## مؤلف الثغرة: Jang Nguyen & Duc PeterJson