Level 18 | Level 19 | Level 20 | Level 21 | Level 22 | Level 23 |
Level 24 | Level 25 | Level 26 | Level 27 | Level 28 | Level 29 |
Level 30 | Level 31 | Level 32 | Level 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.
