Kubernetes Pivoting to Clouds
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Si vous exécutez un cluster k8s à l'intérieur de GCP, vous voudrez probablement qu'une application s'exécutant à l'intérieur du cluster ait un accès à GCP. Il existe 2 façons courantes de le faire :
Une façon courante de donner accès à une application kubernetes à GCP est de :
Créer un compte de service GCP
Lier les permissions souhaitées
Télécharger une clé json du SA créé
La monter en tant que secret à l'intérieur du pod
Définir la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS pointant vers le chemin où se trouve le json.
Par conséquent, en tant qu'attaquant, si vous compromettez un conteneur à l'intérieur d'un pod, vous devez vérifier cette variable env et les fichiers json avec les identifiants GCP.
Une façon de donner accès à un GSA à un cluster GKE est de les lier de cette manière :
Créer un compte de service Kubernetes dans le même namespace que votre cluster GKE en utilisant la commande suivante :
Créez un Secret Kubernetes qui contient les identifiants du compte de service GCP auquel vous souhaitez accorder l'accès au cluster GKE. Vous pouvez le faire en utilisant l'outil en ligne de commande gcloud
, comme montré dans l'exemple suivant :
Liez le Secret Kubernetes au compte de service Kubernetes en utilisant la commande suivante :
Dans la deuxième étape, les identifiants du GSA ont été définis comme secret du KSA. Ensuite, si vous pouvez lire ce secret depuis l'intérieur du cluster GKE, vous pouvez escalader vers ce compte de service GCP.
Avec l'Identité de Charge de Travail, nous pouvons configurer un compte de service Kubernetes pour agir en tant que compte de service Google. Les pods fonctionnant avec le compte de service Kubernetes s'authentifieront automatiquement en tant que compte de service Google lors de l'accès aux API Google Cloud.
La première série d'étapes pour activer ce comportement est d'activer l'Identité de Charge de Travail dans GCP (étapes) et de créer le SA GCP que vous souhaitez que k8s imite.
Activer l'Identité de Charge de Travail sur un nouveau cluster
Créer/Mettre à jour un nouveau pool de nœuds (les clusters Autopilot n'ont pas besoin de cela)
Créez le compte de service GCP à imiter depuis K8s avec des autorisations GCP :
Connectez-vous au cluster et créez le compte de service à utiliser
Lier le GSA avec le KSA
Exécutez un pod avec le KSA et vérifiez l'accès au GSA :
Vérifiez la commande suivante pour vous authentifier si nécessaire :
En tant qu'attaquant à l'intérieur de K8s, vous devriez rechercher des SAs avec l'annotation iam.gke.io/gcp-service-account
car cela indique que le SA peut accéder à quelque chose dans GCP. Une autre option serait d'essayer d'abuser de chaque KSA dans le cluster et de vérifier s'il a accès.
Depuis GCP, il est toujours intéressant d'énumérer les liaisons et de savoir quel accès vous accordez aux SAs à l'intérieur de Kubernetes.
Ceci est un script pour facilement itérer sur toutes les définitions de pods cherchant cette annotation :
Une manière (dépassée) de donner des rôles IAM aux Pods est d'utiliser un Kiam ou un Kube2IAM serveur. En gros, vous devrez exécuter un daemonset dans votre cluster avec un type de rôle IAM privilégié. Ce daemonset sera celui qui donnera accès aux rôles IAM aux pods qui en ont besoin.
Tout d'abord, vous devez configurer quels rôles peuvent être accessibles à l'intérieur de l'espace de noms, et vous le faites avec une annotation à l'intérieur de l'objet d'espace de noms :
Une fois que l'espace de noms est configuré avec les rôles IAM que les Pods peuvent avoir, vous pouvez indiquer le rôle que vous souhaitez sur chaque définition de pod avec quelque chose comme :
En tant qu'attaquant, si vous trouvez ces annotations dans des pods ou des namespaces ou un serveur kiam/kube2iam en cours d'exécution (probablement dans kube-system), vous pouvez imposer chaque rôle qui est déjà utilisé par des pods et plus (si vous avez accès au compte AWS, énumérez les rôles).
Le rôle IAM à indiquer doit être dans le même compte AWS que le rôle kiam/kube2iam et ce rôle doit pouvoir y accéder.
C'est la méthode recommandée par AWS.
Tout d'abord, vous devez créer un fournisseur OIDC pour le cluster.
Ensuite, vous créez un rôle IAM avec les permissions dont le SA aura besoin.
Créez une relation de confiance entre le rôle IAM et le SA nom (ou les namespaces donnant accès au rôle à tous les SAs du namespace). La relation de confiance vérifiera principalement le nom du fournisseur OIDC, le nom du namespace et le nom du SA.
Enfin, créez un SA avec une annotation indiquant l'ARN du rôle, et les pods s'exécutant avec ce SA auront accès au token du rôle. Le token est écrit dans un fichier et le chemin est spécifié dans AWS_WEB_IDENTITY_TOKEN_FILE
(par défaut : /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Pour obtenir aws en utilisant le token depuis /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, exécutez :
En tant qu'attaquant, si vous pouvez énumérer un cluster K8s, vérifiez les comptes de service avec cette annotation pour escalader vers AWS. Pour ce faire, il suffit de exec/créer un pod en utilisant l'un des comptes de service IAM privilégiés et de voler le jeton.
De plus, si vous êtes à l'intérieur d'un pod, vérifiez les variables d'environnement comme AWS_ROLE_ARN et AWS_WEB_IDENTITY_TOKEN.
Parfois, la politique de confiance d'un rôle peut être mal configurée et au lieu de donner l'accès AssumeRole au compte de service attendu, elle le donne à tous les comptes de service. Par conséquent, si vous êtes capable d'écrire une annotation sur un compte de service contrôlé, vous pouvez accéder au rôle.
Vérifiez la page suivante pour plus d'informations :
Ceci est un script pour facilement itérer sur tous les pods et définitions de sas cherchant cette annotation :
La section précédente portait sur la manière de voler des rôles IAM avec des pods, mais notez qu'un nœud du cluster K8s va être une instance dans le cloud. Cela signifie que le nœud a de fortes chances d'avoir un nouveau rôle IAM que vous pouvez voler (notez que généralement tous les nœuds d'un cluster K8s auront le même rôle IAM, donc cela peut ne pas valoir la peine d'essayer de vérifier chaque nœud).
Il y a cependant une exigence importante pour accéder au point de terminaison des métadonnées depuis le nœud, vous devez être dans le nœud (session ssh ?) ou au moins avoir le même réseau :
Auparavant, nous avons discuté de la façon de joindre des rôles IAM aux Pods ou même de s'échapper vers le nœud pour voler le rôle IAM que l'instance a attaché à elle.
Vous pouvez utiliser le script suivant pour voler vos nouvelles informations d'identification de rôle IAM durement acquises :
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE) Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)