arkanzasfeziii/Kraken
GitHub: arkanzasfeziii/Kraken
Kraken 是一套 Kubernetes 与云原生环境红队攻击工具,从被入侵 Pod 出发串联 RBAC 提权、Secret 提取、容器逃逸与云凭据窃取,帮助评估单个容器沦陷后的横向渗透影响范围。
Stars: 0 | Forks: 0
# Kraken — Kubernetes 与云原生攻击套件
## 威胁模型
Kubernetes 的安全失败是架构性的,而非偶然的。使容器强大的那些特性——共享内核访问、挂载的 service account token、宽泛的 RBAC 权限——在大规模配置错误时,就会成为攻击面。
Kraken 模拟了这样一种攻击者:从一个被入侵的 workload 内部开始,将权限提升至 cluster-admin,然后延伸至云端:
| 阶段 | 失效点 | 对手行动 |
|---|---|---|
| **初始侦察** | namespace 之间无网络策略;workload 可访问 API server | 从 pod 内部查询 Kubernetes API;枚举所有 namespace、pod、service |
| **RBAC 配置错误** | service account 在集群范围内对 secret 拥有 `get/list` 权限,或对 pod 拥有 `create` 权限 | 识别通配符权限;绘制通往 cluster-admin 的权限提升路径 |
| **Secret 提取** | secret 以 base64 格式存储在 etcd 中且未进行信封加密 | 转储跨 namespace 的所有 secret,在内存中解码,扫描凭据模式 |
| **容器逃逸** | 以特权模式运行的 pod,或挂载了 Docker socket,或拥有 `CAP_SYS_ADMIN` | 通过 nsenter、Docker socket chroot 或 cgroup release_agent 逃逸至宿主机 |
| **Service Account 滥用** | 默认 service account 自动挂载 token 且拥有过高的 RBAC 权限 | 从 `/var/run/secrets/kubernetes.io/serviceaccount/token` 读取挂载的 token,并用于攻击 API |
| **云桥接** | 可从 pod 网络访问 EKS/AKS/GKE 的 IMDS 端点 | 从集群内部查询 AWS、Azure 或 GCP 元数据服务——提取云 IAM 凭据 |
| **Etcd 访问** | etcd 暴露在 2379 端口且无 TLS 客户端身份验证 | 通过 v2 HTTP API 或 etcdctl 转储整个集群状态——包括所有 secret、配置和集群状态 |
**范围:** 针对以了解单个被入侵容器的爆炸半径为目标的 Kubernetes 环境的授权红队演练。
## 为什么开发此工具
被入侵的容器不仅仅是端点被入侵。它极有可能是整个 Kubernetes 集群被入侵——进而可能是云账户被入侵。
“攻击者在 pod 内部获得了代码执行权限”与“攻击者获得了 cluster-admin 和 AWS 管理员凭据”之间的差距,比大多数组织意识到的要小得多:
- 默认的 service account 会自动挂载 token,其权限范围涵盖了集群范围内的 secret 访问
- 为了“操作便利”而部署特权 pod,却未了解它们所授予的宿主机访问权限
- 随着团队不断增加新功能且未审查现有授权,RBAC 角色会累积通配符权限
- etcd 运行在控制平面节点的 2379 端口上——如果网络策略没有明确阻止,它就是可访问的
- EKS 节点上的 IMDSv1 会响应任何能够到达该节点 IP 的 pod 发出的 HTTP 请求
Kraken 将这些配置错误串联起来。它不仅仅是报告存在特权 pod——它还会演示攻击者会利用它做什么。
## 功能
### 集群枚举
- 通过 `/version` API 进行**集群版本**指纹识别——标记已知存在漏洞的版本
- **Namespace 枚举**——标记敏感的 namespace 名称:`prod`、`payment`、`finance`、`database`
- **Pod 枚举**——检测所有 namespace 中的 `hostPID`、`hostNetwork`、特权安全上下文(security context)以及以 root 身份运行的 pod
- **Service 暴露**——列出所有带有外部 IP 绑定的 `LoadBalancer` 和 `NodePort` 服务
- **RBAC 分析**——枚举所有 ClusterRoleBinding;标记 `cluster-admin` 分配;检测通配符角色(在 verbs 或 resources 上使用 `*`);通过 `RBAC_PRIVESC_PATHS` 检查 7 条已知的权限提升路径
- **自我权限检查**——根据危险的 verb/resource 组合评估被入侵的 service account 自身的权限
- **Service Account 枚举**——列出每个 namespace 中的所有 service account 及其 RBAC 绑定
### Secret 提取
- **Kubernetes Secrets 转储**——列出所有 namespace 中的所有 secret;在内存中对值进行 base64 解码;扫描解码后的内容以查找凭据模式(AWS 密钥、token、API 密钥、密码、连接字符串)
- **Service Account Token 识别**——标记 `kubernetes.io/service-account-token` 类型的 secret
- **ConfigMap 扫描**——在 ConfigMap 中搜索匹配凭据模式(密码、端点、token)的键/值
### 容器逃逸技术
Kraken 会针对当前 pod 的配置评估五种逃逸路径:
| 技术 | 条件 | 方法 |
|---|---|---|
| **特权容器** | `securityContext.privileged: true` | `nsenter --mount=/proc/1/ns/mnt -- chroot /host` |
| **Docker Socket 挂载** | 挂载了 `/var/run/docker.sock` | `docker run --rm -v /:/host alpine chroot /host` |
| **HostPath 根目录挂载** | 从节点挂载了 `/` 或 `/host` | `chroot /host` —— 获得完整的宿主机文件系统访问权限 |
| **HostPID Namespace** | `hostPID: true` | `nsenter -t 1 -m -u -i -n -p` —— 进入 PID 1 namespace |
| **cgroup v1 Release Agent** | 可写的 `/sys/fs/cgroup/*/release_agent` | 将 payload 写入 release_agent —— CVE-2022-0492 变体 |
此外还会检查 capabilities:`CAP_SYS_ADMIN`、`CAP_SYS_PTRACE`、`CAP_NET_ADMIN`——每一个都能开启不同的逃逸或枢纽转发路径。
### Service Account Token 滥用
- **挂载 token 提取**——从当前 pod 读取 `/var/run/secrets/kubernetes.io/serviceaccount/token`
- **跨 Namespace Token 窃取**——枚举并从所有可访问的 namespace 中提取 service account token
- **管理员绑定检查**——针对每个收集到的 token 对 RBAC 进行测试,以识别具有 `cluster-admin` 或特权绑定的 token
- **TokenRequest API**——通过 TokenRequest API 为额外的 service account 请求短期 token
### 云桥接 —— IMDS 横向移动
从集群 pod 网络内部,探测托管 Kubernetes 云元数据服务:
| 云平台 | 端点 | 提取内容 |
|---|---|---|
| **AWS EKS** | `169.254.169.254/latest/meta-data/iam/security-credentials/` | IAM 角色名称 → `AccessKeyId`、`SecretAccessKey`、`Token` |
| **Azure AKS** | `169.254.169.254/metadata/identity/oauth2/token` | 托管标识 OAuth2 访问 token |
| **GCP GKE** | `metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token` | GCP service account bearer token |
| **GCP GKE** | `metadata.google.internal/computeMetadata/v1/project/project-id` | GCP 项目标识符 |
### Etcd 直接访问
- **端口检查**——检测 API server 宿主机上的 2379 端口是否有 etcd
- **未经身份验证的 v2 HTTP API**——通过 `/v2/keys/?recursive=true` 转储所有密钥——如果 TLS 客户端身份验证被禁用,则无需凭据即可返回完整的集群状态
- **etcdctl v3**——执行 `etcdctl get --prefix="" --keys-only` 以及带有可选证书目录的完整密钥转储
## 架构
```
Target (kubeconfig · API host · in-cluster token)
│
▼
EngagementContext
┌──────────────────────────────────────┐
│ api_host · api_port · token │
│ kubeconfig · namespace │
│ K8s Core / RBAC / Apps / Batch API │
└──────────────────────────────────────┘
│
┌─────────────┼──────────────┐
▼ ▼ ▼
EnumModule SecretDump EscapeModule
RBAC+pods K8s Secrets 5 escape paths
namespaces ConfigMaps capability check
│
├─────────────────────────┐
▼ ▼
SAAbuseModule CloudBridgeModule
token theft AWS/Azure/GCP IMDS
cross-ns abuse credential harvest
│
▼
EtcdModule
direct etcd dump
│
▼
JSON Report
(namespace · finding · severity)
```
## 攻击流程
1. **API 发现**——使用提供的 kubeconfig、bearer token,或从 `/var/run/secrets/kubernetes.io/serviceaccount/token` 自动检测到的集群内 token 连接到 Kubernetes API
2. **集群枚举**——对集群版本进行指纹识别;枚举所有 namespace(标记敏感名称);列出 pod 并进行安全上下文分析;识别暴露的服务和 RBAC 配置错误
3. **RBAC 权限提升映射**——针对 `RBAC_PRIVESC_PATHS` 评估当前 service account 的权限;标记任何具有通往 cluster-admin 提升路径的账户
4. **Secret 提取**——转储所有 namespace 中的所有 secret;在内存中对值进行 base64 解码;对所有解码后的内容运行凭据模式扫描
5. **逃逸评估**——检查 pod 的安全上下文是否包含特权标志、`hostPID`、挂载的 Docker socket、HostPath 挂载以及可写的 cgroup release_agent;报告哪些逃逸是可行的,并提供执行它们的确切命令
6. **Token 收集**——跨 namespace 提取所有可访问的 service account token;针对 RBAC 测试每一个 token,以识别具有管理员级别权限的 token
7. **云桥接**——从集群网络内部探测 AWS、Azure 和 GCP 的 IMDS 端点;如果可访问 IMDS,则提取云凭据
8. **Etcd 扫描**——尝试未经身份验证访问 etcd 的 2379 端口;如果可访问,则转储集群状态
9. **报告**——生成包含完整发现列表、严重程度和每个 namespace 的建议修复措施的 `--output report.json`
## 使用方法
```
# 安装依赖
pip install -r requirements.txt
# 从外部 kubeconfig 枚举 cluster
python kraken.py --kubeconfig ~/.kube/config --modules enum
# 导出并解码所有 Kubernetes secrets
python kraken.py --kubeconfig ~/.kube/config --modules secrets
# 检查容器逃逸路径(从 pod 内部运行)
python kraken.py --modules escape
# 枚举并滥用 service account tokens
python kraken.py --kubeconfig ~/.kube/config --modules sa
# 探测 IMDS 端点(从 cluster 网络内部)
python kraken.py --modules cloud
# 直接 etcd 访问检查
python kraken.py --api-host 10.96.0.1 --modules etcd
# 完整 engagement chain
python kraken.py --kubeconfig ~/.kube/config --modules all --output kraken-findings.json
# 非交互模式
python kraken.py --kubeconfig ~/.kube/config --modules all --yes --output results.json
```
## 输出
```
15:11:04 [INFO] [Enum] Kubernetes v1.27.3 | API: https://10.96.0.1:6443
15:11:05 [WARN] [Enum] Sensitive namespace detected: prod, payment, database
15:11:05 [CRIT] [Enum/Pods] Privileged pod: api-gateway (namespace: prod)
15:11:05 [CRIT] [Enum/Pods] hostPID=true: log-collector (namespace: monitoring)
15:11:06 [CRIT] [Enum/RBAC] cluster-admin binding: system:serviceaccount:default:api-sa
15:11:06 [CRIT] [Enum/RBAC] Wildcard role: ci-runner (verbs: * resources: *)
15:11:06 [CRIT] [Enum/RBAC] PrivEsc path: create pods → pod exec → cluster-admin
15:11:07 [CRIT] [Secrets] 84 secrets decoded across 6 namespaces
15:11:07 [CRIT] [Secrets] AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE (namespace: prod)
15:11:07 [CRIT] [Secrets] DB_PASSWORD: supersecret123 (namespace: database)
15:11:07 [CRIT] [Secrets] SA token: system:serviceaccount:kube-system:default
15:11:08 [CRIT] [Escape] Privileged container confirmed — escape feasible
15:11:08 [INFO] [Escape] Command: nsenter --mount=/proc/1/ns/mnt -- chroot /host /bin/bash
15:11:08 [CRIT] [Escape] CAP_SYS_ADMIN capability present — additional escape paths available
15:11:09 [CRIT] [Cloud/AWS] IMDS reachable — role: eks-node-role
15:11:09 [CRIT] [Cloud/AWS] Credentials extracted: AccessKeyId=ASIA..., Expiration=+1h
15:11:10 [CRIT] [Etcd] Port 2379 open — attempting unauthenticated dump
15:11:10 [CRIT] [Etcd] Unauthenticated access — full cluster state exposed (3,847 keys)
[✓] Cluster audit complete — 11 critical findings | report: kraken-findings.json
```
## MITRE ATT&CK 覆盖范围
| 技术 | ID | 模块 |
|---|---|---|
| 容器与资源发现 | T1613 | EnumModule |
| 不安全的凭据:容器 API | T1552.007 | SecretDumpModule, SAAbuseModule |
| 逃逸到宿主机 | T1611 | EscapeModule |
| 有效账户:云账户 | T1078.004 | CloudBridgeModule |
| 利用面向公众的应用程序 | T1190 | EtcdModule |
| 窃取应用程序访问 token | T1528 | SAAbuseModule |
| 账户发现 | T1087 | EnumModule / RBAC |
**战术:** TA0007 发现 · TA0006 凭据访问 · TA0004 权限提升 · TA0008 横向移动
## CWE 涉及的覆盖范围
| CWE | 描述 | 涉及位置 |
|---|---|---|
| CWE-732 | 关键资源权限分配不当 | RBAC 通配符角色、cluster-admin 绑定 |
| CWE-200 | 敏感信息暴露 | etcd 未经身份验证的访问、未强制执行的 IMDS |
| CWE-250 | 使用不必要的权限执行 | 特权 pod、授予 CAP_SYS_ADMIN |
| CWE-306 | 关键功能缺少身份验证 | etcd v2 HTTP API、IMDS 端点 |
| CWE-522 | 凭据保护不足 | Kubernetes Secrets 仅使用 base64 编码 |
| CWE-269 | 权限管理不当 | RBAC 权限提升路径 |
## 法律声明
Kraken 专门为已获得资产所有者明确书面授权的渗透测试和安全评估活动而设计。未经授权测试 Kubernetes 集群或云环境是非法的,并可能暴露机密的基础设施数据。作者不对滥用行为承担任何责任。
标签:StruQ, 协议分析, 容器逃逸, 数据展示, 权限提升, 红队, 逆向工具