cristhian-bot0/kubelet-pwn
GitHub: cristhian-bot0/kubelet-pwn
纯 Python 实现的 Kubernetes Kubelet API 滥用工具包,利用 `get nodes/proxy` RBAC 权限通过 SPDY/3.1 协议在节点容器中实现命令执行。
Stars: 0 | Forks: 0
# kubelet-pwn
用于在 Kubernetes/k3s 集群中滥用 **kubelet API** 的工具包,适用场景为
ServiceAccount 拥有 **`get nodes/proxy`** RBAC 权限时。
## 核心原理
`get nodes/proxy` 看似只是“节点的只读权限”,但 **kubelet 会根据 HTTP 方法推导出授权操作**:
| 对 kubelet 的请求 | RBAC 操作 | 是否被 `get nodes/proxy` 覆盖? |
|---|---|---|
| `GET /pods`, `GET /logs/...` | `get` | ✅ |
| `POST /exec/...`, `POST /run/...` | `create` | ❌ |
| **`GET /exec/...`** (upgrade) | **`get`** | ✅ **← 命令执行** |
也就是说:仅需 `get nodes/proxy` 权限,你就可以通过 `GET /exec` **在节点上的任何容器中执行命令**。如果存在一个挂载了宿主机 `/` 目录的 **特权 pod**(典型的如:`node-exporter`,logging/monitoring agent),这就等同于获得了 **宿主机的 root 权限**。
### 传输层细节(踩坑经验)
- **apiserver 的 proxy** (`/api/v1/nodes//proxy/exec/...`) 在处理 upgrade 请求时会**丢弃查询字符串**(`tryUpgrade` 没有复制 `RawQuery`)→ 因此必须**直接与 kubelet 通信** (`:10250`)。
- kubelet 通常会**拒绝 WebSocket** 形式的 exec 请求,但**接受 SPDY/3.1**。
- exec 参数为:`command`, `output=1`, `error=1`, `input=1`(值为 `"1"`),而**不是** `stdin/stdout/stderr`。upgrade 操作要求提供 `X-Stream-Protocol-Version`。
该工具使用纯 Python(无外部依赖)实现了一个极简的 **SPDY/3.1** 客户端来完成上述所有操作。
## 用法
该 token 通常是受损 pod 中挂载的 ServiceAccount 的 token:
`/var/run/secrets/kubernetes.io/serviceaccount/token`(即 `--token-file` 的默认值)。kubelet 监听在 `*:10250`,因此 `--host` 即为节点的 IP(从任何 pod 或宿主机本身都可以访问)。
```
# 1. 侦察:查看节点上的所有 pods
python3 kubelet_pwn.py pods --host 10.129.60.174 --token-file token
# 2. 找到通往 root 的路径(privileged / host mounts)——解析 mountPath
python3 kubelet_pwn.py priv --host 10.129.60.174 --token-file token
# 3. 在挂载了 host / 的 privileged pod 中执行 / 在 /host/root
python3 kubelet_pwn.py exec --host 10.129.60.174 --token-file token \
-n monitoring -p prometheus-node-exporter-xxxxx -c node-exporter \
-- /bin/sh -c 'id; cat /host/root/root/root.txt'
```
`priv` 已经会为你打印出可以直接复制使用的确切 `exec` 命令。
### 注意事项
- 如果目标容器没有 `/bin/sh`(如 distroless 镜像),可以直接执行单个独立的二进制文件:`-- /bin/cat /host/root/root/root.txt`。
- 如果无法直接访问 kubelet,可以使用 `--via-apiserver` 来进行 GET 侦察(`pods`/`priv`),但这**对 `exec` 无效**(因为 apiserver 会丢失查询字符串)。
- 无需外部依赖:仅使用标准的 Python 3 库(`zlib`, `ssl`, `socket`)。
## 免责声明
本工具仅供**授权的安全测试**(CTF、实验环境、获得明确许可的渗透测试)使用。未经授权对系统使用本工具是违法行为。
## 来源
提炼自 HTB **Fireflow** 虚拟机的权限提升流程:Langflow RCE → 凭据重用 → MCP JWT `alg=none` → 在 pod 中执行代码 → 拥有 `get nodes/proxy` 的 SA → 在特权 `node-exporter` 中执行 SPDY/3.1 → 获取 root。
标签:Python, StruQ, Web截图, 协议分析, 容器安全, 无后门, 权限提升, 逆向工具