Kubernetes Enumeration
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 avez compromis l'accès à une machine, l'utilisateur peut avoir accès à une certaine plateforme Kubernetes. Le token se trouve généralement dans un fichier pointé par la var env KUBECONFIG
ou dans ~/.kube
.
Dans ce dossier, vous pourriez trouver des fichiers de configuration avec tokens et configurations pour se connecter au serveur API. Dans ce dossier, vous pouvez également trouver un dossier de cache avec des informations précédemment récupérées.
Si vous avez compromis un pod dans un environnement kubernetes, il existe d'autres endroits où vous pouvez trouver des tokens et des informations sur l'environnement K8 actuel :
Avant de continuer, si vous ne savez pas ce qu'est un service dans Kubernetes, je vous suggérerais de suivre ce lien et de lire au moins les informations sur l'architecture Kubernetes.
Extrait de la documentation Kubernetes :
“Lorsque vous créez un pod, si vous ne spécifiez pas de compte de service, il se voit automatiquement attribuer le compte de service par défaut dans le même namespace.”
ServiceAccount est un objet géré par Kubernetes et utilisé pour fournir une identité aux processus qui s'exécutent dans un pod. Chaque compte de service a un secret qui lui est associé et ce secret contient un token d'accès. C'est un JSON Web Token (JWT), une méthode pour représenter des revendications de manière sécurisée entre deux parties.
Généralement, un des répertoires :
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
contient les fichiers :
ca.crt : C'est le certificat ca pour vérifier les communications kubernetes
namespace : Il indique le namespace actuel
token : Il contient le token de service du pod actuel.
Maintenant que vous avez le token, vous pouvez trouver le serveur API dans la variable d'environnement KUBECONFIG
. Pour plus d'infos, exécutez (env | set) | grep -i "kuber|kube
"
Le token du compte de service est signé par la clé résidant dans le fichier sa.key et validé par sa.pub.
Emplacement par défaut sur Kubernetes :
/etc/kubernetes/pki
Emplacement par défaut sur Minikube :
/var/lib/localkube/certs
Les hot pods sont des pods contenant un token de compte de service privilégié. Un token de compte de service privilégié est un token qui a la permission d'effectuer des tâches privilégiées telles que lister des secrets, créer des pods, etc.
Si vous ne savez pas ce qu'est RBAC, lisez cette section.
k9s : Une interface graphique qui énumère un cluster kubernetes depuis le terminal. Vérifiez les commandes sur https://k9scli.io/topics/commands/. Écrivez :namespace
et sélectionnez tout pour ensuite rechercher des ressources dans tous les namespaces.
k8slens : Il offre quelques jours d'essai gratuit : https://k8slens.dev/
Pour énumérer un environnement K8s, vous avez besoin de quelques éléments :
Un token d'authentification valide. Dans la section précédente, nous avons vu où chercher un token utilisateur et un token de compte de service.
L'adresse (https://host:port) de l'API Kubernetes. Cela peut généralement être trouvé dans les variables d'environnement et/ou dans le fichier de configuration kube.
Optionnel : Le ca.crt pour vérifier le serveur API. Cela peut être trouvé aux mêmes endroits que le token. Cela est utile pour vérifier le certificat du serveur API, mais en utilisant --insecure-skip-tls-verify
avec kubectl
ou -k
avec curl
, vous n'en aurez pas besoin.
Avec ces détails, vous pouvez énumérer kubernetes. Si l'API pour une raison quelconque est accessible via l'Internet, vous pouvez simplement télécharger ces informations et énumérer la plateforme depuis votre hôte.
Cependant, généralement, le serveur API est à l'intérieur d'un réseau interne, donc vous devrez créer un tunnel à travers la machine compromise pour y accéder depuis votre machine, ou vous pouvez télécharger le kubectl binaire, ou utiliser curl/wget/anything
pour effectuer des requêtes HTTP brutes au serveur API.
list
and get
verbsAvec les permissions get
, vous pouvez accéder aux informations d'actifs spécifiques (option describe
dans kubectl
) API :
Si vous avez la permission list
, vous êtes autorisé à exécuter des requêtes API pour lister un type d'actif (get
option dans kubectl
):
Si vous avez la permission watch
, vous êtes autorisé à exécuter des requêtes API pour surveiller les actifs :
Ils ouvrent une connexion de streaming qui vous renvoie le manifeste complet d'un Déploiement chaque fois qu'il change (ou lorsqu'un nouveau est créé).
Les commandes kubectl
suivantes indiquent comment lister les objets. Si vous souhaitez accéder aux données, vous devez utiliser describe
au lieu de get
Depuis l'intérieur d'un pod, vous pouvez utiliser plusieurs variables d'environnement :
Par défaut, le pod peut accéder au serveur kube-api dans le nom de domaine kubernetes.default.svc
et vous pouvez voir le réseau kube dans /etc/resolv.config
car ici vous trouverez l'adresse du serveur DNS kubernetes (le ".1" du même réseau est le point de terminaison kube-api).
Ayant le jeton et l'adresse du serveur API, vous utilisez kubectl ou curl pour y accéder comme indiqué ici :
Par défaut, l'APISERVER communique avec le schéma https://
si
https://
n'est pas présent dans l'URL, vous pourriez obtenir une erreur comme Bad Request.
Vous pouvez trouver un cheat sheet officiel de kubectl ici. L'objectif des sections suivantes est de présenter de manière ordonnée différentes options pour énumérer et comprendre le nouveau K8s auquel vous avez obtenu accès.
Pour trouver la requête HTTP que kubectl
envoie, vous pouvez utiliser le paramètre -v=8
Si vous avez réussi à voler les identifiants de certains utilisateurs, vous pouvez les configurer localement en utilisant quelque chose comme :
Avec ces informations, vous saurez tous les services que vous pouvez lister
Une autre façon de vérifier vos privilèges est d'utiliser l'outil : https://github.com/corneliusweig/rakkess****
Vous pouvez en apprendre davantage sur Kubernetes RBAC dans :
Une fois que vous savez quels privilèges vous avez, consultez la page suivante pour déterminer si vous pouvez en abuser pour escalader les privilèges :
Kubernetes prend en charge plusieurs clusters virtuels soutenus par le même cluster physique. Ces clusters virtuels sont appelés namespaces.
Si vous pouvez lire les secrets, vous pouvez utiliser les lignes suivantes pour obtenir les privilèges liés à chaque jeton :
Comme discuté au début de cette page lorsqu'un pod est exécuté, un compte de service lui est généralement attribué. Par conséquent, lister les comptes de service, leurs permissions et où ils s'exécutent peut permettre à un utilisateur d'escalader ses privilèges.
Les déploiements spécifient les composants qui doivent être exécutés.
Les Pods sont les conteneurs réels qui vont s'exécuter.
Les services Kubernetes sont utilisés pour exposer un service sur un port et une IP spécifiques (qui agira comme un équilibreur de charge pour les pods qui offrent réellement le service). Il est intéressant de savoir où vous pouvez trouver d'autres services à essayer d'attaquer.
Obtenez tous les nœuds configurés à l'intérieur du cluster.
DaeamonSets permet de s'assurer qu'un pod spécifique s'exécute sur tous les nœuds du cluster (ou sur ceux sélectionnés). Si vous supprimez le DaemonSet, les pods gérés par celui-ci seront également supprimés.
Les cron jobs permettent de planifier à l'aide d'une syntaxe similaire à crontab le lancement d'un pod qui effectuera une action.
configMap contient toujours beaucoup d'informations et de fichiers de configuration qui sont fournis aux applications qui s'exécutent dans le kubernetes. En général, vous pouvez trouver beaucoup de mots de passe, de secrets, de jetons utilisés pour se connecter et valider d'autres services internes/externes.
Si vous êtes capable de créer de nouveaux pods, vous pourriez être en mesure de vous échapper d'eux vers le nœud. Pour ce faire, vous devez créer un nouveau pod en utilisant un fichier yaml, passer au pod créé, puis chroot dans le système du nœud. Vous pouvez utiliser des pods déjà existants comme référence pour le fichier yaml, car ils affichent des images et des chemins existants.
si vous devez créer un pod sur un nœud spécifique, vous pouvez utiliser la commande suivante pour obtenir les étiquettes sur le nœud
k get nodes --show-labels
En général, kubernetes.io/hostname et node-role.kubernetes.io/master sont de bonnes étiquettes à sélectionner.
Ensuite, vous créez votre fichier attack.yaml
Après cela, vous créez le pod
Maintenant, vous pouvez passer au pod créé comme suit
Et enfin, vous chroot dans le système du nœud.
Information obtenue à partir de : Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
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)