[TR] TryHackMe — Skynet Write-Up
(Nisan 2020)
Herkese merhaba, ben Anıl Çelik. Bugün sizlerle TryHackMe platformunda OSCP learning path içerisinde bulunan Skynet isimli makinenin çözümünü paylaşacağım. Bu makinede, SMB servisi üzerinden elde edeceğimiz bilgilerle RFI zafiyetinden faydalanarak makineye bağlanıp daha sonra CMS paneline ait bir exploit ile içerde yetkilerimizi yükseltmeye çalışacağız. Daha fazla uzatmadan çözüme geçelim.
- İlk olarak, her zamanki gibi nmap taramasıyla başlayalım:
nmap taraması sonucunda dikkatimizi çeken birkaç şey var; 80 portundaki HTTP servisi üzerinde bir Apache Web Server ve SquirrelMail adında bir Mail servisi çalışıyor, 110 portunda bir POP3 mail servisi bulunmakta ve son olarak 139 ve 445 portlarında da SMB servisi çalışmakta. Öncelikle 80 portundan enumeration işlemimize başlayalım:
- 80 portuna gittiğimizde varsayılan olarak böyle bir sayfayla karşılaşıyoruz. Nmap sonucunda bize mail servisinin çalıştığı dizin hakkında bir ipucu verilmiş olsa da arka tarafta gizlenmiş olabilecek diğer şeylere de bakmak için gobuster ile bir dizin taraması yapalım:
- Burada bulunan admin, config, css ve js dizinlerine gitmeye çalıştım ancak gerekli izinlere sahip olmadığım için dizinlere erişemedim. Ancak squirrelmail dizinine gittiğimde mail servisinin giriş sayfasıyla karşılaştım:
- Buradaki SquirrelMail version 1.4.23 yazısını gördükten sonra aklıma gelen ilk şey, servisin sahip olduğu versiyona dair bir exploitin olup olmadığını araştırmak oldu, bunun için searchsploit üzerinden bir arama yaptım:
- Ancak bir şey çıkmadı. Burada biraz düşündükten sonra SMB servisine ilerlemeye karar verdim:
- smbclient -L <host> komutu ile, SMB üzerinde çalışan servisleri listelemeye çalıştım, buradan anonymous adında bir dizin olduğunu görüyoruz. Sonrasında, sırasıyla servis üzerindeki izinleri görüntülemeye çalıştım ve buradaki dizinleri recursive olarak sunucudan local ortamıma indirmeye çalıştım ancak çalışmadı. En sonunda direk anonymous isimli share’e bağlanmaya çalıştığımda işlem başarılı oldu:
- Dizine eriştiğimizde, attention.txt isimli bir dosya ilgimizi çekiyor, içeriğine göz atalım:
- İçerikte, sistemde kaynaklanan bir hatadan dolayı bazı şifrelerin değiştiğini, bütün skynet kullanıcılarının bu mesajı gördükten sonra parolalarını değiştirmeleri gerektiği söyleniyor. Dikkat etmemiz gereken kısım ise, Miles Dyson ismi. Çünkü bu isim sisteme giriş yapmaya çalışırken bize username konusunda yardımcı olacak. Geri dönüp enumeration işlemine devam edelim. logs dizinine göz atalım:
- log1.txt, log2.txt, log3.txt adında 3 tane dosya var, dosya boyutlarını incelediğimizde, log1.txt isimli dosyanın boyutu diğer dosyalardan daha fazla, yani içerisinde bazı ipuçları bulabiliriz. İçeriğine göz atalım:
- Galiba bir password listesine ulaştık :) Bu parolalar Miles Dyson kullanıcısına erişirken işimize yarayabilir. Parolaları kopyaladıktan sonra, SquirrelMail servisine MilesDyson kullanıcısı ile Burp üzerinden brute-force işlemi gerçekleştirip bu parola listesi içerisinden doğru olan parolayı bulmaya çalışalım:
- Request 1 isteğinin boyutu diğerlerinden fazla olduğu için dikkatimizi çekiyor, dolayısıyla parolamız bu istek içerisinde giden parola olabilir. Giriş yapmayı deneyelim:
- Giriş başarılı :) skynet@skynet mailine sahip kullanıcıdan gelen mailin içeriği ilgi çekici:
- Mailin içeriğini görüntülediğimizde, MilesDyson isimli kullanıcının SMB giriş parolasına ulaşıyoruz :) Artık MilesDyson kullanıcısı ile SMB servisine bağlanıp ilerleyelim:
- Servise eriştiğimizde, notes adında bir dizin görüyoruz, içeriğine göz atalım:
- İçeriye girdiğimizde, adından da anlayabileceğimiz gibi important.txt isminde önemli bir not görüyoruz:
- CMS (Content Management System) yani diğer bir tabirle sistemin yönetim panelinin dizin bilgisine ulaştık. İlerleyelim:
- Burada admin paneline ulaşmak için admin, administrator, login gibi bazı default login page parametreleri deneyebiliriz ancak ben yine gobuster ile ilerlemeyi tercih ediyorum:
- Önceden de tahmin ettiğim gibi, administrator dizini geldi. İlerleyelim:
- Default login bilgileri olarak admin:admin ile giriş yapmayı denedim ancak olmadı. Sonrasında, bu servise ait bir exploit olup olmadığına baktım:
- Bir exploit bulduk, içeriğine göz atalım:
- Burayı incelediğimizde, local (LFI) veya remote (RFI) şekilde bir PHP dosyası ile inclusion işlemi yapabileceğimizi veya PHP olmayan dosyaları okuyabileceğimizi söylüyor. Aşağıda ise, kullanıma ait örnekler bulunmakta. Verilen örnek payloadları deneyip önce bir LFI zafiyeti bulmaya çalışalım:
- Görüldüğü gibi, LFI zafiyetinden yararlanarak /etc/passwd dosyasını okumayı başardık. Şimdi ise RFI zafiyetinden yararlanarak bir shell almaya çalışalım. Bunun için öncelikle local sistemimizde reverse shell dosyasının bulunduğu dizinde bir HTTP server ayaklandırarak sonrasında netcat ile gelen bağlantıları dinleyip payload’u göndererek shell almaya çalışacağız:
- Gördüğümüz gibi, RFI zafiyetinden faydalanarak bir reverse shell elde etmeyi başardık. Sonrasında girdiğim “ python -c ‘import pty;pty.spawn(“/bin/bash”)’ “ komutu ile başta elde ettiğim primitive shellden ziyade daha gelişmiş bir shell ortamına geçiş sağladım. Vakit kaybetmeden user flag’i ele geçirmeye çalışalım:
- /home/milesdyson dizini altındaki user.txt dosyasına ulaşarak user flag’i elde ettik. User flag’i elde ettikten sonra, yetkilerimi root seviyesine yükseltmek için sırasıyla yanlış konfigüre edilebilmiş olan SUID bitleri kontrol ettim, www-data kullanıcısının sudo olarak çalıştırabileceği komutlara göz attım ancak işe yarar bir şey elde edemedim. Burdan sonra pspy adı verilen, yüksek yetkilere (root) gerek duymaksızın sistem üzerinde çalışan processleri incelemeye yarayan tool’u sistem üzerinde çalıştırıp çalışan processler üzerinden yetkilerimi yükseltmeye çalışacağım. Pspy isimli tool’a buradan ulaşabilirsiniz. Pspy’i sisteme yüklemek için yine az önce ayaklandırmış olduğun HTTP sunucusunu kullanacağım:
- wget ile -nd, -np, -P ve — recursive parametrelerini kullanarak indirme işlemi yapmaya çalıştım ancak işlem başarısız oldu. Neden başarısız olduğumuzun sebebine geçmeden önce, wget içerisinde kullandığım parametrelerin açıklamalarını yapayım:
- nd: Recursive download sırasında hiyerarşik dizinlerin oluşturmasını engellemek için kullanılır.
- np: Recursive download sırasında ana dizine yükselmesini engellemek için kullanılır. Bunun kullanılmasının sebebi, sadece istediğimiz dizin altındaki dosyaların gelmesini garantine almaktır.
- P: Diğer dosyaların ve alt dizinlerin kaydedileceği lokasyon için bir prefix belirler.
- recursive: Adından da anlaşılabileceği gibi, recursive download işlemini gerçekleştirir.
- Şimdi gelelim wget işlemimizin neden başarısız olduğuna; ls -la komutu ile hem bulunduğumuz dizin üzerindeki izinlerimizi hem de dizin içerisindeki dosyalar üzerindeki izinlerimizi görüntülemeye çalıştığımızda, bulunduğumuz dizine yazma yetkimiz olmadığını görüyoruz:
- Bunun yerine, yazma yetkimizin olduğu bir dizin olan /tmp dizininde aynı işlemi gerçekleştirelim ve pspy’i çalıştıralım:
- Pspy çalıştıktan sonra ilgimi çeken ilk şey, UID=0 yani root kullanıcısı tarafından çalıştırılan cronjob işlemi oldu. Bilmeyenler için, cronjob kısaca UNIX sistemlerde zamanlanmış processler anlamına gelir. Biraz bekledikten sonra aşağıdaki logların düştüğünü görüyoruz:
- root tarafından bir /home/milesdyson/backups dizininde bir backup işlemi çalıştırılıyor. İlgili dizine gidip bash dosyasının içeriğini inceleyelim:
- Dosyayı incelediğimizde, root kullanıcısı /var/www/html dizini altındaki her şeye tar işlemi uyguluyor. Tar, Tape Archive anlamına gelen, UNIX sistemlerde kullanılan bir arşiv dosyasıdır. Buna ait bir exploit araştırdığımızda, buradaki sonuca ulaşıyoruz:
- Buradaki işlem, wildcard injection adı verilen, işleme giren dosyalar üzerinde değişiklik yapıp istediğimiz komutları çalıştırmamıza olanak sağlayan olaydır. Aynı işlemi sistem üzerinde deneyelim:
- Başka bir netcat listener açıp, cronjob’ın schedule edildiği süreye gelip işleme konmasını ve root olarak shell almayı bekliyoruz:
- Gördüğümüz gibi, cronjob çalıştı, yetkilerimizi root kullanıcısına yükselttik ve root flag’i elde ettik.
Yazımı okuduğunuz için teşekkür ederim.
Bir sonraki yazımda görüşmek üzere.