OverTheWire / Bandit – 18 to 33 –

<- Önceki Bölümler

Level 18Level 19Level 20Level 21Level 22Level 23
Level 24Level 25Level 26Level 27Level 28Level 29
Level 30Level 31Level 32Level 33

LEVEL 18

Bir sonraki kullanıcının şifresinin bandit18 kullanıcısının home dizininde readme dosyasının içerisinde olduğunu biliyoruz. Bağlanmamız gereken bandit18 kullanıcısını şifresini bilsek de kullanıcıya ssh kullanarak giriş yapamıyoruz çünkü kullanıcının bağlandığımız gibi çalıştırılan .bashrc dosyası logout yapmak üzere yapılandırılmış.

Bu durumumdan kurtulabilmek için .bashrc dosyasının nasıl atlatılacağı araştırılabilir fakat bunun yerine ssh komutuyla direkt olarak çalıştırmak istediğim komutu gönderiyorum.

ssh bandit18@bandit.labs.overthewire.org -p 2220 'cat readme'

LEVEL 19

Kullanıcının home dizininde SUID yani başka bir kullanıcının yetkileriyle çalıştırılabilen bir binary bulunduğunu biliyoruz. Bunu kullanarak bandit20 kullanıcısının parolasını alabiliriz.


LEVEL 20

Kullanıcının home dizininde bulunan binary’ı kullanarak bandit21 kullanıcısına ait parolayı elde etmemiz isteniyor. Bunu elde edebilmek için localhost üzerinde bir porttan binary ile bağlantı kurup bandit20 kullanıcısının parolasını göndermemiz gerekiyor. Bu işlemi iki komutu senkron olarak başlatmak için & karakterini kullanarak ve daha sonra ekrandaki komutu arka plana almak için CTRL+Z kısayolunu, arkaplandaki komutu öne almak için fg $num komutlarını kullanarak gerçekleştiriyorum.


LEVEL 21

Sonraki kullanıcının parolasına ulaşabilmemiz için arkada çalışan bir cron job‘ı incelememiz gerekiyor. Dosyaya /etc/cron.d/ altından ulaşabiliyoruz ve cronjob_bandit22 isimli dosyayı okuduğumuzda /usr/bin dizini altında çalışan bir script olduğunu görüyoruz. Buradaki ilk satırda bulunan @reboot makine her yeniden başlatıldığında yapılacak işi gösteriyor. Bir altındaki * * * * * sembolü komutun her dakika çalıştığını gösteriyor.

Bu dosyadan ulaştığımız script’i okuduğumuzda ise parolanın /tmp altında bir dosyaya yazdırıldığını görebiliyoruz.


LEVEL 22

Arkada çalışan script’i bulabilmek için cron.d dizininin içerisindeki dosyayı kontrol ettiğimizde /usr/bin altında bir script’in çalıştırıldığını görüyorum. Bu script’i okuduğumda kullanıcının adınının md5 özetini alıp özeti boşluk karakterlerine göre bölüp ilk bölümü aldığını ve bu bölümün adıyla /tmp altında bir dosya oluşturup parolayı buraya yazdığını görüyorum. Aynı şekilde dosya adını elde ederek dosyayı okuyabiliyorum.


LEVEL 23

Cron job’ı incelemek için cron.d dizini içerisindeki dosyayı kontrol ediyorum. Dosyanın, /var/spool dizini altında kullanıcının adıyla oluşturulmuş dizin içerisinde bandit23 kullanıcısı tarafından oluşturulmuş bütün dosyaları çalıştırdığını görüyorum.

Kullanıcının parolasına ulaşmak için cron job’ın kontrol ettiği dizin altında bandit24 kullanıcısının parolasını okuyup istediğim dizine yazacak bir script hazırlıyorum.

echo '#!/bin/bash' > gev.sh; echo 'cat /etc/bandit_pass/bandit24 > /tmp/gev/pass; chmod 644 /tmp/gev/pass' >> gev.sh; chmod 777 gev.sh

LEVEL 24

Sıradaki kullanıcının parolasına ulaşabilmek için 30002 portundan dinleyen deamon’a bandit24 kullanıcısının parolasını ve bir boşluk bırakarak 4 haneli bir pin kodu vermemiz gerekiyor. Kodu bulabilmek için bruteforce kullanmamız gerekecek. Bruteforce saldırısını yapabilmek için basit bir bash script hazırlıyorum.

Bir for loop içinde 0000’dan 9999’a kadar bütün sayıları döndürüyorum ve çıktıyı nc komutu yardımıyla localhost‘un 30002 numaralı portuna döndürüyorum.

for i in {0000..9999}; do echo "$(cat /etc/bandit_pass/bandit24) $i"; done | nc localhost 30002

LEVEL 25

Sonraki kullanıcıya geçebilmemiz için bandit25’in home dizininde bulunan ssh key’ini kullanmamız gerekiyor. Sonraki kullanıcının shell’i bash olmadığı için direkt olarak bağlanamıyoruz. Bu durumu atlatmak için direkt olarak ssh komutundan sonra komut çalıştırmayı ve -t parametresiyle shell değiştirmeyi deniyorum fakat başaramıyorum.

Kullanıcının shell’ini öğrenmek için passwd dosyasını kontrol ediyorum. Kullanıcı shell olarak showtext isimli bir script’i kullanıyor. Script’i incelediğimde text.txt dosyası üzerinde more komutu çalıştıran bir script olduğunu görüyorum.

Bir süre bunu nasıl atlatacağımı araştırıyorum ve more komutu bitmeden araya girebilirsem komut çalıştırabileceğimin farkına varıyorum. Bunu yapabilmek için stty rows 5 komutuyla terminalin boyutunu küçültüyorum. Bu şekilde ssh bağlantısı kurmayı denediğimde more komutunun içerisinde kalabiliyorum. Burada v tuşuyla vim edit moduna girebiliyorum. Edit modu içerisinde :set shell=/bin/bash yaptıktan sonra :!/bin/bash komutuyla bash shell’ine düşebiliyorum.


LEVEL 26

Bandit26 kullanıcısının home dizininde bulunan bandit27-do isimli dosyanın adından da anlaşılabileceği gibi bir SUID dosyası olduğunu ve bandit27 olarak komut çalıştırabileceğimizi düşünüyorum.

Bunu kullanarak bandit27 kullanıcısının parolasına erişiyorum.


LEVEL 27

Bir sonraki kullanıcıya erişmek için verilen git reposunu incelemeyi deniyorum. Repoya kendi makinemden ulaşmak yerine bandit27 kullanıcısını kullanarak ssh bağlantısı kurduğum makinede tmp dizininde bir dizin oluşturarak orada inceliyorum. Repoyu çekmek için git clone komutunu kullanıyorum ve içerisinde bulunan README dosyasını okuyorum.

git clone ssh://bandit27-git@localhost/home/bandit27-git/repo

LEVEL 28

Aynı şekilde kullanmam gereken git reposuna erişebilmek için tmp dizini altında bir dizin oluşturuyorum ve repoyu oraya çekiyorum. Repo içerisindeki README dosyasını okuduğumda dosyadaki parola bulunan alanın sansürlendiğini görüyorum.

Dosyanın önceki hallerinde parolanın açık olduğu hali bulabileceğimi düşünüyorum. Önceki commit’lere erişebilmek için git log komutunu kullanıyorum ve öncekileri listeliyorum. Bir önceki commit’e atlamak için git checkout komutunu kullanıyorum.


LEVEL 29

Aynı şekilde belirtilen repoyu klonluyorum ve inceliyorum.

Tekrardan commit’leri kontrol ediyorum fakat bu sefer işime yarayacak bir şeyle karşılaşmıyorum. Başka şeyler bulabilmek için git branch -a komutuyla branch’leri kontrol ediyorum. Burada içerisini kontrol edebileceğim bir branch görüyorum ve git checkout komutuyla o branch’e geçerek kontrol ediyorum.


LEVEL 30

Belirtilen repoyu klonlayarak incelemeye başlıyorum. Git commit’leri ve branch’leri kontrol ediyorum fakat bir şey bulamıyorum. Başka kontrol edebileceğim değerlere erişmek için araştırma yapıyorum ve karşılaştığım bir sayfadan git tag komutunu öğreniyorum. Kontrol ettiğimde secret adında bir değer ile karşılaşıyorum ve git show komutuyla değeri okuyorum.


LEVEL 31

Repoyu çekiyorum ve inceliyorum. README dosyasını okuduğumda key.txt isminde bir dosya ekleyip repoyu pushlamam gerektiğini öğreniyorum.

Repoda bulunan .gitignore dosyası bütün txt dosyaları görmezden geldiği için bu dosyayı silmeden txt pushlayamam. Dosyayı siliyorum benden istenen dosyayı oluşturuyorum ve pushluyorum.


LEVEL 32

Kullanıcıya bağlandığımızda uppercase shell isminde bir shellde olduğumuzu ve yazdığımız her komutun büyük harfe dönüşürüldüğünü görüyorum. Bundan kaçabilmek için uzun bir süre uğraşıyorum. Denemerim sonucunda bash için değişkenler veremeye çalıştığımda daha farklı sonuçlar aldığımı görüyorum.

Öncelikle değer vererek verdiğim değerleri $1 ile ekrana bastırıp uppercase’i atlatmaya çalışıyorum fakat başaramıyorum. Daha sonra çalışan programın ismini döndüren $0 değerini kullandığımda shell’e düşüyorum.


LEVEL 33

Son bölüme geliyoruz. İleride gelecek olan diğer bölümleri de çözmek üzere burada bırakıyorum.