في إحدى التحديات التي اشتركت فيها في الفترة الأخيرة، استطعت الوصول إلى حساب مستخدم داخل الهدف ولكنه للأسف كان حساب ذو صلاحيات محدودة فكان عليّ أن أبحث عن طريقة لزيادة الصلاحيات الخاصة بالمستخدم. وفي الحقيقة وجدت طريقتين، الأولى كانت من خلال ثغرة Buffer Overflow والثانية كانت من خلال الـMysql وهي ما اشرحها في هذا المقال. بالمناسبة أنا عاشق لاستغلال ثغرات الـBuffer Overflow لذلك كانت هذه هي الطريقة التي استخدمتها للوصول إلى الـFlag ولكني مع ذلك قمت بتنفيذ الطريقة الثانية بعد ذلك للتأكد من عملها 🙂

الثغرة من نوع Local Privilege Escalation وهي ثغرة قديمة ولكن من الجيد التعرف على هذا النوع من الثغرات.

فكرة الثغرة: الثغرة تسمى بالـUDF وهي اختصار لـUser Define Function وهي تسمح بأن يقوم المستخدم الخاص بقاعدة البيانات بإنشاء Function خاصة به تقوم بعمل مهمات معينة.

ما جعلني أشك بداية في وجود طريقة لزيادة الصلاحيات تتعلق بالـMysql هو أنني استطعت استخراج اسم المستخدم root والباسورد من داخل قاعدة بيانات Mysql وهذا يعني أنني أملك حساب الـroot داخل قاعدة البيانات ولكني لا أملكه على النظام نفسي. وغير ذلك أنني وجدت أن خدمة الـmysqld تعمل كـroot مع أنه من المفترض أن تعمل هذه الخدمة كمستخدم ذو صلاحيات محدودة.

ps

لتعمل هذه الثغرة يجب أن تملك مستخدم داخل قاعدة البيانات لديه إمكانية عمل Insert. في هذه الحالة أنا أملك حساب الروت 🙂

أول ما سنقوم به هو الاتصال بمستخدم الروت داخل قاعدة البيانات:

mysql root connection

سأقوم باختيار العمل داخل قاعدة البيانات mysql:

show databases

أنا أعلم أن مستخدم الروت داخل قاعدة البيانات كشيء طبيعي لديه إمكانية استخدام insert ولكني سأتحقق مع ذلك كما هو موضح بالصورة:

insert privilage

جيد، مستخدم الروت يملك صلاحيات الـinsert ويوجد مستخدم أخر داخل قاعدة البيانات لكني لم أستطع أن أقوم بكسر الهاش الخاص بهذا المستخدم 🙁

بعد ذلك عليّ التحقق من إن كان بإمكاني أن أقوم بنقل ملف خارج وإضافته داخل قاعدة البيانات فهذه الخطوة مصيرية لأنني سأقوم بنقل plugin وإضافتها لقاعدة البيانات فكان عليّ التحقق:

show local infile

يبدو أنني بالفعل لدي إمكانية استدعاء ملفات خارجية وإضافتها لقاعدة البيانات.

كأمر أخير أريد أن أتحقق منه هو المسار الذي يحتوي على ملفات الـPlugin الخاصة بالـMysql:

show plugin dir

الآن نحن جاهزون للعمل، أول ما عليّ القيام به هو عمل جدول جديد وليكن بأي اسم ولكن النوع يجب أن يكون blob.

ما هو الـBLOB، هي اختصار لـBinary Large Object وهو نوع من أنواع البيانات داخل الـMysql يتم استخدامه في حالة إن كنت تريد إضافة بيانات من نوع Binary سواء كانت صور أو أيًا يكن نوع الملفات.

create table

سأقوم الآن بتحميل الـPlugin التي ستساعدني في عملية إضافة Function خاصة بي. يمكنك تحميلها من هذا الرابط.

https://github.com/mysqludf/lib_mysqludf_sys

ما يهمنا هذا الملف:

lib mysql

هذا الملف من نوع Shared Object وهو الذي نسعى لإضافته داخل مجلد الـPlugin. لاحظوا يا شباب أن عملية إنشاء Function خاصة بنا سهلة جدًا ويمكننا فعل ذلك من خلال سطر واحد كما سنرى في باقي المقال ولكن ما نقوم به الآن هو محاولة إضافة ملف الـShared Object داخل مجلد الـPlugins الخاص بالـMysql فلدخول هذا المجلد يجب أن تمتلك صلاحيات روت وهو ما لا نملكه كما قلت من قبل. فما نملكه هو مستخدم الروت على قاعدة البيانات وليس على النظام نفسه. لذلك نحن نحاول أن نقوم بنقل ملف الـShared Object داخل مجلد الـPlugin من خلال هذه الخطوات الأولية التي نقوم بها وبعدها سيمكننا بمساعدة هذا الملف إنشاء Function خاصة بنا.

لقد قمت بتحميل الملف داخل مجلد /tmp كما هو موضح في الصورة التالية:

ls

دعنا الآن نقوم بإدخال الملف داخل الجدول الذي قمنا بإنشائه 🙂

import to table value

بعد أن قمنا بإدخال الملف داخل الجدول الذي قمنا بإنشاءه، نستطيع الآن أن نقوم بنقله داخل مجلد الـPlugin وهذا هو غرضنا من كل الخطوات السابقة وهو نقل هذا الملف داخل مجلد الـPlugin لأننا لم نكن لنستطيع فعل ذلك من خلال حساب المستخدم المحدود الذي نملكه على النظام. ولكننا نستطيع فعل ذلك من خلال مستخدم الـroot الذي نملكه داخل قاعدة البيانات.

mysql dump into file

كما هو موضح في الصورة السابقة استطعنا أن نقوم بنقل الملف داخل مجلد الـPlugin بنجاح. يمكنك التأكد من خلال عمل ls على مجلد الـPlugin.

mysql plugin folder

الآن كل ما علينا فعله هو إنشاء Function خاصة بنا 🙂

create user define function

قمت بإنشاء Function وهي sys_exec وهي تساعدني في تشغيل أوامر خاصة بالنظام.

في الصورة السابقة ما قمت بفعله هو أنني قمت بطلب إنشاء Function اسمها sys_exec والتي تعيد قيمة من نوع integer وذلك بمساعدة الـShared Object وهو في هذه الحالة الـlib_mysqludf_sys.so.. لاحظ إنه إن لم يكن الـShared Object موجود داخل مجلد الـPlugin فلن يعمل الأمر وسيخبرك أن الـShared Object المطلوب غير موجود. أخيرًا الـsoname هي تشير إلى اسم الـShared Object.

دعنا نعود إلى هدفنا الرئيسي وهو زيادة صلاحياتي على النظام لذلك قمت بكتابة برنامج بسيط بلغة الـC يقوم باستدعاء الـBash.

setuid c program

وبعدها سأقوم بعمل Compile للبرنامج:

compile setuid

الآن، كل شيء جاهز، هذا البرنامج مملوك للمستخدم ذو الصلاحيات المحدودة لأنني قمت بإنشاءه من خلاله والآن دعنا نستخدم الـFunction التي قمنا بإنشاءها لنجعل هذا الملف مملوك للـroot وبالتالي بعد تشغيله سنصل إلى Bash تكون مملوكه للروت وبالتالي معها صلاحيات روت 🙂

sys_exec

ما قمت بفعله في الصورة السابقة أنني قمت باستخدام الـFunction التي قمنا بإنشاءها مسبقًا وذلك لتنفيذ عدة أوامر، أولها هي أنني قمت بتحديد صاحب الملف والمجموعة التي تمتلك الملف على أنها روت، وبعد ذلك أعطيت الملف صلاحيات الـRead والـWrite والـExecute.

دعنا الآن ننتقل للملف ونرى إن كان حدث أي تغيير عليه.

setuid

هل لاحظتم التغيير 🙂

إن قمت بتشغيل البرنامج الآن سنمتلك Bash معها صلاحيات روت وبهذا نكون نجحنا في الوصول لهدفنا وهو زيادة الصلاحيات 🙂

root setuid

بهذا نكون انتهينا من هذا المقال وأتمنى أن تكونوا قد استفدتم..

ملحوظة: ما قمت بإخفاءه في الصور هو اسم المستخدم واسم النظام الذي اعمل عليه، لم يكن لدي الصلاحيات لإظهارها 🙁

إن شاء الله نلتقي في دروس أخرى شيقة.