TryHackMe RootMe CTF Çözümü
                    Bu çözüm makalesinde, TryHackMe platformundaki RootMe adlı CTF’i adım adım nasıl çözeceğinizi göstereceğiz. Amaç, hedef makinede bir zafiyet bularak kullanıcı yetkilerini ele geçirmek ve en sonunda root yetkisine yükselerek makineyi tamamen kontrol etmektir.
VPN Bağlantısı ve Makineyi Başlatma
Öncelikle, TryHackMe hesabınıza giriş yapın ve RootMe odasına gidin. VPN bağlantınızın aktif ve hedef makineye erişiminizin olduğundan emin olun.
- “Join Room” butonuna tıklayarak odaya katılın.
 - “Start Machine” butonuna basarak sanal makineyi başlatın.
 

Makine başlatıldığında, size bir IP adresi verilecektir (ekran görüntüsünde 10.10.196.118 olarak görülüyor). Tüm işlemlerimizi bu IP adresi üzerinden gerçekleştireceğiz.

Servis Keşfi (Nmap Taraması)
Hedef makinenin üzerinde hangi servislerin çalıştığını öğrenmek, bir sızma testi için en önemli ilk adımdır. Bunun için Nmap aracını kullanacağız.
Terminalinizde aşağıdaki komutu çalıştırın:
sudo nmap -sV -sC -p- 10.10.196.118

- -sV: Servis versiyonlarını tespit eder.
 - -sC: Varsayılan Nmap betiklerini çalıştırır.
 - -Pn: hedefe ping atlamasını devre dışı bırakır ve host’u çevrimdışı görünse bile port taramasını doğrudan başlatır.
 
Tarama sonucunda, hedef makinede iki açık port olduğunu göreceksiniz:
- Port 22: SSH (OpenSSH 8.2p1 Ubuntu)
 - Port 80: HTTP (Apache httpd 2.4.41 Ubuntu)
 
Bu sonuçlar, ana saldırı vektörümüzün HTTP servisi olacağını gösteriyor. İlk hedefimiz, web sunucusunda bir zafiyet bulmak olacaktır.
Web Servisini İnceleme ve Gizli Dizinleri Bulma
Tarayıcınızla 80 numaralı porttaki web sitesine gidin (http://10.10.196.118/). Karşınıza root@rootme: ~# ve "Can you root me?" yazan bir sayfa çıkacaktır. Sayfanın kaynak kodunu incelediğinizde, herhangi bir ek bilgi veya ipucu olmadığını göreceksiniz. Bu durumda, sitedeki gizli dizinleri bulmak için bir araç kullanmamız gerekir.


Bu amaçla Gobuster veya Dirb gibi bir dizin tarayıcısı kullanabiliriz. Benzer bir kelime listesi kullanarak gizli dizinleri tarayacağız:
gobuster dir -u http://10.10.196.118 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
- gobuster dir: Dizin tarama modunu başlatır.
 - -u: Hedef URL’yi belirtir.
 - -w: Kullanılacak kelime listesini belirtir.
 

Tarama sonucunda /uploads, /css, /js ve /panel gibi dizinler bulunacaktır. Bu dizinler arasında en ilgi çekici olanı /uploads ve /panel dizinleridir.
/uploadsdizini, sunucuya dosya yüklemek için bir yer olabileceğini gösteriyor./paneldizini, muhtemelen bir yönetim paneli veya dosya yükleme arayüzü içeriyor.
Tarayıcınızdan http://10.10.196.118/uploads/ adresine gittiğinizde, bu dizinin bir dosya yükleme arayüzü olduğunu göreceksiniz. Bu, makineye bir ters kabuk (reverse shell) dosyası yükleyerek ilk erişimi sağlamak için bir yol olabilir.


Ters Kabuk (Reverse Shell) Dosyası Hazırlama
Web sitesinde bir dosya yükleme paneli olduğunu gördük. Bu paneli kullanarak sunucuya bir ters kabuk dosyası yükleyeceğiz. Kali Linux’ta yer alan hazır ters kabuk dosyalarından birini kullanabiliriz.
- Ters kabuk dosyasını bulun: Terminalde 
locate webshellskomutunu çalıştırarak Kali'deki hazır kabuk dosyalarını listeleyebilirsiniz. Bu dosyalar/usr/share/webshellsdizininde bulunur. 

- PHP kabuk dosyasına gidin: 
cd /usr/share/webshells/php/komutuyla PHP kabuklarının bulunduğu dizine gidin. - Dosyayı masaüstüne kopyalayın: 
cp php-reverse-shell.php /home/kali/Desktop/shell.phpkomutuylaphp-reverse-shell.phpdosyasını masaüstünüzeshell.phpadıyla kopyalayın. Bu, dosya üzerinde kolayca düzenleme yapmanızı sağlar. 

- IP ve Port bilgilerini düzenleyin: Kopyaladığınız 
shell.phpdosyasını bir metin düzenleyiciyle açın (nano shell.php). Dosyanın içindeki IP adresi ve port değişkenlerini kendi VPN IP adresinizle ve dinleme yapacağınız portla (örneğin, 4444) değiştirin. VPN IP adresiniziifconfigkomutuyla bulabilirsiniz. 


Dosya Yükleme ve Zafiyetten Kaçınma
Hazırladığınız shell.php dosyasını web sitesindeki dosya yükleme paneline yüklemeye çalıştığınızda, büyük ihtimalle "PHP não é permitido!" (PHP'ye izin verilmiyor!) şeklinde bir hata mesajı alacaksınız. Bu, web sunucusunun .php uzantılı dosyaların yüklenmesini engellediği anlamına gelir.

Bu güvenlik önlemini aşmak için, dosya uzantısını sunucunun izin verdiği başka bir PHP uzantısıyla değiştirmemiz gerekir. TryHackMe’deki “File Upload General Methodology” makalesine bakarak hangi uzantıların geçerli olduğunu kontrol edebilirsiniz. Genellikle .phtml, .php3, .php4 veya .php5 gibi uzantılar işe yarar.

mv shell.php shell.php3komutunu kullanarak dosyanın uzantısını.php3olarak değiştirin.- Şimdi 
shell.php3dosyasını tekrar yüklemeyi deneyin. Bu sefer yüklemenin başarılı olduğunu göreceksiniz. 



Ters Kabuğu Çalıştırma ve İlk Erişimi Elde Etme
Dosyayı yükledikten sonra, kabuğu yakalamak için kendi Kali makinenizde bir dinleyici (listener) başlatmalısınız.
- Dinleyiciyi başlatın: 
nc -nvlp 4444komutunu kullanarak Netcat dinleyicisini başlatın. Bu komut, 4444 portundan gelen bağlantıları dinleyecektir. 

- Kabuğu tetikleyin: Yüklediğiniz 
shell.php3dosyasını çalıştırmanız gerekir. Bu dosya,http://10.10.196.118/uploads/dizininde bulunur. Tarayıcınızla http://10.10.196.118/uploads/shell.php3 adresine gidin. 
Bu adres, Netcat dinleyicinize bir bağlantı gönderecek ve bir kabuk elde edeceksiniz.
NOT
Yüklediğiniz .php3 dosyasının bir ters kabuk bağlantısı kurmadığını fark edebilirsiniz. Bu, web sunucusunun .php3 uzantısına izin vermesine rağmen, bu dosya türünün sunucuda bir web kabuğu olarak çalıştırılmadığı anlamına gelebilir. Web sunucuları, güvenlik önlemi olarak PHP yorumlayıcısını belirli dosya uzantılarıyla ilişkilendirir. Eğer .php3 uzantısı bu ilişkilendirmenin dışında kalıyorsa, dosyanız düz metin olarak işlenir ve kabuk çalışmaz.
Bu engeli aşmak için, farklı dosya uzantılarıyla denemeler yapmanız gerekir. Hedefiniz, PHP yorumlayıcısının çalıştırdığı bir uzantı bulmaktır.
- Çeşitli PHP Uzantılarını Deneyin: Kali’deki PHP kabuk dosyasını (
php-reverse-shell.php) kullanarak yeni kopyalar oluşturun. Her kopyaya farklı bir PHP uzantısı verin; örneğin: shell.phtmlshell.php5shell.php4shell.pht- Adım Adım İlerleme: Her bir yeni dosyayı teker teker yükleyin. Her yüklemeden sonra, kendi makinenizde yeni bir Netcat dinleyicisi başlatın ve ardından tarayıcınızdan yüklediğiniz dosyayı çalıştırın. Örneğin, 
shell.php5dosyasını yüklediyseniz,http://10.10.196.118/uploads/shell.php5adresine gidin. Bu süreç, doğru uzantıyı bulana kadar tekrarlanmalıdır. 
Bu yöntem, sunucunun dosya uzantılarını nasıl işlediğini anlamanıza ve doğru istismar yolunu bulmanıza yardımcı olacaktır. Doğru uzantıyı bulduğunuzda, kabuk bağlantınız Netcat ekranınızda belirecektir.




Kullanıcı Bayrağını Bulma
Kabuk elde ettikten sonra ilk yapmanız gerekenlerden biri, mevcut kullanıcının kim olduğunu öğrenmek ve dosya sistemini keşfetmektir.
whoamikomutunu kullanarak o an hangi kullanıcıyla işlem yaptığınızı görebilirsiniz. Çıktıdawww-dataolarak görüneceksiniz. Bu, bir web sunucusu kullanıcısıdır ve genellikle kısıtlı yetkilere sahiptir.ls -lakomutuyla mevcut dizini listelediğinizde,user.txtadında bir dosya göreceksiniz. Bu dosya, makinenin ilk bayrağını içerir.cat user.txtkomutunu kullanarak dosyanın içeriğini okuyun ve bayrağı alın.

Tebrikler, ilk bayrağı buldunuz! Şimdi yetki yükseltme aşamasına geçerek asıl hedef olan root yetkisine ulaşmalıyız.
Yetki Yükseltme için İpuçları Bulma
Yetki yükseltme için zafiyetler ararken, en yaygın olarak kontrol edilen yerlerden biri SUID binary’leridir. SUID (Set User ID) bitine sahip dosyalar, kendilerini çalıştıran kullanıcının yetkileriyle değil, dosyanın sahibinin yetkileriyle çalışır.
find / -type f -perm -04000 -ls 2>/dev/nullkomutunu kullanarak sistemdeki tüm SUID binary'lerini listeleyebilirsiniz.

- Çıktıları incelediğinizde, normal SUID dosyalarının yanı sıra 
/usr/bin/python2.7dosyasının da SUID bitine sahip olduğunu fark edeceksiniz. 
Bu, önemli bir ipucudur. python normalde bir komut yorumlayıcısıdır ve bu dosyanın root yetkileriyle çalıştırılması, www-data kullanıcısının root kabuğu almasına olanak tanıyabilir.
root.txt Dosyasını Okuma ve Yetki Yükseltme (Root Erişimi)
SUID’li python binary'sini kullanarak bir root kabuğu elde edeceğiz. python ile sistem komutlarını çalıştırabiliriz ve SUID sayesinde bu komutlar root yetkileriyle çalışır.
Bu tür komutları araştırabileceğiniz bir web sitesi var:




root.txt Dosyasını Okuma
Terminalde aşağıdaki komutu girin:
/usr/bin/python2.7 -c ‘print(open(“/root/root.txt”).read())’

Yetki Yükseltme (Root Erişimi)


CTF Tamamlanması
Son olarak CTF sayfasında bizden istenen veriler girilerek CTF tamamlanır.




