什么是Docker
Docker是一个开源的应用容器引擎。它允许开发者将他们的应用及其依赖包打包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,并且实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。docker可以安装软件,也可以安装一个操作系统。
总结:
1.解决环境差异依赖
2.解决重部署,可以快速部署
3.解决复杂的依赖链路
4.提升服务器的利用率,降低成本
5.隔离不同的应用
为了解决相同代码在不同环境中取到一致的效果:
需要在不同操作系统中引入一个中间层,中间层很多版本,可以在Windows、Linux、centos等等的不同操作系统之间引入一个中间层,可以用来屏蔽底层环境的差异。
虚拟机和容器的对比:
我们可以根据实际条件选择用虚拟机和容器。
docker的一些基本命令:
查看版本:docker search
启动:systemctl start docker
拉取镜像:docker pull 文件名和版本
查看镜像:docker images
删除镜像:docker rmi 镜像ID(需要先停止、删除容器)
查看容器正在使用的镜像: docker ps -a
停止镜像:docker stop 容器ID
进入容器的命令行 :docker exec -it 容器ID /bin/bash
退出容器命令:exit
什么是docker逃逸
就是容器拿到了主机的权限
逃逸原因:
1、由操作系统内核漏洞引起:CVE-2016-5195(脏牛)
2、由Docker本身的漏洞引起:CVE-2019-5736、CVE- 2019-14271
3、由Docker配置和使用不当引起 :
1.开启privileged(特权模式)
2.宿主机目录挂载(文件挂载)
3.docket remote api未授权访问导致逃逸
复现:
本次复现需要准备三个机器,centos服务器,centos靶机,kali监听机器
条件: root运行Docker
Docker Version < 18.09.2
runc版本 <=1.0.0-rc5
介绍:
centos服务器:编辑一个恶意POC,开启HTTP服务,等待靶机下载,注意:POC需要用go编译
靶机:需要先运行一个拥有命令行的镜像比如 ubuntu:18.04 ,我们需要在进入镜像,在容器的命令行执行下载远程恶意文件,我们给他增加权限,然后执行。
kali:进行监听,接收靶机的反弹连接
首先配置centos服务器,我们先远程下载POC进入这个下载好的POC
git clone https://github.com/Frichetten/CVE-2019-5736-PoC
然后修改恶意文件的反弹地址,vim main.go
改为自己kali的IP地址和监听端口
然后我们用go编译这个恶意脚本
然后开启一个HTTP服务,准备让靶机下载,
我们靶机先打开启动Docker服务
service docker start
运行一个容器:
docker run -it ubuntu:18.04 "/bin/bash"
进入docker容器的命令界面:
501c 是容器的ID,使用 docker container ls -a 查看
接着我们增加权限并且执行
在这里,我们就执行成功了,runc文件已经被我们改了,但是我们并不能立刻获得反弹,需要下一次执行这个runc文件时才会反弹,即:
我们再次执行之后
返回我们kali监听的端口:
反弹成功。
总结:
篡改了系统的runc文件,在其中加入恶意代码,在下一次run exec的时候导致恶意代码执行。就是在下一次启动这个容器的时候直接反弹,因为我们改了这个服务。
Docker加固建议
1、升级Docker到最新版
2、升级Linux内核
3、不建议以root权限运行Docker服务
4、不建议以privileged(特权模式)启动Docker
5、不建议将宿主机目录挂载至容器目录
6、不建议将容器以--cap-add=SYSADMIN启动, SYSADMIN意为container进程允许执行mount、umount等 一系列系统管理操作,存在容器逃逸风险
参考资料: https://mp.weixin.qq.com/s/R5DV0X3QpYmaxVxIexRYgA