# GCP - Enumerazione di Containers e GKE

{{#include ../../../banners/hacktricks-training.md}}

## Containers

Nei container GCP puoi trovare la maggior parte dei servizi basati su container offerti da GCP, qui puoi vedere come enumerare i più comuni:
```bash
gcloud container images list
gcloud container images list --repository us.gcr.io/<project-name> #Search in other subdomains repositories
gcloud container images describe <name>
gcloud container subnets list-usable
gcloud container clusters list
gcloud container clusters describe <name>
gcloud container clusters get-credentials [NAME]

# Run a container locally
docker run --rm -ti gcr.io/<project-name>/secret:v1 sh

# Login & Download
sudo docker login -u oauth2accesstoken -p $(gcloud auth print-access-token) https://HOSTNAME
## where HOSTNAME is gcr.io, us.gcr.io, eu.gcr.io, or asia.gcr.io.
sudo docker pull HOSTNAME/<project-name>/<image-name>
```
### Privesc

Nella pagina seguente puoi controllare come **abusare dei permessi dei container per escalare i privilegi**:

{{#ref}}
../gcp-privilege-escalation/gcp-container-privesc.md
{{#endref}}

## Node Pools

Questi sono i pool di macchine (nodi) che formano i cluster kubernetes.
```bash
# Pool of machines used by the cluster
gcloud container node-pools list --zone <zone> --cluster <cluster>
gcloud container node-pools describe --cluster <cluster> --zone <zone> <node-pool>
```
## Kubernetes

Per informazioni su cos'è Kubernetes, controlla questa pagina:

{{#ref}}
../../kubernetes-security/
{{#endref}}

Prima di tutto, puoi controllare se esistono cluster Kubernetes nel tuo progetto.
```
gcloud container clusters list
```
Se hai un cluster, puoi far sì che `gcloud` configuri automaticamente il tuo file `~/.kube/config`. Questo file viene utilizzato per autenticarti quando usi [kubectl](https://kubernetes.io/docs/reference/kubectl/overview/), l'interfaccia a riga di comando nativa per interagire con i cluster K8s. Prova questo comando.
```
gcloud container clusters get-credentials [CLUSTER NAME] --region [REGION]
```
Quindi, dai un'occhiata al file `~/.kube/config` per vedere le credenziali generate. Questo file verrà utilizzato per aggiornare automaticamente i token di accesso in base alla stessa identità che la tua sessione `gcloud` attiva sta utilizzando. Questo richiede ovviamente i permessi corretti.

Una volta configurato, puoi provare il seguente comando per ottenere la configurazione del cluster.
```
kubectl cluster-info
```
Puoi leggere di più su `gcloud` per i container [qui](https://cloud.google.com/sdk/gcloud/reference/container/).

Questo è un semplice script per enumerare kubernetes in GCP: [https://gitlab.com/gitlab-com/gl-security/security-operations/gl-redteam/gcp_k8s_enum](https://gitlab.com/gitlab-com/gl-security/security-operations/gl-redteam/gcp_k8s_enum)

### Escalation di Privilegi TLS Bootstrap

Inizialmente, questa tecnica di escalation di privilegi consentiva di **privesc all'interno del cluster GKE**, permettendo effettivamente a un attaccante di **comprometterlo completamente**.

Questo perché GKE fornisce [credenziali TLS Bootstrap](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) nei metadati, che sono **accessibili da chiunque comprometta un pod**.

La tecnica utilizzata è spiegata nei seguenti post:

- [https://www.4armed.com/blog/hacking-kubelet-on-gke/](https://www.4armed.com/blog/hacking-kubelet-on-gke/)
- [https://www.4armed.com/blog/kubeletmein-kubelet-hacking-tool/](https://www.4armed.com/blog/kubeletmein-kubelet-hacking-tool/)
- [https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/)

E questo strumento è stato creato per automatizzare il processo: [https://github.com/4ARMED/kubeletmein](https://github.com/4ARMED/kubeletmein)

Tuttavia, la tecnica abusava del fatto che **con le credenziali dei metadati** era possibile **generare un CSR** (Certificate Signing Request) per un **nuovo nodo**, che era **automaticamente approvato**.\
Nel mio test ho verificato che **quelle richieste non sono più automaticamente approvate**, quindi non sono sicuro se questa tecnica sia ancora valida.

### Segreti nell'API Kubelet <a href="#the-kubelet-api-git-secrets-redux" id="the-kubelet-api-git-secrets-redux"></a>

In [**questo post**](https://blog.assetnote.io/2022/05/06/cloudflare-pages-pt3/) è stata scoperta un'indirizzo API Kubelet accessibile dall'interno di un pod in GKE che fornisce i dettagli dei pod in esecuzione:
```
curl -v -k http://10.124.200.1:10255/pods
```
Anche se l'API **non consente di modificare le risorse**, potrebbe essere possibile trovare **informazioni sensibili** nella risposta. L'endpoint /pods è stato trovato utilizzando [**Kiterunner**](https://github.com/assetnote/kiterunner).

{{#include ../../../banners/hacktricks-training.md}}
