pt1[linux privilege escalation techniques] intro- Setuid & Setgid & Path Variable
السلام عليكم ورحمة الله وبركاتة
نبدا الموضوع من دون مقدمات افضل،
في البداية ناخذ تعريف عن setuid وا setguid
بختصار:
هناك انواع مميزة في التصاريح المسموحه للملفات الباينري القابله للتنفيذ مثال ع ذالك setguid+setuid
عندما تكون هاذي التصاريح موضوعه من قبل الروت في السيرفر ع ملفات باينري يصبح اي يوزر ع السيرفر يستطيع تشغيل الملف بالصلاحيات اليوزر المصرح. في حالة setuid اي التصريح او التشغيل يكون من اليوزر المصرح نفسه
setguid اي التصريح او التشغيل يكون من القروب المصرح ايضا نفسه
مقدمه عن Path variable
Path هو بيئه المتغيرات في اللينكس بحيث انه يحدد المجلدات الافتراضيه لتشغيل الباينيري في اللينكس في العاده
تكون في مجلدات bin,sbin,usr/sbin.usr/bin
التي تحتوي على ملفات الباينري مثل wget ,cat والخ،،
طيب مافائده path variable اختصار للوقت والجهد بحيث لاتطلب الباينري في مجلده الاصلي مثلا
/usr/bin/cat /home/user/file.txt
فقط ماعليك هو كتابه الامر cat /home/user/file.txt
بحيث ان path variable تعرف على الباينيري cat عن طريق بىئه المتغيرات
:/bin
ناخذ مثال عن كيف نظهر path variable env
الامر بسيط
echo $PATH
مقدمه عن Path variable
Path هو بيئه المتغيرات في اللينكس بحيث انه يحدد المجلدات الافتراضيه لتشغيل الباينيري في اللينكس في العاده
تكون في مجلدات bin,sbin,usr/sbin.usr/bin
التي تحتوي على ملفات الباينري مثل wget ,cat والخ،،
طيب مافائده path variable اختصار للوقت والجهد بحيث لاتطلب الباينري في مجلده الاصلي مثلا
/usr/bin/cat /home/user/file.txt
فقط ماعليك هو كتابه الامر cat /home/user/file.txt
بحيث ان path variable تعرف على الباينيري cat عن طريق بىئه المتغيرات
:/bin
ناخذ مثال عن كيف نظهر path variable env
الامر بسيط
echo $PATH
الان ناخذ مثال كود ظريف لطيف يقوم بتشغيل ملف file.sh عن طريق دالة system
نقوم باترجمته
####تنويه خطأ من المفروض مسمى الملف setuid
gcc test.c -o setguid
بعد ماقمنا با ترجمة الكود نقوم الان بوضع التصاريح المطلوبه في هاذي الحالة راح يكون الامر
chomd u+s
u+s = setuid
g+s = setguid
u= user
s= set execuation on id مثل ماهو موضح من ارشيف chomd في الصورة
الان نقوم بتغير مالك اللباينيري الى روت
linux chown root:root / mac chown root:wheel
من بعد ماقمنا بالتصاريح المطلوبه كما نلاحظ (x) = executable اي قابل للتنفيد
(s) suid bit مفعل
root = owner-user
wheel = owner-group
نقوم بتشغيل الملف من صلاحيات اليوزر لنرى
نلاحظ الباينيري يقوم بمحاوله تشغيل ملف باش باسم file.sh من ثم ملف الباش يقرا ملف flag.txt الذي ليسى لدينا صلاحيات لقرائته .....
الان لو نرجع للكود في البداية
نبي نفهم الية عمل setuid+ setguid في اللينكس مع الباث في التصعيد
في الكود السابق استدخمنا دالة system
نقوم بعمل debug
باستخدام strace or ltrace في اللينكس نلاحظ ان الباينيري ينفذ امر ولكن غير مفهوم
الثغرة او التصعيد راح يعتمد الاول ع التصريح والمالك بحيث التصريح
لديناsetuid root وا الowner root والثاني على الباينيري وطريقة عمله..
الان لنفترض انه لدينا يوزر بصلاحيات محدوده باسم r3m0t3
الاستغلال راح يكون بسيط ولكن الفكرة هي كالتالي الباينري يقوم بتنفيذ امر system واستدعاء ملف file.sh وتشغيله
ولكن يكمن الخطاء في التصعيد انه لم يقم بتحديد المجلد للملف الباش او يكون سوء + اهمال ادارة من الروت ويقوم بعمل [.] في $PATH بحيث يسهل له طلب استدعاءا لباينيري من دون وضع ./binary
وهنا يسمى التصعيد PATH Variable .
بحيث انه بستطاعتنا بتالاعب في PATH Variable
واضافه متغير جديد عن طريق export عندما يقوم بالتحقق من من مجلدات $PATH يقوم بتشغيل مجلد الذي يحتوي الباينري التابع لنا. مثال،
export PATH=/PATHfolder:$PATH
#ِِِ~Exploit
الفكرة في الاستغلال هي
١- انشاء binary بأسم bash
٢- تغير Path Variable
الاستغلال راح يكون بيسيط
يقوم بطباعه path variable اي المجلدات الافتراضيه للتشغيل الباينيري echo $PATH
نقوم بوضع path تبع الباينيري الذي سمينه [bash] export PATH=/tmp:$PATH
والناتج
بعض الاومر للبحث على setuid + setguid bit
setuid =
find / -perm -g=s -type f 2>/dev/null
setgid=
find / -perm -u=s -type f 2>/dev/null
ناخذ مثال اخر من موقع
https://attackdefense.com
نقوم في البداية بالبحث عن setuid bit & setgid bitبعد ماقمنا بتشغيل البينيري يتضح لنا انه يقوم بقراءه ملف يحتوي welcome to attack ...
وايضا من $path يتضحى لنا انه welcome باينيري مستقل بشكل ما
اهم النقاط التي نريد ان نركز عليها هي المجلد الي احنا عليه المالك الي هو نفس اليوزر الي احنا نحاول نصعد الصلاحيات منه
وايضا ملف الباينيري + ملف اخر بصلاحيات روت قابل للتفنيذ بصلاحيات المالك الي هو root لايمكن قرائته لسبب الصلاحيات طيب في الاول نحاول نعمل debug للباينري حتى نتاكد بأن الملف الذي يقراه/ينفذه الباينري هو greetings او لا
كما نلاحظ بوجود greetings داخل strings تبع الباينيري وهاذا يأكد لنا انه الباينيري يقرا/ينفذ من ملف greetings
بحكم ماذكرنا في البداية انه المجلد المالك هو نفس اليوزر الي نحاول نصعد الصلاحيات منه نقدر بحذف الملف greetings بحكم صلاحياتي ع الملجد
كما نلاحظ قمنا بمسح الملف
الان الاستغلال بسيط ولطيف
echo "/bin/bash -c id" > greetings|chmod +x greetings|./welcome
في النهاية حاولت ابسط واختصر الفكرة بقدر ماستطيع حتى توصل المعلومة مبسطه، دمتم بود/
تعليقات
إرسال تعليق