本文通过 Google 翻译 Docker Breakout – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词举行了校正及个别注释增补。导航
容器是轻量级的,包含运行应用程序所需的一切。Docker 使用客户端-服务器架构。 Docker 客户端与 Docker 守护进程通讯,后者负责构建和运行 Docker 容器的繁重工作。
注:此处及后文提到的 docker 容器用户和 docker 进程用户并非同一个身份。思量到全部这些,让我们来看一些例子!
docker 容器用户:指进入容器之后,在容器操作情况中的用户身份。
docker 进程用户:指容器外部 docker 守护进程是以宿主机的哪个用户身份去运行的。
完备 TTY 对于我们将要使用的毛病利用来说照旧很有必要的。2.2、手动罗列 Docker 组中的用户
参加 docker 组是一个有趣的发现,由于如果 docker 使用的是默认配置,那么 root 权限就是有保障的。但大多数时候,我们不会直接就以 docker 组中的用户身份在目标主机上立足,因此,我们必要对 docker 组中的用户举行水平提权,然后才能获得 root 权限。
注:该部分的主题以罗列 docker 服务为主,而此处的描述有些跑题,显得词不达意,但依旧值得去学习。此处跑题结束
套接字 docker.sock 文件相当于是 Docker 守护进程的一个 API 接口,多用于容器与守护进程通讯以操作管理守护进程,通俗易理解示例如 docker.ui 容器管理容器。
也就是说,如果我们能够有权读写 docker.sock 文件,即便不是 root 用户、不在 docker 组中,我们也依旧可以通过一些特别操作去管理容器(创建、查看、交互)。
参考:特别操作1、特别操作2
使用无根模式,Docker 容器和守护进程都会在定义的用户命名空间内运行。这样,守护进程就可以在没有 root 权限的情况下运行。
注:在场景1中,在容器中举行的拷贝赋权等操作同样作用到了容器外部的系统上面,而这些操作在容器外部本应该是以 root 身份去举行的,但由于 docker 进程是 root 身份运行的,故这些在容器中的操作也同样有了 root 身份的加持。继续往下看,我们应该进一步枚举 docker 是如何配置的,以确定在创建容器并登录容器后使用的是哪个身份的用户。
在启动容器时,您还可以使用映像 ID 代替存储库名称。接着,我们启动一个容器,该容器将运行单个命令 (whoami),然后自行销毁。
过去,可写的 docker.sock 结果总是红色/黄色。但在最新版本的 LinPEAS 中(本文撰写时),这只是一个红色结果。下一部分我们将在 “User Information” 部分找到有关 docker 的信息。
在此示例中,我们使用 netcat 立足,因此我们应该像之前一样尝试升级到完备的 TTY。
注:此处必须要相识 docker 容器和宿主机之间的网络模式,本例容器的网络模式必须是 host 模式,也就是容器相当于一个应用摆设在宿主机上,和宿主机使用共同的网卡、共同的 ip ,且假设宿主机已运行 ssh 服务。若容器使用其它的网络模式,则下列方法无效。4.3.1、添加 “root” 用户
由于我们将用户 id 和组 id 设置为0,以是这个新用户和内置的 root 是一样的。只要 UID 和 GID 为 0,全部 "root" 都是平等的。
必要使用 CAP_SYS_ADMIN 来执行容器内所需的一系列管理操作。如果在容器内执行特权操作,但没有使用 -privileged 标志,那么该功能很可能是为 "最小特权原则 " 而设置的。由于我们发现在此容器中启用了 CAP_SYS_ADMIN,因此我们必要重点关注专门使用此功能的毛病利用。
启用 AppArmor 后,您将无法使用 mount 命令,权限将被拒绝。5.3.1、找到许多关于容器的好信息
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |