mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB
This commit is contained in:
@@ -398,7 +398,8 @@
|
||||
- [Az - Enumeration Tools](pentesting-cloud/azure-security/az-enumeration-tools.md)
|
||||
- [Az - Unauthenticated Enum & Initial Entry](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md)
|
||||
- [Az - OAuth Apps Phishing](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-oauth-apps-phishing.md)
|
||||
- [Az - VMs Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md)
|
||||
- [Az - Storage Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-storage-unauth.md)
|
||||
- [Az - VMs Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unauth.md)
|
||||
- [Az - Device Code Authentication Phishing](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md)
|
||||
- [Az - Password Spraying](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md)
|
||||
- [Az - Services](pentesting-cloud/azure-security/az-services/README.md)
|
||||
|
||||
@@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).p
|
||||
|
||||
## Azure CosmosDB
|
||||
|
||||
**Azure Cosmos DB** je potpuno **upravljana NoSQL, relacijska i vektorska baza podataka** koja nudi vreme odziva u milisekundama, automatsku skalabilnost i dostupnost podržanu SLA-om uz sigurnost na nivou preduzeća. Omogućava brži razvoj aplikacija kroz ključne višeregionalne distribucije podataka, open-source API-je, SDK-ove za popularne jezike i AI funkcije baze podataka kao što su integrisana podrška za vektore i besprekorno Azure AI integrisanje.
|
||||
**Azure Cosmos DB** je potpuno **upravljana NoSQL, relacijska i vektorska baza podataka** koja nudi vreme odziva u milisekundama, automatsku skalabilnost i dostupnost podržanu SLA-om uz sigurnost na nivou preduzeća. Omogućava brži razvoj aplikacija kroz ključne višeregionalne distribucije podataka, open-source API-je, SDK-ove za popularne jezike i AI funkcije baze podataka kao što su integrisana podrška za vektore i besprekorno Azure AI integraciju.
|
||||
|
||||
Azure Cosmos DB pruža više API-ja za baze podataka kako bi modelovao stvarne podatke koristeći dokumente, relacione, ključ-vrednost, grafičke i kolone porodične modele podataka, a ovi API-ji su NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin i Table.
|
||||
|
||||
@@ -212,10 +212,10 @@ mongodb://<hostname>:<port>/<database>
|
||||
{% endcode %}
|
||||
|
||||
#### Baze podataka
|
||||
U MongoDB-u možete kreirati jednu ili više baza podataka unutar instance. Svaka baza podataka služi kao logička grupa kolekcija i pruža granicu za organizaciju i upravljanje resursima. Baze podataka pomažu u logičkom razdvajanju i upravljanju podacima, kao što su za različite aplikacije ili projekte.
|
||||
U MongoDB-u, možete kreirati jednu ili više baza podataka unutar instance. Svaka baza podataka služi kao logička grupa kolekcija i pruža granicu za organizaciju i upravljanje resursima. Baze podataka pomažu u logičkom razdvajanju i upravljanju podacima, kao što su za različite aplikacije ili projekte.
|
||||
|
||||
#### Kolekcije
|
||||
Osnovna jedinica skladištenja podataka u MongoDB-u je kolekcija, koja sadrži dokumente i dizajnirana je za efikasno pretraživanje i fleksibilan dizajn šeme. Kolekcije su elastično skalabilne i mogu podržati operacije visokog protoka preko više čvorova u distribuiranom okruženju.
|
||||
Osnovna jedinica skladištenja podataka u MongoDB-u je kolekcija, koja sadrži dokumente i dizajnirana je za efikasno pretraživanje i fleksibilan dizajn šeme. Kolekcije su elastično skalabilne i mogu podržati operacije sa visokim protokom preko više čvorova u distribuiranom okruženju.
|
||||
|
||||
#### Enumeracija
|
||||
|
||||
@@ -352,6 +352,8 @@ print(f"Inserted document with ID: {result.inserted_id}")
|
||||
* Pogledajte post eksploataciju "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" i definicije uloga jer ovde može biti privesc
|
||||
* Pogledajte restoracije
|
||||
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
Učite i vežbajte AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
|
||||
Učite i vežbajte GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
# Az - VMs Unath
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Virtuelne mašine
|
||||
|
||||
Za više informacija o Azure virtuelnim mašinama pogledajte:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/vms/
|
||||
{{#endref}}
|
||||
|
||||
### Izložena ranjiva usluga
|
||||
|
||||
Mrežna usluga koja je ranjiva na neki RCE.
|
||||
|
||||
### Javne galerijske slike
|
||||
|
||||
Javna slika može sadržati tajne unutra:
|
||||
```bash
|
||||
# List all community galleries
|
||||
az sig list-community --output table
|
||||
|
||||
# Search by publisherUri
|
||||
az sig list-community --output json --query "[?communityMetadata.publisherUri=='https://3nets.io']"
|
||||
```
|
||||
### Javni Ekstenzije
|
||||
|
||||
Ovo bi bilo čudnije, ali ne i nemoguće. Velika kompanija bi mogla staviti ekstenziju sa osetljivim podacima unutar nje:
|
||||
```bash
|
||||
# It takes some mins to run
|
||||
az vm extension image list --output table
|
||||
|
||||
# Get extensions by publisher
|
||||
az vm extension image list --publisher "Site24x7" --output table
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -5,19 +5,19 @@
|
||||
Ovde možete pronaći neke potencijalno opasne konfiguracije Roles i ClusterRoles.\
|
||||
Zapamtite da možete dobiti sve podržane resurse sa `kubectl api-resources`
|
||||
|
||||
## **Povećanje privilegija**
|
||||
## **Privilege Escalation**
|
||||
|
||||
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**:
|
||||
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**:
|
||||
|
||||
- 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.
|
||||
- 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 **č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.
|
||||
|
||||
### Pristup bilo kojem resursu ili glagolu (Wildcard)
|
||||
### 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 bilo koji namespace 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 anynamespace u klasteru
|
||||
```yaml
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
@@ -49,9 +49,9 @@ verbs: ["create", "list", "get"]
|
||||
```
|
||||
### Pod Create - Steal Token
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Primer poda koji će ukrasti token servisnog naloga `bootstrap-signer` i poslati ga napadaču:
|
||||
Primer poda koji će ukrasti token `bootstrap-signer` service account-a i poslati ga napadaču:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
@@ -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 eksfiltrira token SA** unutar poda:
|
||||
Sledeći yaml **kreira daemonset i exfiltrira 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 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:
|
||||
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:
|
||||
```
|
||||
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>`), **zahteva `0.log`** datoteku pod-a koristeći `/logs/` endpoint **Kubelet** servisa.\
|
||||
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**.
|
||||
|
||||
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 exfiltrirate hosts shadow datoteku koristeć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 radeći:
|
||||
```bash
|
||||
kubectl logs escaper
|
||||
failed to get parse function: unsupported log format: "root::::::::\n"
|
||||
@@ -247,7 +247,7 @@ allowedHostPaths:
|
||||
- pathPrefix: "/foo"
|
||||
readOnly: true
|
||||
```
|
||||
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:
|
||||
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:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
@@ -379,11 +379,11 @@ $ kubectl get secret stolen-admin-sa-token --token=$SECRETS_MANAGER_TOKEN -o jso
|
||||
```
|
||||
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
|
||||
### Č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**_ 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).
|
||||
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).
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
### Zahtevi za potpisivanje sertifikata
|
||||
|
||||
@@ -433,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 imenskom 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 imenu 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
|
||||
@@ -477,15 +477,15 @@ groups:
|
||||
> 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 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.
|
||||
> 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.
|
||||
|
||||
### 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).
|
||||
|
||||
> [!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 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**.
|
||||
> 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 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.
|
||||
|
||||
@@ -497,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
|
||||
|
||||
@@ -505,14 +505,14 @@ 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 webhook konfiguracija** 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 webhookconfigurations** kako bi mogli da **eskaliraju privilegije**.
|
||||
|
||||
Za [`mutatingwebhookconfigurations` primer proverite ovu sekciju ovog posta](#malicious-admission-controller).
|
||||
|
||||
### Eskalacija
|
||||
### Eskaliraj
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
### Nodes proxy
|
||||
|
||||
@@ -526,7 +526,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** u **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** 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"}]'
|
||||
@@ -543,7 +543,7 @@ 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 primenjene ograničenja raspoređivanja.
|
||||
Principali sa **`update`** ili **`patch`** dozvolama nad `nodes/status` ili `pods/status`, mogli bi modifikovati oznake kako bi uticali na ograničenja raspoređivanja.
|
||||
|
||||
## Ugrađena prevencija eskalacije privilegija
|
||||
|
||||
@@ -561,9 +561,9 @@ Pravilo nalaže da **korisnik može kreirati ili ažurirati ulogu samo ako posed
|
||||
> [!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 admin 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 administratorske privilegije za kompromitovani servisni nalog.**
|
||||
|
||||
## Drugi napadi
|
||||
## Ostali napadi
|
||||
|
||||
### Sidecar proxy aplikacija
|
||||
|
||||
@@ -617,7 +617,7 @@ Više informacija na: [https://kubernetes.io/docs/tasks/configure-pod-container/
|
||||
|
||||
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 trajno prisustvo u klasteru.
|
||||
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.
|
||||
|
||||
**Primer iz** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers):
|
||||
```bash
|
||||
@@ -657,7 +657,7 @@ Path: "/spec/containers/0/image",
|
||||
Value: "rewanthtammana/malicious-image",
|
||||
})
|
||||
```
|
||||
Gore navedeni deo zamenjuje prvu sliku kontejnera u svakom podu sa `rewanthtammana/malicious-image`.
|
||||
Gore navedeni isječak zamenjuje prvu sliku kontejnera u svakom podu sa `rewanthtammana/malicious-image`.
|
||||
|
||||
## OPA Gatekeeper zaobilaženje
|
||||
|
||||
@@ -674,7 +674,7 @@ Gore navedeni deo zamenjuje prvu sliku kontejnera u svakom podu sa `rewanthtamma
|
||||
|
||||
### **Restriktivno dodeljivanje korisnika u RoleBindings/ClusterRoleBindings**
|
||||
|
||||
- **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.
|
||||
- **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 visoku sigurnost.
|
||||
|
||||
### **Uloge specifične za namespace umesto uloga na nivou klastera**
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ Ako imate kompromitovan pristup mašini, korisnik može imati pristup nekoj Kube
|
||||
|
||||
U ovoj fascikli možete pronaći konfiguracione datoteke sa **tokenima i konfiguracijama za povezivanje sa API serverom**. U ovoj fascikli takođe možete pronaći fasciklu sa kešom sa informacijama prethodno preuzetim.
|
||||
|
||||
Ako ste kompromitovali pod unutar kubernetes okruženja, postoje druga mesta gde možete pronaći tokene i informacije o trenutnom K8 okruženju:
|
||||
Ako ste kompromitovali pod unutar kubernetes okruženja, postoje i druga mesta gde možete pronaći tokene i informacije o trenutnom K8 okruženju:
|
||||
|
||||
### Service Account Tokens
|
||||
|
||||
@@ -47,7 +47,7 @@ Podrazumevana lokacija na **Minikube**:
|
||||
|
||||
### Hot Pods
|
||||
|
||||
_**Hot pods su**_ podovi koji sadrže privilegovan servisni nalog token. Privilegovani servisni nalog token je token koji ima dozvolu za obavljanje privilegovanih zadataka kao što su listanje tajni, kreiranje podova, itd.
|
||||
_**Hot pods su**_ podovi koji sadrže privilegovani token servisnog naloga. Privilegovani token servisnog naloga je token koji ima dozvolu za obavljanje privilegovanih zadataka kao što su listanje tajni, kreiranje podova, itd.
|
||||
|
||||
## RBAC
|
||||
|
||||
@@ -64,7 +64,7 @@ Da biste enumerisali K8s okruženje, potrebni su vam neki od ovih:
|
||||
|
||||
- **validan autentifikacioni token**. U prethodnom odeljku smo videli gde da tražimo korisnički token i token servisnog naloga.
|
||||
- **adresa (**_**https://host:port**_**) Kubernetes API**. Ovo se obično može pronaći u promenljivim okruženja i/ili u kube konfiguracionoj datoteci.
|
||||
- **Opcionalno**: **ca.crt za verifikaciju API servera**. Ovo se može pronaći na istim mestima gde se može pronaći token. Ovo je korisno za verifikaciju sertifikata API servera, ali korišćenjem `--insecure-skip-tls-verify` sa `kubectl` ili `-k` sa `curl` vam neće biti potrebno.
|
||||
- **Opcionalno**: **ca.crt za verifikaciju API servera**. Ovo se može pronaći na istim mestima gde se može pronaći token. Ovo je korisno za verifikaciju sertifikata API servera, ali korišćenjem `--insecure-skip-tls-verify` sa `kubectl` ili `-k` sa `curl` vam to neće biti potrebno.
|
||||
|
||||
Sa tim detaljima možete **enumerisati kubernetes**. Ako je **API** iz nekog razloga **dostupan** putem **Interneta**, možete jednostavno preuzeti te informacije i enumerisati platformu sa vaše mašine.
|
||||
|
||||
@@ -91,7 +91,7 @@ GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name} [DEPRECATED]
|
||||
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments [DEPRECATED]
|
||||
GET /apis/apps/v1/watch/deployments [DEPRECATED]
|
||||
```
|
||||
Oni otvaraju streaming vezu koja vam vraća puni manifest jednog Deployment-a kada god se promeni (ili kada se kreira novi).
|
||||
Oni otvaraju streaming vezu koja vam vraća puni manifest jednog Deployment-a svaki put kada se promeni (ili kada se kreira novi).
|
||||
|
||||
> [!CAUTION]
|
||||
> Sledeće `kubectl` komande pokazuju samo kako da se navedu objekti. Ako želite da pristupite podacima, treba da koristite `describe` umesto `get`
|
||||
@@ -109,19 +109,19 @@ alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
|
||||
# if kurl is still got cert Error, using -k option to solve this.
|
||||
```
|
||||
> [!WARNING]
|
||||
> Pod može **pristupiti** **kube-api serveru** na imenu domena **`kubernetes.default.svc`** i možete videti kube mrežu u **`/etc/resolv.config`** jer ćete ovde pronaći adresu kubernetes DNS servera (".1" iste opsega je kube-api krajnja tačka).
|
||||
> Pod može **pristupiti** **kube-api serveru** u imenskom prostoru **`kubernetes.default.svc`** i možete videti kube mrežu u **`/etc/resolv.config`** jer ćete ovde pronaći adresu kubernetes DNS servera (".1" iste opsega je kube-api krajnja tačka).
|
||||
|
||||
### Koristeći kubectl
|
||||
### Korišćenje kubectl
|
||||
|
||||
Imajući token i adresu API servera, koristite kubectl ili curl za pristup kao što je ovde naznačeno:
|
||||
|
||||
Podrazumevano, APISERVER komunicira sa `https://` shemom.
|
||||
Podrazumevano, APISERVER komunicira sa `https://` šemom.
|
||||
```bash
|
||||
alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true [--all-namespaces]' # Use --all-namespaces to always search in all namespaces
|
||||
```
|
||||
> ako nema `https://` u URL-u, možete dobiti grešku poput Bad Request.
|
||||
|
||||
Možete pronaći [**službeni kubectl cheatsheet ovde**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). Cilj sledećih sekcija je da predstavi različite opcije za enumeraciju i razumevanje novog K8s na koji ste dobili pristup, u uređenom redosledu.
|
||||
Možete pronaći [**službeni kubectl cheatsheet ovde**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). Cilj sledećih sekcija je da predstavi različite opcije za enumeraciju i razumevanje novog K8s na koji ste dobili pristup.
|
||||
|
||||
Da biste pronašli HTTP zahtev koji `kubectl` šalje, možete koristiti parametar `-v=8`
|
||||
|
||||
@@ -161,7 +161,7 @@ kubectl config set-credentials USER_NAME \
|
||||
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
|
||||
--auth-provider-arg=id-token=( your id_token )
|
||||
```
|
||||
### Dobijte podržane resurse
|
||||
### Dobijanje podržanih resursa
|
||||
|
||||
Sa ovom informacijom ćete znati sve usluge koje možete navesti
|
||||
|
||||
@@ -266,13 +266,13 @@ kurl -v https://$APISERVER/api/v1/namespaces/custnamespace/secrets/
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Ako možete da pročitate tajne, možete koristiti sledeće linije da dobijete privilegije povezane sa svakim tokenom:
|
||||
Ako možete da čitate tajne, možete koristiti sledeće linije da dobijete privilegije povezane sa svakim tokenom:
|
||||
```bash
|
||||
for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f 7`; do echo $token; k --token $token auth can-i --list; echo; done
|
||||
```
|
||||
### Dobijanje servisnih naloga
|
||||
|
||||
Kao što je pomenuto na početku ove stranice **kada se pod pokrene, obično mu se dodeljuje servisni nalog**. Stoga, listanje servisnih naloga, njihovih dozvola i gde se nalaze može omogućiti korisniku da eskalira privilegije.
|
||||
Kao što je pomenuto na početku ove stranice **kada se pod pokrene, obično mu se dodeljuje servisni nalog**. Stoga, listanje servisnih naloga, njihovih dozvola i gde se pokreću može omogućiti korisniku da eskalira privilegije.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -328,7 +328,7 @@ kurl -v https://$APISERVER/api/v1/namespaces/<namespace>/pods/
|
||||
|
||||
### Dobijanje usluga
|
||||
|
||||
Kubernetes **usluge** se koriste za **izlaganje usluge na određenom portu i IP-u** (koji će delovati kao balansirnik opterećenja za podove koji zapravo nude uslugu). Ovo je zanimljivo znati gde možete pronaći druge usluge koje možete pokušati napasti.
|
||||
Kubernetes **usluge** se koriste za **izlaganje usluge na određenom portu i IP** (koji će delovati kao balansirnik opterećenja za podove koji zapravo nude uslugu). Ovo je zanimljivo znati gde možete pronaći druge usluge koje možete pokušati napasti.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -381,9 +381,9 @@ kurl -v https://$APISERVER/apis/extensions/v1beta1/namespaces/default/daemonsets
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Preuzmi cronjob
|
||||
### Dobijanje cronjob-a
|
||||
|
||||
Cron poslovi omogućavaju zakazivanje pokretanja poda koji će izvršiti neku radnju koristeći sintaksu sličnu crontab-u.
|
||||
Cron poslovi omogućavaju zakazivanje pokretanja poda koji će izvršiti neku radnju koristeći crontab sintaksu.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -429,7 +429,7 @@ k get CiliumClusterwideNetworkPolicies
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Dobijte sve / Sve
|
||||
### Dobij sve / Sve
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -473,7 +473,7 @@ kubectl get pod <name> [-n <namespace>] -o yaml
|
||||
>
|
||||
> `k get nodes --show-labels`
|
||||
>
|
||||
> Obično, kubernetes.io/hostname i node-role.kubernetes.io/master su dobre oznake za selektovanje.
|
||||
> Obično, kubernetes.io/hostname i node-role.kubernetes.io/master su sve dobre oznake za selekciju.
|
||||
|
||||
Zatim kreirate svoj attack.yaml fajl
|
||||
```yaml
|
||||
@@ -505,6 +505,8 @@ restartPolicy: Never
|
||||
# or using
|
||||
# node-role.kubernetes.io/master: ""
|
||||
```
|
||||
[original yaml source](https://gist.github.com/abhisek/1909452a8ab9b8383a2e94f95ab0ccba)
|
||||
|
||||
Nakon toga kreirate pod
|
||||
```bash
|
||||
kubectl apply -f attacker.yaml [-n <namespace>]
|
||||
@@ -672,7 +674,7 @@ curl --path-as-is -i -s -k -X $'POST' \
|
||||
--data-binary $'{\"apiVersion\":\"rbac.authorization.k8s.io/v1\",\"kind\":\"RoleBinding\",\"metadata\":{\"name\":\"secrets-manager-role-binding\",\"namespace\":\"default\"},\"roleRef\":{\"apiGroup\":\"rbac.authorization.k8s.io\",\"kind\":\"Role\",\"name\":\"secrets-manager-role\"},\"subjects\":[{\"apiGroup\":\"\",\"kind\":\"ServiceAccount\",\"name\":\"secrets-manager-sa\",\"namespace\":\"default\"}]}\x0a' \
|
||||
"https://$CONTROL_PLANE_HOST/apis/rbac.authorization.k8s.io/v1/$NAMESPACE/default/rolebindings?fieldManager=kubectl-client-side-apply&fieldValidation=Strict"
|
||||
```
|
||||
### Obriši vezu ulogu
|
||||
### Obriši vezu uloge
|
||||
```bash
|
||||
CONTROL_PLANE_HOST=""
|
||||
TOKEN=""
|
||||
|
||||
Reference in New Issue
Block a user