../

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.

image

31337 portunda nginx 1.21.3 sürümünü kullanan bir uygulama çalışmaktadır.

image

3000 portunda rocket.chat isimli bir uygulama çalışıyor

image

rastgele bir kullanıcı hesabı oluşturup içerisine girildiğinde geliştiricilere ait bir yazışma görülmektedir.

image

image

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.

image

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.

image

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.

image

Çı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.

image

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.

image

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.

image

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.

image

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.

image

-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