Level 0 | Level 1 | Level 2 | Level 3 | Level 4 | Level 5 |
Level 6 | Level 7 | Level 8 | Level 9 | Level 10 | Level 11 |
Level 12 | Level 13 | Level 14 | Level 15 | Level 16 | Level 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.

(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 ./-

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

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.

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.

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`

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.
