الكشف عن chroot من داخل السجن
سؤال
كيف يمكن كشف يجري في 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 داخل السجن.