You found a secret server located under the deep sea. Your task is to hack inside the server and reveal the truth.
-DesKel
Link | Difficulty | Creator |
---|---|---|
Agent Sudo | Easy | DesKel |
Scan / Enumeration
Keşif işlemine nmap
aracıyla port taraması yaparak başlıyorum. Aracın varsayılan olarak T3 olan hızını -T4
parametresiyle arttırıyorum. Açık olarak bulduğu portları bulduğu gibi ekrana basması ve taramanın ne zaman biteceğine dair rapor vermesi için -vv
parametresini kullanıyorum. Makinedeki bütün portları taraması için -p-
parametresini veriyorum ve taramayı yapacağı makinenin IP adresini de vererek taramayı başlatıyorum.
nmap -T4 -vv -p- $IP
Makinede 21
,22
ve 80
portlarının açık olduğunu öğreniyorum. Bu portları daha ayrıntılı inceleyebilmek için portlara özel bir nmap taraması daha gerçekleştiriyorum. Versiyon taraması yapan -sV
ve script taraması yapan -sC
parametrelerinin birleşimi olan -sVC
parametresini kullanıyorum. Daha önce bulduğum portları -p
parametresinin ardından belirtiyorum. Taramanın sonucunu bir dosyaya kaydetmek için -oN
parametresini kullanıyorum.
nmap -sVC -p21,22,80 -oN agent.nmap $IP

21 portunda FTP
-File Transfer Protocol-, 22 portunda SSH
-Secure Shell- ve 80 portunda Apache
web server çalıştığını öğreniyorum. Makinede çalışan FTP sunucusunun vsftpd 3.0.3
versiyonu için yakın bir zamanda çözdüğüm TryHackme / Bounty Hacker makinesinde zafiyet taraması yapmış ve yalnızca bir DOS
exploiti ile karşılaşmıştım. Bu nedenle bu servis için zafiyet taraması işlemini atlıyorum. Nmap çıktısında ftp sunucusuna anonim girişe izin verildiğine dair herhangi bir bulgu görmüyorum fakat yine de ftp $IP
komutuyla servise bağlanarak anonymous
kullanıcı adıyla bağlantı kurmayı deniyorum fakat başaramıyorum.
22 portunda çalışan SSH servisinin OpenSSH 7.6p1
versiyonu için searchsploit
ve arama motorları aracılığıyla zafiyet taraması yapıyorum. Makinede olabilecek kullanıcılar hakkında biraz bilgi topladıktan sonra kullanabileceğim bir Username Enumeration exploit’i ile karşılaşıyorum. Bunun dışında şu an için kullanabileceğim bir şey ile karşılaşmıyorum.

80 portunda çalışan Apache servisinin 2.4.29
versiyonu için searchsploit
ve arama motorları aracılığıyla zafiyet taraması gerçekleştiriyorum. Çalışan versiyonun daha üst versiyonları için işime yarayabilecek bir kaç exploit ile karşılaşıyorum fakat bu versiyonda çalışacaklarından emin olamadığım ve henüz web sitesi üzerinde keşife başlamadığım için daha sonra değerlendirmek üzere kenarda bırakıyorum.

Bir tarayıcı aracılığıyla web sitesini keşfetmeye başlıyorum. Makinenin web sitesine eriştiğimde Agent R
isminde bir kullanıcının bırakmış olduğu notla karşılaşıyorum.

Burada codename
‘den kastının kendisinin kullandığı R
adı gibi harfler olduğunu varsayıyorum. Alfabetik karakterleri user-agent olarak kullanarak siteye erişmeye çalışmayı düşünüyorum. Bunu denemeden önce site üzerinde daha fazla bilgiye erişebilmek için gobuster
aracıyla bir dizin taraması başlatıyorum. Araca dir
parametresini vererek dizin taraması yapacağını anlatıyorum. Taramayı gerçekleştireceği sitenin adresini -u
parametresiyle, taramada kullanacağı wordlist’i -w
parametresiyle veriyorum. Dizin taraması yaparken aynı zamanda dosya da taraması için -x
parametresiyle dosya uzantılarını belirtiyorum. Varsayılan olarak 10 olan hızını -t
parametresiyle 30’a çıkartıyorum. Taramanın sonucunun kaydedilmesi için -o
parametresiyle bir dosya ismi vererek taramayı başlatıyorum.
gobuster dir -u http://$IP -w directory-list-2.3-medium.txt -x php,txt,db,bak -t 30 -o agent.buster
Tarama devam ederken user-agent değiştirerek siteye erişmek üzerine çalışıyorum. Hangi harfin erişebileceğim codename olduğunu bilmediğim için bunu kontrol etmemi sağlayabilecek ufak bir bash script yazıyorum. Bunun için bir script yazmak yerine OWASP ZAP
veya BurpSuite
gibi proxy araçlarını kullanabileceğimi bilsem de manuel yoldan yapmak istiyorum. curl
aracını -A
parametresiyle birlikte kullanarak user-agent belirleyebiliyorum. Komuta -s
parametresini de ekleyerek silent modda çalışmasını sağlıyorum. İlk olarak A harfine request atıp response’u wc
komutunun byte saydırma parametresi olan -c
parametresine döndürüyorum ve response’un 218
byte olduğunu görüyorum. Bir for
döngüsü içerisinde i
değişkenini A’dan Z’ye kadar bütün harfleri dönecek şekilde ayarlıyorum. Daha sonra i
değişkenini curl
komutunun user-agent girdisi olarak vererek komutun çıktısındaki byte sayısını bulduruyorum. Eğer byte sayısı 218’den farklıysa user-agent olarak kullandığı harfi ekrana basmasını sağlayacak bir if sorgusu kullanıyorum.
for i in {A..Z}; do if [[ `curl -A "$i" http://$IP -s | wc -c` != 218 ]]; then echo $i; fi; done

Yalnızca R
harfiyle farklı bir sayfa içeriğine ulaşıldığını görüyorum ve sayfa içeriğini inceliyorum fakat bu hareketimin raporlanacağına dair uyarıdan başka bir şeyle karşılaşmıyorum. Farklı içeriklere erişebilmek için user-agent olarak R
harfini kullanarak bir dizin taraması yapmamın işime yarayabileceğini düşünüyorum. Fakat bundan önce attığım farklı user-agent’lere sahip requestlere dönen response’ların içerikleri aynı olsa da status kodunun farklı olabileceği yani başka bir harf daha girdiğimde 302
ile başka sayfaya yönlendirilebileceğimi düşünerek bir de status kodlarına göre tarayan bir script yazma kararı alıyorum.
Aynı mantığı yalnızca if sorgusunu değiştirerek kullanıyorum. curl
komutuna -I
parametresini ekleyerek response’un headerlarını ekrana getirmesini sağlıyorum. Bu headerları enter karakterine göre bölmek için cut
komutunun -d
parametresini kullanıp -f
parametresiyle bölümün ilk parçasını alıyorum. Bu şekilde elde ettiğim ilk satırı yine bir cut
komutuna döndürerek boşluk karakterlerine göre parçalıyorum ve kontrol etmek istediğim status kodunun yer aldığı ikinci parçayı ayırıyorum. Eğer elde ettiğim status kod, 200'
den farklıysa harfi ekrana basmasını istiyorum. Bu yöntem ile de yeni bir harf elde edebiliyorum.
for i in {A..Z}; do if [[ `curl -I -A "$i" http://$IP -s | cut -d$'\n' -f1 | cut -d' ' -f2` != 200 ]]; then echo $i; fi; done

İnadımı sürdürerek bulguları da terminal üzerinden kontrol ediyorum. Bulduğumuz user-agent’in chris
adında bir kullanıcıya ait olduğunu ve bu kullanıcının parolasının zayıf olduğunu öğreniyorum.

Gain Shell
Makinedeki SSH servisi üzerinde zafiyet taraması yaptığımız sırada bulduğumuz user enumeration exploit’lerini kullanarak chris
isminin ssh servisi üzerinde bir kullanıcı olduğunu doğrulamak istiyorum. Bu exploitler python2 ile yazıldıkları ve python2 artık desteklenmediği için ilk iki denememde başarılı bir şekilde çalışan bir exploit bulamıyorum. Aynı exploit’in hata verse de çalışabilen bir versiyonunu buluyorum ve bunu kullanarak chris
ismini kontrol ediyorum. (verdiği hatayı ekrana basmaması için STDERR çıktısını /dev/null dosyasına yönlendiriyorum.)

Kullanıcı adının sunucuda bulunduğunu doğruluyoruz. Bu kullanıcının parolasının zayıf olduğuna dair bilgimiz de olmasından mütevellit SSH ve FTP servislerine eş zamanlı olarak hydra
aracını kullanarak kaba kuvvet saldırısı yapmaya karar veriyorum. Araca -l
parametresi ile kullanıcı adını, -P
parametresi ile genellikle kullanılan geniş çaplı bir wordlist olan rockyou.txt dosyasını veriyorum. Saldırının yapılacağı IP adresini ve servis bilgisini de verdikten sonra saldırıyı başlatıyorum. Kısa bir süre sonra ftp servisine ait parolaya erişiyorum.
hydra -l chris -P rockyou.txt $IP ftp

Buradan elde ettiğimiz bilgilerle ftp servisinden makineye bağlantı kuruyorum. Burada To_agentJ.txt
, cute-alien.jpg
ve cutie.png
olmak üzere üç adet dosya ile karşılaşıyoruz. Üçünü de get
komutunu kullanarak kendi makineme alıyorum. Bir üst dizin olabilmesi ihtimaline karşın cd ..
ile üst dizine çıkmayı deniyorum fakat olmadığını görüyorum.

Elde ettiğim dosyalar içerisinden To_agentJ.txt
dosyasını okuyorum ve Agent J kullanıcısının şifresinin buradan elde ettiğim görsellerden birinin içerisinde gizli olduğunu öğreniyorum. İki resimin de meta datalarını exiftool
yardımıyla kontrol ediyorum fakat ikisini ayrıştırabileceğim herhangi bir şey göremiyorum. İkisinin de içerisindeki human readable satırları okumak için strings
komutunu kullanıyorum. Çıktıları incelediğimde cute-alien.jpg
dosyasında ilgi çekici bir şeyler göremesem de cutie.png
isimli resmin To_agentR.txt isminde bir dosya içerdiğini görebiliyorum.

Resmin içerisindeki dosyaya ulaşmak için binwalk
aracını -e
parametresiyle kullanıyorum ve içerisindeki dosyaları çıkartıyorum. Çıkan dosyaları incelediğimde direkt olarak çıkartılmaya çalışılan To_agentR.txt dosyasının boş olduğunu görüyorum. Aynı dizinde şifreli bir zip
dosyası olduğunu da görüyorum ve bu dosyanın bir şeyler içerebileceğini umuyorum.

Buradaki zip dosyasına kaba kuvvet saldırısı yapabilmek için john aracını kullanıyorum. Dosyayı john aracının kullanabileceği bir hale getirmek için zip2john 8702.zip > forjohn
şeklinde dönüştürüyorum. Daha sonra dönüştürdüğüm dosya ve –wordlist parametresini kullanarak verdiğim bir wordlist aracılığıyla kaba kuvvet saldırısını başlatıyorum.
john --wordlist=rockyou.txt forjohn

Elde ettiğim parolayı kullanarak 7z
aracına x
parametresini verip zip dosyasını çıkartıyorum. İçinden çıkan To_agentR.txt dosyasını okuduğumda bir resmin tırnak içine alınmış bir değere gönderilmesi gerektiğine dair bir notla karşılaşıyorum. Buradaki tırnak içerisindeki değerin basit bir encoding olduğunu düşünerek base64
ile decode etmeyi deniyorum ve Area51
değeri ile karşılaşıyorum.

Diğer resim dosyasına hiç dokunmamış olmamızdan ve steghide
isimli aracın .jpg uzantılı resimler içerisine dosya gömüp çıkarabilme kabiliyeti olduğunu bildiğimden, bulduğumuz Area51
değerinin bu resim içerisinden dosya çıkarmak için kullanılabileceğini düşünüyorum. Araca extract parametresini ve -sf parametresini vererek bulduğumuz değeri parola olarak deneyerek dosya çıkartmayı deniyorum ve başarıyorum.

Privilege Escalation
Elde ettiğimiz bilgileri kullanarak james kullanıcısı olarak ssh üzerinden makineye bağlanabiliyorum. Bağlandıktan sonra yetki yükseltebilmek için keşif işlemlerine başlıyorum. Kullanıcının sudo yetkisini kontrol etmek için sudo -l
komutunu kullandığımda, kullanıcının root hariç her türlü kullanıcıyla /bin/bash
komutunu çalıştırabildiğini görüyorum. Bu yetkilendirmenin zafiyet içerdiğini bildiğimden sudo
komutunun versiyonunu kontrol ediyorum.

Daha önce karşılaştığım bypass tekniğinin bu versiyon için de geçerli olduğunu biliyorum. Bu yetkilendirmeye sahip sudo komutu -u
parametresiyle root kullanıcısı dışında herhangi bir kullanıcı ismi vererek o kullanıcı yetkileriyle komut çalıştırmak için kullanılıyor. Örneğin makinede bulunduğunu bildiğimiz chris kullanıcısı için:
sudo -u chris /bin/bash
Şeklinde komut çalıştırabiliyoruz. Kullanıcı adını değil de UID değerini kullanmak istersek -u#UID şeklinde kullabiliyoruz. Yine chris kullanıcısı için:
sudo -u#1001 /bin/bash

Bizim komut çalıştırmak istediğimiz root kullanıcısı 0
UID değerine sahip. Komuta direkt olarak 0 değerini verirsek root olarak komut çalıştıramayacağımızı söylüyor fakat -1
verirsek bunu kendi içerisinde 0 değerine dönüştürüyor ve dönüştürdükten sonra kontrol etmediği için kontrol mekanizması bypasslanıyor.
