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
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.
Oke, berhasil masuk. Nice, level 0 selesai.
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…
Yup, ketemu…
Kita akan coba login ulang dengan username bandit1 dan password yang baru ditemukan tadi.
Berhasil login…
Level 1 -> 2
Objective: cari password di file “-” di home directory & login dengan password tersebut menggunakan username bandit2.
Answer:
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.
Oke, kita coba…
Berhasil! Thanks to chatgpt. Kita login kembali dengan username: bandit2 dan password yang baru saja kita dapatkan.
Oke, kita lanjut…
Level 2 –> 3
Objective: cari password di file bernama “space in this filename” di home directory & login dengan password tersebut menggunakan username bandit3.
Answer:
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
Objective: cari password di file yang tersembunyi di direktori “inhere” & login dengan password tersebut menggunakan username bandit4.
Answer:
Masih mudah.
Login dengan username bandit4 dan password yang baru saja kita temukan itu.
Kita lanjut.
Level 4 -> 5
Objective: cari password di file yang “human-readable”di direktori “inhere” & login dengan password tersebut menggunakan username bandit5.
Answer:
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
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:
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 :)
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
Okeyy, berhasil!
Login dengan username bandit6 dan password yang sudah kita temukan barusan!
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
Kalau saya jalankan perintah tersebut, maka outputnya akan seperti ini:
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…
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
Objective: cari password di file data.txt, di sebelah kata millionth & login dengan password tersebut menggunakan username bandit8.
Answer:
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
Masih easy.
Jadi, kita lanjutkan dulu ke level berikutnya dengan login menggunakan username bandit8 dan password di atas.
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:
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…
Berikut penjelasannya:
Kita coba…
Nice!
Thanks again to ChatGPT…
Kita lanjut ke level berikutnya dengan login menggunakan username bandit9 dan password barusan yang kita dapatkan.
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:
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.
Berikut penjelasannya:
Kita coba…
ChatGPT memang dabes lah yaa, wkwkwk.
Lanjut, kita login ke level berikutnya dengan username bandit10 dan password barusan yang kita dapatkan.
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:
Eaasyy, tinggal kita decode langsung aja dan bummm!!!
Lanjut ke level berikutnya dengan username bandit11 dan password tersebut!
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:
“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.
HHHeeeaassyyy!!!
Lanjut login ke level selanjutnya dengan username bandit12 dan password itu!
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:
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.
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
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:
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.
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
Berhasil!
Selanjutnya, seperti di mention juga di soal, kita akan melihat password yang tersimpan di file /etc/bandit_pass/bandit14.
Lanjut ke level berikutnya…
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.
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.
Dan kita mendapatkan password yang baru!
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
Service yang berjalan adala ssl/pago-service. Karena saya sendiri tidak tahu cara berinteraksi dengan service tersebut, mari kita tanyakan ke ChatGPT.
Markicob, mari kita coba.
openssl s_client -connect localhost:30001
Berhasil!!
Kita lanjut ke level berikutnya!
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
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
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.
Setelah dicoba,..
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.
Naiisss, berhasil!!!
Kita mendapatkan SSH private key.
Okeyy, kita lanjut ke level berikutnya menggunakan username bandit17 dan ssh key tersebut!
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.
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.
contohnya sebagai berikut:
oke, kita coba…
Booom! Berhasil!
Kita login ke level selanjutnya via SSH dengan username bandit18 dengan password yang barusan ditemukan…
Tapi,
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
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.
Seperti terlihat, file permissionnya pun juga sangat terbatas. Kita juga tidak bisa membaca file .bashrc itu.
Jadi, gak ada salahnya tanya ChatGPT, hehe..
Kita coba sarannya…
ssh -t bandit18@bandit.labs.overthewire.org -p 2220 'bash --noprofile'
Ternyata masih belum berhasil. Oke, kita tanya lagi ke 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
Woooww! Berhasil!! Kita berhasil login ke bandit18 dengan shell “sh”. Saatnya membaca file readme!
Kita lanjut ke bandit19 dengan password tersebut!
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.
Lanjut…
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
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.
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:
Kita coba praktekkan…
Berhasill!!
Kita mendapatpkan passoword untuk login ke bandit 21.
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:
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
Objective: Tugas kita adalah mengamati file konfirugrasi cronjob yang lain.
Answer:
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.
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..
Selanjutnya, saya akan mengubah value variabel myname dari ($whoami) ke ‘bandit23’.
Berikutnya, saya akan jalankan script tersebut, langsung dari direktori /tmp saja.
Dan terlihat kita mendapatkan nama file yang menyimpan password bandit23.
Yakkk! Berhasill! Kita mendapatkan password bandit23!
Level 23 -> 24
Objective: Kita harus membuat file script sendiri untuk mendapatkan password level berikutnya.
Answer:
Pertama-tama, kita inspeksi dulu cronjob bandit24.
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…
Booom!! Berhasil! wkwkw
Kita tinggal login ke akun bandit24 dengan password tersebut!
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…
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:
Kemudian kita akan lakukan bruteforce ke localhost port 30002:
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.
#!/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.
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…
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.
#!/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.
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,..
BOOOOM!
Dapat password untuk login ke bandit25.
Level 25 -> 26
Objective: Katanya, shell bandit26 bukan /bin/bash. Kita disuruh cari tau.
Answer:
Hmmm, kita coba liat-liat dulu 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.
Kalau gak percaya, kita bisa buktikan sih,
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.
Coba kita login dengan private key tersebut.
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.
Ternyata, shell yang digunakan bandit26 adalah /usr/bin/showtext. Oke, kalau gitu, kita coba login dengan shell tersebut.
Gak bisa login.
Hmmm, apakah /usr/bin/showtext beneran shell? Kita cek lagi deh..
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:
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…
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.
Level 26 -> 27
Objective: Kita disuruh dapetin password bandit27, itu aja.
Answer:
Pertama-tama, kita akan lihat ada apa saja di home bandit26.
Di sana, ada binary menarik bernama bandit27-do. Kita coba running.
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.
Yupp!
Kita berhasil mendapatkan password bandit27!
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
Boom!
Easy ya. Kita berhasil mendapatkan password bandit28.
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…
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.
Kita coba lihat lognya…
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}
Yakk, kita berhasil mendapatkan password bandit29!!!
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…
Oke, sama seperti sebelumnya, kita tidak diberi clear password di file README.md.
Di log juga tidak memberikan tanda-tanda adanya perubahan password.
Kalau begitu, kita akan coba masuk ke direktori .git.
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:
Jadi, file tersebut memang digunakan untuk mengkompres representasi dari semua references, seperti branches, tags, dan lain-lain.
Kita coba lihat isinya…
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.
Okeeyy, kita berhasil mendapatkan password untuk bandit30!!
Yeeaayy!
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.
Yakk, ada tags yang menarik di sana, yaitu /secret. Langsung saja kita buka…
Wwkwkwk, langsung dapat passwordnya!!
Sekarang, kita sudah mendapatkan password untuk bandit31!
Level 30 -> 31
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:
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:
- buat file key.txt yang isinya adalalah May I come in?
- 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.
- Commit seperti biasa.
- Push dengan -u untuk menjelaskan lokasi remote branch kita untuk pertama kali, yaitu di branch master, sebagaimana yang diminta oleh file README.md
Kita berhasil mendapatkan password untuk bandit32!!
Level 31 -> 32
Objective: another escape.
Answer:
Kita coba login dulu..
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.
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…
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…
Untuk bisa mem-bypass shell tersebut, kita perlu tahu bahwa linux memiliki variabel $0 yang direferensikan kepada shell yang sedang berjalan atau digunakan.
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…
Okee, kita berhasil mendapatkan password untuk akun bandit33.
Di level ini, kita hanya mendapatkan satu file README.txt pada direktori home bandit33, yang isi pesannya adalah sebagai berikut:
Akhirnya, usai sudah kita menyelesaikan level-level ini. Harapannya, kalian bisa mendapatkan pelajaran baru dari level ini guys!
See you later!!
Happy hacking… :)