linux提权系列25: [训练营]docker逃逸1
2023-4-19 08:32:29 Author: 奶牛安全(查看原文) 阅读量:32 收藏

到目前为止,已经了解了 Docker 是什么以及它是如何工作的。由于已经看到它创建了在应用程序级别隔离的容器,这意味着两个容器彼此不认识,但 docker 本身作为附加实用程序在主机系统上运行。此外,容器生成的进程是 docker  OCI 服务的子进程。虽然这里使用 docker 是因为它变得流行,但这些技术适用于所有容器管理器

挂载Docker 套接字

有时为了省事,系统管理员和开发人员将 docker socket 挂载到容器中以调试应用程序,例如从容器内部读取其日志。

这是一个严重的问题,因为一旦容器被攻陷,攻击者可以使用 docker 命令或通过 Unix Domain Socket 交互的库来突破容器环境。

一个 docker socket挂载到/var/run/docker.sock并且作为容器中的 root 用户可以对其执行读/写操作

让人惊喜的是,Docker CLI 已安装,默认情况下,它使用socketruntime交互。由于这个socket是关联宿主机的,可以通过它直接与 docker runtime对话。这是通过在 docker 本地存储库中列出镜像来验证的

要逃逸出去,需要通过将宿主机的 / 挂载到容器中的 /host 来启动一个新的 docker 容器。这将解析参数并将它们发送到 Docker runtime。因此,在这里选择的冒号 左侧的任何路径都将是主机上的路径

容器执行完成后,可以chroot/host目录下,执行find命令查找flag

特权容器

在本实验中,docker 容器以特权模式运行。正如在上一篇文章中所意识到的那样,特权容器是一个巨大的威胁。将在本实验中看到它的实际应用。

特权容器几乎可以拥有 Linux 内核中的所有功能,并且它运行在主机操作系统层而不是 docker runtime。在本实验中,容器具有 cap_sys_admin 功能,这意味着可以挂载分区

检查fdisk -l命令的输出后,会发现/dev/sda分区存在。现在可以将其挂载到 /mnt 并打开容器

要挂载设备,需要在设备名称后跟挂载路径。因此,如果要将/dev/sda挂载到/mnt,则命令为mount /dev/sda /mnt。稍后可以执行 chroot /mnt

特权容器 II

使用从之前的实验中获得的知识并尝试突破这个容器。chroot 技巧有效,但 /proc 文件系统没有被挂载。有一个挂载 proc ( mount -t proc proc /proc) 的黑科技,但这将挂载容器的 proc

根据描述,该flag存储在宿主机的 /proc 文件系统的进程。枚举之后会发现宿主机上有两个端口是开放的。主机的 IP 始终是172.17.0.1. 在这个容器中,没有安装Nmap,但是可以找到netcat命令,用它来进行端口扫描

查看当前网络状态后,可以看到宿主机192.110.119.2连接上容器的22端口。

在特征扫描中,会发现 2222 端口也运行着 SSH 服务器。这可能是来自宿主机

但当chroot到宿主机文件系统,修改root用户的密码,用root用户进行SSH登录时,会因为远程root登录被禁用而失败

可以通过创建用户、设置密码然后使用它执行登录来绕过此问题。这次一定会成功。

现在有了主机的 proc 文件系统,你可以读取进程列表中的标志

这个关于 Linux 权限提升的系列,需要超越仅检索flag的阶段,并尝试完全拥有 root 。发现主机中安装了sudo。因此,可以做的是,允许低权限用户(在本例中为 john)以任何用户身份运行所有命令的所有权限。NOPASSWD在这种情况下不需要选择该选项,因为您已经在前面的步骤中进行了设置

登录到 john 用户的 SSH 会话并执行sudo -l. 这次将拥有以 root 用户身份运行的所有权限。用于sudo su生成 root 用户 shell

进程注入

进程注入是一个非常有趣的话题,因为它允许一个进程写入另一个进程的内存并执行 shellcode。但并非所有进程都可以读取或写入另一个进程的内存

  1. 进程的 EUID 为 0(又名特权进程)
  2. 程序文件具有 CAP_SYS_PTRACE 能力来调试进程

进程注入本身是一个非常广泛的主题,现在不会深入探讨它。在本实验中,会发现宿主机的 PID 命名空间映射进容器里。这意味着可以直接在主机上创建进程,也可以枚举正在运行的进程

通常,在普通容器中,不会具有 cap_sys_ptrace 功能,但在这种情况下,容器创建者已明确启用此功能。这意味着容器中启动的任何进程都可以调试进程并在对进程的内存执行读写操作

在其他正在运行的进程中,整理出 python 进程,因为如果要注入到另一个进程,并且万一失败,那么它会使目标进程崩溃,并且可能导致异常行为,可能会阻止进一步利用系统。所以为了安全起见,选择使用 pythonnginx 服务器等进程

现在需要在实验室中下载漏洞利用程序和 shellcode,并使用 gcc 对其进行编译。

  1. 找到目标架构的shellcode,比如 https://www.exploit-db.com/exploits/41128
  2. 找到一个将shellcode注入进程内存的程序, 比如https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c
  3. 修改程序内部的shellcode并编译gcc exploit.c -o exploit

上面的漏洞已经在端口 5600 上启动了一个绑定 shell。可以使用 netcat 连接到它并读取flag。由于这个过程是在宿主机上启动的,所以需要通过宿主机docker接口的IP进行连接——nc 172.17.0.1 5600


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247489228&idx=1&sn=7f6513f04f8d83e664dc68fc39244cac&chksm=fdf97dd9ca8ef4cf94355672e63f6986aae6bca1f6c6d6b193c54886edb9d4672023def10769#rd
如有侵权请联系:admin#unsafe.sh