
CTF - OverTheWire Bandit Çözümleri 15-26
İçindekiler
OverTheWire Bandit CTF’ine kaldığımız yerden devam ediyoruz. Bölüm 15 ve 26 arasını kapsayan bu yazıda sonlara doğru epey yıprandım. Gerek aşırı yıpranmam gerekse konun başka bir yere gitmesi nedeniyle iki parça olarak düşündüğüm bu yazı dizisini üç parça halinde yazmaya karar verdim. 27’den 34’e kadar olan bölümleri bir sonraki yazıya bırakıyorum. İyi eğlenceler..
Bölüm 15 → 16
İpucu: Localhost port 30001‘e bölümün şifresini ssl ile şifrelenmiş şekilde göndermemiz gerekriği belirtilmiş.
Bu sefer ssl bağlantısı kurmak için openssl kullanacağız. Bağlantımızı openssl s_client -connect localhost:30001
komutu ile başlatıyoruz.
Daha sonra şifreyi yapıştırarak enter tuşuna basıyoruz ve sunucu cevap olarak bayrağı döndürüyor.
Şifre: cluFn7wTiGryunymYOu4RcffSxQluehd
Bölüm 16 → 17
İpucu: Bu bölümün şifresini localhost üzerinde 31000 ve 32000 aralığında ssl ile şifreli bir sunucuya göndermemiz gerekiyor. Veriyi göndermemiz gereken servis haricindeki bütün servisler bize gönderdiğimiz veriyi cevap olarak dönüyor (echo).
1. Adım ilgili aralıkta hizmet veren portları taramamız lazım bunun içi nmap aracından faydalanacağız.
nmap -sV localhost -p31000-32000
-sV
parametresi ile servis ve versiyon bilgilerini de araştırıyoruz.-p31000-32000
ile tarayacağımız port aralığını belirttik.
Çıktıları incelediğimizde echo yazan portlar ipucunda bahsettiğim gibi gönderdiğimiz isteği aynı şekilde cevap olarak gönderiyor. Kırmızı ile işaretli 31790 portu ise ssl kullanıyor ve bilinmeyen bir işleve sahip.
2. Adım: Openssl aracı ile ilgili hizmete bağlanarak şifreyi (cluFn7wTiGryunymYOu4RcffSxQluehd) gönderelim.
openssl s_client -connect localhost:31790
Doğru portu bulduk servis bize cevap olarak bir RSA Private key döndürdü.
—–BEGIN RSA PRIVATE KEY—– MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama +TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT 8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM 77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3 vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY= —–END RSA PRIVATE KEY—–
3. Adım: SSH anahtarımızı bir dosyaya kaydetmemiz lazım. Ancak ev dizini içerisinde yazma hakkımız yok. Bu nedenle /tmp altında ct adında bir dizin oluşturup burada çalışacağım.
mkdir /tmp/ct
cd /tmp/ct
Daha sonra herhangi bir editör yardımı ile anahtar.private adında bir dosya oluşturuyorum. Ben editör olarak nano tercih ettim. İçerisine anahtar dizimizi yapıştırarak kaydediyoruz.
nano anahtar.private
4. Adım: Son olarak ssh ile bir sonraki bölüme bağlanıyoruz.
ssh -i anahtar.private bandit17@localhost
Bir sonraki bölüme bağlanmış olduk daha önceki bölümlerden bandit oyununda her bölüme ait şifrerin /etc/bandit_pass/ dizini altında yer aldığını biliyoruz. cat /etc/bandit_pass/bandit17
komutu ile 17. bölümün şifresini ekrana bastırıyoruz. Böylece bir daha bu bölüme bağlanmamız gerektiğinde yukarıdaki adımları uygulamayacağız.
Şifre: xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn
Bölüm 17 → 18
İpucu: Ev dizininde passwords.old ve passwords.new adında iki dosya olduğu ve şifremiz ikinci dosyada değişen satır olduğu belirtilmiş.
Değişen satırı bulmak için diff komutunu kullanacağız. Diff komutuna ilk parametre olarak passwords.old dosyasını, ikinci parametre olarak ise passwords.new dosyasını veriyoruz.
diff passwords.old passwords.new
Şifre: kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
Not: Bölüm 18’e bağlanmaya çalıştığınızda başarısız olursanız konu 18. bölüm ile ilgili. Bölüm 18’i okumaya devam edin.
Bölüm 18 → 19
İpucu: Şifrenin ev dizini altında readme dosyasının içeriğinde olduğu ancak .bashrc içersine yazılmış bir kodun sunucu ile olan bağlantımızı kestiği belirtilmiş.
.bashrc devreye girmeden komut çalıştırmak için ssh‘a çalıştırmak istediğimiz komutu parametre olarak yazıyoruz.
ssh bandit18@bandit.labs.overthewire.org -p 2220 "cat readme"
Şifre: IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
Bölüm 19 → 20
İpucu: Ev dizini içerisinde setuid görevi gören bir çalıştırılabilir dosya olduğu ve şifrenin her zamanki gibi /etc/bandit_pass içerisinde yer aldığı belirtilmiş.
ls ile baktığımız zaman bandit20-do adında bir çalıştırılabilir dosya olduğunu görüyoruz. Kısaca sudo benzeri bir iş yaparak herhangi bir komutu bandit20 kullanıcısı olarak çalıştırmamıza olanak sağlıyor.
./bandit20-do cat /etc/bandit_pass/bandit20
Şifre: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Bölüm 20 → 21
İpucu: Ev dizinin yine bir setuid çalıştırılabilir dosyası olduğu, bu dosyanın komut satırından parametre olarak belirtilen porta bağlanarak sunucudan gelen cevabı dinlediğini ve gelen cevap bir önceki bölümün şifresine eşit ise bir sonraki bölümün şifresini sunucuya gönderdiği belirtilmiş.
İpucundan yola çıkarak suconnect adlı dosyanın bağlanabileceği ve istemciye bulunduğumuz bölümüz şifresini gönderecek bir sunucu oluşturmamız gerekiyor. nc komutuna -vlp parametreleri ve bir port numarası vererek belirttiğimiz portu dinlemesini sağlayabiliriz. Daha sonrasında nc komutuna echo GbKksEFF4yrVs6il55v6gwY5aVje5f0j ile geçerli bölümün şifresini yönledirebiliriz.
echo GbKksEFF4yrVs6il55v6gwY5aVje5f0j | nc -vlp 12345
Bu noktada ayrı bir terminal üzerinden ikinci bir ssh bağlantısı kurarak bölüme tekrar bağlanmamız ve ./suconnect 12345
komutunu çalıştırmamız lazım.(Eski terminali kapatmayınız.)
Şifrenin sunucuya gönderildiğini görüyoruz. İlk bağlantıyı kurduğumuz pencereye dönelim ve bir sonraki bölümün şifresini alalım.
Şifre: gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
Bölüm 21 → 22
İpucu: Cron dosyaları ile bir takım dosyaların otomatik olarak çalıştırıldığı ve /etc/cron.d altındaki dosyaları kontrol etmemiz gerektiği belirtilmiş.
Cat * ile /etc/cron.d/ altındaki bütün dosyaların içeriğini ekrana yazdıralım. Çalışmaları zamanlanmış sh scriptlerinin içeriğine tek tek bakalım.
/usr/bin/cronjob_bandit22.sh adlı betik /etc/bandit_pass/bandit22 dosyasının içeriğini /tmp altında t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv adlı dosyaya yazıyor. Dosyanın içeriğini yazdırıyoruz.
Şifre: Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
Bölüm 22 → 23
İpucu: Geçen bölümle aynı ipucu verilmiş. Ek olarak başka insanların yazdığı bash scriptlerini okumanın faydalı olduğu belirtilmiş.
bir sonraki zamanlanmış scriptine (cronjob_bandit23.sh) bakalım.
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
Bu satırda I am user ile geçerli kullanıcı adı harmanlanarak hashlenmiş. Bu hash ise /tmp altında dosya adı olarak kullanılmış ve bölümün şifresi kopyalanmış.
echo I am user bandit23 | md5sum | cut -d ' ' -f 1
komutunu çalıştırarak aynı hash’e ulaşabilir ve dosyanın adını öğrenebiliriz.
Dosyayı yazdıralım.
Şifre: jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
Bölüm 23 → 24
İpucu: Yine önceki bölümlerle aynı şeyler yazılmış. Ek olarak:
- Not: İlk defa script yazacağımız ve bu yüzden bu bölümü tamamlayınca gurur duymamız gerektiği belirtilmiş :D.
- Not-2: Yazdığımız scriptler çalışınca silindiğinden bahsedilmiş bu yüzden yazdığımız scriptin yedeğini almamız tavsiye edilmiş.
Aynı şekilde cron iş dosyalarını inceleyerek başlıyorum.
cronjob_bandit24.sh dosyasını değerlendirdiğimizde:
/var/spool/$myname(bandit24)
altında bulunan bütün scriptlerin çalıştırıldığını,- timeout ile komutu ile 60 saniyede bir bu işlemin tekrarlandığını
görüyoruz. Önce /tmp altında kendime bir çalışma alanı ayarlıyorum.
- mkdir ile bir dizin açıyorum ve izinleri 777 ile herkes tarafından okunabilir ve yazılabilir yapıyorum.
- vim kullanarak (siz nano da tercih edebilirsiniz) payload.sh adlı bir script oluşturuyorum ve içerisine /etc/bandit_pass/bandit24 dosyasının içeriğini kendi klasörüme kopyalayan bir script yazıyorum:
#!/bin/sh
cat /etc/bandit_pass/bandit24 > /tmp/payload/pass
- Dosyanın herkes tarafından okunabilir, yazılabilir ve çalıştırılabilir olduğuna emin oluyorum.
- Son olarak dosyayı /var/spool/bandit24 dizini altına kopyalıyorum.
Bu noktadan sonra 60 saniyelik timeout zamanın dolmasını bekliyorum. Arada ls ile kontrol ediyorum.
Şifre: UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
Not: Artık gurur duyabiliriz :)
Bölüm 24 → 25
İpucu:
- Port 30002 üzerinde dinleme yapan bir servisin olduğu
- Servisin geçerli bölüm şifresi ve doğru pin sağlanan isteğe sonraki bölümün şifresini döneceği
- Pin kodunun 4 haneli olduğu
- Yalnızca brute force ile kırılabileceği belirtilmiş.
Öncelikle ilgili servise bir istekte bulunalım.
Bağlantı başlayınca sunucu bize [Bandit24-Şifrei PIN] şeklinde bir istek beklediğini belirtiyor.
Bandit24 kullanıcısnın şifresini 0 dan 999’a kadar olan pin kodlarını sırayla ekrana yazacak bir script yazalım. /tmp dizinin altında kendime bir çalışma alanı ayarlıyorum.
- brute.sh adında bir dosya oluşturup chmod +x ile çalışma izni veriyorum.
- basit bir döngü ile echo [şifre] $i satırında çıktı üretiyorum
Bu noktadan sonra
./brute.sh | nc localhost 30002
ile çıktıları sunucuya iletiyorum- Son olarak grep komutu ile password içeren satırları yakalıyorum.
Şifre: uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG
Bölüm 25 → 26
İpucu: bandit25’ten bandit26’ya geçişin kolay olduğu, bandit26 kullanıcısı için ön tanımlı kabuğun /bin/bash olmadığı belirtilmiş. Hangi kabuk olduğu, nasıl çalıştığını öğrenmemiz ve dışına çıkmamız için bir yol bulmamız gerektiği tavsiye edilmiş.
Not: Bu ve bir sonraki bölüm kişisel olarak sıkıldığım, sinir krizleri geçirdiğim ayrıca garip bir şekilde keyif aldığım bölümler oldu.
Ls ile kontrol ettiğimiz zaman ev dizininde .sshkey dosyası olduğunu görüyoruz. Ancak ssh -i bandit26.sshkey bandit26@localhost
ile bağlanmaya çalıştığımızda bağlantımız otomatik olarak kapanıyor.
Bandit26 kullanıcsının hangi kabukta işlem yaptığını görebilmek adına /etc/passwd dosyasına bakıyorum
Kabuk olarak /usr/bin/showtext dosyasının tanımlı olduğunu görüyoruz. İlgili dosyaya bakalım
Not 2: Bu noktada az kafayı yemedim. Bu arada text.txt dosyasını okuma iznimiz yok. Bir noktada işin içinden çıkamayacağımı düşünsemde bir şekilde bir açık olduğunu ve bir sonraki bölüme geçmenin imkansız olmadığını biliyoruz. Bir kaç kere bilgisayar başından kalkıp oturmamın ve satırları tek tek araştırmamın ardından çözüme ulaştım.
Satırları tek tek inceleyelim
export TERM=linux
Terminal emülatörünü linux olarak ayarlıyor.more ~/text.
More komutu ile text dosyasını ekrana basıyor.exit 0
bağlantımızı sonlandıran komut.
Delirme aşamalarını geçtikten sonra more komutunun yardım sayfalarını incelediğimde ‘v’ tuşu ile editöre girebileceğimi gördüm. Öncelikle terminalin boyutunu küçültmem gerekti ki more komutu devreye girsin. ‘V’ ile editörü çalıştırdığımda ön tanımlı editörün vi olduğunu(man sayfalarında da belirtildiği üzere) görüyoruz. Bu noktada işler çözülmeye başlıyor. More komutu hala devam ettiği için exit komutu henüz çalışmış değil ve subprocess olarak çalışan vi’nin içerisindeyiz. Vi’nin komut çalıştırma özelliğini kullanarak başka bir subprocess çalıştırabilirz. Biraz karışık olduğunu biliyorum.
more ~/text.txt > vi > bizim komutumuz
şeklinde şematize edebilirim sanırım.
1. Adım Terminalimizi küçültüyoruz ve ssh bağlantımızı başlatıyoruz. Birkaç deneme gerektirebilir aşırı küçültmeyin. More devreye girecek kadar küçültmeniz yeterli. More devreye girince ekranı tekrar büyütebilirsiniz.
2. Adım ‘v’ Tuşuna basarak vi’yi açıyoruz. 3. Adım İki nokta üst üste yazarak vi’yi komut moduna alıyoruz ve sırasıyla
:set shell=/bin/bash
:shell
komutlarını uyguluyoruz. Ve böylece bash kabuğuna düştük.
Hemen bandit26 kullanıcısının şifresini alalım ve ev dizininde neler var diye bakalım. bandit27-do adlı bir dosya var böylece bir sonraki bölümü de çözmüş olduk.
Bölüm 26 Şifresi: 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z Bölüm 27 Şifresi: 3ba3118a22e93127a4ed485be72ef5ea
Bölüm 26 → 27
Bölümün çözümü Bölüm 25 → 26’da anlatıldı.
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