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)
Se stai eseguendo un cluster k8s all'interno di GCP, probabilmente vorrai che alcune applicazioni in esecuzione all'interno del cluster abbiano accesso a GCP. Ci sono 2 modi comuni per farlo:
Un modo comune per dare accesso a un'applicazione kubernetes a GCP è:
Creare un Account di Servizio GCP
Assegnare i permessi desiderati
Scaricare una chiave json dell'Account di Servizio creato
Montarla come segreto all'interno del pod
Impostare la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS che punta al percorso in cui si trova il json.
Pertanto, come attaccante, se comprometti un container all'interno di un pod, dovresti controllare quella variabile env e i file json con le credenziali GCP.
Un modo per dare accesso a un GSA a un cluster GKE è legarli in questo modo:
Creare un account di servizio Kubernetes nello stesso namespace del tuo cluster GKE utilizzando il seguente comando:
Crea un Kubernetes Secret che contiene le credenziali dell'account di servizio GCP a cui vuoi concedere accesso al cluster GKE. Puoi farlo utilizzando lo strumento da riga di comando gcloud
, come mostrato nel seguente esempio:
Collega il Kubernetes Secret all'account di servizio Kubernetes utilizzando il seguente comando:
Nel secondo passo sono state impostate le credenziali del GSA come segreto del KSA. Quindi, se puoi leggere quel segreto dall'interno del cluster GKE, puoi escalare a quel servizio account GCP.
Con l'Identità del Carico di Lavoro, possiamo configurare un account di servizio Kubernetes per agire come un account di servizio Google. I pod che girano con l'account di servizio Kubernetes si autenticheranno automaticamente come l'account di servizio Google quando accedono alle API di Google Cloud.
La prima serie di passi per abilitare questo comportamento è abilitare l'Identità del Carico di Lavoro in GCP (passi) e creare il SA GCP che vuoi che k8s impersoni.
Abilita l'Identità del Carico di Lavoro su un nuovo cluster
Crea/Aggiorna un nuovo nodepool (I cluster Autopilot non necessitano di questo)
Crea il GCP Service Account da impersonare da K8s con permessi GCP:
Connettersi al cluster e creare l'account di servizio da utilizzare
Collegare il GSA con il KSA
Esegui un pod con il KSA e controlla l'accesso al GSA:
Controlla il seguente comando per autenticarti nel caso sia necessario:
Come attaccante all'interno di K8s dovresti cercare SAs con l'annotazione iam.gke.io/gcp-service-account
poiché indica che l'SA può accedere a qualcosa in GCP. Un'altra opzione sarebbe cercare di abusare di ogni KSA nel cluster e controllare se ha accesso.
Da GCP è sempre interessante enumerare i binding e sapere quale accesso stai dando agli SAs all'interno di Kubernetes.
Questo è uno script per iterare facilmente su tutte le definizioni dei pod cercando quella annotazione:
Un modo (obsoleto) per dare ruoli IAM ai Pods è utilizzare un Kiam o un Kube2IAM server. Fondamentalmente, dovrai eseguire un daemonset nel tuo cluster con un tipo di ruolo IAM privilegiato. Questo daemonset sarà quello che darà accesso ai ruoli IAM ai pods che ne hanno bisogno.
Prima di tutto, devi configurare quali ruoli possono essere accessibili all'interno del namespace, e lo fai con un'annotazione all'interno dell'oggetto namespace:
Una volta che il namespace è configurato con i ruoli IAM che i Pods possono avere, puoi indicare il ruolo che desideri in ciascuna definizione del pod con qualcosa come:
Come attaccante, se trovi queste annotazioni nei pod o nei namespace o un server kiam/kube2iam in esecuzione (probabilmente in kube-system) puoi impersonare ogni ruolo che è già utilizzato dai pod e altro (se hai accesso all'account AWS elenca i ruoli).
Il ruolo IAM da indicare deve essere nello stesso account AWS del ruolo kiam/kube2iam e quel ruolo deve essere in grado di accedervi.
Questo è il modo raccomandato da AWS.
Prima di tutto, è necessario creare un provider OIDC per il cluster.
Poi si crea un ruolo IAM con i permessi di cui avrà bisogno il SA.
Creare una relazione di fiducia tra il ruolo IAM e il SA nome (o i namespace che danno accesso al ruolo a tutti i SA del namespace). La relazione di fiducia controllerà principalmente il nome del provider OIDC, il nome del namespace e il nome del SA.
Infine, creare un SA con un'annotazione che indica l'ARN del ruolo, e i pod in esecuzione con quel SA avranno accesso al token del ruolo. Il token è scritto all'interno di un file e il percorso è specificato in AWS_WEB_IDENTITY_TOKEN_FILE
(predefinito: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Per ottenere aws utilizzando il token da /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, esegui:
Come attaccante, se puoi enumerare un cluster K8s, controlla per service account con quella annotazione per escalare a AWS. Per farlo, basta exec/create un pod utilizzando uno dei service account privilegiati IAM e rubare il token.
Inoltre, se sei all'interno di un pod, controlla le variabili d'ambiente come AWS_ROLE_ARN e AWS_WEB_IDENTITY_TOKEN.
A volte la Trust Policy di un ruolo potrebbe essere mal configurata e invece di dare accesso AssumeRole al service account previsto, lo dà a tutti i service account. Pertanto, se sei in grado di scrivere un'annotazione su un service account controllato, puoi accedere al ruolo.
Controlla la seguente pagina per ulteriori informazioni:
Questo è uno script per iterare facilmente su tutti i pod e le definizioni di sas cercando quella annotazione:
La sezione precedente riguardava come rubare i ruoli IAM con i pod, ma nota che un Node del cluster K8s sarà un istanza all'interno del cloud. Questo significa che è altamente probabile che il Node abbia un nuovo ruolo IAM che puoi rubare (nota che di solito tutti i nodi di un cluster K8s avranno lo stesso ruolo IAM, quindi potrebbe non valere la pena provare a controllare ogni nodo).
Tuttavia, c'è un requisito importante per accedere all'endpoint dei metadati dal nodo, devi essere nel nodo (sessione ssh?) o almeno avere la stessa rete:
In precedenza abbiamo discusso di come allegare i Ruoli IAM ai Pod o persino di come fuggire al Nodo per rubare il Ruolo IAM che l'istanza ha allegato ad esso.
Puoi utilizzare il seguente script per rubare le tue nuove e faticosamente guadagnate credenziali del ruolo IAM:
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)