OverTheWire: Wargames — Bandit

Alex
27 min readFeb 22, 2024
OverTheWire: Bandit (https://overthewire.org/wargames/bandit/)

Hola!

Kali ini, saya akan coba solve salah satu challenge di website OverTheWire, yaitu Bandit. Pada challenge Bandit ini, terdapat 35 level (level 0 -34) yang harus kita selesaikan. Aturannya simpel:

Finishing a level results in information on how to start the next level.

Challenge Bandit ini tujuannya sederhana, yaitu:

The purpose of this game is for you to learn the basics. Part of learning the basics, is reading a lot of new information.

Intinya, di challenge Bandit ini, kita akan belajar dasar-dasar linux.

Jadi, kita tidak perlu merasa “cupu” kalau stuck di salah satu levelnya, karena, kita hanya perlu istirahat sebentar, kemudian lanjut untuk mencari solusinya di Google (dan ChatGPT kalau perlu) supaya bisa menghajar level-level berikutnya.

Tanpa basa-basi lagi, kita mulai ke level 0.

Let’s Gooo!!!

Level 0

level 0

Objective: login ke server dengan SSH

Info:

  • host: bandit.labs.overthewire.org
  • port: 2220 (SSH)
  • username: bandit0
  • password: bandit0

Answer:

Langsung kita coba login ke SSH-nya dengan kredensial tersebut. Pastikan kita sudah menginstall ssh di mesin linux kita.

SSH to server

Oke, berhasil masuk. Nice, level 0 selesai.

Level 0 -> 1

level 0–1

Objective: cari password di file “readme” & login dengan password tersebut menggunakan username bandit1.

Info:

  • username: bandit1
  • file: readme di home directory

Note: Kapanpun kita mendapatkan password untuk naik level, kita dapat menggunakannya untuk login kembali dengan SSH di port 2220 tadi.

Answer:

Langsung kita cari…

password

Yup, ketemu…

Kita akan coba login ulang dengan username bandit1 dan password yang baru ditemukan tadi.

login by username: bandit1

Berhasil login…

Level 1 -> 2

level 1–2

Objective: cari password di file “-” di home directory & login dengan password tersebut menggunakan username bandit2.

Answer:

- file

Kita menemukan filenya, tapi karena namanya hanya strip (-) saja, jadi, tidak bisa dibuka dengan perintah seperti normalnya file lain. Jadi, lebih baik kita coba tanya chatgpt.

chatgpt

Oke, kita coba…

password

Berhasil! Thanks to chatgpt. Kita login kembali dengan username: bandit2 dan password yang baru saja kita dapatkan.

login by username: bandit2

Oke, kita lanjut…

Level 2 –> 3

level 2–3

Objective: cari password di file bernama “space in this filename” di home directory & login dengan password tersebut menggunakan username bandit3.

Answer:

password

Easy, hanya perlu mengetikkan sebagian namanya saja, lalu tekan Tab, maka linux akan otomatis menuliskan nama filenya agar dapat dibaca dengan perintah cat.

Login dengan username: bandit3 dan password yang baru saja kita dapatkan!

Lanjut ke level berikutnya…

Level 3 -> 4

level 3 -4

Objective: cari password di file yang tersembunyi di direktori “inhere” & login dengan password tersebut menggunakan username bandit4.

Answer:

password

Masih mudah.

Login dengan username bandit4 dan password yang baru saja kita temukan itu.

Kita lanjut.

Level 4 -> 5

level 4 -5

Objective: cari password di file yang “human-readable”di direktori “inhere” & login dengan password tersebut menggunakan username bandit5.

Answer:

password

Ada 10 file di direktori inhere. Tapi, setelah dicoba baca satu-persatu, yang human-readable hanya file -file07.

Lanjut login dengan username bandit5 dengan password yang sudah kita temukan di fille -file07 tadi.

Level 5 -> 6

level 5–6

Objective: cari password di file yang ada di direktori “inhere” & login dengan password tersebut menggunakan username bandit6.

Info:

Berikut adalah karakteristik file yang perlu kita temukan di direktori inhere:

  • human-readable
  • ukurannya 1033 bytes
  • tidak executable

Answer:

inhere directory

Ada 20 folder/direktori lagi ternyata di dalam direktori inhere. Dan, akan capek dan buang-buang waktu kalau kita cek satu persatu foldernya hanya untuk menemukan satu file yang sesuai kriteria. Jadi, kita akan coba temukan file yang dimaksud menggunakan perintah find.

Panggil ChatGPT :)

chatgpt

Oke, untuk mempermudah, saya hanya akan mengambil karakteristik ukurannya saja sebagai filter. Jadi, perintah yang akan saya gunakan adalah sebagai berikut:

find ./ -type f -size 1033c
password

Okeyy, berhasil!

Login dengan username bandit6 dan password yang sudah kita temukan barusan!

Level 6 -> 7

level 6 -7

Objective: cari password di file suatu tempat di server & login dengan password tersebut menggunakan username bandit7.

Info:

Berikut adalah karakteristik file yang perlu kita temukan:

  • dimiliki oleh user bandit7
  • dimiliki oleh group bandit6
  • ukuran file 33 bytes

Answer:

Kita panggil lagi ChatGPT, xixixi

chatgpt

Kalau saya jalankan perintah tersebut, maka outputnya akan seperti ini:

find output

Terlalu banyak output yang berupa error. Kita mau supaya output atau hasil perintah yang kita inputkan adalah benar-benar menunjukkan file (atau file-file) yang memenuhi kriteria saja, tanpa harus menampilkan hasil error seperti “Permission denied” tersebut. Jadi, mari kita tanya lagi ke master ChatGPT…

chatgpt
password

Yakkk, berhasil! Kita hanya perlu menambahkan “2>/dev/null” di belakang perintah find yang tadi supaya dapat meng-eksklud output errornya.

Sekarang, login dengan username bandit7 dan password yang sudah kita dapatkan…

Level 7 -> 8

level 7–8

Objective: cari password di file data.txt, di sebelah kata millionth & login dengan password tersebut menggunakan username bandit8.

Answer:

data.txt

Setelah diidentifikasi, file data.txt ternyata adalah file yang terdiri dari dua kolom, sebelah kiri adalah sebuah kata dan sebelah kanan adalah string random. Dan, ukuran filenya lumayan besar (4 MB) karena memang file data.txt mengandung 98.567 baris susunan kata dan string random seperti itu. Jadi, mustahil kalau kita cek satu-satu untuk mencari kata “millionth”.

Maka, kita akan gunakan perintah grep untuk memfilter kata “millionth” tersebut.

cat data.txt | grep millionth
password

Masih easy.

Jadi, kita lanjutkan dulu ke level berikutnya dengan login menggunakan username bandit8 dan password di atas.

Level 8 -> 9

level 8–9

Objective: cari password di file data.txt yang berada pada line yang hanya muncul sekali saja & login dengan password tersebut menggunakan username bandit9.

Answer:

data.txt

Jika melihat screenshot di atas, kita bisa tahu beberapa hal:

  • file data.txt adalah file yang berisi barisan random string.
  • Terdapat 1001 baris random string.
  • Setiap string pasti memiliki string lain yang sama persis (contohnya adalah seperti yang saya beri ceklis), kecuali string password yang akan kita gunakan untuk naik level.

Jadi, bagaimana cara mencari string hanya hanya muncul sekali dalam file data.txt? ChatGPT…

chatgpt

Berikut penjelasannya:

alt

Kita coba…

password

Nice!

Thanks again to ChatGPT…

Kita lanjut ke level berikutnya dengan login menggunakan username bandit9 dan password barusan yang kita dapatkan.

Level 9 -> 10

level 9–10

Objective: cari password di file data.txt berupa string human-readable yang didahului oleh beberapa karakter tanda sama dengan (=) & login dengan password tersebut menggunakan username bandit10.

Answer:

data.txt

Hmm.., berdasarkan isi file data.txt di level ini, kita tahu bahwa data.txt berisi karakter binary random. Solusinya? Coba kita tanyakan ke ChatGPT, cara mencari string yang dimulai dengan beberapa tanda sama dengan (= ) yang terdapat pada file yang berisi binary karakter seperti ini.

chatgpt

Berikut penjelasannya:

alt

Kita coba…

password

ChatGPT memang dabes lah yaa, wkwkwk.

Lanjut, kita login ke level berikutnya dengan username bandit10 dan password barusan yang kita dapatkan.

Level 10 -> 11

level 10–11

Objective: cari password di file data.txt yang ter-encode oleh tipe encoding base64 & login dengan password tersebut menggunakan username bandit11.

Answer:

password

Eaasyy, tinggal kita decode langsung aja dan bummm!!!

Lanjut ke level berikutnya dengan username bandit11 dan password tersebut!

Level 11 -> 12

level 11–12

Objective: cari password di file data.txt, dimana semua karakter huruf kecil (a-z) dan besar (A-Z) dirotate 13 posisi & login dengan password tersebut menggunakan username bandit12.

Answer:

data.txt

“di-rotate 13 posisi”, kita dah tahu maksudnya, adalah tipe enkripsi ROT 13. Jadi, kita tinggal ubah ke posisi semula. Di sini, saya menggunakan website, rot13.com.

password

HHHeeeaassyyy!!!

Lanjut login ke level selanjutnya dengan username bandit12 dan password itu!

Level 12 -> 13

level 12–13

Objective: cari password di file data.txt yang merupakan sebuah hexdump yang sudah berulang kali dikompres. Jadi, kita bisa menggunakan direktori /tmp untuk menganalisis file data.txt tesebut & kemudian login dengan password tersebut menggunakan username bandit13.

Answer:

data.txt

Pertama-tama, saya membuat direktori baru di /tmp/cobadata. Kemudian, saya men-copy-paste file data.txt tersebut ke direktori baru tadi. Selanjutnya proses “de-kompresi” di mulai. Dan setelah sekian lama mencoba untuk terus meng-”dekompres”, akhirnya saya mendapatkan file yang berisi password untuk level selanjutnya.

password

Kita lanjut ke level berikutnya dengan login menggunakan username bandit13 dan password barusan yang sudah kita temukan setelah sekian kali proses dekompres.

Level 13 -> 14

level 13–14

Objective: cari password di file /etc/bandit_pass/bandit14 yang haya bisa dibaca oleh user bandit14.

Info:

  • passwordnya tersimpan di file /etc/bandit_pass/bandit14
  • file tersebut hanya dapat dibaca oleh user bandit14
  • untuk level ini, kita tidak memerlukan password untuk naik level, tapi private SSH key
  • hostname mesin yang sedang berjalan bernama localhost

Answer:

private ssh key in sshkey.private

Seperti di-mention pada soal, kita menemukan file bernama sshkey.private di home directory yang berisi private key untuk login ke SSH.Jadi, saya akan copy-paste dulu private key tersebut ke file di komputer lokal saya yang saya beri nama id_rsa.

id_rsa

Selesai. Selanjutnya, saya akan login ke akun bandit14 menggunakan private key tersebut. Jangan lupa untuk mengubah permission filenya terlebih dahulu.

chmod 600 id_rsa
ssh bandit14@bandit.labs.overthewire.org -p 2220 -i id_rsa
login with bandit14 username

Berhasil!

Selanjutnya, seperti di mention juga di soal, kita akan melihat password yang tersimpan di file /etc/bandit_pass/bandit14.

password

Lanjut ke level berikutnya…

Level 14 -> 15

level 14–15

Objective: password untuk berikutnya dapat didapatkan dengan men-submit password di level sebelumnya ke port 30000 di localhost.

Answer:

Pertama, saya coba iseng mengecek service dari port 30000 tersebut dengan nmap.

localhost port 30000

Nama service yang berjalan di port 30000 adalah ndmps. Ketika tanya ChatGPT, saya ga ga dapet clue apa-apa. So, kita kembali ke soal…

Tugas kita hanyalah men-submit password dari file /etc/bandit_pass/bandit14 tadi ke port 30000 di localhost, kan? Jadi, saya akan coba berkomunikasi dengan port 30000 di localhost ini, dengan nc…, dan dengan telnet.

Ketika sudah terhubung, saya akan submit pasword tadi di sana.

password

Dan kita mendapatkan password yang baru!

Level 15 -> 16

level 15–16

Objective: password untuk berikutnya dapat didapatkan dengan men-submit password di level sebelumnya ke port 30001 di localhost menggunakan enskripsi SSL.

Answer:

Seperti sebelumnya, saya akan coba cek terlebih dahulu service yang berjalan di port 30001 dengan nmap.

nmap localhost -p 30001 -vv -sV
nmap

Service yang berjalan adala ssl/pago-service. Karena saya sendiri tidak tahu cara berinteraksi dengan service tersebut, mari kita tanyakan ke ChatGPT.

chatGPT

Markicob, mari kita coba.

openssl s_client -connect localhost:30001
ssl-pago/service

Berhasil!!

Kita lanjut ke level berikutnya!

Level 16 -> 17

level 16–17

Objective: password untuk berikutnya dapat didapatkan dengan men-submit password di level sebelumnya ke salah satu port yang ada di localhost di range port nomor 31000–32000. Hanya 1 server yang akan mengembalikan nilai input kita berupa kredensial untuk level selanjutnya, server yang lain hanya akan mengembalikan ulang nilai yang kita inputkan.

Answer:

Berarti kita pertama-tama harus menebak dulu, port mana yang open. Kemudian, cari mana port yang menggunakan service dengan SSL.

Kita coba scannng dulu dengan nmap.

nmap -p31000-32000 --open -vv localhost
open port 31000–32000

Oke, gut, kita dapat 5 nomor port yang open, yaitu port nomor 31046, 31518, 31691, 31790, dan 31960. Sekarang, kita akan lihat service dari masing-masing port tersebut, masih dengan nmap.

nmap -vv -sV -p31046,31518,31691,31790,31960 localhost
ports with their services

Kita tahu sekarang hanya ada dua port yang menjalankan ssl, yaitu port 31518 dengan service ssl/echo dan 31790 dengan service ssl/unknown.

Kita akan coba interaksi dengan port 31518 dengan perintah atau command yang sama seperti sebelumnya.

ChatGPT

Setelah dicoba,..

interact with port 31518

Ternyata, port 31518 hanya mengembalikan kembali nilai input yang kita masukkan. Berarti, port tersebut bukan port yang dimaksud. So, kita coba port dengan service ssl yang kedua, yaitu port nomor 31790.

interact with port 31790

Naiisss, berhasil!!!

Kita mendapatkan SSH private key.

Okeyy, kita lanjut ke level berikutnya menggunakan username bandit17 dan ssh key tersebut!

login with username bandit17 and ssh private key

Level 17 -> 18

level 17–18

Objective: Kita harus menemukan password berupa string yang terdapat di file passwords.new yang merupakan satu-satunya string yang berubah dari string di file passwords.old. Kedua file tersebut ada di home directory.

Info:

Ada catatan juga di soal yang bilang bahwa kalau kita nanti sudah mendapatkan passwordnya dan mencoba login ke bandit18, tapi mendapatkan pesan “Byebye!”, berarti itu terkait dengan soal di level berikutnya, bandit19. Okee! Noted.

Answer:

Kita cek dulu kedua file tersebut.

passwords.old and passwords.new

Kita bisa melihat dari isi sampel kedua file tersebut, keduanya memiliki string yang sama persis. Jadi, seperti yang tertera di soal, kita perlu mencari satu-satunya string yang sudah berubah di file passwords.new.

Kita akan gunakan perintah atau command diff.

chatgpt

contohnya sebagai berikut:

chatgpt

oke, kita coba…

password

Booom! Berhasil!

Kita login ke level selanjutnya via SSH dengan username bandit18 dengan password yang barusan ditemukan…

Tapi,

byebye

Seperti yang sudah dimention di soal, ada pesan byebye ketiga login ke bandit18. Oke, kalau gitu, kita lanjut dulu baca soal di bandit18.

Level 18 -> 19

level 18–19

Objective: Password untuk level berikutnya tersimpan di sebuah file bernama readme di home directory. Sayangnya, seseorang sudah mengubah file .bashrc supaya kita logout ketika login dengan ssh.

Answer:

Hmm, oke, wajar dan nyambung berarti ya, kenapa sebelumnya, saya gak bisa login ke bandit18 dan ada pesan “byebye”. Kalau gitu, kita coba login dengan bandit17 untuk melihat-lihat file dan permissionnya di home directory bandit18.

bandit18 home directory

Seperti terlihat, file permissionnya pun juga sangat terbatas. Kita juga tidak bisa membaca file .bashrc itu.

Jadi, gak ada salahnya tanya ChatGPT, hehe..

chatgpt

Kita coba sarannya…

ssh -t bandit18@bandit.labs.overthewire.org -p 2220 'bash --noprofile'
trial & error

Ternyata masih belum berhasil. Oke, kita tanya lagi ke ChatGPT.

chatgpt

ChatGPT menyarankan untuk mengganti shell loginnya ke /bin/sh. Ide bags. Kita coba…

ssh -t bandit18@bandit.labs.overthewire.org -p 2220 /bin/sh
login success

Woooww! Berhasil!! Kita berhasil login ke bandit18 dengan shell “sh”. Saatnya membaca file readme!

password

Kita lanjut ke bandit19 dengan password tersebut!

Level 19 -> 20

level 19–20

Objective: Kita dapat menemukan password untuk level berikutnya di file /etc/bandit_pass setelah kita berhasil menggunakan binary setuid di home directory.

Answer:

Sebelumnya, berikut adalah penjelasan singkat mengenai setuid binary.

chatgpt

Lanjut…

password

Kita berhasil membaca password yang ada di dalam file /etc/bandit_pass/bandit20 menggunakan binary yang ada di home directory. Karena, kalau kita coba baca langsung filenya tidak bisa.

Kenapa begitu? Karena file permission /etc/bandit_pass/bandit20 memiliki grup yang sama dengan binary bandit20-do.

Kita lanjut ke bandit20 dengan password tersebut.

Level 20 -> 21

level 20–21

Objective: Kita disuguhkan sebuah setuid binary di home directory yang membuat koneksi ke port di localhost yang kita masukkan sebagai argumennya. Kemudian, nanti dia akan membaca teks dari koneksi tersebut dan membandingkannya dengan password di level sebelumnya (bandit20). Kalau betul, dia akan memberikan password untuk level berikutnya.

Answer:

Pertama-tama, kita lihat dulu file setuid binary-nya.

suconnect

Oke, kita sudah tau bagaimana cara menggunakan setuid binary tersebut. Skema yang akan kita jalankan seperti ini kira-kira:

Kita akan pasang listener (netcat/nc) di port random (saya pilih 1337), dimana listener tersebut juga bertugas sebagai pemberi input (berupa file password bandit20 di /etc/bandit_pass/bandit20) kepada binary yang akan menghubunginya (dalam hal ini adalah suconnect). Jadi, ketika binary suconnect menghubungi port 1337, dia akan mendapatkan input berupa file berisi password bandit20 tadi dan akan memberikan output berupa password baru untuk level berikutnya jika password yang diinputkan oleh listener tadi benar.

Sederhananya saya gambarkan sebagai berikut:

schema

Kita coba praktekkan…

password

Berhasill!!

Kita mendapatpkan passoword untuk login ke bandit 21.

Level 21 -> 22

level 21–22

Objective: Sebuah program berjalan secara otomatis dari cron. Tugas kita adalah melihat konfigurasinya di /etc/cron.d dan mencari tahu perintah atau command apalagi yang dieksekusi melalui cron tersebut.

Answer:

password

Berdasarkan screenshot tersebut, kita bisa melihat ada file konfigurasi cronjon untuk bandit22. Ketika dibaca isi filenya, file tersebut bertugas untuk mengeksekusi sebuah script /usr/bin/cronjob_bandit22.sh setiap restart mesin dan setiap detik ketika mesin hidup.

Adapun isi file script tersebut yaitu mencetak output dari file password bandit22 dari /etc/bandit_pass/bandit22 ke file bernama random di direktori /tmp. Dengan kata lain, kalau kita bisa membaca isi file /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv ini, artinya, kita mendapatkan password bandit22.

Dan benar saja, setelah dibaca, isi file tersebut memang adalah password bandit22!

Level 22 -> 23

level 22–23

Objective: Tugas kita adalah mengamati file konfirugrasi cronjob yang lain.

Answer:

cronjob_bandit23.sh

Sama seperti level sebelumnya, kita perlu mengecek file konfigurasi di /etc/cron.d. Ada file cronjob_bandit23 yang bertugas untuk mengeksekusi script /usr/bin/cronjob_bandit23.sh. Inti isi file script tersebut adalah perintah untuk mencetak output dari file /etc/bandit_pass/bandit22 ke file /tmp/8169b67bd894ddbb4412f91573b38db3.

Artinya, kalau saya menjalankan atau mengeksekusi file script tersebut, kita tidak akan mendapatkan password untuk bandit23 karena file password yang di-copy-paste ke file di direktori /tmp tersebut adalah password bandit22, bukan password bandit23.

Jadi, kita hanya perlu membaca file konfigurasi cronjob lain.

cronjob_bandit24

Ternyata, file script /usr/bin/cronjob_bandit24.sh gak bisa dibaca…

Hmmm,,…

Setelah mencoba-coba beberapa cara dan banyak yang tidak berhasil, saya akhirnya menemukan beberapa kesimpulan.

  • berdasarkan dua file script tersebut, /usr/bin/cronjob_bandit22.sh & /usr/bin/cronjob_bandit23.sh, kita tahu bahwa mereka sama-sama men-copy-paste password dari /etc/bandit_pass ke /tmp.
  • kemungkinan, ada file di /tmp yang juga berisi password hasil copy-paste dari /etc/bandit_pass/bandit23.
  • sayangnya, direktori /tmp sendiri gak bisa di list
  • Tapi, nama file yang ada di /tmp jelas bukan string random, tapi hasil hash dengan algoritma md5, seperti yang ada di file script /usr/bin/cronjob_bandit23.sh.

Artinya, kalau kita bisa mencari tahu hasil hash md5 untuk bandit23, kita bisa mendapatkan file password bandit23 di /tmp.

So, pertama-tama, saya akan men-copy file /usr/bin/cronjob_bandit23.sh ke /tmp..

copy cronjob_bandit23.sh to /tmp dir

Selanjutnya, saya akan mengubah value variabel myname dari ($whoami) ke ‘bandit23’.

editing cronjob_bandit23.sh

Berikutnya, saya akan jalankan script tersebut, langsung dari direktori /tmp saja.

running cronjob_bandit23.sh inside /tmp dir

Dan terlihat kita mendapatkan nama file yang menyimpan password bandit23.

password

Yakkk! Berhasill! Kita mendapatkan password bandit23!

Level 23 -> 24

level 23–24

Objective: Kita harus membuat file script sendiri untuk mendapatkan password level berikutnya.

Answer:

Pertama-tama, kita inspeksi dulu cronjob bandit24.

/usr/bin/cronjob_bandit24.sh

Kita temukan file script /usr/bin/cronjob_bandit24.sh yang bertugas untuk mengeksekusi semua script yang ada di direktori /var/spool/$myname/foo. Dan setelah 60 detik, eksekusi akan dihentikan, dan file script yang ada di direktori tersebut akan dihapus.

Jadi, di sini, ide saya adalah, saya akan membuat file script yang akan men-copy password dari /etc/bandit_pass/bandit24 ke /tmp. Supaya tidak susah, saya akan menyalin script cronjob_bandit23.sh tadi dan mengganti value variabel myname-nya ke bandit24.

File tersebut akan saya simpan dengan nama script.sh dan akan dibuat dalam satu baris saja. Kira-kira kodenya seperti ini:

#!/bin/bash

myname='bandit24'
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)

echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"

cat /etc/bandit_pass/$myname > /tmp/$mytarget

Kita coba…

password

Booom!! Berhasil! wkwkw

Kita tinggal login ke akun bandit24 dengan password tersebut!

Level 24 -> 25

level 24–25

Objective: Kita harus memasukkan password bandit24 dan 4 digit angka tambahan di belakangnya ke port 30002 di localhost untuk mendapatkan password bandit25.

Answer:

Kita coba cek port 30002-nya…

localhost 30002

Ya, seperti yang dikatakan di soal, kita perlu menginputkan password bandit24 dan diikuti dengan 4 digit angka setelahnya yang dipisahkan oleh spasi. Masalahnya, kita gak tau 4 digit angka yang betul itu berapa, kan? Jadi, kita harus membuat script bruteforce sepertinya..

Langkah pertama, kita akan coba bruteforce dengan 5 pincode secara manual. Jadi, saya akan buat file tes.txt di direktori /tmp yang isinya adalah seperti berikut:

tes.txt

Kemudian kita akan lakukan bruteforce ke localhost port 30002:

simple bruteforce

Seperti terlihat, kita dapat melihat pincode tersebut berhasil dieksekusi tapi salah. So, idenya di sini adalah kita akan men-generate list string dengan format seperti tes.txt tadi. Kita dapat membuatnya dengan bantuan chatgpt.

chatgpt
#!/bin/bash

# Membuka file payload.txt untuk menulis
> payload.txt

# Loop untuk menghasilkan kombinasi 4 digit angka dari 0000 hingga 9999
for ((i=0; i<=9999; i++)); do
# Format nomor menjadi 4 digit dengan leading zeros
number=$(printf "%04d" $i)
# Menambahkan string ke payload.txt dengan nomor yang dihasilkan
echo "VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar $number" >> payload.txt
done

echo "Selesai! Hasil telah disimpan di payload.txt"

Bash script tersebut saya simpan dengan nama gen_payload.sh di direktori /tmp. Lalu kita jalankan untuk men-generate payload yang akan kita kirimkan ke server di port 30002.

generate payload

Selanjutnya, kita akan inputkan setiap payload tersebut ke localhost di port 30002 dengan netcat. Caranya seperti saat kita melakukan tes pincode tadi, kita cukup mengetikkan perintah berikut:

 cat payload.txt | nc localhost 30002

Dann…

oops!

Masalah datang. Saya gak tau kenapa kodenya seperti macet. Jadi, gak jalan lagi. Stuck di situ aja. Artinya, kemungkinan pincode yang terinput tidak sampai setengahnya. Kemungkinan juga, servernya memang dirancang hanya menerima sekian payload saja, supaya kita kesulitan mendapatkan payload yang benar.

Nah, gaada salahnya kita merevisi script kita untuk men-generate ulang payloadnya. Bedanya, rencana kita sekarang adalah men-generate payload secara terbalik, jadi dari 9999 ke 0000.

Kita coba.

Pertama, minta bash script-nya ke ChatGPT.

chatgpt
#!/bin/bash

# Membuka file payload.txt atau membuatnya jika belum ada
touch payload.txt

# Loop untuk menghasilkan kombinasi 4 digit angka dari 9999 hingga 0000
for ((i=9999; i>=0; i--)); do
# Format nomor menjadi 4 digit dengan leading zeros
printf -v formatted_num "%04d" "$i"
# Gabungkan string dengan nomor yang diformat dan tambahkan ke payload.txt
echo "VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar $formatted_num" >> payload.txt
done

echo "Payload telah disimpan di payload.txt"

Saya save script tersebut ke my_payload.sh di direktori /tmp dan jalankan.

payload.txt

Kita sudah berhasil men-generate ulang payload kita dengan pincode terbalik, dimulai dari 9999 hingga 0000. Sekarang, kita coba inputkan ke servernya di localhost 30002.

Daan,..

password

BOOOOM!

Dapat password untuk login ke bandit25.

Level 25 -> 26

level 25 — 26

Objective: Katanya, shell bandit26 bukan /bin/bash. Kita disuruh cari tau.

Answer:

Hmmm, kita coba liat-liat dulu home bandit25.

home bandit25

Wkwkww, di sana ada file .pin. Kalau kalian penasaran berapa pincode yang benar untuk dapet password bandit25 yang sudah kita kerjakan di level sebelumnya, kita bisa baca file tersebut.

.pin

Kalau gak percaya, kita bisa buktikan sih,

approved

Kan, wkwk.

Oke, itu flashback bentar. Kita balik lagi…

Kalau kita lihat, di home bandit25, ada file bandit26.sshkey yang isinya yang private key untuk login ke bandit26.

bandit26 private key

Coba kita login dengan private key tersebut.

id_rsa bandit26

Kita sudah bisa login dengan private key tersebut. Sayangnya, karena default shell SSH adalah /bin/bash, kita tidak bisa lanjut login. Itulah kenapa di soal, kita dikasih tau kalau bandit26 kita disuruh cari tau shell bandit26 apa, supaya kita bisa login.

Jadi, tugas kita sekarang adalah mencari tau shell bandit26.

Gampang, tinggal kita lihat di /etc/passwd.

bandit26 shell

Ternyata, shell yang digunakan bandit26 adalah /usr/bin/showtext. Oke, kalau gitu, kita coba login dengan shell tersebut.

cannot login

Gak bisa login.

Hmmm, apakah /usr/bin/showtext beneran shell? Kita cek lagi deh..

/usr/bin/showtext

Ternyata bukan shell guys, wkwk, tapi script.

Setelah mencari-cari cara untuk men-bypass login ssh ini dan saya tidak menemukan jawaban yang cocok, saya memutuskan untuk membaca walkthrough bandit26 overthewire. Berikut adalah “hint” untuk level ini:

hint

Di sinilah kata kuncinya.

Intinya, sebetulnya, ketika kita login ke bandit26 dengan perintah SSH normal, script /usr/bin/showtext otomatis dijalankan. Artinya, perintah more dieksekusi untuk membuka ~/text.txt. Tapi, karena isi file text.txt tersebut sangat singkat, jadi, perintah more langsung tertutup dan tidak masuk ke mode command atau mode interaktif.

Sebagai ilustrasi, di komputer lokal saya, saya akan mencoba menjalankan perintah more untuk membuka sebuah file. Coba bandingkan…

test 1
test 2

Keliatan bedanya?

Bedanya adalah, kalau isi suatu file lebih sedikit dari ukuran window terminal, maka perintah more akan langsung ditutup begitu semua isi file tersebut berhasil ditampilkan seperti pada gambar test 1. Sebaliknya, jika isi suatu file lebih banyak dari ukuran window terminal, maka perintah more akan masuk ke more interaktif seperti pada gambar test 2.

Jadi, sekarang, kita akan coba login ke bandit26 dengan ukuran window yang kecil.

Selanjutnya, jika berhasil memasuki mode interaktif, kita akan mengganti memasuki shell bash dengan beberapa perintah berikut via vim, yaitu:

:set shell=/bin/bash, untuk mengganti default bash yang disediakan vim ke bash shell

:shell digunakan untuk memasuki server dengan shell sudah kita set sebelumnya, yaitu bash shell.

login to bandit26

Level 26 -> 27

level 26–27

Objective: Kita disuruh dapetin password bandit27, itu aja.

Answer:

Pertama-tama, kita akan lihat ada apa saja di home bandit26.

bandit27-do

Di sana, ada binary menarik bernama bandit27-do. Kita coba running.

bandit27-do

Oke, melalui binary tersebut, kita dapat menjalankan command atau binary default lainnya, seperti id, ls, cat, dan lain-lain.

Jadi, seperti biasa, kita akan coba membaca isi file /etc/bandit_pass/bandit27 untuk bisa mendapatkan password bandit27.

password

Yupp!

Kita berhasil mendapatkan password bandit27!

Level 27 -> 28

level 27–28

Objective: Ada git repository di ssh://bandit27-git@localhost/home/bandit27-git/repo di port 2220. Passwordnya sama dengan password bandit27.

Answer:

Oke, easy. Karena kita sudah menemukan password bandit27 di level sebelumnya, kita akan clone saja repo tersebut dengan password tadi. Jangan lupa mengganti localhost dengan hostname bandit dan menambahkan portnya di belakangnya.

git clone ssh://bandit27-git@bandit.labs.overthewire.org:2220/home/bandit27-git/repo
password

Boom!

Easy ya. Kita berhasil mendapatkan password bandit28.

Level 28 -> 29

level 28–29

Objective: Ada git repository di ssh://bandit28-git@localhost/home/bandit28-git/repo di port 2220. Passwordnya sama dengan password bandit28.

Answer:

Lho, sama dengan level sebelumnya?

Oke, kita coba cloning dulu…

README.md

Hmm, passwordnya disembunyikan…

Hipotesis saya adalah, mungkin passwordnya sudah sempat ditulis dalam file README.md tersebut, tapi kemudian diubah lagi menjadi xxxxx seperti itu. Itu artinya, selama file tersebut tercatat di log git, kita masih mungkin untuk mengakses history perubahannya.

chatgpt

Kita coba lihat lognya…

log

Dari log tersebut, kita dapat mengetahui bahwa sudah dilakukan 3x commit sebelumnya. Commit pertama, pesannya adalah “initial commit”. Commit kedua, “add missing data”. Commit ketiga, “fix info leak”.

Jadi, kita bisa berasumsi bahwa di commit kedua dengan pesan “add missing data”, file README.md diisi dengan password bandit29. Tapi, kemudian, di commit ketiga dengan pesan “fix info leak”, password bandit29 tadi dihapus dan diganti dengan xxxxx. Artinya, kita bisa mulai membaca isi log dari commit kedua.

Selanjutnya, kita bisa membaca log tersebut dengan menggunakan perintah:

git show {commit id}
password

Yakk, kita berhasil mendapatkan password bandit29!!!

Level 29 -> 30

level 29–30

Objective: Ada git repository di ssh://bandit29-git@localhost/home/bandit29-git/repo di port 2220. Passwordnya sama dengan password bandit29.

Answer:

Lagi-lagi, kita akan bermain dengan git. Kalau gitu, kita clone dulu repo-nya…

README.md

Oke, sama seperti sebelumnya, kita tidak diberi clear password di file README.md.

git log

Di log juga tidak memberikan tanda-tanda adanya perubahan password.

Kalau begitu, kita akan coba masuk ke direktori .git.

.git dir

Di sana, kita menjumpai ada beberapa file dan direktori lain. Salah satu file yang menarik adalah file “packed-refs”. Kalau kita cari tau fungsi file tersebut di git via ChatGPT:

chatgpt

Jadi, file tersebut memang digunakan untuk mengkompres representasi dari semua references, seperti branches, tags, dan lain-lain.

Kita coba lihat isinya…

packed-refs

Ada 3 referensi di sana, yang pertama ada /dev, kemudian ada /master, dan ada /sploit-dev.

Kita bisa membuka ketiga referensi di sana dengan menggunakan perintah yang sama ketika ingin membaca sebuah log git, yaitu dengan perintah:

git show {commit id}

Jadi, kita coba lihat dari yang paling atas terlebih dahulu, yaitu /dev.

password

Okeeyy, kita berhasil mendapatkan password untuk bandit30!!

Yeeaayy!

Level 30 -> 31

level 30–31

Objective: Ada git repository di ssh://bandit30-git@localhost/home/bandit30-git/repo di port 2220. Passwordnya sama dengan password bandit30.

Answer:

Masih belum selesai dengan git, wkwkw, okeee.

Kita akan clone reponya. Dan seperti sebelumnya, ada file README.md yang tidak ada passwordnya. Jadi, kita akan lanjut ke direktori .git dan membaca lagi file packed-refs.

packed-refs

Yakk, ada tags yang menarik di sana, yaitu /secret. Langsung saja kita buka…

password

Wwkwkwk, langsung dapat passwordnya!!

Sekarang, kita sudah mendapatkan password untuk bandit31!

Level 30 -> 31

level 31–32

Objective: Ada git repository di ssh://bandit31-git@localhost/home/bandit31-git/repo di port 2220. Passwordnya sama dengan password bandit31.

Answer:

Hadeuh, hadeuh, git lagii, git lagii, wkwkwk. Gapapalah, gas!

Kita buka README.md:

README.md

Sekarang, kita diminta untuk push file ke repo dengan spesifikasi file tersebut:

  • nama filenya key.txt
  • isi filenya ‘May I come in?’
  • Branch-nya master

Oke, kita coba push file key.txt.

Berikut langkah-langkahnya:

  1. buat file key.txt yang isinya adalalah May I come in?
  2. Kita add file key.txt ke stage-ing area dengan menambahkan -f untuk “memaksa” agar commit tersebut diterima, karena kita tahu di .gitignore, file .txt tidak diizinkan untuk ditambahkan.
  3. Commit seperti biasa.
  4. Push dengan -u untuk menjelaskan lokasi remote branch kita untuk pertama kali, yaitu di branch master, sebagaimana yang diminta oleh file README.md
password

Kita berhasil mendapatkan password untuk bandit32!!

Level 31 -> 32

level 32–33

Objective: another escape.

Answer:

Kita coba login dulu..

login

Menarik, kita mendapatkan shell yang baru lagi. Di shell ini, kita bahkan tidak diizinkan untuk menginputkan satu command pun karena apapun perintah yang kita inputkan akan dieksekusi dalam huruf besar (kapital). Bahkan, seperti terlihat di ss, permintaan shell sh pun gak dieksekusi sama sekali.

uppershell

Kalau kita kembali login dengan bandit31 dan mengunjungi home directory bandit32, kita bisa lihat, di sana ada suid binary bernama uppershell. Sepertinya, binary tersebut yang dieksekusi menjadi shell bandit32. Kita pastikan di /etc/passwd…

/etc/passwd

Benar saja. Ternyata, shell bandit32 adalah binary uppershell tadi.

Setelah stuck cukup lama, saya akhirnya “memberanikan diri” untuk kembali membaca writeup, dimana di sana dijelaskan bahwa…

hint

Untuk bisa mem-bypass shell tersebut, kita perlu tahu bahwa linux memiliki variabel $0 yang direferensikan kepada shell yang sedang berjalan atau digunakan.

gemini
chatgpt

Jadi, kalau kita ingin agar shell kita kembali normal, kita dapat mengetikkan $0 sehingga dapat mem-bypass aturan dari suid binary uppershell tadi karena tidak ada huruf kapital pada variabel $0.

Kita coba…

password

Okee, kita berhasil mendapatkan password untuk akun bandit33.

level end

Di level ini, kita hanya mendapatkan satu file README.txt pada direktori home bandit33, yang isi pesannya adalah sebagai berikut:

README.txt

Akhirnya, usai sudah kita menyelesaikan level-level ini. Harapannya, kalian bisa mendapatkan pelajaran baru dari level ini guys!

See you later!!

Happy hacking… :)

:)

--

--

Alex

A college student. A writer. Cyber security enthusiast.