到目前为止,已经了解了 Docker
是什么以及它是如何工作的。由于已经看到它创建了在应用程序级别隔离的容器,这意味着两个容器彼此不认识,但 docker
本身作为附加实用程序在主机系统上运行。此外,容器生成的进程是 docker
OCI
服务的子进程。虽然这里使用 docker 是因为它变得流行,但这些技术适用于所有容器管理器
有时为了省事,系统管理员和开发人员将 docker socket
挂载到容器中以调试应用程序,例如从容器内部读取其日志。
这是一个严重的问题,因为一旦容器被攻陷,攻击者可以使用 docker
命令或通过 Unix Domain Socket
交互的库来突破容器环境。
一个 docker socket
挂载到/var/run/docker.sock
并且作为容器中的 root
用户可以对其执行读/写操作
让人惊喜的是,Docker CLI
已安装,默认情况下,它使用socket
与runtime
交互。由于这个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
使用从之前的实验中获得的知识并尝试突破这个容器。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
。但并非所有进程都可以读取或写入另一个进程的内存
进程注入本身是一个非常广泛的主题,现在不会深入探讨它。在本实验中,会发现宿主机的 PID
命名空间映射进容器里。这意味着可以直接在主机上创建进程,也可以枚举正在运行的进程
通常,在普通容器中,不会具有 cap_sys_ptrace
功能,但在这种情况下,容器创建者已明确启用此功能。这意味着容器中启动的任何进程都可以调试进程并在对进程的内存执行读写操作
在其他正在运行的进程中,整理出 python
进程,因为如果要注入到另一个进程,并且万一失败,那么它会使目标进程崩溃,并且可能导致异常行为,可能会阻止进一步利用系统。所以为了安全起见,选择使用 python
、nginx
服务器等进程
现在需要在实验室中下载漏洞利用程序和 shellcode
,并使用 gcc
对其进行编译。
shellcode
,比如 https://www.exploit-db.com/exploits/41128shellcode
注入进程内存的程序, 比如https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.cshellcode
并编译gcc exploit.c -o exploit
上面的漏洞已经在端口 5600
上启动了一个绑定 shell
。可以使用 netcat
连接到它并读取flag
。由于这个过程是在宿主机上启动的,所以需要通过宿主机docker
接口的IP
进行连接——nc 172.17.0.1 5600