Kubernetes:未授权Kubelet API 10250令牌窃取与kubectl权限提升
kube-hunter扫描输出作为开始:
漏洞信息
| 位置 | 类别 | 漏洞 | 描述 | 证据 |
|---|---|---|---|---|
| 1.2.3.4:10250 | 远程代码执行 | 暴露容器内运行 | 攻击者可以在容器内运行任意命令 | |
| 1.2.3.4:10250 | 远程代码执行 | 匿名认证 | Kubelet配置错误,可能允许安全访问所有kubelet请求,无需认证 |
执行 curl -s https://k8-node:10250/runningpods/ 获取运行中的pod列表
利用这些数据,可以构造POST请求在pod中执行命令以便进行探测。
示例请求:
|
|
输出:
|
|
检查环境变量,查看kubelet令牌是否在环境变量中。根据云提供商或托管提供商的不同,有时它们就在那里。否则我们需要从以下位置检索它们:
- 挂载的文件夹
- 云元数据URL
使用以下命令检查环境变量:
|
|
我们正在寻找 KUBLET_CERT、KUBLET_KEY 和 CA_CERT 环境变量。
我们还在寻找Kubernetes API服务器。这很可能不是您在10250上操作的主机。我们正在寻找类似以下的内容:
|
|
或
|
|
一旦我们获得Kubernetes令牌或密钥,我们需要与API服务器通信来使用它们。Kubelet(10250)不知道如何处理它们。这可能(如果我们幸运的话)是另一个公共IP或10.* IP。如果是10.* IP,我们需要将kubectl下载到pod中。
假设它们不在环境变量中,让我们查看挂载的密钥中是否存在:
|
|
示例输出(截断):
|
|
然后我们可以输出ca.cert、namespace和token
|
|
输出:
|
|
然后:
|
|
输出:
|
|
同时获取ca.crt :-)
有了token、ca.crt和API服务器IP地址,我们可以使用kubectl执行命令。
|
|
输出:
|
|
此时,您可以提取密钥或exec到任何可用的pod中
|
|
通过kubectl获取shell
|
|
为了完整性,如果您通过环境变量获取了密钥,kubectl命令将类似于这样:
|
|