سؤال

كيف يمكن كشف يجري في chroot السجن دون امتيازات الجذر?نفترض القياسية BSD أو نظام لينكس.أفضل ما توصلت إليه هو أن ننظر إلى inode قيمة "/" والنظر في ما إذا كان من منخفضة إلى حد معقول ، ولكن أود طريقة أكثر دقة للكشف.

[edit 20080916 142430 EST] ببساطة تبحث حول الملفات ليست كافية ، كما أنه ليس من الصعب تكرار الأشياء مثل /التمهيد /dev لخداع سجن المستخدم.

[edit 20080916 142950 EST] لأنظمة لينكس, التحقق من قيم غير متوقعة داخل /proc هو معقول ، ولكن ماذا عن الأنظمة التي لا تدعم /proc في المقام الأول ؟

هل كانت مفيدة؟

المحلول

على inode ل / سوف تكون دائما 2 إذا كان الدليل الجذر من الملفات ، ولكن قد يكون chrooted داخل استكمال الملفات.لو كان مجرد chroot (وليس بعض الافتراضية الأخرى), هل يمكن تشغيل جبل ومقارنة التي شنت ضد نظام الملفات ما ترى.تحقق من أن كل نقطة تحميل inode 2.

نصائح أخرى

إذا كنت لا chroot ، inode ل / سوف تكون دائما 2.يمكنك التحقق من ذلك باستخدام

stat -c %i /

أو

ls -id /

إينتيريستينج ، ولكن دعونا في محاولة لايجاد طريق chroot الدليل.نسأل stat على الجهاز الذي / هو:

stat -c %04D /

البايت الأول هو الرئيسي من الجهاز خوفا من البايت طفيفة.على سبيل المثال ، 0802, يعني الكبرى 8, ثانوية 1.إذا قمت بالتدقيق في /dev, سوف نرى هذا الجهاز /dev/sda2.إذا كنت الجذر يمكنك إنشاء مباشرة correspondong جهاز في chroot:

mknode /tmp/root_dev b 8 1

الآن, دعونا العثور على inode المرتبطة لدينا chroot.debugfs يسمح قائمة محتويات الملفات باستخدام inode الأرقام.على سبيل المثال ، ls -id / عاد 923960:

sudo debugfs /tmp/root_dev -R 'ls <923960>'
 923960  (12) .       915821  (32) ..     5636100  (12) var   
5636319  (12) lib    5636322  (12) usr    5636345  (12) tmp   
5636346  (12) sys    5636347  (12) sbin   5636348  (12) run   
5636349  (12) root   5636350  (12) proc   5636351  (12) mnt   
5636352  (12) home   5636353  (12) dev    5636354  (12) boot   
5636355  (12) bin    5636356  (12) etc    5638152  (16) selinux   
5769366  (12) srv    5769367  (12) opt    5769375  (3832) media 

معلومات مثيرة للاهتمام هو inode من .. دخول:915821.يمكنني أن أطلب من محتواه:

sudo debugfs /tmp/root_dev -R 'ls <915821>'
915821  (12) .              2  (12) ..    923960  (20) debian-jail   
923961  (4052) other-jail  

دليل يسمى debian-jail وقد inode 923960.حتى آخر عنصر من chroot dir debian-jail.دعونا نرى الدليل الأصل (inode 2) الآن:

sudo debugfs /tmp/root_dev -R 'ls <2>'
      2  (12) .           2  (12) ..          11  (20) lost+found    1046529  (12) home   
 130817  (12) etc    784897  (16) media     3603  (20) initrd.img   
 261633  (12) var    654081  (12) usr     392449  (12) sys            392450  (12) lib   
 784898  (12) root   915715  (12) sbin   1046530  (12) tmp   
1046531  (12) bin    784899  (12) dev     392451  (12) mnt   
 915716  (12) run        12  (12) proc   1046532  (12) boot               13  (16) lib64   
 784945  (12) srv    915821  (12) opt       3604  (3796) vmlinuz 

دليل يسمى opt وقد inode 915821 و inode 2 جذر نظام الملفات.لذا chroot الدليل /opt/debian-jail.بالتأكيد ، /dev/sda1 قد تكون محمولة على آخر الملفات.تحتاج إلى التحقق من أن (استخدام lsof أو مباشرة التقاط المعلومات /proc).

على لينكس مع أذونات الجذر, اختبار ما إذا كان الدليل الجذر من عملية التهيئة هو الدليل الجذر الخاص بك.على الرغم من أن /proc/1/root دائما ارتباط رمزي إلى /, عقب ذلك يؤدي إلى "سيد" الدليل الجذر (على افتراض التهيئة العملية ليست chrooted ، ولكن هذا لا يكاد أي وقت مضى القيام به).إذا /proc لا يعلو, يمكنك الرهان كنت في chroot.

[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]
# With ash/bash/ksh/zsh
! [ -x /proc/1/root/. ] || [ /proc/1/root/. -ef / ]

هذا هو أكثر دقة من تبحث في /proc/1/exe لأن ذلك يمكن أن تكون مختلفة خارج chroot إذا init تمت ترقية منذ آخر التمهيد أو إذا كان chroot على الجذر الرئيسي الملفات ، init من الصعب ربط في ذلك.

إذا لم يكن لديك أذونات الجذر, يمكنك أن تبحث في /proc/1/mountinfo و /proc/$$/mountinfo (بإيجاز موثقة في filesystems/proc.txt في نواة لينكس الوثائق).هذا الملف هو العالم للقراءة و يحتوي على الكثير من المعلومات حول كل نقطة التحميل في عملية عرض الملفات.المسارات في هذا الملف هي مقيدة chroot التي تؤثر على القارئ عملية ، إن وجدت.إن عملية القراءة /proc/1/mountinfo هو chrooted في نظام ملفات مختلف من الجذر (على افتراض pid 1 الجذر العالمية الجذر) ، ثم لا دخول / يظهر في /proc/1/mountinfo.إن عملية القراءة /proc/1/mountinfo هو chrooted إلى دليل على عالمية الملفات الجذر ، ثم إدخال / يظهر في /proc/1/mountinfo, ولكن مع اختلاف في جبل الهوية.بالمناسبة, جذر المجال ($4) إلى حيث chroot في ماجستير الملفات.مرة أخرى, هذا هو تحديدا إلى لينكس.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

منع مثل هذه الاشياء هو بيت القصيد.إذا كان لديك التعليمات البرمجية التي من المفترض أن تعمل في chroot ، يكون ذلك تعيين إشارة على بدء التشغيل.إذا كنت القرصنة, هاك:تحقق من العديد من الأشياء المشتركة في مواقع معروفة ، عدد الملفات في /etc شيء في /dev.

على أنظمة BSD (تحقق مع uname -a), proc يجب أن تكون حاضرة دائما.تحقق مما إذا كان dev/inode زوج /proc/1/exe (استخدام القانون الأساسي على أن الطريق لن اتبع الارتباط الرمزي من خلال النص ولكن قبل الكامنة هوك) مباريات /sbin/init.

التحقق من الجذر inode #2 هو أيضا فكرة جيدة.

في معظم الأنظمة الأخرى ، الجذر يمكن المستخدم من معرفة أسرع بكثير من محاولة fchdir الجذر كسر خدعة.إذا كان يذهب في أي مكان كنت في chroot السجن.

أعتقد أن ذلك يعتمد لماذا قد يكون في chroot ، وما إذا كان أي جهد قد ذهب إلى تمويه ذلك.

أنا أدقق /proc هذه الملفات يتم إنشاؤها تلقائيا نظام ملفات المعلومات.نواة سيتم ملء هذه في جذر نظام الملفات ، ولكن من الممكن أنها لم تكن موجودة في chroot الملفات.

إذا كان نظام الملفات الجذر هو /proc كان لا بد أن /proc في chroot ، فمن المحتمل أن هناك بعض التناقضات بين هذه المعلومات و chroot البيئة.الاختيار /proc/يتصاعد على سبيل المثال.

Similrarly ، حدد /sys.

إذا دخلت chroot مع schroot, ثم يمكنك التحقق من قيمتها debian_chroot.

أردت نفس المعلومات السجن يعمل على فري (كما Ansible لا يبدو أن الكشف عن هذا السيناريو).

على FreeNAS توزيع فري 11, /proc هي التي شنت على المضيف ، وإنما هو داخل السجن.ما إذا كان هذا ينطبق أيضا على العادية فري أنا لا أعرف على وجه اليقين ، ولكن procfs:ذهب لكن لا تنسى يبدو أن تشير إلى ذلك.وفي كلتا الحالتين, ربما كنت لا تريد أن تجرب تركيب فقط للكشف عن السجن ووضع لذلك لست متأكد من أنها يمكن أن تستخدم على أنها موثوقة مؤشرا يجري داخل السجن.

كما استبعد استخدام القانون الأساسي على / بالتأكيد على FreeNAS جميع السجون تعطى الخاصة بهم نظام الملفات (أي ZFS dataset) وبالتالي فإن / عقدة على المضيف في السجن كلاهما inode 4.أتوقع هذا هو شائع على فري 11 في العام.

وبالتالي فإن النهج أنا استقر على استخدام procstat على pid 0.

[root@host ~]# procstat 0
  PID  PPID  PGID   SID  TSID THR LOGIN    WCHAN     EMUL          COMM        
    0     0     0     0     0 1234 -        swapin    -             kernel      
[root@host ~]# echo $?
0
[root@host ~]# jexec guest tcsh
root@guest:/ # procstat 0
procstat: sysctl(kern.proc): No such process
procstat: procstat_getprocs()
root@guest:/ # echo $?
1

وأنا على صنع الافتراض هنا أن pid 0 وسوف يكون دائما النواة على المضيف ، و لن يكون هناك pid 0 داخل السجن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top