Overthewire Bandit Çözümleri




  Herkese merhabalar bu yazıda siber güvenlik alanına yeni başlayanlara linux terminalindeki komutlar hakkında alıştırma olması amacıyla hazırlanan bandit serisinin çözümlerini anlatmaya çalışacağım.(Not: Makinelerden aldığımız keyleri sıradaki makineye bağlanırken ssh parolası olarak kullanıyoruz.)

Bandit0
  İlk aşamada bize ssh ile sunuculara bağlanmayı öğretiyor.

Bandit 0 -> 1
  Bu aşamada keyi bulmamız için bize readme dosyasına bakmamız söylenmiş. ls komutu ile bulunduğumuz directorydeki dosyaları listeleyip keyi alıyoruz.

Bandit 1 -> 2
 Bağlandıktan sonra ls komutu ile baktığımızda bize " - "(kısa çizgi) isminde bir dosya olduğunu gösteriyor. Böyle isimlendirilen dosyaları  cat komutu ile direkt olarak açamıyoruz, dosyanın pathini yani lokasyonunu vererek açabiliyoruz.


Bandit 2 -> 3
  Bu aşamada bize isminde boşluk karakteri olan dosyayı okumamızı istiyor. Dosyanın ilk harflerini yazıp tab'a basarak tamamlayınca key geliyor.


Bandit 3 -> 4
  Bu aşamada gizli dosyadan okuma yapmamızı istiyor. ls komutu dizindeki gizli dosyaları listelemez. Bu yüzden ls -la komutu ile listeleme yapıp dosya adını öğreniyor ve keyi okuyoruz.


Bandit 4 -> 5
  Bu aşamada bize birden fazla dosya veriliyor ve hepsi de dash ile başlıyor. bunları okuyup bizim keye sahip olanı bulmamız lazım. Ben hepsini yazdırıp key olan yeri aldım. Bu arada  "* " işareti ile de isminin baş tarafı aynı olan dosyaları kapsayan işlem yapabilirsiniz.


Bandit 5 -> 6
  Bu aşamada bize 3 adet şartı sağlayan bir dosyayı bulmamızı söylüyor.
Okunabilir, 1033 byte boyutunda ve not executable olsun diyor. Find komutunun man saydasına bakarak hangi komutların işimize yarayacağına bakıyoruz. İsterseniz internete de  örneklere bakabilirsiniz.


Bandit 6 -> 7
  Bu aşamada bize serverin bir yerinde bir dosyada key olduğu söyleniyor. verilen bilgiler ise grubunun bandit6 sahibinin bandit7 ve boyutunun da 33 olduğu. Buna uygun olan komutu yine parametreleri ayarlayıp yazıyoruz ve "permission denied" hatası vermeyen arada bir tane dosya oluyor ve o dosyayı okuyup keyi alıyoruz.



Bandit 7 -> 8
  Bu aşamada bize verilen dosyada "millionth" kelimesinden sonra anahtarın yer aldığı söyleniyor.Grep ile verilen kelimenin olduğu yeri yazdırıyoruz ve key geliyor.


Bandit 8 -> 9
  Bu aşamada bize anahtarın verilen dosyadaki unique yani tek olan satırında olduğunu söylüyor. Bunu bulmak için dosyadaki tekrarlı satırları almamamız lazım. Önce dosyayı sıralayıp ardından sadece tek satır olan satırı almak için uniq komutunu kullanacağız. Tek olan satırı seçmek için -u(--unique) parametresini vermemiz lazım.(Man page'den parametrelere bakın derim.)


Bandit 9 -> 10
  Bu aşamada bize söylenene göre anahtarımız okunabilir bir string ve başında "=" işareti bulunuyor. Strings komutu ile dosyadaki stringleri alıp grep ile de "=" bulunanları listeleyip keyi alıyoruz.


Bandit 10 -> 11
  Bu aşamada bize dosyada bir base64 hash veriliyor ve bunu decode ederek keyi alıyoruz.(Komut için "man base64" bakabilirsiniz.)



Bandit 11 -> 12
  Bu aşamada bize bir şifre veriliyor ve diyor ki bu şifrede her harf 13 sonrasındaki harf ile değiştirilmiş. Eğer ctf vs. çözüyorsanız veya crypto ile ilgili bir şeyler okuduysanız ROT13 şifreleme tanıdık gelecektir zaten. Şimdi bu verilen metni çözerken "ne uğraşacam yeaa" diyerek online herhangi bir tool ile(https://cryptii.com/pipes/rot13-decoder) çözeblirsiniz veya komut satırından halledebilirsiniz. Bu serinin amacı terminal öğrenmek olduğuna göre komut satırındaki mantığını anlatayım.


tr komutu ile metinler üzerinde düzenlemeler yapabiliyoruz.Verdiğimiz bu komut ise diyor ki, eğer harf A ise N yap, B ise O yap vs vs...  Aynı şartları küçük harfler için de yazıyoruz ve key geliyor.

Bandit 12 -> 13
  Bu aşamada bize çok kez compress edilmiş bir dosya veriyor. Bunu arka arkaya çıkartarak key içeren dosyayı bulmamız lazım.Bu soruda baya vakit harcadım gzip,bzip2 ve xxd kullanma ihtiyacı duymamıştım önceden :) (Bu soruda terminalde ortalık baya karıştı, bu yüzden komutları yazı olarak ekliyorum.)

/****dosyayı çalışabileceğimiz alana taşıyoruz.
mkdir /tmp/deneme2/
cp data.txt /tmp/deneme2/
/****dosyamızı xxd ile eski haline dönüştürüyoruz
xxd -r  data.txt > dosya
file dosya
/****dosya gzip file çıktı, ismini gz uzantılı yapıp extract ediyoruz
mv dosya dosya.gz
gzip -d dosya.gz
/****çıkan dosya bzip2 dosyası çıkıyor ve onu da extract ediyoruz
file dosya 
bzip2 -d dosya
file dosya.out
/****yine gzip çıkıyor ve yine dönüştürüp çıkartıyoruz
mv dosya.out dosya.gz
gzip -d dosya.gz 
file dosya 
mv dosya dosya.tar
/****dosyamız bu sefer tar dosyası çıkıyor ve onu da çıkartıyoruz
tar -xvf dosya.tar 
file data5.bin 
/***şimdi bir tane daha tar dosyası çıkıyor, isminde bin var ama file ile bakınca tar olduğu anlaşılıyor
/***arka arkaya extract işlemleri yapıyoruz
mv data5.bin dosya.tar
tar -xvf dosya.tar 
mv data6.bin dosya.tar
tar -xvf dosya.tar 
mv data8.bin dosya.tar
tar -xvf dosya.tar 
/****yine bir gzip dosyası ve onu da extract edince key dosyamız geliyor
file dosya.tar 
mv dosya.tar dosya.gz
gzip -d dosya.gz 
file dosya
cat dosya 
/****key geldi
bandit12@bandit:/tmp/deneme2$ cat dosya 
The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL


Bandit 13 -> 14
  Bu aşamada bizden bir private ssh key bulup bunu kullanarak sıradaki makineye geçmemizi söylüyor. Bulunduğumuz dizindeki dosyaları listeleyince ssh key dosyası ortaya çıkıyor. Bu dosyanın içeriğini herhangi bir satırı silmeden bir txt dosyasına kaydediyoruz. Ardından chmod ile sadece dosya sahibi okuma yazma yapabilir hale getirip kullanıyoruz yoksa ssh bağlantısında hata alırız.



Bandit 14 -> 15
  Bu aşamada bizden localhostun 30000'inci portundan veriyi almamızı söylüyor. Başta nasıl yapacağımı bulamadım ancak önceki soruda bize "The password for the next level is stored in /etc/bandit_pass/bandit14 and can only be read by user bandit14." diyordu. Verilen dizine gidip anahtarı alıyorum ve bağlanmaya çalışıyorum. İnternetten localhostu nasıl dinleyeceğime baktıktan sonra keyi alıyorum.(nc  -l 127.0.0.1 30000 denedim olmadı, sebebini bilmiyorum.)




Bandit 15 -> 16
  Bu aşamada bizden bulunduğumuz aşamanın anahtarı ile localhostun 30001. portuna bağlanarak yeni seviyenin anahtarını almamızı söylüyor. İnternetten openssl bağlantı komutuna bakıp localhost olarak yazıyoruz ve bağlantı gelince de 15'inci seviyenin keyini girip yeni keyi alıyoruz.




Bandit 16 -> 17
  Bu aşamada bizden bulunduğumuz adımın anahtarını kulanarak 31000-32000 arasındaki portlardan birine openssl ile bağlanıp key almamızı istiyor. nmap ile localhostumuza tarama yapıyoruz. Bunu yaparken -p ile port aralığımızı belirliyoruz.



  Bu tarama sonucunda bize 2 adet sonuç dönüyor. İkisine de ssl ile bağlanmayı deniyoruz.



İlk denememde bağlanmadı, diğer portta ise bağlandı ve key olarak 16'ıncı adımın keyini veriyorum.


   Gördüğünüz gibi bize yine bir ssh key geldi. Bunu kopyalayıp masaüstüne txt olarak kaydediyorum ve chmod ile izinleri ayarlayıp ssh ile bağlantı yapıyorum ve işlem tamam :)


Bandit 17 -> 18
  Bu aşamada verilen iki dosya arasındaki farklı olan satır sıradaki aşamanın anahtarıdır diyor.(Not: Eğer bye bye mesajını alırsanız bu bir sonraki seviyeyle alakalıdır gibisinden bir şeyler söylenmiş.) Diff komutu ile farklı satırı bulup sonuçları deniyoruz ve bize bye bye mesajı veren keyi buluyoruz.



Bandit 18 -> 19
  Bize diyor ki readme dosyasında key var ancak birileri  bashrc'yi değiştirmiş ve sen bağlanınca hemen logout oluyosun. Şimdi yapmamız gereken ssh ile bağlanırken terminal komutu çalıştırmak. Bunu yaparken de man pageden yararlanıp " -t " komutunu kullanmaız gerektiğini öğreniyoruz. Biz -t den sonra hangi komutu yazarsak onu çalıştırıp ardından logout oluyor. Madem key readme'nin  içinde, cat readme yazıp keyi alıyoruz :)


Bandit 19 -> 20
   Bu aşamada bizden verilen setuid executable dosyasını çalıştırıp sıradaki aşamanı keyi almamızı istiyor. Hiç argüman vermeden çalıştırınca bize bir id ile çalıştımamız gerektiğini söylüyor. Soruda da "password" için verilen dizine gidip bu dosyayı argüman olarak veriyoruz ve key geliyor.



Bandit 20 ->21
 Bu aşamada bize yine bir setuid dosyası veriyor ve diyor ki localhosttan bir portu dinle,oradan vereceğin 20. aşama keyi karşılığında sana  sonraki aşamanın keyi dönecek. Bunu yaparken iki ayrı terminal ekranından bağlanıp birinde netcat ile porttan veri gönderip alacağız, diğerinde ise dosyayı çalıştırıp keyi yollayacağız.



Bandit 21 -> 22
  Bu aşamada bize bir cron.d dosyası veriliyor.Cron demek zamanlanmış görev demek. Verilen dosyanın içine baktığımızda bir bash script çalıştırdığını görüyoruz. Sonra bu sh dosyasının içine bakıp ne yapıyor diye inceliyoruz. Bu dosya bandit22 nin anahtarını bir dosyaya yazıyormuş. Gidip o dosyanın içeriğine bakıp keyi alıyoruz.


Bandit 22 -> 23
  Bu aşamada işi biraz bash scripte doğru kaydırıyoruz. Bize verilen cron dosyasının neyi çalıştırdığına bakıyoruz ve kodu açıyoruz. Kodda whoami kodunu çalıştırıp buna bir dönüşüm uygulayıp bir key oluşturuyor ve bu keyin tmp altındaki dosyasına o aşamanın keyini yazıyor. Biz de kodun o parçasını bandit23 olarak kullanıp keyi alıyoruz.



Bandit 23 -> 24
  Bu aşamada ise ilk bash scriptimizi yazıyoruz. Öncelikle soruda yine aynı directorye gidip bakıyoruz.


Bandit 24 üzerinde çalışan bu kod ne yapıyor diye bakalı. Myname değişkenine kullanıcı adını alıp ardından /var/spool/myname dizinindeki bitin scriptleri çalıştırıp ardından siliyor.
O zaman bizim yapmamız gereken yazacağımız script ile bandit24'ün parolasını alıp okuyacağımız bir yere yazdırmak. Onu da şu şekilde yaptım.


Gidip pass bilgilerinin tutulduğu dizinden okuma yapıp çıktıyı da tmp dizinindeki deneme diye bir dosyaya yaz dedim.

 Ve yazıp chmod ile izinleri verdikten sonra çalışmasını bekliyoruz. Ardından dosyayı okuyoruz ve key geliyor.

Bandit 24 -> 25
  Bize bandit24 parola ve 4 karakterlik numerik bir parola ile bruteforce yaparak netcatde beklenen sonucu verip sıradaki aşamanın anahtarını almamızı söylüyor. Öncesinde kodu farklı yazmıştım ancak çalışması fazla zaman alınca başka bir yol denedim.Sebebini bilmediğim bir şekilde nc tieout hatası veriyordu, ben de rakalmarı 2 ayrı parçaya ayırıp ayrı ayı listeleri deneyerek buldum.




Bandit 25 -> 26
 Bu soru beni cidden çok şaşırttı. Hiç beklemediğim tarzda bir aşama ve bence baya zor anlaması. Açık söylemek gerekirse bunu yaparken internetten baktım ve ayrıca önceden çözen birine de danıştım. Gerçekten çözenlere helal olsun. Neyse anlatmaya çalışayım.
  Önce biza bir ssh key veriliyor. Bunu kopyalayıp bir txt dosyası olarak kaydediyoruz ve chmod ile izinleri verip ssh bağlantısı deniyoruz. ssh bağlanıyor ancak shell anında kapanıyor ki zaten soruda da shell bash değil demiş.Shell türünü öğrenmek için gidip /etc/passwd dizininden bandit26 ya bakıyoruz. showtext diye bir şey çıkıyor ve içini inceliyoruz.


Burada more komutu ile text dosyasının belli kısmını yaza yaza gidiyor. Muhtemelen txt içinde de ilk çıkan yazılar var ssh ile bağlanınca ve o bitince de exit 0 ile shell kapanıyor. İşte burada yaptığımız şey terminal, ufak bir pencere yaparak more komutu bitmeden araya kendi komutumuzu sokup shell ile parolayı okumak.
  Önce v komutu ile vim açıyoruz. Ardından vim içinde hazır gelen ":e" komutu ile dosyayı editleyerek kendi yazdığımız komutu dosyaya yerleştirip çalışmasını sağlayacağız ve parolayı okuyacağız



  İşte bu şekilde parola geliyor.Parola geldi ama hala shell yok elimizd.Onun için de yine vim ile :set shell=/bin/bash ile bash shell alıyoruz.Ardından :shell komutu ile shelle geçiyoruz.(Acilen vim öğrenmek lazım.)

Bandit 26 -> 27
  Bu aşamada yine bize bir setuid dosyası veriliyor.19'dan 20'ye geçerken yaptığımızın aynısını yapıp keyi alıyoruz.



Bandit 27 -> 28
  Bu aşamada bize git komutlarını öğretmeye başlıyor. Verilen repositoryden dosyaları çekeceğiz ve bunu yaparken bu aşamaya gelirken kullandığımız parolayı kullanacağız.Çalışabilmek için tmp dizinine geçip mevcut olmayan bir isimde klasör açıyoruz ve dosyaları çekiyoruz.


Bandit 28 -> 29
  Bu soruda yine git komutundan faydalanacağız. Fakat burada key direkt olarak karşımıza çıkmıyor. Yine önceki sorudaki gibi tmp altında bir klasör açıp repoyu oraya klonluyoruz. Ardından readme ye bakıyoruz ki password xxxx olarak ayarlanmış. Demek ki password deiştirilmiş.Bunun için git log ile bakıyoruz ve bizi en başta "fix info leak" açıklaması ile bir commit karşılıyor.


 Ardından commitlerle oluşturulan değişiklikleri bulmak için -p komutu ile bakıyoruz ve şifre karşımıza çıkıyor.(Bu komutları git log sayfasındaki açıklamalardan inceleyebilirsiniz.)


Bandit 29 -> 30
  Bu aşamada yine aynı şekilde bağlantı kurup verilen repoyu klonluyoruz.


 Ardından loglara baktım ve şifre yoktu ve "no password in production " yazıyordu. İnternetten biraz araştırdım ve daha önce çözen bir arkadaşın verdiği "branchlere bak" şeklindeki ipucu ile branch ile ilgili komutlara baktım.

  Branch komutunun man sayfasında -r parametresi ile yapılan branchlerin listelenip silinebildiği yazıyordu. Bunu yaptıktan sonra yapılan branchlere geçiş yapmamız lazım(https://git-scm.com/docs/git-checkout). 


 Chechkout komutu ile dev branchine geçiş yaptıktan sonra tekrar readme dosyasını okuyoruz ve key geliyor.


Bandit 30 -> 31
  Bu aşamada yine ufaktan bir yardım alarak sonucu aldım. Maalesef git komutlarını ilk defa burada kullanıyorum bu yüzden hint almam gerekti bazen :) Branch,log vs gibi komutları denedim ancak bir sonucu erişemedim. Ardından git tag komutu ile etiketlere baktım ve secret isimli bir tag vardı. git show secret ilekeyi okuduk.


Bandit 31 -> 32
  Bu aşamada bizden bir dosya upload etmemizi istiyor.


Resimdeki işlemlerden sonra "git add key.txt" yapıyorum. Ardından commit ekliyorum ancak bana key gelmiyor. Ardından ls -la ile baktığımda gitignore dosyası gördüm. Ne işe yarıyormuş bu diye internetten bakınca anladım ki bir nevi kuralların yazılı olduğu dosya diyebiliriz.

 İçine bakınca anladık ki bu dosya yüzünden bizim işler test gitmiş çünkü biz de txt upload deniyoruz ve bu arkadaş bunu ignore ediyo. O zaman silelim gitsin.


Ve aynı işlemleri tekrardan yapınca key geldi :)

 Bandit 32 -> 33
  Bu soruyu şu arkadaştan(https://medium.com/secttp/overthewire-bandit-level-31-e3b82064285a) bakmak zorunda kaldım zira ilk defa böyle bir şey görüyorum. Bağlantı kurunca bize uppershell isminde bir shell veriyor ve burada bash komutlarını çalıştıramadım. Ardından internette uppershell ile ilgili bir şeyler var mı diye baktım ama bir şey bulamadım. Ardından bu writeupdan baktım. $0 ile çalıştırılan bir scriptdeki ismi ifade ediyor diye yazıyor internette fakat hala tam anlamıyla anlayabilmiş değilim.


Bandit 33 -> 34
  VE BİTTİ :)


 Bu serinin kesinlikle kendi açımdan çok faydalı olduğunu düşünüyorum çünkü bilmediğim baya bir komutu ve konuyu bu soruları çözme bahanesiyle öğrendim ya da en azından fikir edindim. Umarım okuyan herkese ufacık da olsa bir faydası dokunur. Bir sonraki yazımda yine bir zaafiyetli makine çözmeyi hedefliyorum. Görüşmek üzere, kendinize iyi bakın :)

Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

rgbCTF Writeup(Rev/Pwn)