Abusing Roles/ClusterRoles in Kubernetes
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Burada bazı potansiyel olarak tehlikeli Roller ve ClusterRoller yapılandırmalarını bulabilirsiniz.
Desteklenen tüm kaynakları kubectl api-resources
ile alabileceğinizi unutmayın.
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) ve Kubernetes'te temelde ayrıcalıkları yükseltmek için 4 ana teknik vardır:
Kubernetes kümesi içinde veya dış bulutlarda daha iyi ayrıcalıklara sahip diğer kullanıcılar/gruplar/SAs ile taklit edebilme
Kubernetes kümesi içinde veya dış bulutlarda daha iyi ayrıcalıklara sahip SAs ile bulabileceğiniz veya ekleyebileceğiniz podlar oluşturma/yamanlama/çalıştırma
SAs token'larının gizli olarak saklandığı için gizli bilgileri okuma
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 podda port-forward çalıştırma yeteneğidir, çünkü bu pod içinde ilginç kaynaklara erişim sağlayabilirsiniz.
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.
RBAC'de, belirli izinler önemli riskler taşır:
create
: Herhangi bir küme kaynağı oluşturma yetkisi verir, ayrıcalık yükselmesi riski taşır.
list
: Tüm kaynakları listeleme izni verir, hassas verilerin sızdırılma potansiyeli vardır.
get
: Hizmet hesaplarından gizli bilgilere erişim izni verir, güvenlik tehdidi oluşturur.
Pod oluşturma izinlerine sahip bir saldırgan, pod'a ayrıcalıklı bir Hizmet Hesabı ekleyebilir ve Hizmet Hesabı'nı taklit etmek için token'ı çalabilir. Böylece, ayrıcalıkları etkili bir şekilde artırmış olur.
bootstrap-signer
hizmet hesabının token'ını çalacak ve bunu saldırgana gönderecek bir pod örneği:
Aşağıda bir konteynerin sahip olabileceği tüm ayrıcalıklar belirtilmiştir:
Ayrıcalıklı erişim (korumaları devre dışı bırakma ve yetenekleri ayarlama)
hostIPC ve hostPid ad alanlarını devre dışı bırakma bu, ayrıcalıkları artırmaya yardımcı olabilir
hostNetwork ad alanını devre dışı bırakma, düğümlerin bulut ayrıcalıklarını çalma ve ağlara daha iyi erişim sağlama
Konteyner içinde / ana bilgisayarları bağlama
Pod'u oluşturun:
Tek satırlık bu tweet ve bazı eklemelerle:
Şimdi node'a kaçabildiğinize göre, istismar sonrası tekniklere göz atın:
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:
Ayrıcalıklı + hostPID
Sadece ayrıcalıklı
hostPath
hostPID
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 adresinde bulabilirsiniz.
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, host network namespace ile bir pod oluşturabiliyorsanız, node örneğinin IAM rolünü ç steal edebilirsiniz.
Daha fazla bilgi için kontrol edin:
Pod Escape PrivilegesBu 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 token'ını dışarı aktarır:
pods/exec
kubernetes'te bir pod içinde bir shell'de komut çalıştırmak için kullanılan bir kaynaktır. Bu, konteynerler içinde komut çalıştırmaya veya bir shell'e girmeye olanak tanır.
Bu nedenle, bir pod'a girmek ve SA'nın token'ını çalmak veya ayrıcalıklı bir pod'a girmek, düğüme kaçmak ve düğümdeki tüm pod'ların token'larını çalmak ve (kötüye) kullanmak mümkündür:
Bu izin, bir yerel portu belirtilen pod'daki bir porta yönlendirmeye olanak tanır. Bu, bir pod içinde çalışan uygulamaları kolayca hata ayıklamak için tasarlanmıştır, ancak bir saldırgan bunu, bir pod içindeki ilginç (örneğin DB'ler) veya savunmasız uygulamalara (webler?) erişim sağlamak için kötüye kullanabilir:
As bu araştırmada belirtilmiştir, eğer hosts /var/log/
dizini montelenmiş bir pod'a erişebilir veya oluşturabilirseniz, konteynerden kaçabilirsiniz.
Bu, esasen 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çığa çıkaran /logs/
uç noktasını sunar.
Bu nedenle, konteynerin /var/log/ klasörüne 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 symlink olacak şekilde değiştirmek. Ardından, hosts shadow dosyasını dışarıya aktarabileceksiniz:
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).
Bir laboratuvar ve otomatik istismar https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts adresinde bulunabilir.
Eğer şanslıysanız ve yüksek ayrıcalıklı yetenek CAP_SYS_ADMIN
mevcutsa, klasörü rw olarak yeniden monte edebilirsiniz:
Bu araştırmada belirtildiği gibi, korumayı aşmak mümkündür:
Bu, ö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 etmeyi amaçlıyordu:
Bir kullanıcı taklit etme ayrıcalığı ile, bir saldırgan ayrıcalıklı bir hesabı taklit edebilir.
Bir kullanıcıyı taklit etmek için kubectl
komutunda --as=<username>
parametresini veya bir grubu taklit etmek için --as-group=<group>
parametresini kullanın:
Ya da REST API'sini kullanın:
Gizli anahtarları listeleme izni, bir saldırganın aslında gizli anahtarları okumasına izin verebilir REST API uç noktasına erişerek:
Okuma izinlerine sahip bir token'a sahip bir saldırgan, bunu kullanmak için sırrın tam adını gerektirirken, daha geniş sırları 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 sır ile ilişkilidir. Bu sırların bir ad yapısı vardır: statik bir ön ekin ardından belirli karakterler hariç rastgele beş karakterli alfanümerik bir token gelir kaynak koduna 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 ş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.
Eğer certificatesigningrequests
kaynağında create
fiillerine (veya en azından certificatesigningrequests/nodeClient
içinde) sahipseniz, yeni bir düğüm için yeni bir CeSR oluşturabilirsiniz.
Belgelerine göre, bu talepleri otomatik olarak onaylamak mümkündür, bu durumda ek izinlere ihtiyacınız yoktur. Aksi takdirde, talebi onaylayabilmeniz gerekir, bu da certificatesigningrequests/approval
içinde güncelleme ve signers
içinde approve
anlamına gelir; resourceName <signerNameDomain>/<signerNamePath>
veya <signerNameDomain>/*
olmalıdır.
Gerekli tüm izinlere sahip bir rol örneği:
Yeni node CSR onaylandığında, node'ların özel izinlerini istismar ederek gizli bilgileri çalabilir ve yetkileri artırabilirsiniz.
bu yazıda ve şu yazıda GKE K8s TLS Bootstrap yapılandırması otomatik imzalama ile yapılandırılmıştır ve bu, yeni bir K8s Node'un kimlik bilgilerini oluşturmak için istismar edilmekte ve ardından bu kimlik bilgileri kullanılarak gizli bilgileri çalarak yetkilerin artırılması sağlanmaktadır. Eğer belirtilen yetkilere sahipseniz aynı şeyi yapabilirsiniz. İlk örneğin, yeni bir node'un konteynerler içindeki gizli bilgilere erişimini engelleyen hatayı aştığını unutmayın çünkü bir node yalnızca üzerine monte edilmiş konteynerlerin gizli bilgilerine erişebilir.
Bunu aşmanın yolu, ilginç gizli bilgilerin monte edildiği konteynerin bulunduğu node adı için bir node kimlik bilgisi oluşturmaktır (ama bunu nasıl yapacağınızı ilk yazıda kontrol edin):
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, veya configmap oluşturulmadıysa create
'dir:
aws-auth
kullanarak kalıcılık sağlayabilir ve diğer hesaplardan kullanıcılara erişim verebilirsiniz.
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.
GCP ilkelerine K8s izinleri atamanın 2 yolu 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).
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 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 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 bu izinlere sahipse, bunu kullanabilecektir.
GCP - Container Privescİkinci yöntem, kümeye içindeki K8s izinlerini atamak ve kullanıcıyı e-posta ile tanımlamaktır (GCP hizmet hesapları dahil).
TokenRequests (serviceaccounts/token
) oluşturabilen ilkeler K8s api uç noktasıyla konuşurken SAs (bilgi buradan).
update
veya patch
pods/ephemeralcontainers
üzerinde yetkisi olan ilkeler, diğer pod'larda kod çalıştırma yeteneğine sahip olabilir ve ayrıcalıklı bir securityContext ile geçici bir konteyner ekleyerek düğümden çıkabilir.
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 yükseltebilirler.
mutatingwebhookconfigurations
örneği için bu gönderinin bu bölümüne bakın.
Sonraki bölümde okuyabileceğiniz gibi: Yerleşik Ayrıcalık Yükseltme Önleme, 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.
nodes/proxy
alt kaynağına erişimi olan ilkeler, Kubelet API aracılığıyla pod'larda kod çalıştırabilir (buna göre bu). Kubelet kimlik doğrulaması hakkında daha fazla bilgi bu sayfada:
Yetkilendirilmiş bir Kubelet API ile RCE elde etme örneğini burada bulabilirsiniz.
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 çalabilir böylece bunlar ele geçirilmiş düğümde çalıştırılır ve saldırgan bu pod'lardan token'ları çalabilir.
services/status
'u değiştirebilen yetkililer, 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 önlem, yalnızca ExternalIP hizmetlerini engellemektedir (bkz. bu).
nodes/status
veya pods/status
üzerinde update
veya patch
izinlerine sahip yetkililer, uygulanan zamanlama kısıtlamalarını etkilemek için etiketleri değiştirebilir.
Kubernetes, ayrıcalık yükseltmeyi önlemek için yerleşik bir mekanizma sunar.
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ışı olsa 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: ClusterRoles için küme genelinde veya Roles için aynı ad alanına (veya küme genelinde) sınırlı olmalıdır.
Önceki kuralda bir istisna vardır. Eğer bir yetkili roles
veya clusterroles
üzerinde escalate
fiiline sahipse, izinlere sahip olmadan bile rollerin ve clusterrollerin ayrıcalıklarını artırabilir.
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 izinleriniz yoksa, 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.
Varsayılan olarak, podlar arasındaki iletişimde herhangi bir şifreleme yoktur. Karşılıklı kimlik doğrulama, iki yönlü, poddan poda.
.yaml dosyanızı oluşturun.
YAML dosyanızı düzenleyin ve yorum satırlarını ekleyin:
Proxy'nin loglarını görüntüleyin:
Daha fazla bilgi için: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
Bir kabul kontrolörü, nesnenin kalıcı hale gelmesinden önce Kubernetes API sunucusuna yapılan istekleri yakalar, 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 privesc yapabilme ve genellikle kümede kalıcı olma imkanı sağlar.
Örnek https://blog.rewanthtammana.com/creating-malicious-admission-controllers:
Durumunu kontrol et ve hazır olup olmadığını gör:
Sonra yeni bir pod dağıtın:
ErrImagePull
hatasını gördüğünüzde, görüntü adını aşağıdaki sorgulardan biriyle kontrol edin:
Yukarıdaki resimde 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!!?
./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:
The above snippet replaces the first container image in every pod with rewanthtammana/malicious-image
.
Podlar ve Hizmet Hesapları: Varsayılan olarak, podlar bir hizmet hesabı token'ı monte eder. Güvenliği artırmak için, Kubernetes bu automount özelliğinin devre dışı bırakılmasına izin verir.
Nasıl Uygulanır: Kubernetes sürüm 1.6'dan itibaren hizmet hesapları veya podların yapılandırmasında automountServiceAccountToken: false
ayarını yapın.
Seçici Dahil Etme: Sadece gerekli kullanıcıların RoleBindings veya ClusterRoleBindings'e 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.
Roller vs. ClusterRoller: Namespace'a özel izinler için ClusterRoles ve ClusterRoleBindings yerine Roller ve RoleBindings kullanmayı tercih edin. Bu yaklaşım daha ince bir kontrol sunar ve izinlerin kapsamını sınırlar.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)