
CTF - OverTheWire Bandit Çözümleri 1-15
İçindekiler
OverTheWire üzerindeki Bandit CTF’i beraber çözeceğiz. Oyun farklı bölümlerden oluşuyor ve her bölümdeki bayrak bir sonraki bölümün şifresi olarak kullanıyor. Toplam otuz dört bölümden oluşan oyun uzun olacağı için çözümleri seri halinde yayınlayacağım. Serinin ilk yazısında on beşinci bölüme kadar ilerleyeceğiz.
Bölüm 0
Oyuna bağlanmak için herhangi bir ssh istemcisini kullanabilirsiniz. Ben WLS Kali’de ssh tercih ettim.
ssh bandit0@bandit.labs.overthewire.org -p 2220
Kullanıcı adı: bandit0
Şifre: bandit0
Bölüm 0 → 1
İkinci bölüm için gerekli şifreyi bulmamız gerekiyor. Öncelikle içinde bulunduğumuz dizinin içeriğini ls komutu ile listeliyorum.
Readme adında bir dosya bulduk. cat komutundan faydalanarak içeriğini ekrana bastıralım.
cat readme
İlk bayrağımızı bulduk.
Kullanıcı Adı: bandit1
Şifre: boJ9jbbUNNfktd78OOpsqOltutMc3MY1
Yine ssh komutunu kullanarak ikinci bölüme bağlanıyoruz. @ işaretinden önce gelen kullanıcı adını ‘bandit2’ olarak değiştirmeyi unutmayın.
ssh bandit2@bandit.labs.overthewire.org -p 2220
Bölüm 1 → 2
İpucu: Ev dizini içerisinde -
isimli dosyada bayrağın bulunduğunu belirtilmiş.
-
işareti komutlara parametre iletmek için kullanılan özel bir operatör olduğu için cat -
komutu işe yaramayacaktır. Bunun önüne geçmenin bir kaç yolu var. Ben tam dosya yolunu yazmayı tercih ettim. Cat komutunu cat ./-
şeklinde düzenledim.
Kullanıcı Adı: bandit2
Şifre: CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
Bölüm 2 → 3
İpucu: Bayrağın bulunduğu dosyanın adında boşluklar olduğu belirtilmiş.
Yine önce ls ile kontrol ediyoruz. ‘spaces in the filename’ adlı dosyayı ekrana bastırmamız gerekiyor. Bu sefer boşluklardan \
operatörü ile kaçıyoruz. Cat komutumuz cat ./spaces\ in\ this\ filename
halini alıyor. cat ./
yazıp tab tuşuna basarsanız gerekli kaçış karakterini komut satırı otomatik olarak oluşturacaktır.
Kullanıcı Adı: bandit3
Şifre: UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
Bölüm 3 → 4
İpucu: Şifrenin ‘inhere’ adlı dizinde gizli bir dosyanın içerisinde olduğu belirtilmiş.
Rutin olarak ls ile kontrol ediyorum. Daha sonra cd ile ‘inhere’ adlı dizine geçerek ls ile dizin içeriğini listeliyorum. Ancak dosya gizli olduğu için ls komutunu -a parametresi ile kullanıyorum. Çıktıda görünen .
şu anki geçerli dizinin ..
is bir üst dizinin yolları, '.hidden' adlı dosya ise bayrağımızı içeren dosya.
Şifre: pIwrPrtPN36QITSp3EQaw936yaFoFgAB
Bölüm 4 → 5
İpucu: ‘inhere’ dizinindeki insanlar tarafından okunabilir formattaki dosyada bulunduğu belirtilmiş.
ls -l
ile dizin içerisindeki dosyalara bakıyorum. '-file' ile başlayan bir çok dosya var file komutundan yararlanarak dosyalar ile ilgili bilgi alacağız. file ./inhere/-file0*
(* burada herhangi bir karakter anlamına geliyor) komutu ile bütün dosyaların tipini öğreniyorum. ASCDII Text tipi insanların okuyabileceği bir format. cat ./inhere/-file07
ile dosyanın içeriğini ekrana bastıralım.
Şifre: koReBOKuIDDepwhWk7jZC0RTdopnAYKh
Not: Bu bölümde cd ile dizin değiştirmeden çalışabileceğimizi de görmüş olduk.
Bölüm 5 → 6
İpucu: inhere dizininde insanların okuyabileceği, çalıştırılabilir dosya olmayan ve 1033 byte uzunluğunda bir dosya arıyoruz.
Dosyayı bulmak için find komutundan yararlanacağız.
-readable
parametresi insanlar tarafından okunabilir,-size 1033c
dosyanın büyüklüğünün 1033 byte,-executable
ise çalıştırılabilir dosyaları (tersini almak için!
operatöründen yararlanacağız.) belirtiyor.
find inhere/ -readable -size 1033c ! -executable
Şifre: DXjZPULLxYr17uwoI01bNLQbtFemEgo7
Bölüm 6 → 7
İpucu: Sunucunun herhangi bir yerinde bandit7 kullanıcısına ait bandit6 grubunda 33 bayt boyutunda bir dosyayı arıyoruz.
Yine benzer şekilde find komutunu kullanacağız. Komutumuz find -user bandit7 -group bandit6 -size 33c
.
-user bandit7
parametresi dosyanın bandit7 kullanıcısına ait olduğunu,-group bandit6
dosyanın bandit6 grubuna ait olduğunu.-size 33c
ise dosyanın büyüklüğünün 33 byte olduğunu belirtiyor.
Ancak komutu bu şekilde kullanırsak okuma iznimizin olmadığı dosyalar ekrana hata mesajı döndürecek ve çıktımız kalabalıklaşacaktır. Bunu önlemek için 2>/dev/null
eki ile sterr(2 burada stderr’in giriş çıkış tanımlayıcısı) mesajlarına /dev/null‘a yönlendirerek bir nevi yok ediyoruz.
find -user bandit7 -group bandit6 -size 33c 2>/dev/null
Şifre: HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
Bölüm 7 → 8
İpucu: Şifremiz data.txt içerinde millionth kelimesinin yanında yer alıyor.
Cat komutu ile data.txt dosyasının içeriğini ekrana bastırırsak göreceğiz ki dosya içeriği oldukça uzun. Millionth kelimesini aramak için dosya içeriğini |
operatörüyle grep komutuna aktarıyoruz. grep komutu bizim için içerisinde millionth içeren satırları filitreliyor.
cat data.txt | grep "millionth"
Şifre: cvX2JJa4CFALtqS87jk27qwqGhBM9plV
Bölüm 8 → 9
İpucu : data.txt içerisinde sadece bir defa yer alan satırda şifremiz bulunuyor.
Dosyanın içerisinde bir defa geçen veriyi arıyoruz. Bu nedenle uniq komutu işimize yarayacaktır.
Ancak uniq komutu iki dosyayı karşılaştırmaya yarar girdi olarak pipe ile veri girersek alt alta denk gelen satırları karşılaştırıp birbirinin tekrarı olan satırları ekrana bastıracak. Bunun için önce dosyayı alfabetik sıraya göre sıralamamız lazım ki uniq tekrar eden satırları bulabilsin.
Bu noktada ise sort komutundan faydalanıyoruz. Son olarak tekrar eden satırları değil tam tersi bir kere yer alan satırı arıyoruz bunun için de -u
parametresini kullanacağız.
cat data.txt | sort | uniq -u
Şifre: UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
Bölüm 9 → 10
İpucu: Şifremiz data.txt içerisinde bir kaç = ile işaretli ve insanlar tarafından okunabilir nitelikte.
Strings komutu bir dosya içerisinde yer alan bütün yazdırılabilir*(yani insanlar tarafından okunabilir)* veriyi listeler. Bu komutun çıktısına *grep* komutuna yönlendirip *=* işaretini filtrelememiz yeterli olacaktır.
strings data.txt | grep '='
Şifre: truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
Bölüm 10 → 11
İpucu: data.txt dosyası içerisinde base64 ile şifrelenmiş halde.
Base64 komutuna şifreyi çözme işlemi için -d parametresini veriyoruz.
base64 -d data.txt
Şifre: IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
Bölüm 11 → 12
İpucu: Şifrenin bütün harfleri kendisinden sonra gelen on üçüncü harf ile değiştirilmiş, ve okumamız için Rot13 ile ilgili bir link bırakılmış.
ROT13 aslında bir çeşit sezar şifreleme. Kısaca özetlersek sezar şifreleme bir harfin kendisinden X sayı sonra gelen harfle değiştirildiği ilkel ve basit bir şifreleme metodudur. İngiliz alfabesinde yirmi altı adet harf bulunması nedeni ile rot13 tersine çalışan bir fonksiyondur. Yani şifreli metni 13 harf sonraki harfler ile değiştirdiğimiz zaman orijinal metine dönüş bulunuyoruz.
Bu işlemi yapabilmek için tr komutundan yararlanacağız. Tr komutuna bir birine dönüştürmek istediğimiz iki diziyi parametre olarak vermemiz gerekiyor.
İpucunda büyük ve küçük harflere dikkat etmemiz gerektiği zaten bahsedilmişti. O zaman ilk dizimiz ‘A-Za-z’ olacak. İkinci dizi ise A+13’ten*(N harfine denk geliyor)* başlayacak ve Z’ye kadar gidecek daha sonra alfabenin diğer yarısını da içerisine almak adına N+13’ten(A harfine denk geliyor) M’ye(N harfinden bir önceki harf Z+12) kadar gidecek. Daha sonra ise aynı işlemi küçük harfler için tanımlıyoruz.
tr 'A-Za-z' 'N-ZA-Mn-za-m
Şifre: 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
Bölüm 12 → 13
İpucu: Data.txt dosyasında üst üste sıkıştırılmış bir dizi dosyanın hexdump‘ı olduğu belirtilmiş.
Rahat çalışabilmemiz adına data.txt dosyasını /tmp dizini altına açacağımız bir dizinin içerisine kopyalayıp orada çalışmamız önerilmiş. Öncelikle bu işlemleri yapıyorum.
Daha sonrasında hexdump‘ı geri çevirmek için xxd -r data.txt > arsiv1
komutundan yararlanıyorum ve file komutu yardımıyla dosyanın hangi sıkıştırma algoritması kullanılarak sıkıştırıldığını öğreniyorum. Daha sonrasında doğru aracı kullanarak arşivi açıyorum.
Oldukça tekrar eden ve sıkıcı bir bölüm olmuş. O yüzden bütün komutlara ve ekran görüntülerine yer vermeyeceğim. Yapılan işlem döngü halinde file ile arşiv türünü öğrenip gzip, bzip2 ve tar kullanarak arşivleri açmaktan ibaret en sonunda ASCII tipinde bir dosyaya ulaşarak bölümü tamamlayacaksınız.
Dikkat etmeniz gereken iki nokta var:
1. Gzip dosya uzantılarının uyumlu olması bekliyor o yüzden gzip arşivlerini açmadan önce. mv [dosya] [dosya].gz
ile dosya uzantılarını düzelttim.
2. Yine gzip dosyanın açılan adını arşivli halinden taşıyor ve orijinal dosyayı siliyor bunun önüne geçmek isterseniz -dkN parametrelerinden yararlanabilirsiniz. gzip -dkn [dosya].gz
Şifre: 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
Bölüm 13 → 14
İpucu: Şifrenin /etc/bandit_pass/bandit14 dosyasında olduğunu ancak sadece bandit14 kullanıcısı tarafından okunabileceğini söylüyor. Buna ek olarak bandit14 kullanıcısı için private ssh anahtarımız olduğu ve yerel sunucunun localhost olduğu belirtilmiş.
Ls ile listeleyince anahtar dosyamızı buluyoruz. Komutumuza bu dosyayı ekleyerek ssh -i sshkey.private bandit14@localhost
haline getiriyoruz.
Bize soracağı bağlanmak istediğinize emin misiniz yazısına yes yazarak olumlu cevap veriyoruz ve doğrudan bandit14 kullanıcısı olarak bağlanmış oluyoruz.
Şifre: 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
Bölüm 14 → 15
İpucu: Bir sonraki bayrağı elde etmek için bu bölümün şifresini localhost port 3000‘e göndermemiz lazım.
Bunun için nc komutunu kullanarak localhost 3000 portuna bağlanıyoruz. nc localhost 3000
komutu ile bağlanarak şu anki bölümün şifresini (4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e) yapıştırıyoruz ve enter tuşuna basıyoruz.
Şifre: BfMYroe26WYalil77FoDi9qh59eK5xNr
Bu Serideki Yazılar
- CTF - OverTheWire Bandit Çözümleri 26-33 - SON
- CTF - OverTheWire Bandit Çözümleri 15-26
- CTF - OverTheWire Bandit Çözümleri 1-15