OverTheWire / Bandit – 0 to 17 –

Level 0Level 1Level 2Level 3Level 4Level 5
Level 6Level 7Level 8Level 9Level 10Level 11
Level 12Level 13Level 14Level 15Level 16Level 17

LEVEL 0

Makineye SSH – Secure Shell – üzerinden bize verilen bandit0 kullanıcısı ile bağlantı sağlıyoruz.

ssh <username>@<IP> -p 2220

Giriş yaptığımız dizinde bulunan readme dosyasını cat komutuyla okuyarak bandit1 kullanıcısının şifresine ulaşabiliyoruz.

level0

(Burada bize verilen şifre bandit1 kullanıcısının SSH bağlantı şifresi olmasından mütevellit bir sonraki kullanıcıya geçmek için exit komutu ile SSH bağlantımızı sonlandırıyoruz ve bandit1 kullanıcısı olarak tekrar bağlanıyoruz.)


LEVEL 1

Giriş yaptığımız dizinde - karakteriyle isimlendirilmiş bir dosya görüyoruz. Bu karakter komutlara parametre verilirken (ls -la gibi) kullanıldığı için direkt olarak cat - komutuyla okumaya çalıştığımızda hata ile karşılaşıyoruz. Dosyayı okuyabilmek için şu iki yöntemden birini kullanabiliriz:

cat < - 
#veya
cat ./-
level1

LEVEL 2

Giriş yaptığımız dizinde ismi boşluk karakterleri içeren bir dosya görüyoruz. Bu dosyayı da iki farklı yöntemle okuyabiriz.

cat "spaces in this filename"
#veya
cat cat spaces\ in\ this\ filename
level2

LEVEL 3

*NIX (UNIX-GNU/Linux) sistemlerde . ile başlayan dosyalar ve dizinler gizli dosyalar veya dizinler olarak adlandırılırlar. Bu dosyalar veya dizinler özellikle istenmedikleri sürece listelenmezler. İşletim sistemi bu özelliği kullanıcının config dosyalarını yanlışlıkla değiştirmesini önlemek gibi nedenlerle kullanır.

inhere isimli dizinin içine direkt olarak ls komutuyla baktığımızda herhangi bir dosya ile karşılaşmıyoruz. Fakat ls -a (–all) komutunu kullanarak baktığımızda, .hidden dosyasını görebiliyoruz.

level3

LEVEL 4

inhere dizini altındaki dosyalar içerisinde human-readable olanı bulmamız gerekiyor. En kolay yöntem olarak file komutuyla dosyaların neler içerdiğini görebilir hangisinin okunabilir olduğunu anlayabiliriz.

level4

Ya da bash script‘i kullanarak basit bir for döngüsü ile bütün dosyaları, dosyaların içerisindeki human-readable karakterleri ekrana basma görevini gerçekleştiren strings komutuna input olarak vererek parolayı bulabiliriz.

strings ./*

– dosyalardan önce ./ kullanmamızın nedeni dosyaların - karakteriyle başlıyor olması. –


LEVEL 5

inhere dizini altındaki dosyalar içerisinden:

  • human-readable olan
  • 1033 byte boyutunda
  • çalıştırılabilir olmayan

Dosyayı bulmamız gerekiyor. Bu dosyayı bulmak için find komutunu kullanabiliriz. find komutuna . sembolüyle bulunduğumuz dizin içerisinde arama yapmasını söylüyoruz. -type parametresine f değerini vererek dosya tipinde arama yapmasını istiyoruz. -size parametresine 1033c değerini vererek 1033 byte’lık dosyaları bulmasını sağlıyoruz. ! işareti kendinden sonra gelen değerlerin olumsuzlarının alınmasını sağlar. Bu işaretten sonra -executable değerini vererek çalıştırılamayan dosyaları bulmasını istiyoruz. Bash‘te ` tırnakları içerisine yazan ifadeler komut olarak çalıştırılır dolayısıyla cat komutundan sonra tırkanklar ile find komutunu vererek komutun çıktısında dönen dosyayı direkt olarak okuyabiliyoruz.

cat `find . -type f -size 1033c ! -executable`
level5

LEVEL 6

Bizden serverda bulunan bütün dosyalar içerisinde:

  • sahibi bandit7 kullanıcısı olan
  • grubu bandit6 olan
  • 33 byte boyutunda

Bir dosya bulmamız isteniyor. find komutunu kullanarak bu işlemi gerçekleştirebiliriz. / ile kök dizin altında bulunan bütün dosyaları kontrol etmesini söylüyoruz. -type parametresine f değerini vererek tipi dosya olanlara bakmasını söylüyoruz. -user parametresine bandit7 değerini ve -group parametresine bandit6 değerini vererek dosyanın sahibinin bandit7, dosyanın grubunun ise bandit6 olması gerektiğini belirtiyoruz. -size parametresine 33c değerini vererek dosyanın 33 byte boyutunda olması gerektiğini söylüyoruz. 2>/dev/null değeri ise çalışan kodun sonucunda dönecek olan hataları – permission denied hataları gibi – /dev/null’un içine yani hiçliğe göndermesini söylüyor bu şekilde kodun sonucunda herhangi bir hata çıktısı görmüyoruz.

cat `find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null`

LEVEL 7

Erişmek istediğimiz parolanın, data.txt dosyasının içerisinde millionth kelimesinden sonra yazılı olduğunu biliyoruz. grep komutunu kullanarak dosyanın içerisinde istediğimiz kelimeler için arama yapabiliriz.

grep millionth data.txt

LEVEL 8

Parolanın data.txt dosyası içerisindeki tekrar etmeyen tek satır olduğunu biliyoruz. Bu satırı bulabilmek için sort ve uniq komutlarını kullanabiliriz. uniq komutunun çalışabilmesi için dosyanın sıralı olması gerekli. Bu yüzden öncelikle sort komutuyla dosyayı sıralıyor sonra uniq komutuna -u (–unique) parametresini vererek istediğimiz satırı alabiliyoruz.

sort data.txt | uniq -u

LEVEL 9

Parolanın data.txt dosyası içerisinde human-readable satırlardan olduğunu ve = karakterlerinden sonra geldiğini biliyoruz. Dosyadaki human-readable satırları okuyabilmek için strings komutunu kullanabiliriz. grep komutuyla da = karakterleri olan satırları alırsak istediğimiz sonuca ulaşırız.

strings data.txt | grep =

LEVEL 10

Parola data.txt içerisinde base64 olarak saklanıyor. Buradan dosyayı okuyup, base64 değeri kopyalayıp internette herhangi bir base64 decoder‘a çözdürebiliriz ya da GNU/Linux sistemlerde dahili olarak gelen base64 komutuna -d (–decode) parametresini vererek çözebiliriz.

base64 -d data.txt

LEVEL 11

Parolanın data.txt içerisinde 13 karakter kaydırılmış halde yazılmıl olduğunu biliyoruz. Buradan dosya içeriğini kopyalayıp internette ROT13 ile decode edebiliriz. Ya da tr komutunu kullanarak, ilk parametreyi 'A-Za-z' ve ikinci parametreyi 'N-ZA-Mn-za-M' verek bütün harfleri alıp 13 karakter kaydırmasını sağlayabiliriz.

cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'

LEVEL 12

Burada bize verilen dosyanın başka bir dosyanın hexdump’ı olduğu biliyoruz. xxd komutuna -r parametresini vererek orijinal dosyay ulaşabiliriz.

xxd -r data.txt

Elde ettiğimiz dosyanın gzip dosyası olduğunu file komutunu kullanarak görebiliyoruz. Bu dosyayı açmak için gzip komutunu -d parametresiyle kullanabiliriz fakat kullanmadan önce suffix hatası almamamız için dosyaya .gz uzantısı eklememiz gerekiyor.

Bu sefer de karşımıza bir bzip2 dosyası çıkyıor. Ulaşmamız gereken ASCII dosyaya ulaşana kadar bir çok kez 3 farklı sıkıştırma teknolojisine ait dosyayla uğraşmamız gerekecek bu dosyalara decompress işlemini gerçekleştirebilmek için aşağıdaki komutları kullanacağız.

.bz2   ->  bzip2 -d $file
.gz    ->  gzip -d $file
.tar   -> tar xf $file

LEVEL 13

Bir sonraki kullanıcının parolasının /etc/bandit_pass/bandit14 dosyasında yazılı olduğunu biliyoruz. Elimizdeki private ssh key’i -id_rsa- ile bandit14 kullanıcısına bağlanıp şifre dosyasını okuyabiliriz. Anahtarı kullanmak için ssh komutuna -i parametresiyle anahtar dosyasını veriyoruz. kullanıcıadı@server şeklinde de bağlanacağımız kullanıcıyı ve bağlanacağımız server’ı belirttikten sonra herhangi bir şey yazmamamız halinde direkt olarak ssh bağlantısı gerçekleştirebiliriz. Eğer bilgileri girdikten sonra tırnaklar içine çalıştırmak istediğimiz komutu verirsek kullanıcıya giriş yapmadan kullanıcının yetkileriyle komutun çalıştırılmış halinin çıktısını elde ederiz.

ssh -i sshkey.private bandit14@localhost 'cat /etc/bandit_pass/bandit14'

LEVEL 14

Sonraki parolaya ulaşmamız için elimizde olan bandit14 kullanıcısının parolasını server’ın 30000 portuna göndermemiz gerektiğini biliyoruz. nc komutuyla bu işlemi gerçekleştirebiliriz.

echo $passfbandit14 | nc localhost 30000

LEVEL 15

Bir sonraki kullanıcının parolasına erişebilmemiz için server’ın 30001 portuna bandit15 kullanıcısının parolasını SSL ile bağlanarak göndermemiz gerekiyor. openssl komutunu kullanarak bizden istenen işlemi gerçekleştirebiliriz. s_client parametresi ile SSL Client bağlantısı yapacağımızı belirtiyoruz. -connect parametresine server@port şeklinde bağlanacağımız server’ın bilgilerini verdikten sonra bağlantıyı gerçekleştirebiliyoruz.

openssl s_client -connect localhost:30001

LEVEL 16

31000 ile 32000 arasındaki bir porta SSL bağlantı kurarak bandit16’nın şifresini gönderdiğimizde bize bandit17 kullanıcısınına erişim bilgilerini vereceğini biliyoruz. Bu portları kontrol edebilmek ve şifreyi alabilmek için ufak bir bash script’i yazıyorum.

for döngüsü kullanarak i değişkenini 31000 ile 32000 arasındaki bütün değerleri gezdiriyorum. openssl komutunu s_client parametresiyle kullanarak client bağlantısı yapmak istediğimi belirtiyorum. Bağlanacağım server’ın adresini ve portunu -connect parametresiyle localhost ve i değişkeni olarak veriyorum. Komutun başlarken ekrana bastığı yazıları basmaması için -quiet parametresini kullanıyorum. Eğer bağlanmaya çalıştığım port SSL bağlantı kabul etmiyorsa ise dönen değer STDERR olacağı için 2>/dev/null komutuyla hataları hiçliğe yolluyorum. İstediğim çıktıya ulaşabilmek için /etc/bandit_pass/bandit16 dosyasındaki bandit16 kullanıcısına ait olan şifreyi açılacak olan openssl bağlantısına yönlendiriyorum. Son olarak openssl ile bağlanabileceğimiz bazı portlar bize bandit16 kullanıcısının şifresini geri döndüreceğini biliyoruz. Eğer bir bağlantı sağlarsak ve bu bağlantıyı kapatmazsak kodumuz çalışmaya devam etmez bu nedenle komutu timeout ile çevreliyorum. Komuta 2 değerini vererek bağlantıdan 2 saniye sonra bağlantıyı sonlandırmasını sağlıyorum. Çalıştıracağım komut olarak bash değerini verip -c ile aynı satırda bash komutu olarak openssl komutumu veriyorum ve çalıştırıyorum.

for i in {31000..32000}; do timeout 2 bash -c "cat /etc/bandit_pass/bandit16 | openssl s_client -connect localhost:$i -quiet 2>/dev/null"; done

LEVEL 17

Bir önceki bölümde bu kullanıcı için bir id_rsa dosyası bulmuştuk. Bu dosyayı kendi makineme kaydedip yetkilerini chmod 700 id_rsa komutuyla ayarladıktan sonra bandit17 kullanıcısına SSH bağlantısı gerçekleştiriyorum.

ssh -i id_rsa bandit17@bandit.labs.overthewire.org -p 2220

Kullanıcının home dizininde passwords.new ve password.old isminde iki dosya olduğunu ve old uzantılı dosya ile new uzantılı dosya arasında değiştirilmiş tek satırın bizim ihtiyacımız olan satır olduğunu biliyoruz. Bu karşılaştırmayı diff komutunu kullanarak yapabiliriz. Komuta -u parametresini vererek daha okunaklı bir çıktı ile aradığım bilgiye erişiyorum.

Sonraki Bölümler ->