ما هو تصعيد الامتيازات؟
تُصمم معظم أنظمة الكمبيوتر لتكون مُستخدمة من قِبل عدة مستخدمين. وتعني الامتيازات ما يُسمح للمستخدم بالقيام به. تشمل الامتيازات الشائعة عرض الملفات وتحريرها أو تعديل ملفات النظام. يشير تصعيد الامتيازات إلى عندما يحصل مستخدم على امتيازات ليس من حقه الحصول عليها. يمكن استخدام هذه الامتيازات لحذف الملفات، عرض المعلومات الخاصة، أو تثبيت برامج غير مرغوب فيها مثل الفيروسات. وغالبًا ما يحدث ذلك عندما تحتوي النظام على خطأ يسمح بتجاوز الأمان أو، بدلاً من ذلك، لديه افتراضات تصميم خاطئة حول استخدامه.
تصعيد الامتيازات هو عمل استغلال خطأ أو عيب تصميم أو غفلة في تكوين نظام التشغيل أو تطبيق البرمجيات للحصول على وصول مرتفع إلى الموارد التي عادةً ما تحميها تطبيق أو مستخدم. والنتيجة هي تطبيق لديه امتيازات أكثر مما هو مقصود من قِبل المطور أو مسؤول النظام، مما يؤدي إلى القيام بأعمال غير مصرح بها.
بينما من المحتمل أن تكون المنظمات لديها عملاء Windows بشكل إحصائي أكثر، فإن هجمات تصعيد الامتيازات في Linux تعتبر تهديدات كبيرة يجب أخذها في الاعتبار عند التفكير في وضع أمان المعلومات في المنظمة. ضع في اعتبارك أن البنية التحتية الأكثر أهمية في المنظمة، مثل خوادم الويب، وقواعد البيانات، والجدران النارية، إلخ، من المحتمل جدًا أنها تعمل بنظام تشغيل Linux.
يمكن أن تؤدي المساومات على هذه الأجهزة الحرجة إلى تعطيل عمليات المنظمة بشكل كبير، إن لم تكن تدمرها تمامًا. علاوة على ذلك، فإن الإنترنت للأشياء (IoT) والأنظمة المدمجة أصبحت شائعة في مكان العمل، مما يزيد من عدد الأهداف المحتملة للقراصنة الخبيثين. بالنظر إلى انتشار أجهزة Linux في مكان العمل، من الضروري أن تقوم المنظمات بتقوية وتأمين هذه الأجهزة.
الهدف
تتناول هذه المدونة قضايا الأمان التي قد تؤدي إلى هجوم تصعيد الامتيازات الناجح على أي أنظمة قائمة على Linux. سنتحدث أيضًا عن كيفية استخدام المهاجم للتقنيات المعروفة الممكنة لرفع امتيازاته بنجاح على مضيف بعيد، وكيف يمكننا حماية أنظمتنا من أي هجوم من هذا القبيل. في النهاية، سيكون هناك بعض الأمثلة لتوضيح كيفية تحقيق تصعيد الامتيازات على أنظمة Linux مختلفة تحت ظروف مختلفة.
هذه المدونة ليست ورقة غش للتعداد باستخدام أوامر Linux، بل تهدف بشكل خاص إلى مساعدة المبتدئين على فهم أساسيات تصعيد الامتيازات في Linux مع أمثلة.
تصعيد الامتيازات يتعلق بالعد السليم. هناك طرق متعددة لأداء نفس المهام التي أظهرتها في الأمثلة.
نموذج الأذونات في Linux
يتمتع Linux بإرث من UNIX، حيث يتمثل مفهوم الملكية وأذونات الملفات. تُعتبر أذونات الملفات وسيلة لحماية النظام من العبث الخبيث. على خادم ويب يعمل بنظام UNIX، تحتوي كل ملف ومجلد مخزن على
القرص الصلب على مجموعة من الأذونات المرتبطة به، والتي تحدد من يُسمح له بالقيام بما مع الملف.
في لقطتي الشاشة أعلاه، يمكننا أن نرى أن الملف “docker-compose.yml” لديه حق الوصول للقراءة فقط من قبل المالك وهو “root”. فقط المستخدم الخارق (superuser) يمكنه قراءة هذا الملف؛ عندما حاولت قراءة الملف كمستخدم غير خارق، حدث خطأ “إذن مرفوض” (permission denied).
هذا يعني أن المستخدم لا يمكنه الوصول (قراءة/كتابة/تنفيذ) الملفات التي ليس لديه إذن للوصول إليها. ومع ذلك، يمكن للمستخدم الخارق (root) الوصول إلى جميع الملفات الموجودة على النظام. من أجل تغيير أي إعدادات هامة أو تنفيذ أي هجوم إضافي، يجب علينا أولاً الحصول على وصول root على أي نظام قائم على Linux.
لماذا نحتاج إلى تنفيذ تصعيد الامتيازات؟
نحتاج إلى تنفيذ تصعيد الامتيازات من أجل:
قراءة/كتابة أي ملف حساس.
الحفاظ على الاستمرارية بسهولة بين عمليات إعادة التشغيل.
إدراج باب خلفي دائم.
ما هي التقنيات المستخدمة في تصعيد الامتيازات؟
نفترض أنه لدينا الآن صلاحيات shell على النظام البعيد. بناءً على كيفية وصولنا إلى هناك، قد لا نكون نملك صلاحيات “root”. يمكن استخدام التقنيات المذكورة أدناه للحصول على وصول “root” على النظام.
1. استغلالات النواة (Kernel Exploits)
استغلالات النواة هي برامج تستغل ثغرات النواة من أجل تنفيذ تعليمات برمجية عشوائية بامتيازات مرتفعة. عادةً ما تمنح استغلالات النواة الناجحة المهاجمين وصولاً إلى المستخدم الخارق (super user) على الأنظمة المستهدفة في شكل موجه أوامر root. في العديد من الحالات، يكون تصعيد الوصول إلى root على نظام Linux بسيطًا مثل تنزيل استغلال نواة إلى نظام الملفات المستهدف، وتجميع الاستغلال، ثم تنفيذه.
افترض أنه يمكننا تشغيل الكود كمستخدم غير مميز، وهذه هي سير العمل العام لاستغلال النواة:
خداع النواة لتشغيل الحمولة الخاصة بنا في وضع النواة.
التلاعب ببيانات النواة، مثل امتيازات العمليات.
إطلاق shell بامتيازات جديدة. احصل على root!
تعتبر أربعة شروط ضرورية لنجاح هجوم استغلال النواة:
وجود نواة vulnerable.
وجود استغلال مطابق.
القدرة على نقل الاستغلال إلى الهدف.
القدرة على تنفيذ الاستغلال على الهدف.
أبسط طريقة للدفاع ضد استغلالات النواة هي الحفاظ على تحديث النواة وإصلاحها. في غياب التصحيحات، يمكن للمسؤولين التأثير بشكل كبير على القدرة على نقل وتنفيذ الاستغلال على الهدف. بالنظر إلى هذه الاعتبارات، لم تعد هجمات استغلال النواة قابلة للتطبيق إذا كان بإمكان المسؤول منع إدخال و/أو تنفيذ الاستغلال على نظام ملفات Linux.
لذلك، يجب على المسؤولين التركيز على تقييد أو إزالة البرامج التي تمكن نقل الملفات، مثل FTP وTFTP وSCP وwget وcurl. عندما تكون هذه البرامج ضرورية، يجب تقليل استخدامها لمستخدمين محددين، ودلائل، وتطبيقات (مثل SCP)، وعناوين IP أو مجالات محددة.
استغلال DirtyCow الشهير – Linux Kernel <= 3.19.0-73.8
تم العثور على حالة سباق (race condition) في الطريقة التي تعامل بها نظام الذاكرة في نواة Linux مع كسر copy-on-write (COW) في خرائط الذاكرة الخاصة القابلة للقراءة فقط. كان يمكن لمستخدم محلي غير مميز استخدام هذه الثغرة للحصول على وصول كتابة إلى خرائط الذاكرة التي كانت قابلة للقراءة فقط وبالتالي زيادة امتيازاته على النظام. كانت هذه واحدة من أخطر ثغرات تصعيد الامتيازات التي تم اكتشافها على الإطلاق وأثرت على تقريبًا جميع توزيعات Linux الرئيسية.
استغلال جهاز مصاب عبر dirtycow
$ whoami # يُظهر لنا أن المستخدم الحالي هو john (مستخدم غير root).
$ uname -a # يُعطينا إصدار النواة الذي نعرف أنه معرض لـ dirtycow.
#تم تجميعه وتنفيذه. يستبدل المستخدم 'root' بمستخدم جديد 'rash' من خلال تحرير ملف /etc/passwd.
تم تنزيل استغلال dirtycow من هنا.
$ su rash # يغير المستخدم الحالي المسجل إلى 'rash' الذي هو root.
يمكنك الاطلاع على متغيرات أخرى من استغلالات DirtyCow.
توجد العديد من استغلالات تصعيد الامتيازات المحلية المتاحة علنًا لأنظمة التشغيل المختلفة ونواة Linux. يعتمد ما إذا كان يمكنك الحصول على وصول root على مضيف Linux باستخدام استغلال نواة على ما إذا كانت النواة معرضة أم لا. يحتوي Kali Linux على نسخة محلية من استغلالات exploit-db، مما يسهل البحث عن استغلالات root المحلية. على الرغم من ذلك، لا أنصح بالاعتماد الكامل على هذه القاعدة البيانات عند البحث عن استغلالات نواة Linux.
$ searchsploit Linux Kernel 2.6.24 # يُظهر لنا جميع الاستغلالات المتاحة لنواة معينة الموجودة بالفعل في Kali Linux.
لماذا يجب عليك تجنب تشغيل استغلال تصعيد الامتيازات المحلية في المقام الأول؟
على الرغم من أنه قد يبدو مغريًا للغاية تشغيل استغلال والحصول على وصول root، إلا أنه يجب عليك دائمًا اعتبار ذلك كخيار أخير.
قد يتعطل المضيف البعيد، حيث أن العديد من استغلالات root المتاحة علنًا ليست مستقرة للغاية.
قد تحصل على وصول root ثم يتعطل النظام.
قد يترك الاستغلال آثارًا/سجلات قد تؤدي إلى القبض عليك.
يجب عليك دائمًا تجربة التقنيات الأخرى للحصول على وصول root التي تم مناقشتها أدناه قبل الانتقال مباشرة إلى تشغيل استغلال root المحلي.
التدابير الوقائية
حافظ على تحديث النواة وإصلاحها.
2. استغلال الخدمات التي تعمل كـ Root
إن استغلال أي خدمة تعمل كـ Root سيوفر لك وصولًا إلى Root!
يعد استغلال EternalBlue وSambaCry الشهير مثالًا على استغلال خدمة smb التي تعمل عادة كـ Root. مع استغلال واحد فقط، يمكن للمهاجم الحصول على تنفيذ كود عن بُعد وتصعيد الامتيازات محليًا أيضًا. تم استخدامه بشكل كبير لنشر برامج الفدية في جميع أنحاء العالم بسبب تركيبته المميتة.
يجب عليك دائمًا التحقق مما إذا كانت خوادم الويب، وخوادم البريد، وخوادم قواعد البيانات، إلخ، تعمل كـ Root. كثيرًا ما يقوم مسؤولو الويب بتشغيل هذه الخدمات كـ Root وينسون المشكلات الأمنية التي قد تسببها. قد تكون هناك خدمات تعمل محليًا وليست مكشوفة للجمهور يمكن استغلالها أيضًا.
$ netstat -antup # يُظهر لك جميع المنافذ المفتوحة والتي تستمع. يمكننا التحقق من الخدمات التي تعمل محليًا وما إذا كانت قابلة للاستغلال أم لا.
استغلال إصدار مصاب من MySQL يعمل كـ Root للحصول على وصول Root
يتيح استغلال مكتبة MySQL UDF الديناميكية لك تنفيذ أوامر عشوائية من واجهة mysql. إذا كانت MySQL تعمل بامتيازات Root، فستُنفذ الأوامر كـ Root.
$ ps -aux | grep root # يُظهر لنا الخدمات التي تعمل كـ Root.
يمكننا تنفيذ أوامر عشوائية باستخدام واجهة MySQL والتي ستُنفذ كـ Root.
إحدى أكبر الأخطاء التي يرتكبها مسؤولو الويب هي تشغيل خادم الويب بامتيازات Root. يمكن أن تؤدي ثغرة حقن الأوامر في تطبيق الويب إلى حصول المهاجم على وصول إلى shell كـ Root. هذه مثال كلاسيكي على سبب وجوب عدم تشغيل أي خدمة كـ Root ما لم يكن ذلك ضروريًا حقًا.
تعتبر الاستغلالات الثنائية لبرنامج مملوك كـ Root أقل خطورة بكثير من استغلال النواة، لأنه حتى إذا تعطل الخدمة، فلن يتعطل الجهاز المضيف، وستقوم الخدمات على الأرجح بإعادة التشغيل تلقائيًا.
التدابير الوقائية
لا تقم بتشغيل أي خدمة كـ Root ما لم يكن ذلك ضروريًا حقًا، خاصة خوادم الويب، وقواعد البيانات، وخوادم الملفات.
3. استغلال الملفات القابلة للتنفيذ SUID
SUID، والذي يعني set user ID، هو ميزة في Linux تسمح للمستخدمين بتنفيذ ملف بصلاحيات مستخدم محدد. على سبيل المثال، يتطلب الأمر في أوامر Linux مثل ping
عادةً صلاحيات Root من أجل فتح مقابس الشبكة الخام. من خلال وضع علامة SUID على برنامج ping
مع مالك البرنامج كـ Root، يتم تنفيذ ping
بصلاحيات Root في أي وقت يقوم فيه مستخدم ذو صلاحيات منخفضة بتنفيذ البرنامج.
-rwsr-xr-x – تشير حرف ‘s’ بدلاً من ‘x’ إلى أن بت SUID تم تعيينه.
SUID هي ميزة تعزز أمان Linux عند استخدامها بشكل صحيح. المشكلة هي أن المسؤولين قد يقدمون تكوينات SUID خطيرة دون علمهم عند تثبيت تطبيقات طرف ثالث أو إجراء تغييرات منطقية على التكوين.
العديد من مسؤولي النظام لا يفهمون جيدًا مكان تعيين بت SUID وأين لا ينبغي تعيينه. يجب عدم تعيين بت SUID خاصةً على أي محرر ملفات، حيث يمكن للمهاجم الكتابة فوق أي ملفات موجودة على النظام.
استغلال ملف SUID القابل للاستخدام للحصول على صلاحيات Root
$ find / -perm -u=s -type f 2>/dev/null
هذا الأمر يقوم بطباعة البرامج التنفيذية التي تم تعيين بت SUID عليها.
$ ls -la /usr/local/bin/nmap
هذا الأمر يستخدم للتحقق مما إذا كان برنامج nmap
يحتوي على بت SUID المعين أم لا. سيظهر لك الإخراج تفاصيل عن صلاحيات البرنامج، وإذا كانت موجودة، ستظهر علامة s
في موضع صلاحيات المالك.
يحتوي Nmap
على بت SUID المعين. كثيرًا ما يقوم المسؤولون بتعيين بت SUID لـ Nmap
ليتمكنوا من استخدامه لمسح الشبكة بكفاءة، حيث إن تقنيات مسح Nmap
لا تعمل إذا لم يتم تشغيله مع صلاحيات الجذر (root).
ومع ذلك، هناك وظيفة في الإصدارات القديمة من Nmap
تسمح لك بتشغيل Nmap
في وضع تفاعلي، مما يتيح لك الهروب إلى shell. إذا كان Nmap
يحتوي على بت SUID المعين، فسوف يعمل مع صلاحيات الجذر، ويمكننا الحصول على الوصول إلى shell الجذر من خلال وضعه التفاعلي.
الأوامر
$ nmap --interactive # يشغل nmap في الوضع التفاعلي
nmap>!sh # يمكنك من الهروب إلى shell النظام من shell nmap
التدابير الوقائية
يجب عدم تعيين بت SUID لأي برنامج يتيح لك الهروب إلى shell.
يجب ألا تقوم أبدًا بتعيين بت SUID على أي محرر ملفات أو Compiler or interpreter، حيث يمكن للمهاجم قراءة أو كتابة أي ملفات موجودة على النظام بسهولة.
4.استغلال حقوق SUDO/المستخدم
إذا لم يتمكن المهاجم من الحصول على وصول جذر مباشرةً عبر أي تقنيات أخرى، فقد يحاول اختراق أي من المستخدمين الذين لديهم وصول SUDO. بمجرد أن يحصل على الوصول إلى أي من مستخدمي SUDO، يمكنه تنفيذ أي أوامر بصلاحيات الجذر.
غالبًا ما يسمح المسؤولون للمستخدمين بتشغيل عدد قليل من الأوامر من خلال SUDO وليس جميعها، ولكن حتى مع هذا التكوين، قد يقدمون ثغرات دون علمهم، مما يمكن أن يؤدي إلى تصعيد الامتيازات.
مثال كلاسيكي
مثال كلاسيكي على ذلك هو منح حقوق SUDO لأمر find
حتى يتمكن مستخدم آخر من البحث عن ملفات/سجلات معينة في النظام. في حين أن المسؤول قد يكون غير مدرك أن أمر find
يحتوي على معلمات لتنفيذ الأوامر، يمكن للمهاجم تنفيذ الأوامر بصلاحيات الجذر.
استغلال حقوق SUDO غير المهيأة للحصول على وصول جذر
التحقق من الأوامر المسموح بها:
sudo -l
سيظهر الأوامر التي يمكننا تشغيلها كـ SUDO.
يمكننا تشغيل find
و cat
و python
كـ SUDO. جميع هذه الأوامر ستعمل كـ root عند تشغيلها مع SUDO. إذا تمكنا بطريقة ما من الهروب إلى الصدفة من خلال أي من هذه الأوامر، يمكننا الحصول على صلاحيات root.
$ sudo find /home -exec sh -i \;
– يمكن استخدام معامل exec في أمر find
لتنفيذ تعليمات برمجية عشوائية.
لا تعطي صلاحيات SUDO لأي من Compiler لغات البرمجة أو interpreters أو المحررات.
يمكن تطبيق هذه التقنية أيضًا على vi
و more
و less
و perl
و ruby
و gdb
وغيرها.
$ sudo python -c ‘import pty; pty.spawn(“/bin/bash”);’
– يقوم بإنشاء terminal جديدة.
التدابير الوقائية
لا تعطي صلاحيات SUDO لأي برنامج يتيح لك الهروب إلى الصدفة.
لا تعطي صلاحيات SUDO لـ vi
و more
و less
و nmap
و perl
و ruby
و python
و gdb
وغيرها.
5.استغلال وظائف Cron المكونة بشكل سيئ
وظائف Cron، إذا لم يتم تكوينها بشكل صحيح، يمكن استغلالها للحصول على صلاحيات الجذر.
هل هناك أي سكربتات أو ملفات ثنائية في وظائف cron يمكن الكتابة عليها؟
هل يمكننا الكتابة فوق ملف cron نفسه؟
هل دليل cron.d
قابل للكتابة؟
وظائف cron تعمل عادةً بصلاحيات الجذر. إذا تمكنا من العبث بأي سكربت أو ملف ثنائي تم تعريفه في وظائف cron، يمكننا تنفيذ كود تعسفي بصلاحيات الجذر.
استغلال وظائف cron المكونة بشكل سيئ للحصول على وصول الجذر
$ ls -la /etc/cron.d
— يعرض وظائف cron الموجودة بالفعل في cron.d
.
$ find / -perm -2 -type f 2>/dev/null
— يقوم بطباعة الملفات القابلة للكتابة من قبل الجميع.
$ ls -la /usr/local/sbin/cron-logrotate.sh
— لنؤكد إذا كانت cron-logrotate.sh
قابلة للكتابة من قبل الجميع.
cron-logrotate.sh قابلة للكتابة من قبل الجميع، ويتم تشغيلها بواسطة مهمة cron الخاصة بـ logrotate. أي أمر نكتبه/نضيفه في cron-logrotate.sh سيتم تنفيذه كـ ‘root’.
نقوم بكتابة ملف C في دليل /tmp ونقوم compiled.
الملف القابل للتنفيذ rootme سيقوم بإطلاق shell.
$ ls -la rootme # يُظهر أن الملف مملوك من قبل المستخدم 'SHayslett'.
$ echo “chown root:root /tmp/rootme; chmod u+s /tmp/rootme;” > /usr/local/sbin/cron-logrotate.sh
#هذا سيغير مالك المجموعة للملف القابل للتنفيذ rootme إلى root. كما سيقوم أيضًا بتعيين SUID bit.
$ ls -la rootme # بعد 5 دقائق، تم تشغيل cronjob الخاص بـ logrotate وتم تنفيذ cron-logrotate.sh بصلاحيات الجذر.
$ ./rootme # يطلق shell بصلاحيات الجذر.
التدابير الوقائية
أي سكريبتات أو ثنائيات معرفة في cron jobs يجب ألا تكون قابلة للكتابة.
ملف cron يجب ألا يكون قابلاً للكتابة من قبل أي شخص باستثناء الجذر.
يجب ألا يكون دليل cron.d قابلاً للكتابة من قبل أي شخص باستثناء الجذر.
6.استغلال المستخدمين الذين لديهم ‘.’ في مسارهم
وجود ‘.’ في مسارك يعني أن المستخدم قادر على تنفيذ الثنائيات/السكريبتات من الدليل الحالي. لتجنب الحاجة إلى إدخال حرفين إضافيين في كل مرة، يقوم المستخدم بإضافة ‘.’ إلى مساره. هذه يمكن أن تكون وسيلة ممتازة للمهاجم لتصعيد امتيازه.
لنفترض أن سوزان هي مديرة وتضيف ‘.’ إلى مسارها حتى لا تضطر لكتابة الحرفين مرة أخرى.
مع ‘.’ في المسار – البرنامج
بدون ‘.’ في المسار – ./program
يحدث هذا لأن لينوكس يبحث أولاً عن البرنامج في الدليل الحالي عندما يتم إضافة ‘.’ في بداية المسار، ثم يبحث في أي مكان آخر.
مستخدم آخر “رشيد” علم أن سوزان قد أضافت ‘.’ في مسارها لأنها كسولة.
أخبر رشيد سوزان أن أمر ‘ls’ لا يعمل في دليلها.
رشيد يضيف كودًا في دليله يغير ملف sudoers ويجعله مديرًا.
يخزن رشيد هذا الكود في ملف باسم ‘ls’ ويجعله قابلاً للتنفيذ.
سوزان تمتلك امتيازات الجذر. تأتي وتنفذ أمر ‘ls’ في دليل رشيد.
بدلاً من أمر ‘ls’ الأصلي، يتم تنفيذ الكود الخبيث بامتيازات الجذر.
داخل الملف المحفوظ باسم ‘ls’، تم إضافة كود سيقوم بطباعة “Hello world”.
$ PATH=.:${PATH} # يضيف '.' إلى متغير PATH.
$ ls #ينفذ ملف ./ls بدلاً من تشغيل أمر قائمة الملفات.
الآن، إذا نفذ مستخدم الجذر الكود بامتيازات الجذر، يمكننا تحقيق تنفيذ كود تعسفي بامتيازات الجذر.
هنا نختتم هجوم تصعيد الامتياز الناجح على أي أنظمة قائمة على لينكس. الآن تعرف كيف يمكن للمهاجمين استغلال تقنيات معينة لزيادة امتيازاتهم، والتي يمكن أن تُستخدم لاحقًا لحماية أنظمتك وتطبيقاتك من التطفل والهجمات.
المراجع
https://sushant747.gitbooks.io/total-oscp-guide/content/privilege_escalation_-_linux.html