当前位置:  开发笔记 > 运维 > 正文

从内部探测chroot监狱

如何解决《从内部探测chroot监狱》经验,为你挑选了3个好方法。

如何在没有root权限的情况下检测到chroot监狱?假设标准的BSD或Linux系统.我想出的最好的方法是查看"/"的inode值并考虑它是否相当低,但我想要一种更准确的检测方法.

[edit 20080916 142430 EST] 简单地查看文件系统是不够的,因为复制诸如/ boot和/ dev之类的东西以欺骗被监禁的用户并不困难.

[edit 20080916 142950 EST] 对于Linux系统,在/ proc中检查意外值是合理的,但是那些首先不支持/ proc的系统呢?



1> user10392..:

如果它是文件系统的根目录,则/的inode将始终为2,但您可能在一个完整的文件系统中被chroot.如果它只是chroot(而不是其他一些虚拟化),你可以运行mount并将安装的文件系统与你看到的相比较.验证每个安装点是否具有inode 2.


出于好奇,什么得到inode 1?
对于每个文件系统都不是这样.例如,对于XFS,root具有inode 128.
坏块(历史/遗产)
在linux上,/ sys和/ proc都是inode == 1. devtmpfs是inode == 3.酷技巧但在"真实"文件系统上只能可靠.
IOW,`root_inode = $(stat -c%i /); if [$ root_inode -ne 2 -a $ root_inode -ne 128]; ...`

2> Jérôme Pouil..:

如果您不在chroot中,/的inode将始终为2.您可以检查使用

stat -c %i /

要么

ls -id /

Interresting,但让我们试着找到chroot目录的路径.询问stat位于哪个设备上:

stat -c %04D /

第一个字节是设备的主要字节,最小字节是次要的.例如,0802表示主要8,次要1.如果您检入/ dev,您将看到此设备是/ dev/sda2.如果您是root用户,可以直接在chroot中创建对应的设备:

mknode /tmp/root_dev b 8 1

现在,让我们找到与我们的chroot相关联的inode.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 

有趣的信息是..入门名称: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目录的最后一个组件是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).



3> Gilles 'SO- ..:

在具有root权限的Linux上,测试init进程的根目录是否是您的根目录。尽管/proc/1/root它始终是的符号链接/,但其后会指向“主”根目录(假设init进程未进行chroot,但几乎从未这样做)。如果/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更为精确,因为如果init从上次启动以来已升级chroot,或者如果chroot在主根文件系统上并且init在其中进行了硬链接,则在chroot 之外可能会有所不同。

如果您没有root权限,则可以查看/proc/1/mountinfo/proc/$$/mountinfo(简要记录在filesystems/proc.txtLinux内核文档中)。该文件是世界可读的文件,并且在文件系统的进程视图中包含许多有关每个安装点的信息。该文件中的路径受chroot限制,该chroot影响读取器进程(如果有)。如果将进程读取/proc/1/mountinfo更改为与全局根不同的文件系统(假设pid 1的根为全局根),则不会在其中/显示任何条目/proc/1/mountinfo。如果将进程读取/proc/1/mountinfo更改为全局根文件系统上的目录,则的条目将/出现在中/proc/1/mountinfo,但具有不同的装载ID。顺便说一下,根字段($4)表示chroot在其主文件系统中的位置。同样,这是特定于Linux的。

[ "$(awk '$5=="/" {print $1}' 

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有