linux提权系列28:冲破母体2

admin 2023年4月23日22:23:35评论96 views字数 2503阅读8分20秒阅读模式

这部分是上一篇文章的延续,将继续探索 docker 宿主机中更多的底层错误配置,以及如何利用它们来获取 root 用户 shell

底层容器runtime

在本实验中,会发现没有安装 docker,但安装了runc 。基本上 runc 是一个使用 OCI 规范(存储在 JSON 文件中)的容器创建和运行工具。早期采用容器化的旧系统中会安装 runc

linux提权系列28:冲破母体2

那么就在当前目录下创建OCI规范的配置,并配置挂载,使得宿主机根目录绑定挂载到容器根目录且有读写权限。

{
 "destination""/",
 "source""/",
 "type""bind",
 "options": ["rbind""rw"]
}

在配置中使用了 rbind 选项以允许递归地将所有子项绑定到容器中,并使用 rw 选项以允许对系统的读写权限。

一旦配置绑定挂载,在工作目录中创建“rootfs”目录,因为容器将使用该目录。

linux提权系列28:冲破母体2

现在只需执行runc run <name>即可运行容器,它将生成 root 用户 shell。从这里可以检索flag文件或系统的后门

linux提权系列28:冲破母体2

滥用组成员资格

默认情况下,docker 运行其 Unixsocket,并且该socket的用户是root,组是docker。这个socket文件可以在/run/docker.sock中找到

如果当前用户在docker组中,那么可以与 docker 守护进程通信,因为socket文件中的组具有读写权限。

linux提权系列28:冲破母体2

如果不确定,请使用docker images检查当前登录用户是否可以与 Docker 守护进程通信。成功的响应将至少有列名,如果失败,将收到类似“permission denied while trying to connect to the Docker daemon socket”的错误

linux提权系列28:冲破母体2

使用 bind-mount 配置运行 docker 容器并使用镜像modified-ubuntu:latest。会发现它正在运行一个 SSH 服务器,因为这是在容器入口点配置的。要覆盖容器的容器入口点,可以通过将--entrypoint /path/to/new/entrypoint参数传递给容器创建或运行命令来实现

linux提权系列28:冲破母体2

在这种情况下,不要通过 chroot 提权。可以看到 sudo 已安装。因此,为student用户配置 sudo 以在没有任何密码的情况下以任何用户或组的身份运行任何命令。为此,需要在文件中添加以下配置

student ALL=(ALL:ALL) NOPASSWD: ALL

将以上行附加到/etc/sudoers文件中,这是 sudo 命令的主要配置文件,并通过使用tail命令列出最后 10 行来验证它

linux提权系列28:冲破母体2

现在关闭容器并使用sudo -l命令检查当前用户的 sudo 权限。会发现student用户现在可以以 root 用户身份运行命令。要升级到 root 用户,只需使用 sudo – 执行切换用户命令sudo su -l root。这将执行 root 用户登录并进入 root 的主目录 ( /root )

linux提权系列28:冲破母体2

利用 Containerd

在本实验和下一个实验中,将了解另一种管理容器的工具,即containerd及其客户端ctr。正如在容器架构系列开始时讲述的那样,docker 不仅是市场上可用的容器技术,还有其他容器技术。

linux提权系列28:冲破母体2

在本实验中,containerd 服务正在运行,它在本地存储库中有两个镜像。使用第一个 modified-alpine:latest

linux提权系列28:冲破母体2

所有内容都与 docker 相同,但在这,必须详细定义挂载配置。mount的参数如下所述

  • type – 您要执行的挂载类型(此处为bind)
  • src – 挂载源(一般在主机上)
  • dst – 挂载的目的地(通常在容器上)
ctr run --rm  
 --mount type=bind,src=/,dst=/,options=rbind:ro 
 registry:5000/modified-alpine:latest  
 exploit  
 bash -c "whoami;id"

通常,当容器以 root 身份运行时,它只有一个组,即用户本身(root)。在这种情况下,当执行上面的命令时,它会向你显示 root 用户,其中有很多组。这意味着您已经在 root 主机上,不需要 chroot。这是因为已经把宿主机的根挂载到容器的根上了

linux提权系列28:冲破母体2

由于 sudo 已经安装在主机上,将student用户添加到 sudoers 文件中,这样它就可以以任何用户身份运行任何命令,而不会提示输入密码。可以通过执行以下命令来执行此操作

ctr run --rm  
 --mount type=bind,src=/,dst=/,options=rbind:rw  
 registry:5000/modified-alpine:latest  
 exploit  
 bash -c "echo 'student ALL=NOPASSWD: ALL' | tee -a /etc/sudoers"

现在可以使用 sudo 将用户切换为 root 用户。这将直接登录并进入 root 用户的主目录。

linux提权系列28:冲破母体2

利用 Containerd II

在本实验中,不会专注于实际获取 root 用户 shell,因为该flag保存在正在运行的进程的内存中,需要从那里自行转储它。

出于安全原因,只能通过特权用户或当前用户具有 CAP_SYS_PTRACE 能力来执行读取操作。那么通过ctr快速为student用户添加sudo配置,让它不用输入密码就可以以任何用户的身份执行任何命令。

linux提权系列28:冲破母体2

在实验室的描述中,它提到“检索存储在主机系统上运行的flag-holder进程的内存中的flag!”。已经在主机系统上,但没有 root 用户权限。

linux提权系列28:冲破母体2

通过简单的 Google 搜索,发现实际上可以使用 gcore 通过提及其 PID 和输出文件来转储正在运行的进程的内存。如果程序异常终止,系统会创建一个core文件来存储终止进程的内存映像。gcore产生的一个core文件等同于进程崩溃时内核产生的一个文件

转储文件后,可以使用stringsgrep 在转储中查找标志(如下所示)

linux提权系列28:冲破母体2

请点一下右下角的“在看”,谢谢!!

请帮忙点赞, 谢谢!!

请帮忙转发,谢谢!!

暗号: 947985


原文始发于微信公众号(奶牛安全):linux提权系列28:冲破母体2

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月23日22:23:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   linux提权系列28:冲破母体2http://cn-sec.com/archives/1688001.html

发表评论

匿名网友 填写信息