chroot介绍
通常来说,提到chroot一般有两个含义,chroot(1)是/usr/bin/chroot,要有一定权限才能使用chroot, chroot(2)是glibc中的一个函数,属于系统调用
chroot(1)
chroot - run command or interactive shell with special root directory 一个命令行工具,可用于创建沙箱shell,用于交互式 shell 或命令的文件系统隔离
1 | chroot [OPTION] NEWROOT [COMMAND [ARG]…] |
影响范围:只限于执行 chroot
后启动的进程以及它们的子进程。例如,如果你在一个 shell 中执行 chroot /my/new/root /bin/bash
,那么这个新启动的 Bash shell和它的子进程会在 /my/new/root
作为根目录的环境下运行。
不影响其他 shell:其他已经存在的 shell,或者你之后在原始环境中启动的 shell,都不受 chroot
的影响,它们仍然使用原来的根目录。
chroot(2)
chroot - change root directory 用于编程接口下的根目录更改
1 | int chroot(const char *path); |
chroot的主要功能就是改变根目录
看起来很鸡肋,但是当你的电脑被入侵,而对方入侵的是你的chroot环境,那么他使用cd../就永远跳不出来,比如将chroot设置为/tmp/jail,他就只能到达/tmp/jail,不能到达真正的root位置,这样入侵者就只能在特定的文件里运行,将伤害限制在chroot沙盒
但是要注意使用,一般在测试的时候(也就是设置正确的时候)你能独立的操作chroot空间,也能很轻松的退出来。但如果设置错误(没有使用chdir”/“),你的真实根目录就会完全变成chroot的根目录,但是能使用cd退出去 cd../../
chroot使用及注意事项
1 | sudo chroot /tmp/jail /bin/bash |
这样执行后会运行错误,因为chroot目录里没有库,可以说,它什么也没有
chroot
目录最初的状态:
没有系统工具:在
chroot
环境中最初是没有bash
、ls
、cat
等常用工具的,除非你手动将它们复制进去。没有库文件:任何程序在运行时所需的库文件也不会自动存在,必须手动添加。即使你将
/bin/bash
复制到chroot
目录中,仍然需要手动复制与之相关的依赖库。没有配置文件:
/etc/passwd
、/etc/group
、/etc/hosts
等系统配置文件也不会存在,需要手动配置或复制。目录结构:你需要手动创建或复制常见的目录结构,如
/bin
、/lib
、/etc
、/home
、dev
等,以使chroot
环境类似于一个完整的系统。
虽然 chroot
在用户空间内,但文件系统隔离
尽管 chroot
环境位于用户空间,它的工作原理是通过文件系统的隔离机制,给进程提供一个新的文件系统视图。在默认情况下,Linux 的文件系统是全局共享的,任何进程都可以访问 /bin
、/usr
等目录。然而,通过 chroot
,你可以将某个进程的文件系统访问限制在一个特定的目录下,防止其访问全局的系统资源
在这种情况下,可以安装busybox
BusyBox 是一个集成了一百多个最常用Linux 命令和工具(如 cat 、 echo 、 grep 、 mount 、 telnet 等)的精简工具箱,将它装入chroot目录即可正常执行命令
jailkit——将攻击者关进chroot jail
https://olivier.sessink.nl/jailkit/
Jailkit 是一套实用程序,用于增强 chroot jails 的可能性。Jailkit 包含一组工具和配置文件,用于自动部署 chroot jails。Jailkit 还包含各种工具,用于将用户帐户限制为特定文件或特定命令,这些工具可通过配置文件进行配置。设置 chroot shell、限制为某些特定命令的 shell 或 chroot jail 内的守护进程要容易得多,并且可以使用这些实用程序自动完成。
Jailkit 是一套专门为安全而开发的工具。如果配置、系统设置或环境不是 100% 安全,它将以安全的方式中止,并向系统日志发送有用的日志消息来解释哪里出了问题。
Jailkit 是一款非常稳定的软件,拥有非常稳定和高质量的代码库。据悉,它被多家领先的 IT 安全公司的网络安全设备、多家大型企业的互联网服务器、互联网服务提供商的互联网服务器以及许多需要保护 cvs、sftp、shell 或守护进程的小型公司和私人用户所采用。
使用
1.安装
1 | sudo apt-get install jailkit |
- 创建 Jail 环境
使用 Jailkit 的 jk_init
命令来初始化 chroot jail
环境。创建一个目录作为新的根目录,并配置一些基础命令和工具。
1 | sudo mkdir /home/jail |
basicshell
是 Jailkit 提供的一组预定义的环境配置,它包括基本的 shell 工具,如ls
、cp
、mv
等,供用户在 jail 中使用。
- 将用户放入 Jail
使用 jk_jailuser
命令将用户 attacker
限制在 chroot jail
中:
1 | sudo jk_jailuser -m -j /home/jail attacker |
这会将 attacker
用户添加到 chroot jail
中,并确保该用户只能访问 jail 中的文件系统。
- 测试 Jail 环境
以用户 attacker
身份登录系统,检查是否被限制在 chroot jail
中:
1 | su - attacker |
- 登录成功后,用户会发现根目录
/
实际上是/home/jail
,且无法访问系统的其他文件。
扩展用法
- 以上方法是把攻击者关进新的环境,但如果攻击者一开始就偷偷进入系统并新建用户,还在自己的用户下留了恶意文件呢,如何不让攻击者发现自己被发现了
这个操作比较繁琐我就不一一写了,关键步骤就是新建一个home/jail/home/username(已存在用户)
,然后将原用户的文件都复制进去,相应的权限都要一一转移,并且要确保已存在用户对home/jail/home/username
操作的权限sudo chown -R existinguser:existinguser /home/jail/home/existinguser
- 如果在上面的步骤里不小心把自己的用户关进去了,如何释放
- 修改用户的登录 shell
当将用户放入 Jailkit 管理的 chroot jail
环境时,通常会将用户的默认 shell 设置为 jk_chrootsh
,jk_chrootsh
是 Jailkit 提供的一种特殊 shell,它能够在用户登录时,自动将该用户的根目录限制在指定的 chroot
环境中。要移出 jail,首先需要将用户的 shell 改回默认的 Bash 或其他常用 shell。
使用 chsh
(change shell)命令更改用户的 shell:
1 | sudo chsh -s /bin/bash username |
2**.快照**
在进行操作前对虚拟机拍摄快照,情况不对则一键还原)
逃逸
- chroot时存在已打开的资源:
对于../的拦截只局限于chroot中,在chroot外的文件不受它控制,所以,如果在使用chroot时正打开了一个文件,那么即使还在chroot内,chroot能用一些复杂的系统调用来利用这些之前被打开的文件,像linux里的open和execve的at变体,openat接受已被打开的资源文件描述符和一条以这个资源为起点的相对路径,所以可以执行一个相对于之前打开的文件的程序,最终这会使你逃离chroot环境。
当前的工作目录是一个隐式开放资源,因此,当恶意代码获得控制权时,你的工作目录如果不在chroot里,会有问题。
openat
和 **execveat
**:这些系统调用的变体允许使用一个打开的文件描述符作为基础来执行文件操作。例如:
openat(fd, "../outside_directory", O_RDONLY)
:可以通过fd
指向的目录路径访问chroot
之外的文件,前提是fd
指向的是chroot
外的资源。execveat(fd, "some_program", ...)
:可以从chroot
外部启动一个新的进程。chroot只能有一个
新chroot会覆盖旧chroot。如果你在chroot环境中拥有root权限,那么你可以设置一个chroot(chroot只有特权用户能设置),用新设置的chroot覆盖之前的chroot)
- 使用
pivot_root()
pivot_root()
是一个特殊的系统调用,通常用于容器和虚拟化环境,允许进程更改其根文件系统。攻击者可以尝试使用 pivot_root()
将根目录切换到 chroot
之外的目录,从而彻底逃逸。
1 | int ret = pivot_root("/new_root", "/old_root"); // 切换根目录 |
- 未指定工作目录
如果进入 chroot
时没有更改工作目录,而当前的工作目录在 chroot
外,攻击者可以通过相对路径(如 ../
)导航回到 chroot
外部。工作目录是进程的一个隐式开放资源,如果未显式改变,仍然可以访问到 chroot
外的目录。
1 | cd ../ # 访问 chroot 之外的目录 |
- 可使用的工具:
chroot未隔离网络,使用网络下载工具然后脱离即可
https://github.com/earthquake/chw00t
chroot缺点
1.chroot不提供其他形式的隔离,比如进程id
echo $$
能打印当前shell的进程id
如果杀死了当前chroot shell的进程id,相当于杀死了当前chroot环境,就能退出了
2.chroot也不隔离网络,就算在chroot环境也能使用外面的网络,这意味着可以在chroot里下载你所需要的用来破解chroot的工具或环境
3.容易逃离,如果你是root用户且chroot调用没有被阻塞,就可以使用“覆盖”来逃离
4.chroot
并不是一个完全安全的隔离机制,因为它只隔离文件系统视图,不隔离文件描述符、工作目录、以及进程通信等系统资源。
restricted bash
https://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html
rbash限制以下操作:
禁止切换目录:用户无法使用
cd
命令更改当前工作目录。禁止修改****环境变量:用户不能设置或取消设置如
SHELL
、PATH
、HISTFILE
、ENV
等重要的环境变量。禁止执行带有斜杠的命令:无法使用包含斜杠的命令(如
/bin/ls
),避免用户绕过限制执行系统级命令。禁止输出重定向:
>
、>>
、&>
等重定向符号被禁用,防止用户修改文件或输出结果。禁止使用 **
exec
**:无法用exec
命令替换当前 shell,确保受限环境不会轻易被逃脱。不能关闭受限模式:用户不能通过
set +r
或其他方法禁用受限模式。
正常
1 | lili@lili-virtual-machine:~/Desktop/myshare$ cd .. |
开启rbash
1 | lili@lili-virtual-machine:~/Desktop/myshare$ rbash |
逃逸
1.新建另一个shell
rbash
禁止直接执行带有斜杠的命令(如 /bin/bash
),但是如果 bash
位于 PATH
目录中,用户可以直接运行 bash
或 sh
来启动一个新的、不受限制的 shell。
PATH
目录的位置
PATH
变量中的每个目录都用冒号(:
)分隔,系统会按顺序在这些目录中查找可执行文件。常见的 PATH
目录如下:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
效果:
1 | ┌──(pwn㉿kali)-[/usr/bin] |
2.使用**vi,nano等编辑器逃脱**
vi
后,输入:!bash
,就可以新建一个bash,该bash无限制
1 | lili@lili-virtual-machine:~/Desktop/myshare$ cd .. |
3.SSH 远程命令执行
通过 SSH 连接到服务器并直接执行一个新命令,而不会进入 rbash
。例如,使用 SSH 执行 bash
:
1 | ssh user@server bash |
4.使用编程语言
直接执行无法执行,但是可以使用python之类的编辑器来执行文件,test.py文件内容为print("exe a file")
1 | ┌──(pwn㉿kali)-[~/桌面/shellcode] |
执行bash
1 | python -c 'import os; os.system("/bin/bash")' |
效果
1 | ┌──(pwn㉿kali)-[~/桌面/shellcode] |
chroot+rbasn
要点
chroot
创建隔离的文件系统
chroot
将用户的根目录限制在一个指定的文件系统,使得用户无法访问系统的其余部分。即使用户尝试访问 /
,实际上访问的也是 chroot jail
内部的文件
rbash
限制用户操作
rbash
(受限 Bash)进一步限制用户对文件系统和系统命令的操作,禁止更改目录、修改环境变量、使用重定向等。将用户的 shell 设置为 rbash
,可以防止用户在 chroot jail
中逃脱出来或执行非预期的操作。
防范措施(反逃逸)
基本上就是和前面的“逃逸”反着来,能使用python就禁用python,能使用编辑器就禁用编辑器
参考资料
pwn.college - Sandboxing - chroot