Frankandherby
↑Frank & Herby make an app - THM WriteUp
tryhackme room: https://tryhackme.com/r/room/frankandherby
Nmap Taraması
nmap taramasında 22, 3000 ve 31337 portlarının açık olduğu görülmektedir. Kubernetes ortamlarında uygulamalara dışardan erişebilmek için NodePort servisini kullanarak 30000 - 32767 portları arasında yayınlanır.
31337 portunda nginx 1.21.3 sürümünü kullanan bir uygulama çalışmaktadır.
3000 portunda rocket.chat isimli bir uygulama çalışıyor
rastgele bir kullanıcı hesabı oluşturup içerisine girildiğinde geliştiricilere ait bir yazışma görülmektedir.
uygulama için git versiyon kontrol sistem aracını kullandıkları anlaşılabilir. Bir repository oluşturmuş ve bunu açıkta bırakmış olabilir. Dizin taramasını yaygın olarak kullanılan wordlistler ile istenen dizin tespit edilemedi. Daha çok gizli dizinleri barındıran bir wordlist kullanılması gerekiyor.
Dizin içerisinde giriş bilgileri yer almaktadır. Verilen giriş bilgilerini URL decode ile çözülmesi gerekebilir. Bu bilgiler ile SSH oturum giriş bilgileri olarak da kullanılıyor. frank sudoers içerisinde yer almıyor ve yüksek yetkilerde değil. İlk user flag dosyası frank home dizini altında yer almaktadır.
Yetki Yükseltme
Pod Escape to Host
geliştiricilerin konuşmaları içerisinde microk8s aracı ile kubernetes ortamının oluşturulduğu ve microk8s kubectl
komutu ile çalıştırıldığı yer almaktaydı. microk8s kubectl auth can-i --list
komutu ile, içerisinde bulunulan bağlamda hangi yetkilere sahip olunduğu öğrenilebilir.
Çıktının yorumlanması gerekirse kısaca, tüm kaynaklar için, tüm yetkiler verilmiş.
localhost:32000/bsnginx image kullanarak hosta erişim için bir pod oluşturalım. Bu image çalışan pod içerisinde kullanılan image ve bunu öğrenmek için microk8s kubectl get pod POD_NAME -o yaml
ile görüntülenebilir. Kullanılan tek satırlık kod ile yetki yükseltilebilmektedir.
Host Mount to Pod
İkinci bir çözüm yolunda ise host makinesinin root dizini bir pod içerisine mount edilip, pod içerisinden erişim gerçekleşebilir. Bunun için bir yaml dosyası oluşturulur.
Sonra, microk8s kubectl apply -f root-pod.yaml
komutu ile pod oluşturma işlemi gerçekleştirilir. kubectl get pod
komutu ile de hatasız bir şekilde çalışmaya başladığı kontrol edilebilmektedir.
microk8s kubectl exec -it hostmount -- /bin/bash
komutu ile pod içerisine erişilir. Burada host makinesinin root dizini /opt/root içerisine mount edilecek şekilde ayarlanmıştır. Bu yüzden root.txt dosyası root dizini altında bulunduğundan /opt/root dizini host makinesinin / dizinini göstermektedir.
note
Farklı çözüm yöntemlerinde gördüklerim, kubernetes enumeration araçları kullanarak, zaten sistemde varolan yetkilendirilmiş (privileged) pod tespit ederek bu pod üzerinden işlem yapılabilir.
-A parametresi oluşturulmuş tüm namespaclerdeki podları listelemek için kullanılır. Burada diğer namespaceler içerisinde çalışan podları araştırıp yetkileri ve ayarları kontrol edilerek çözüme gidilebilir. Ancak, yetki kısıtlaması olmamasından dolayı bu adıma gerek duyulmamaktadır.
Kaynaklar
- https://exploit-notes.hdks.org/exploit/container/kubernetes/microk8s-pentesting/
- https://owasp.org/www-project-kubernetes-top-ten/2022/en/src/K04-policy-enforcement
- https://www.container-security.site/general_information/tools_list.html