docker逃逸几点思路
1、docker daemon api未授权访问
2、privileged 特权模式启动容器
3、利用dirty cow来进行docker逃逸
4、通过cve-2019-5736来达到docker逃逸
1、docker daemon api未授权访问
访问http://ip:2375/containers/json
2、privileged 特权模式启动容器
特权模式逃逸是一种最简单有效的逃逸方法,使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,可直接通过chroot切换根目录、写ssh公钥和crontab计划任何等getshell。
当操作者执行docker run --privileged
时,Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限。
特权模式起的容器,实战可通过以下命令判断当前容器是否通过特权模式起:
cat /proc/self/status |grep Cap
(CapEff: 000000xfffffffff代表为特权模式起)
3、利用dirty cow来进行docker逃逸
dirty cow漏洞可以让我门获取只读内存的写的权限,我们首先利用dirty coa漏洞写入一段shellcode到VDSO映射的一段闲置内存中,然后改变函数的执行颁顺序,使得调用正常的任意函数之前都要执行这段shellcode。这段shellcode初始化的时候会检查是否是被root调用,如果是则继续执行,如果不是,则接着执行clock_gettime函数,接下来它会检测/tmp/.x文件的存在,如果存在,则这时已经是root权限了,然后它会打开一个反向的TCP链接,为Shellcode中填写的ip返回一个Shell。
这种利用方法利用成功的前提是,宿主机的内核有dirty cow漏洞。
4、通过cve-2019-5736来达到docker逃逸
1.漏洞原理与条件
通过在docker容器内重写和运行主机系统的runc二进制文件达到逃逸的目的。
利用条件为:
runc版本<=1.0-rc6
Docker Version < 18.09.2
2.漏洞触发过程
首先我们要有一个docker下的shell,第二步修改利用脚本中的反弹shell命令,第三步使用go build来编译脚本,第四步将脚本上传到docker中,第五步等待宿主机执行exec进入当前docker容器等时候,宿主机就会向我们的vps反弹root权限的shell.
防止docker逃逸的方法
- 更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆盖CVE-2019-5736。
- runc版本 >1.0-rc6
- k8s 集群版本>1.12
- Linux内核版本>=2.6.22——CVE-2016-5195(脏牛)
- Linux内核版本>=4.14——CVE-2017–1000405(大脏牛),未找到docker逃逸利用过程,但存在逃逸风险。
- 不建议以root权限运行Docker服务。
- 不建议以privileged(特权模式)启动Docker。
- 不建议将宿主机目录挂载至容器目录。
- 不建议将容器以—cap-add=SYSADMIN启动,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,存在容器逃逸风险。