linux沙箱之文件系统隔离
arch3rn4r

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
2
3
chroot [OPTION] NEWROOT [COMMAND [ARG]…]
sudo chroot /my/new/root /bin/bash
这将启动一个 Bash shell,并将 /my/new/root 作为新根目录。

影响范围:只限于执行 chroot 后启动的进程以及它们的子进程。例如,如果你在一个 shell 中执行 chroot /my/new/root /bin/bash,那么这个新启动的 Bash shell和它的子进程会在 /my/new/root 作为根目录的环境下运行。

不影响其他 shell:其他已经存在的 shell,或者你之后在原始环境中启动的 shell,都不受 chroot 的影响,它们仍然使用原来的根目录。

chroot(2)
chroot - change root directory 用于编程接口下的根目录更改

1
2
3
int chroot(const char *path);
path:要作为新根目录的路径。
返回值:成功返回 0,失败返回 -1,并设置 errno 来指示错误类型。

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 目录最初的状态:

  1. 没有系统工具:在 chroot 环境中最初是没有 bashlscat 等常用工具的,除非你手动将它们复制进去。

  2. 没有库文件:任何程序在运行时所需的库文件也不会自动存在,必须手动添加。即使你将 /bin/bash 复制到 chroot 目录中,仍然需要手动复制与之相关的依赖库。

  3. 没有配置文件:/etc/passwd/etc/group/etc/hosts 等系统配置文件也不会存在,需要手动配置或复制。

  4. 目录结构:你需要手动创建或复制常见的目录结构,如 /bin/lib/etc/homedev 等,以使 chroot 环境类似于一个完整的系统。

虽然 chroot 在用户空间内,但文件系统隔离

尽管 chroot 环境位于用户空间,它的工作原理是通过文件系统的隔离机制,给进程提供一个新的文件系统视图。在默认情况下,Linux 的文件系统是全局共享的,任何进程都可以访问 /bin/usr 等目录。然而,通过 chroot,你可以将某个进程的文件系统访问限制在一个特定的目录下,防止其访问全局的系统资源

在这种情况下,可以安装busybox

https://www.busybox.net/

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
  1. 创建 Jail 环境

使用 Jailkit 的 jk_init 命令来初始化 chroot jail 环境。创建一个目录作为新的根目录,并配置一些基础命令和工具。

1
2
sudo mkdir /home/jail
sudo jk_init -v /home/jail basicshell
  • basicshell 是 Jailkit 提供的一组预定义的环境配置,它包括基本的 shell 工具,如 lscpmv 等,供用户在 jail 中使用。
  1. 将用户放入 Jail

使用 jk_jailuser 命令将用户 attacker 限制在 chroot jail 中:

1
sudo jk_jailuser -m -j /home/jail attacker

这会将 attacker 用户添加到 chroot jail 中,并确保该用户只能访问 jail 中的文件系统。

  1. 测试 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

  • 如果在上面的步骤里不小心把自己的用户关进去了,如何释放
  1. 修改用户的登录 shell

当将用户放入 Jailkit 管理的 chroot jail 环境时,通常会将用户的默认 shell 设置为 jk_chrootshjk_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 命令更改当前工作目录。

禁止修改****环境变量:用户不能设置或取消设置如 SHELLPATHHISTFILEENV 等重要的环境变量。

禁止执行带有斜杠的命令:无法使用包含斜杠的命令(如 /bin/ls),避免用户绕过限制执行系统级命令。

禁止输出重定向>>>&> 等重定向符号被禁用,防止用户修改文件或输出结果。

禁止使用 **exec**:无法用 exec 命令替换当前 shell,确保受限环境不会轻易被逃脱。

不能关闭受限模式:用户不能通过 set +r 或其他方法禁用受限模式。

正常

1
2
lili@lili-virtual-machine:~/Desktop/myshare$ cd ..
lili@lili-virtual-machine:~/Desktop$

开启rbash

1
2
3
lili@lili-virtual-machine:~/Desktop/myshare$ rbash
lili@lili-virtual-machine:~/Desktop/myshare$ cd ..
rbash: cd: restricted

逃逸

1.新建另一个shell

rbash 禁止直接执行带有斜杠的命令(如 /bin/bash),但是如果 bash 位于 PATH 目录中,用户可以直接运行 bashsh 来启动一个新的、不受限制的 shell。

  • PATH 目录的位置

PATH 变量中的每个目录都用冒号(:)分隔,系统会按顺序在这些目录中查找可执行文件。常见的 PATH 目录如下:

/usr/local/sbin

/usr/local/bin

/usr/sbin

/usr/bin

/sbin

/bin

效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(pwn㉿kali)-[/usr/bin]
└─$ rbash
┌──(pwn㉿kali)-[/usr/bin]
└─$ cd ..
rbash: cd: 受限

┌──(pwn㉿kali)-[/usr/bin]
└─$ bash
┌──(pwn㉿kali)-[/usr/bin]
└─$ cd ..

┌──(pwn㉿kali)-[/usr]
└─$

2.使用**vi,nano等编辑器逃脱**

vi后,输入:!bash,就可以新建一个bash,该bash无限制

1
2
3
4
5
6
lili@lili-virtual-machine:~/Desktop/myshare$ cd ..
rbash: cd: restricted
lili@lili-virtual-machine:~/Desktop/myshare$ vi

lili@lili-virtual-machine:~/Desktop/myshare$ cd ..
lili@lili-virtual-machine:~/Desktop$

3.SSH 远程命令执行

通过 SSH 连接到服务器并直接执行一个新命令,而不会进入 rbash。例如,使用 SSH 执行 bash

1
ssh user@server bash

4.使用编程语言

直接执行无法执行,但是可以使用python之类的编辑器来执行文件,test.py文件内容为print("exe a file")

1
2
3
4
5
6
7
┌──(pwn㉿kali)-[~/桌面/shellcode]
└─$ ./test.py
rbash: ./test.py: 受限:无法在命令名中使用 "/"

┌──(pwn㉿kali)-[~/桌面/shellcode]
└─$ python test.py
exe a file

执行bash

1
python -c 'import os; os.system("/bin/bash")'

效果

1
2
3
4
5
6
7
8
9
10
11
┌──(pwn㉿kali)-[~/桌面/shellcode]
└─$ cd ..
rbash: cd: 受限

┌──(pwn㉿kali)-[~/桌面/shellcode]
└─$ python -c 'import os; os.system("/bin/bash")'
┌──(pwn㉿kali)-[~/桌面/shellcode]
└─$ cd ..

┌──(pwn㉿kali)-[~/桌面]
└─$

chroot+rbasn

要点

  • chroot 创建隔离的文件系统

chroot 将用户的根目录限制在一个指定的文件系统,使得用户无法访问系统的其余部分。即使用户尝试访问 /,实际上访问的也是 chroot jail 内部的文件

  • rbash 限制用户操作

rbash(受限 Bash)进一步限制用户对文件系统和系统命令的操作,禁止更改目录、修改环境变量、使用重定向等。将用户的 shell 设置为 rbash,可以防止用户在 chroot jail 中逃脱出来或执行非预期的操作。

防范措施(反逃逸)

基本上就是和前面的“逃逸”反着来,能使用python就禁用python,能使用编辑器就禁用编辑器

参考资料

pwn.college - Sandboxing - chroot

https://atum.li/2017/04/25/linuxsandbox/#chroot-jail

https://www.baeldung.com/linux/sandboxing-process

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 39.3k 访客数