Docker Breakout / Privilege Escalation

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

使用Trickest轻松构建和自动化工作流程,利用世界上最先进的社区工具。 立即获取访问权限:

自动枚举和逃逸

  • linpeas:它还可以枚举容器

  • CDK:这个工具非常有用,可以枚举您所在的容器,甚至尝试自动逃逸

  • amicontained:有用的工具,用于获取容器的特权,以找到逃逸的方法

  • deepce:用于枚举和逃逸容器的工具

  • grype:获取镜像中安装的软件中包含的CVE

挂载的Docker套接字逃逸

如果您某种方式发现Docker套接字被挂载在Docker容器内部,您将能够从中逃逸。 这通常发生在需要连接到Docker守护程序执行操作的Docker容器中。

在这种情况下,您可以使用常规的docker命令与docker守护程序进行通信:

如果 docker套接字 位于意外位置,您仍可以使用带有参数 -H unix:///path/to/docker.sockdocker 命令与其通信。

Docker守护程序也可能在端口上进行监听(默认为2375、2376),或者在基于Systemd的系统上,可以通过Systemd套接字 fd:// 与Docker守护程序通信。

此外,还要注意其他高级运行时的运行时套接字:

  • dockershim: unix:///var/run/dockershim.sock

  • containerd: unix:///run/containerd/containerd.sock

  • cri-o: unix:///var/run/crio/crio.sock

  • frakti: unix:///var/run/frakti.sock

  • rktlet: unix:///var/run/rktlet.sock

  • ...

能力滥用逃逸

您应该检查容器的能力,如果具有以下任何一种能力,则可能能够从中逃逸:CAP_SYS_ADMINCAP_SYS_PTRACECAP_SYS_MODULEDAC_READ_SEARCHDAC_OVERRIDE, CAP_SYS_RAWIOCAP_SYSLOGCAP_NET_RAWCAP_NET_ADMIN

您可以使用先前提到的自动工具或以下方式检查当前容器的能力:

从特权容器中逃逸

可以通过使用标志--privileged或禁用特定防御措施来创建特权容器:

  • --cap-add=ALL

  • --security-opt apparmor=unconfined

  • --security-opt seccomp=unconfined

  • --security-opt label:disable

  • --pid=host

  • --userns=host

  • --uts=host

  • --cgroupns=host

  • 挂载 /dev

--privileged标志显著降低了容器的安全性,提供了无限制的设备访问并绕过多项保护措施。有关详细信息,请参考有关--privileged完整影响的文档。

Docker --privileged

特权 + hostPID

拥有这些权限后,您可以轻松地进入以 root 用户身份在主机上运行的进程的命名空间,比如 init (pid:1),只需运行:nsenter --target 1 --mount --uts --ipc --net --pid -- bash

在容器中执行以下测试:

特权

仅使用特权标志,您可以尝试访问主机的磁盘或尝试滥用release_agent或其他逃逸来进行特权升级。

在容器中执行以下绕过测试:

挂载磁盘 - Poc1

良好配置的docker容器不会允许类似 fdisk -l 这样的命令。然而,在错误配置的docker命令中,如果指定了 --privileged--device=/dev/sda1 并使用了权限,就有可能获得查看主机驱动器的权限。

因此,要接管主机机器是微不足道的:

挂载磁盘 - Poc2

在容器内部,攻击者可能会尝试通过集群创建的可写hostPath卷进一步访问基础主机操作系统。以下是您可以在容器内部检查的一些常见内容,以查看是否可以利用这种攻击向量:

利用现有的release_agent进行特权逃逸 (cve-2022-0492) - PoC1

利用创建的 release_agent 进行特权逃逸(cve-2022-0492)- PoC2

在以下位置找到有关该技术的解释

Docker release_agent cgroups escape

滥用 release_agent 实现特权逃逸,无需知道相对路径 - PoC3

在先前的利用中,容器在主机文件系统中的绝对路径被泄露。然而,并非总是如此。在你不知道容器在主机中的绝对路径的情况下,可以使用这种技术:

release_agent exploit - Relative Paths to PIDs

在一个特权容器中执行 PoC 应该会提供类似以下输出:

滥用敏感挂载进行特权逃逸

有几个文件可能被挂载,提供有关底层主机的信息。其中一些甚至可能指示主机在发生某些事件时要执行的内容(这将允许攻击者从容器中逃脱)。 滥用这些文件可能会导致:

但是,您可以在此页面中找到其他敏感文件进行检查:

Sensitive Mounts

任意挂载

在许多情况下,您会发现容器从主机挂载了一些卷。如果此卷配置不正确,您可能能够访问/修改敏感数据:读取机密信息,更改ssh authorized_keys...

使用2个shell和主机挂载进行权限提升

如果您以容器内的root身份访问具有来自主机挂载的某个文件夹的容器,并且已经以非特权用户的身份逃逸到主机并且对挂载的文件夹具有读取权限。 您可以在容器内挂载的文件夹中创建一个bash suid文件,并且从主机上执行以进行权限提升。

通过2个shell进行特权提升

如果您在容器内部具有root访问权限,并且已经以非特权用户的身份逃逸到主机,则可以滥用这两个shell来在主机内部提升权限,前提是您在容器内部具有MKNOD功能(默认情况下具有),如此文章中所述。 有了这样的功能,容器内的root用户被允许创建块设备文件。设备文件是用于访问底层硬件和内核模块的特殊文件。例如,/dev/sda块设备文件允许读取系统磁盘上的原始数据

Docker通过强制执行阻止块设备读/写操作的cgroup策略来防止容器内的块设备被滥用。然而,如果在容器内部创建块设备,则可以通过**/proc/PID/root/目录从容器外部访问该块设备。此访问要求进程所有者在容器内外相同**。

来自此文章利用示例:

hostPID

如果您可以访问主机的进程,您将能够访问存储在这些进程中的许多敏感信息。运行测试实验室:

例如,您可以使用类似 ps auxn 的命令列出进程,并在命令中搜索敏感细节。

然后,由于您可以访问主机中/proc/的每个进程,只需运行即可窃取它们的环境机密:

你也可以访问其他进程的文件描述符并读取它们打开的文件

你也可以终止进程并造成拒绝服务

hostNetwork

如果一个容器配置了Docker 主机网络驱动器(--network=host),那么该容器的网络堆栈与Docker主机不是隔离的(容器与主机共享网络命名空间),并且该容器不会被分配自己的IP地址。换句话说,容器将所有服务直接绑定到主机的IP。此外,容器可以拦截主机发送和接收的所有网络流量,使用共享接口tcpdump -i eth0

例如,您可以使用这个方法嗅探甚至欺骗主机和元数据实例之间的流量。

就像以下示例中所示:

您还可以访问主机内部绑定到本地主机的网络服务,甚至访问节点的元数据权限(这可能与容器可以访问的权限不同)。

hostIPC

通过hostIPC=true,您可以访问主机的进程间通信(IPC)资源,例如在/dev/shm中的共享内存。这允许读取/写入同一IPC资源被其他主机或容器进程使用。使用ipcs进一步检查这些IPC机制。

  • 检查/dev/shm - 查看此共享内存位置中的任何文件:ls -la /dev/shm

  • 检查现有IPC设施 - 您可以使用/usr/bin/ipcs检查是否正在使用任何IPC设施。使用以下命令检查:ipcs -a

恢复权限

如果系统调用**unshare**没有被禁止,您可以通过运行以下命令恢复所有权限:

通过符号链接滥用用户命名空间

https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/中解释的第二种技术表明,您可以滥用用户命名空间中的绑定挂载,以影响主机内的文件(在该特定情况下,删除文件)。

使用Trickest轻松构建和自动化工作流程,利用世界上最先进的社区工具。 立即获取访问权限:

CVE

Runc漏洞利用(CVE-2019-5736)

如果您可以以root身份执行docker exec(可能使用sudo),您可以尝试通过滥用CVE-2019-5736(漏洞利用在此处)来提升特权。该技术基本上将从容器中主机****覆盖 /bin/sh 二进制文件,因此任何执行docker exec的人都可能触发有效载荷。

相应地更改有效载荷,并使用go build main.go构建main.go。生成的二进制文件应放置在docker容器中以供执行。 执行时,一旦显示[+] Overwritten /bin/sh successfully,您需要从主机上执行以下操作:

docker exec -it <container-name> /bin/sh

这将触发main.go文件中存在的有效载荷。

更多信息:https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html

容器可能存在其他CVE漏洞,您可以在https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list中找到列表。

Docker自定义逃逸

Docker逃逸表面

  • 命名空间: 该进程应通过命名空间与其他进程完全隔离,因此我们无法通过命名空间逃脱与其他进程的交互(默认情况下无法通过IPC、Unix套接字、网络服务、D-Bus、其他进程的/proc进行通信)。

  • 根用户: 默认情况下,运行该进程的用户是根用户(但其权限受限)。

  • 权限: Docker保留以下权限:cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep

  • 系统调用: 这些是根用户无法调用的系统调用(因为缺乏权限+Seccomp)。其他系统调用可用于尝试逃逸。

syscall_bf.c

Container Breakout through Usermode helper Template

If you are in userspace (no kernel exploit involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):

  • Find the path of the containers filesystem inside the host

  • You can do this via mount, or via brute-force PIDs as explained in the second release_agent exploit

  • Find some functionality where you can indicate the path of a script to be executed by a host process (helper) if something happens

  • You should be able to execute the trigger from inside the host

  • You need to know where the containers files are located inside the host to indicate a script you write inside the host

  • Have enough capabilities and disabled protections to be able to abuse that functionality

  • You might need to mount things o perform special privileged actions you cannot do in a default docker container

References

Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

最后更新于