Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB

This commit is contained in:
Translator
2025-01-22 23:09:46 +00:00
parent 683aed026a
commit 447555ac8f
5 changed files with 46 additions and 82 deletions
+2 -1
View File
@@ -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)
@@ -10,18 +10,18 @@ Ucz się i ćwicz Hacking GCP: <img src="../../../.gitbook/assets/image (2) (1).
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **Podziel się sztuczkami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
</details>
{% endhint %}
## Azure CosmosDB
**Azure Cosmos DB** to w pełni **zarządzana baza danych NoSQL, relacyjna i wektorowa**, oferująca czasy odpowiedzi w milisekundach, automatyczną skalowalność i dostępność wspieraną SLA z bezpieczeństwem na poziomie przedsiębiorstwa. Umożliwia szybszy rozwój aplikacji dzięki gotowej dystrybucji danych w wielu regionach, otwartym API, SDK dla popularnych języków oraz funkcjom bazy danych AI, takim jak zintegrowane wsparcie wektorowe i bezproblemowa integracja z Azure AI.
**Azure Cosmos DB** to w pełni **zarządzana baza danych NoSQL, relacyjna i wektorowa**, oferująca czasy odpowiedzi w milisekundach, automatyczną skalowalność i dostępność wspieraną SLA z bezpieczeństwem na poziomie przedsiębiorstwa. Umożliwia szybszy rozwój aplikacji dzięki gotowej dystrybucji danych w wielu regionach, otwartym API, SDK dla popularnych języków oraz funkcjom bazy danych AI, takim jak zintegrowane wsparcie dla wektorów i bezproblemowa integracja z Azure AI.
Azure Cosmos DB oferuje wiele API baz danych do modelowania danych ze świata rzeczywistego przy użyciu dokumentów, relacyjnych, klucz-wartość, grafowych i modeli danych kolumnowych, a te API to NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin i Table.
Azure Cosmos DB oferuje wiele API baz danych do modelowania danych z rzeczywistego świata przy użyciu dokumentów, relacyjnych, klucz-wartość, grafowych i modeli danych kolumnowych, a te API to NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin i Table.
Jednym z kluczowych aspektów CosmosDB jest Azure Cosmos Account. **Azure Cosmos Account** działa jako punkt wejścia do baz danych. Konto określa kluczowe ustawienia, takie jak globalna dystrybucja, poziomy spójności oraz konkretne API do użycia, takie jak NoSQL. Dzięki kontu możesz skonfigurować globalną replikację, aby zapewnić dostępność danych w wielu regionach dla niskiej latencji. Dodatkowo możesz wybrać poziom spójności, który równoważy wydajność i dokładność danych, z opcjami od silnej do ostatecznej spójności.
Jednym z kluczowych aspektów CosmosDB jest Azure Cosmos Account. **Azure Cosmos Account** działa jako punkt wejścia do baz danych. Konto określa kluczowe ustawienia, takie jak globalna dystrybucja, poziomy spójności i konkretne API do użycia, takie jak NoSQL. Dzięki kontu możesz skonfigurować globalną replikację, aby zapewnić dostępność danych w wielu regionach dla niskiej latencji. Dodatkowo możesz wybrać poziom spójności, który równoważy wydajność i dokładność danych, z opcjami od silnej do ostatecznej spójności.
### NoSQL (sql)
API NoSQL Azure Cosmos DB to API oparte na dokumentach, które używa JSON jako formatu danych. Oferuje składnię zapytań podobną do SQL do zapytań obiektów JSON, co czyni je odpowiednim do pracy z danymi strukturalnymi i półstrukturalnymi. Punkt końcowy usługi to:
@@ -36,7 +36,7 @@ https://<Account-Name>.documents.azure.com:443/
W ramach konta możesz utworzyć jedną lub więcej baz danych, które służą jako logiczne grupy kontenerów. Baza danych działa jako granica dla zarządzania zasobami i uprawnieniami użytkowników. Bazy danych mogą dzielić przydzieloną przepustowość między swoimi kontenerami lub przydzielać dedykowaną przepustowość do poszczególnych kontenerów.
#### Kontenery
Podstawową jednostką przechowywania danych jest kontener, który przechowuje dokumenty JSON i jest automatycznie indeksowany w celu efektywnego zapytania. Kontenery są elastycznie skalowalne i rozproszone w obrębie partycji, które są określane przez klucz partycji zdefiniowany przez użytkownika. Klucz partycji jest kluczowy dla zapewnienia optymalnej wydajności i równomiernego rozkładu danych. Na przykład, kontener może przechowywać dane klientów, z "customerId" jako kluczem partycji.
Podstawową jednostką przechowywania danych jest kontener, który przechowuje dokumenty JSON i jest automatycznie indeksowany w celu efektywnego zapytania. Kontenery są elastycznie skalowalne i rozproszone w obrębie partycji, które są określane przez zdefiniowany przez użytkownika klucz partycji. Klucz partycji jest kluczowy dla zapewnienia optymalnej wydajności i równomiernego rozkładu danych. Na przykład, kontener może przechowywać dane klientów, z "customerId" jako kluczem partycji.
#### Enumeracja
@@ -203,7 +203,7 @@ print("Document inserted.")
{% endcode %}
### MongoDB
API MongoDB NoSQL to API oparta na dokumentach, która używa formatu danych BSON (Binary JSON) podobnego do JSON. Oferuje język zapytań z możliwościami agregacji, co czyni go odpowiednim do pracy z danymi strukturalnymi, półstrukturalnymi i niestrukturalnymi. Punkt końcowy usługi zazwyczaj ma ten format:
API NoSQL MongoDB to API oparty na dokumentach, który używa formatu danych BSON (Binary JSON) podobnego do JSON. Oferuje język zapytań z możliwościami agregacji, co czyni go odpowiednim do pracy z danymi strukturalnymi, półstrukturalnymi i niestrukturalnymi. Punkt końcowy usługi zazwyczaj ma ten format:
{% code overflow="wrap" %}
```bash
@@ -215,7 +215,7 @@ mongodb://<hostname>:<port>/<database>
W MongoDB możesz utworzyć jedną lub więcej baz danych w ramach instancji. Każda baza danych służy jako logiczna grupa kolekcji i zapewnia granicę dla organizacji i zarządzania zasobami. Bazy danych pomagają oddzielić i zarządzać danymi logicznie, na przykład dla różnych aplikacji lub projektów.
#### Kolekcje
Podstawową jednostką przechowywania danych w MongoDB jest kolekcja, która zawiera dokumenty i jest zaprojektowana do efektywnego zapytania oraz elastycznego projektowania schematu. Kolekcje są elastycznie skalowalne i mogą obsługiwać operacje o wysokiej przepustowości w rozproszonym środowisku na wielu węzłach.
Podstawową jednostką przechowywania danych w MongoDB jest kolekcja, która zawiera dokumenty i jest zaprojektowana do efektywnego zapytywania oraz elastycznego projektowania schematu. Kolekcje są elastycznie skalowalne i mogą obsługiwać operacje o wysokiej przepustowości w rozproszonym środowisku na wielu węzłach.
#### Enumeracja
@@ -350,7 +350,7 @@ print(f"Inserted document with ID: {result.inserted_id}")
* Reszta bazy danych tutaj, tabele, cassandra, gremlin...
* Zwróć uwagę na post eksploatacji "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" oraz definicje ról, ponieważ tutaj może być eskalacja uprawnień
* Zwróć uwagę na przywracanie
* Zwróć uwagę na przywrócenia
{% hint style="success" %}
Ucz się i ćwicz Hacking AWS:<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">\
@@ -362,7 +362,7 @@ Ucz się i ćwicz Hacking GCP: <img src="../../../.gitbook/assets/image (2) (1).
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.
</details>
{% endhint %}
@@ -1,37 +0,0 @@
# Az - VMs Unath
{{#include ../../../banners/hacktricks-training.md}}
## Maszyny Wirtualne
Aby uzyskać więcej informacji na temat Maszyn Wirtualnych Azure, sprawdź:
{{#ref}}
../az-services/vms/
{{#endref}}
### Wystawiona podatna usługa
Usługa sieciowa, która jest podatna na pewne RCE.
### Publiczne obrazy galerii
Publiczny obraz może zawierać sekrety:
```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']"
```
### Public Extensions
To byłoby bardziej dziwne, ale nie niemożliwe. Duża firma mogłaby umieścić rozszerzenie z wrażliwymi danymi w środku:
```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}}
@@ -34,7 +34,7 @@ verbs: ["*"]
W RBAC niektóre uprawnienia niosą ze sobą istotne ryzyko:
1. **`create`:** Przyznaje możliwość tworzenia dowolnego zasobu klastra, co stwarza ryzyko eskalacji uprawnień.
2. **`list`:** Umożliwia wyświetlanie wszystkich zasobów, co może prowadzić do wycieku wrażliwych danych.
2. **`list`:** Umożliwia wylistowanie wszystkich zasobów, co może prowadzić do wycieku wrażliwych danych.
3. **`get`:** Zezwala na dostęp do sekretów z kont serwisowych, co stanowi zagrożenie dla bezpieczeństwa.
```yaml
apiVersion: rbac.authorization.k8s.io/v1
@@ -140,7 +140,7 @@ _Możesz znaleźć przykład, jak stworzyć/wykorzystać poprzednie konfiguracje
### Pod Create - Przenieś do chmury
Jeśli możesz **stworzyć** **pod** (i opcjonalnie **konto usługi**), możesz być w stanie **uzyskać uprawnienia w środowisku chmurowym** poprzez **przypisanie ról chmurowych do poda lub konta usługi** i następnie uzyskanie do niego dostępu.\
Jeśli możesz **stworzyć** **pod** (i opcjonalnie **konto usługi**), możesz być w stanie **uzyskać uprawnienia w środowisku chmurowym** poprzez **przypisanie ról chmurowych do podu lub konta usługi** i następnie uzyskanie do niego dostępu.\
Co więcej, jeśli możesz stworzyć **pod z przestrzenią nazw sieci hosta**, możesz **ukraść rolę IAM** instancji **węzła**.
Aby uzyskać więcej informacji, sprawdź:
@@ -151,9 +151,9 @@ pod-escape-privileges.md
### **Utwórz/Zaktualizuj wdrożenie, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs i Cronjobs**
Możliwe jest nadużycie tych uprawnień do **stworzenia nowego poda** i uzyskania uprawnień, jak w poprzednim przykładzie.
Możliwe jest nadużycie tych uprawnień do **stworzenia nowego podu** i uzyskania uprawnień, jak w poprzednim przykładzie.
Poniższy yaml **tworzy daemonset i eksfiltruje token SA** wewnątrz poda:
Poniższy yaml **tworzy daemonset i eksfiltruje token SA** wewnątrz podu:
```yaml
apiVersion: apps/v1
kind: DaemonSet
@@ -199,13 +199,13 @@ kubectl exec -it <POD_NAME> -n <NAMESPACE> -- sh
```
### port-forward
To uprawnienie pozwala na **przekierowanie jednego lokalnego portu na jeden port w określonym podzie**. Ma to na celu ułatwienie debugowania aplikacji działających wewnątrz poda, ale atakujący może to wykorzystać, aby uzyskać dostęp do interesujących (jak bazy danych) lub podatnych aplikacji (webów?) wewnątrz poda:
To uprawnienie pozwala na **przekierowanie jednego lokalnego portu na jeden port w określonym podzie**. Ma to na celu ułatwienie debugowania aplikacji działających wewnątrz poda, ale atakujący może to wykorzystać, aby uzyskać dostęp do interesujących (jak DB) lub podatnych aplikacji (webów?) wewnątrz poda:
```
kubectl port-forward pod/mypod 5000:5000
```
### Hosts Writable /var/log/ Escape
Jak [**wskazano w tych badaniach**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), jeśli możesz uzyskać dostęp lub utworzyć pod z **zamontowanym katalogiem `/var/log/` hosta**, możesz **uciec z kontenera**.\
As [**wskazano w tym badaniu**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), jeśli możesz uzyskać dostęp lub utworzyć pod z **zamontowanym katalogiem `/var/log/` hosta**, możesz **uciec z kontenera**.\
Dzieje się tak, ponieważ gdy **Kube-API próbuje uzyskać logi** kontenera (używając `kubectl logs <pod>`), **żąda pliku `0.log`** podu, korzystając z punktu końcowego `/logs/` usługi **Kubelet**.\
Usługa Kubelet udostępnia punkt końcowy `/logs/`, który zasadniczo **udostępnia system plików `/var/log` kontenera**.
@@ -247,7 +247,7 @@ allowedHostPaths:
- pathPrefix: "/foo"
readOnly: true
```
Który miał na celu zapobieganie ucieczkom, jak te poprzednie, poprzez zamiast używania montażu hostPath, użycie PersistentVolume i PersistentVolumeClaim do zamontowania folderu hosta w kontenerze z dostępem do zapisu:
Które miało na celu zapobieganie ucieczkom, jak te poprzednie, poprzez zamiast używania montażu hostPath, użycie PersistentVolume i PersistentVolumeClaim do zamontowania folderu hosta w kontenerze z dostępem do zapisu:
```yaml
apiVersion: v1
kind: PersistentVolume
@@ -295,7 +295,7 @@ name: task-pv-storage-vol
```
### **Podszywanie się pod uprzywilejowane konta**
Z uprawnieniem [**podszywania się pod użytkownika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), atakujący może podszyć się pod uprzywilejowane konto.
Z uprawnieniem [**podszywania się pod użytkownika**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), atakujący może podszywać się pod uprzywilejowane konto.
Wystarczy użyć parametru `--as=<username>` w poleceniu `kubectl`, aby podszyć się pod użytkownika, lub `--as-group=<group>`, aby podszyć się pod grupę:
```bash
@@ -379,15 +379,15 @@ $ kubectl get secret stolen-admin-sa-token --token=$SECRETS_MANAGER_TOKEN -o jso
```
Zauważ, że jeśli masz pozwolenie na tworzenie i odczytywanie sekretów w danej przestrzeni nazw, konto usługi ofiary również musi znajdować się w tej samej przestrzeni nazw.
### Odczytywanie sekretu brute-forcing tokenów
### Odczytywanie sekretu brute-forcing tokenów ID
Podczas gdy atakujący posiadający token z uprawnieniami do odczytu wymaga dokładnej nazwy sekretu, aby go użyć, w przeciwieństwie do szerszego przywileju _**wyliczania sekretów**_, nadal istnieją luki. Domyślne konta usług w systemie mogą być wyliczane, z których każde jest powiązane z sekretem. Te sekrety mają strukturę nazwy: statyczny prefiks, a następnie losowy pięcioznakowy alfanumeryczny token (z wyłączeniem niektórych znaków) zgodnie z [kodem źródłowym](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83).
Podczas gdy atakujący posiadający token z uprawnieniami do odczytu wymaga dokładnej nazwy sekretu, aby go użyć, w przeciwieństwie do szerszego przywileju _**wyliczania sekretów**_, nadal istnieją luki. Domyślne konta usług w systemie mogą być wyliczane, z każdym powiązanym z sekretem. Te sekrety mają strukturę nazwy: statyczny prefiks, a następnie losowy pięcioznakowy alfanumeryczny token (z wyłączeniem niektórych znaków) zgodnie z [kodem źródłowym](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83).
Token jest generowany z ograniczonego zestawu 27 znaków (`bcdfghjklmnpqrstvwxz2456789`), a nie z pełnego zakresu alfanumerycznego. To ograniczenie zmniejsza całkowitą liczbę możliwych kombinacji do 14 348 907 (27^5). W związku z tym atakujący mógłby wykonać atak brute-force, aby wydedukować token w ciągu kilku godzin, co potencjalnie prowadziłoby do eskalacji uprawnień poprzez uzyskanie dostępu do wrażliwych kont usług.
### Żądania podpisania certyfikatu
Jeśli masz czasowniki **`create`** w zasobie `certificatesigningrequests` (lub przynajmniej w `certificatesigningrequests/nodeClient`). Możesz **utworzyć** nowy CeSR dla **nowego węzła**.
Jeśli masz czasowniki **`create`** w zasobie `certificatesigningrequests` (lub przynajmniej w `certificatesigningrequests/nodeClient`). Możesz **utworzyć** nowy CeSR dla **nowego węzła.**
Zgodnie z [dokumentacją, możliwe jest automatyczne zatwierdzanie tych żądań](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), więc w takim przypadku **nie potrzebujesz dodatkowych uprawnień**. Jeśli nie, musiałbyś być w stanie zatwierdzić żądanie, co oznacza aktualizację w `certificatesigningrequests/approval` i `approve` w `signers` z resourceName `<signerNameDomain>/<signerNamePath>` lub `<signerNameDomain>/*`
@@ -424,7 +424,7 @@ verbs:
```
Więc, z nowym zatwierdzonym CSR węzła, możesz **wykorzystać** specjalne uprawnienia węzłów do **kradzieży sekretów** i **eskalacji uprawnień**.
W [**tym poście**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) i [**tym**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) konfiguracja GKE K8s TLS Bootstrap jest skonfigurowana z **automatycznym podpisywaniem** i jest wykorzystywana do generowania poświadczeń nowego węzła K8s, a następnie wykorzystywania ich do eskalacji uprawnień poprzez kradzież sekretów.\
W [**tym poście**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) i [**tym**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) konfiguracja GKE K8s TLS Bootstrap jest skonfigurowana z **automatycznym podpisywaniem** i jest wykorzystywana do generowania poświadczeń nowego węzła K8s, a następnie wykorzystywana do eskalacji uprawnień poprzez kradzież sekretów.\
Jeśli **masz wspomniane uprawnienia, możesz zrobić to samo**. Zauważ, że pierwszy przykład omija błąd uniemożliwiający nowemu węzłowi dostęp do sekretów wewnątrz kontenerów, ponieważ **węzeł może uzyskać dostęp tylko do sekretów kontenerów zamontowanych na nim.**
Sposób na obejście tego to po prostu **utworzenie poświadczeń węzła dla nazwy węzła, na którym zamontowany jest kontener z interesującymi sekretami** (ale sprawdź, jak to zrobić w pierwszym poście):
@@ -433,7 +433,7 @@ Sposób na obejście tego to po prostu **utworzenie poświadczeń węzła dla na
```
### AWS EKS aws-auth configmaps
Podmioty, które mogą modyfikować **`configmaps`** w przestrzeni nazw kube-system na klastrach EKS (muszą być w AWS), mogą uzyskać uprawnienia administratora klastra, nadpisując **aws-auth** configmap.\
Podmioty, które mogą modyfikować **`configmaps`** w przestrzeni nazw kube-system na klastrach EKS (muszą być w AWS), mogą uzyskać uprawnienia administratora klastra, nadpisując configmap **aws-auth**.\
Potrzebne czasowniki to **`update`** i **`patch`**, lub **`create`**, jeśli configmap nie został utworzony:
```bash
# Check if config map exists
@@ -481,7 +481,7 @@ groups:
### Eskalacja w GKE
Istnieją **2 sposoby przypisania uprawnień K8s do zasad GCP**. W każdym przypadku zasada również potrzebuje uprawnienia **`container.clusters.get`**, aby móc zebrać dane uwierzytelniające do uzyskania dostępu do klastra, lub będziesz musiał **wygenerować własny plik konfiguracyjny kubectl** (postępuj zgodnie z następującym linkiem).
Istnieją **2 sposoby przypisania uprawnień K8s do zasad GCP**. W każdym przypadku zasada również potrzebuje uprawnienia **`container.clusters.get`**, aby móc zebrać poświadczenia do uzyskania dostępu do klastra, lub będziesz musiał **wygenerować własny plik konfiguracyjny kubectl** (postępuj zgodnie z następującym linkiem).
> [!WARNING]
> Rozmawiając z punktem końcowym API K8s, **token uwierzytelniający GCP zostanie wysłany**. Następnie GCP, przez punkt końcowy API K8s, najpierw **sprawdzi, czy zasada** (po e-mailu) **ma jakikolwiek dostęp wewnątrz klastra**, a następnie sprawdzi, czy ma **jakikolwiek dostęp przez GCP IAM**.\
@@ -501,7 +501,7 @@ Zasady, które mogą **tworzyć TokenRequests** (`serviceaccounts/token`) podcza
### ephemeralcontainers
Zasady, które mogą **`aktualizować`** lub **`patchować`** **`pods/ephemeralcontainers`**, mogą uzyskać **wykonanie kodu na innych podach**, a potencjalnie **wyjść** na ich węzeł, dodając tymczasowy kontener z uprzywilejowanym securityContext.
Zasady, które mogą **`aktualizować`** lub **`patchować`** **`pods/ephemeralcontainers`**, mogą uzyskać **wykonanie kodu na innych podach**, a potencjalnie **wyjść** na ich węzeł, dodając kontener ephemerowy z uprzywilejowanym securityContext.
### ValidatingWebhookConfigurations lub MutatingWebhookConfigurations
@@ -526,7 +526,7 @@ Masz przykład, jak uzyskać [**RCE rozmawiając autoryzowanym z API Kubelet tut
### Usuwanie podów + węzły nieschedulowalne
Zasady, które mogą **usuwać pody** (`delete` czasownik nad zasobem `pods`), lub **ewikować pody** (`create` czasownik nad zasobem `pods/eviction`), lub **zmieniać status poda** (dostęp do `pods/status`) i mogą **czynić inne węzły nieschedulowalnymi** (dostęp do `nodes/status`) lub **usuwać węzły** (`delete` czasownik nad zasobem `nodes`) i mają kontrolę nad pod, mogą **ukraść pody z innych węzłów**, aby były **wykonywane** w **skompromentowanym** **węźle** i atakujący może **ukraść tokeny** z tych podów.
Zasady, które mogą **usuwać pody** (`delete` czasownik nad `pods` resource), lub **ewikować pody** (`create` czasownik nad `pods/eviction` resource), lub **zmieniać status poda** (dostęp do `pods/status`) i mogą **czynić inne węzły nieschedulowalnymi** (dostęp do `nodes/status`) lub **usuwać węzły** (`delete` czasownik nad `nodes` resource) i mają kontrolę nad pod, mogą **ukraść pody z innych węzłów**, aby były **wykonywane** w **skompromentowanym** **węźle** i atakujący może **ukraść tokeny** z tych podów.
```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,25 +543,25 @@ Podmioty, które mogą **modyfikować** **`services/status`**, mogą ustawić po
### Status węzłów i podów
Podmioty z uprawnieniami **`update`** lub **`patch`** do `nodes/status` lub `pods/status` mogą modyfikować etykiety, aby wpłynąć na wymuszone ograniczenia harmonogramowania.
Podmioty z uprawnieniami **`update`** lub **`patch`** do `nodes/status` lub `pods/status` mogą modyfikować etykiety, aby wpłynąć na wymogi dotyczące harmonogramowania.
## Wbudowana ochrona przed eskalacją uprawnień
## Wbudowana zapobieganie eskalacji uprawnień
Kubernetes ma [wbudowany mechanizm](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) zapobiegający eskalacji uprawnień.
System ten zapewnia, że **użytkownicy nie mogą podnosić swoich uprawnień poprzez modyfikację ról lub powiązań ról**. Egzekwowanie tej zasady odbywa się na poziomie API, co zapewnia zabezpieczenie nawet wtedy, gdy autoryzator RBAC jest nieaktywny.
System ten zapewnia, że **użytkownicy nie mogą podnosić swoich uprawnień poprzez modyfikację ról lub powiązań ról**. Egzekwowanie tej zasady odbywa się na poziomie API, co stanowi zabezpieczenie nawet wtedy, gdy autoryzator RBAC jest nieaktywny.
Zasada ta stanowi, że **użytkownik może tworzyć lub aktualizować rolę tylko wtedy, gdy posiada wszystkie uprawnienia, które ta rola obejmuje**. Ponadto zakres istniejących uprawnień użytkownika musi być zgodny z zakresem roli, którą próbuje utworzyć lub zmodyfikować: albo w skali klastra dla ClusterRoles, albo ograniczony do tej samej przestrzeni nazw (lub w skali klastra) dla Ról.
> [!WARNING]
> Istnieje wyjątek od powyższej zasady. Jeśli podmiot ma **czasownik `escalate`** nad **`roles`** lub **`clusterroles`**, może zwiększyć uprawnienia ról i clusterroles, nawet nie mając tych uprawnień.
### **Pobierz i zmodyfikuj RoleBindings/ClusterRoleBindings**
### **Pobierz i Zaktualizuj RoleBindings/ClusterRoleBindings**
> [!CAUTION]
> **Wygląda na to, że ta technika działała wcześniej, ale według moich testów już nie działa z tego samego powodu wyjaśnionego w poprzedniej sekcji. Nie możesz utworzyć/modyfikować rolebindingu, aby przyznać sobie lub innemu SA jakieś uprawnienia, jeśli ich już nie masz.**
> **Wygląda na to, że ta technika działała wcześniej, ale według moich testów już nie działa z tego samego powodu, co wyjaśniono w poprzedniej sekcji. Nie możesz utworzyć/modyfikować rolebindingu, aby przyznać sobie lub innemu SA jakieś uprawnienia, jeśli ich już nie masz.**
Uprawnienie do tworzenia Rolebindings pozwala użytkownikowi na **wiązać role z kontem usługi**. To uprawnienie może potencjalnie prowadzić do eskalacji uprawnień, ponieważ **pozwala użytkownikowi przypisać uprawnienia administratora do skompromitowanego konta usługi.**
Uprawnienie do tworzenia Rolebindings pozwala użytkownikowi na **powiązanie ról z kontem usługi**. To uprawnienie może potencjalnie prowadzić do eskalacji uprawnień, ponieważ **pozwala użytkownikowi powiązać uprawnienia administratora z skompromitowanym kontem usługi.**
## Inne ataki
@@ -670,15 +670,15 @@ Powyższy fragment zastępuje pierwszy obraz kontenera w każdym podzie na `rewa
### **Wyłączenie automatycznego montowania tokenów konta usługi**
- **Pody i konta usługi**: Domyślnie pody montują token konta usługi. Aby zwiększyć bezpieczeństwo, Kubernetes pozwala na wyłączenie tej funkcji automatycznego montowania.
- **Jak zastosować**: Ustaw `automountServiceAccountToken: false` w konfiguracji konta usługi lub podów, począwszy od wersji Kubernetes 1.6.
- **Jak zastosować**: Ustaw `automountServiceAccountToken: false` w konfiguracji kont usług lub podów począwszy od wersji Kubernetes 1.6.
### **Ograniczone przypisanie użytkowników w RoleBindings/ClusterRoleBindings**
- **Selektywne włączenie**: Upewnij się, że tylko niezbędni użytkownicy są włączani w RoleBindings lub ClusterRoleBindings. Regularnie audytuj i usuwaj nieistotnych użytkowników, aby utrzymać ścisłe bezpieczeństwo.
### **Role specyficzne dla przestrzeni nazw zamiast ról ogólnych**
### **Role specyficzne dla przestrzeni nazw zamiast ról ogólnoklastrowych**
- **Role vs. ClusterRoles**: Preferuj używanie Ról i RoleBindings dla uprawnień specyficznych dla przestrzeni nazw, zamiast ClusterRoles i ClusterRoleBindings, które mają zastosowanie w całym klastrze. Takie podejście oferuje dokładniejszą kontrolę i ogranicza zakres uprawnień.
- **Role vs. ClusterRoles**: Preferuj używanie ról i RoleBindings dla uprawnień specyficznych dla przestrzeni nazw zamiast ClusterRoles i ClusterRoleBindings, które mają zastosowanie w całym klastrze. Takie podejście oferuje dokładniejszą kontrolę i ogranicza zakres uprawnień.
### **Używaj narzędzi automatycznych**
@@ -8,11 +8,11 @@ Jeśli masz skompromitowany dostęp do maszyny, użytkownik może mieć dostęp
W tym folderze możesz znaleźć pliki konfiguracyjne z **tokenami i konfiguracjami do połączenia z serwerem API**. W tym folderze możesz również znaleźć folder cache z informacjami wcześniej pobranymi.
Jeśli skompromitowałeś pod w środowisku Kubernetes, są inne miejsca, w których możesz znaleźć tokeny i informacje o bieżącym środowisku K8:
Jeśli skompromitowałeś pod w środowisku Kubernetes, są inne miejsca, gdzie możesz znaleźć tokeny i informacje o bieżącym środowisku K8:
### Service Account Tokens
Zanim przejdziesz dalej, jeśli nie wiesz, co to jest usługa w Kubernetes, sugeruję **przeczytać ten link i zapoznać się przynajmniej z informacjami o architekturze Kubernetes.**
Zanim przejdziesz dalej, jeśli nie wiesz, czym jest usługa w Kubernetes, sugeruję **przeczytać ten link i zapoznać się przynajmniej z informacjami o architekturze Kubernetes.**
Z dokumentacji Kubernetes [documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server):
@@ -35,7 +35,7 @@ zawiera pliki:
Teraz, gdy masz token, możesz znaleźć serwer API w zmiennej środowiskowej **`KUBECONFIG`**. Aby uzyskać więcej informacji, uruchom `(env | set) | grep -i "kuber|kube`**`"`**
Token konta usługi jest podpisywany kluczem znajdującym się w pliku **sa.key** i weryfikowany przez **sa.pub**.
Token konta usługi jest podpisywany przez klucz znajdujący się w pliku **sa.key** i weryfikowany przez **sa.pub**.
Domyślna lokalizacja w **Kubernetes**:
@@ -51,7 +51,7 @@ _**Hot pods to**_ pody zawierające token konta usługi z uprawnieniami. Token k
## RBAC
Jeśli nie wiesz, co to jest **RBAC**, **przeczytaj tę sekcję**.
Jeśli nie wiesz, czym jest **RBAC**, **przeczytaj tę sekcję**.
## GUI Applications
@@ -119,7 +119,7 @@ Domyślnie, APISERVER komunikuje się z schematem `https://`
```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
```
> jeśli brak `https://` w adresie URL, możesz otrzymać błąd podobny do Bad Request.
> jeśli brak `https://` w adresie URL, możesz otrzymać błąd typu Bad Request.
Możesz znaleźć [**oficjalną ściągawkę kubectl tutaj**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). Celem poniższych sekcji jest przedstawienie w uporządkowany sposób różnych opcji do enumeracji i zrozumienia nowego K8s, do którego uzyskałeś dostęp.
@@ -163,7 +163,7 @@ kubectl config set-credentials USER_NAME \
```
### Pobierz obsługiwane zasoby
Dzięki tym informacjom będziesz wiedzieć, wszystkie usługi, które możesz wylistować
Dzięki tym informacjom będziesz wiedzieć, wszystkie usługi, które możesz wymienić
{{#tabs }}
{{#tab name="kubectl" }}
@@ -272,7 +272,7 @@ for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f
```
### Uzyskaj konta serwisowe
Jak omówiono na początku tej strony **gdy pod jest uruchamiany, zazwyczaj przypisywane jest do niego konto serwisowe**. Dlatego wylistowanie kont serwisowych, ich uprawnień i miejsc, w których działają, może umożliwić użytkownikowi eskalację uprawnień.
Jak omówiono na początku tej strony, **gdy uruchamiany jest pod, zazwyczaj przypisywane jest do niego konto serwisowe**. Dlatego wylistowanie kont serwisowych, ich uprawnień i miejsc, w których działają, może umożliwić użytkownikowi eskalację uprawnień.
{{#tabs }}
{{#tab name="kubectl" }}
@@ -417,7 +417,7 @@ kurl -v https://$APISERVER/api/v1/namespaces/${NAMESPACE}/configmaps
{{#endtab }}
{{#endtabs }}
### Pobierz polityki sieciowe / Polityki sieciowe Cilium
### Pobierz polityki sieciowe / polityki sieciowe Cilium
{{#tabs }}
{{#tab name="Pierwsza zakładka" }}
@@ -461,7 +461,7 @@ k top pod --all-namespaces
## Interakcja z klastrem bez użycia kubectl
Widząc, że kontrolny plane Kubernetes udostępnia API REST-ful, możesz ręcznie tworzyć żądania HTTP i wysyłać je za pomocą innych narzędzi, takich jak **curl** lub **wget**.
Widząc, że kontrola Kubernetes udostępnia API REST-ful, możesz ręcznie tworzyć żądania HTTP i wysyłać je za pomocą innych narzędzi, takich jak **curl** lub **wget**.
### Ucieczka z poda
@@ -513,7 +513,7 @@ Teraz możesz przełączyć się na utworzony pod w następujący sposób
```bash
kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file
```
I na koniec chrootujesz do systemu węzła
A na koniec chrootujesz do systemu węzła
```bash
chroot /root /bin/bash
```