PicoCTF — Beginner picoMini 2022 (Bahasa Indonesia)

Alex
9 min readSep 26, 2023

Kali ini, kita akan coba main CTF di picoCTF. Sebagai permulaan, tidak ada salahnya kita pilih yang mudah-mudah dulu. Jadi, kita akan coba solve semua challenge yang ada di “Beginner picoMini 2022”.

Beginner picoMini 2022

Oiya, kita memang harus login terlebih dahulu untuk bisa melihat dan menyelesaikan challenge-challenge di picoCTF. Jadi, kalau belum punya akun, tinggal bikin akun dulu, baru bisa login.

Satu lagi, budayakan #BacaTuntas kalau mau bisa ngerti atau paham ya.

Okey, tanpa basa-basi lagi, langsung kita masuk ke soalnya…

1 — Codebook

codebook

Kita download dulu dua file yang disediakan, code.py dan codebook.txt.

donwloading code.py & codebook.txt

Sekarang, seperti yang disarankan oleh soalnya, kita bisa langsung menjalankan script code.py.

flag

2 — convertme.py

convertme.py

Download dulu filenya. Selanjutnya, kita diminta untuk menjalankan script convertme.py-nya. Nanti, akan muncul pertanyaan yang meminta kita untuk meng-convert satu bilangan desimal ke biner, seperti ini:

sample

Mungkin, kalau jawaban kita benar, kita bisa dapat flag-nya. Tapi, karena kita punya dan bisa baca + edit convertme.py, mari kita coba liat dulu kode-nya..

source code convertme.py

Berdasarkan source code convertme.py, kalau kita bisa menjawab pertanyaan dengan benar, maka kita akan mendapat flagnya. Oke, kita coba.

10100

Yup, kita dapet flagnya.

flag

Tapi, kalau kita paham dikit tentang python dan mau alternatif cara yang lebih mudah (dan tricky), kita bisa edit source code convertme,py tadi supaya kita bisa dapat flag-nya langsung ketika convertme.py dijalankan tanpa harus ribet2 menjawab pertanyaan. Berikut:

Caranya, kita hilangkan proses validasi jawabannya dan langsung aja print flagnya, hehe..

variabel flag

Kira, kira, setelah diedit, nanti code-nya jadi simple seperti ini:

after

Dan tinggal eksekusi..

flag

3 — fixme1.py

fixme1.py

Download filenya.

Dan kalau kita coba jalankan script-nya:

error

Katanya ada error ‘indent’ di line 20. Oke, kita buka source code-nya.

fixme1.py source code

Dan bener, itu kenapa print-nya menjorok gitu? Jadi, kita atur aja supaya dia bisa sejajar dengan variabel flag.

flag

4 — fixme2.py

fixme2.py

Download filenya, dan pas dijalankan:

error

Oke, kita coba lihat line 22.

source code fixme2.py

Oke, di sana ada pengkondisian (if statement), dimana kita mau kalau variabel “flag” gak kosong, maka dia akan nge-print flag-nya. Jadi, kita hanya perlu menambahkan tanda sama dengannya saja:

flag

5 — Glitch Cat

Gllitch Cat

Kita pasang koneksi ke alamat saturn.picoctf.net di port 49700 dengan netcat.

nc saturn.picoctf.net 49700

Kita bisa lihat, di sana sudah ada flag-nya, yaitu ‘picoCTF{gl17ch_m3_n07_’ + chr(0x61) + chr(0x34) + chr(0x33) + chr(0x39) + chr(0x32) + chr(0x64) + chr(0x32) + chr(0x65) + ‘}’.

Nah, karakter-karakter di dalam kurung, misalnya seperti chr(0x61), adalah karakter hex.

Tugas kita sekarang adalah mengkonversi karakter hex ke ascii char. Ada 8 karakter yang perlu kita konversi. So, di sini, saya akan menggunakan tabel ascii untuk mengkonversi karakter-karater tersebut.

ascii to hex

Dan dapet deh flag-nya…

flag

6 — HashingJobApp

HashingJobApp

Pasang koneksi ke alamat saturn.picoctf.net port 50561 via netcat. Dan dia minta kita menginputkan hash md5 dari tulisan yang ada di dalam tanda petik. Oke, kita bisa manfaatkan python di sini…

Yang kita perlukan adalah library “hashlib”. Selanjutnya, kita akan menggunakan dua fungsi utama, yaitu fungsi “encode()” dan “hexdigest()” untuk mengkonversi string yang akan kita inputkan ke dalam md5 hash.

Hal yang perlu diperhatikan juga adalah kita tidak boleh terlalu lama membuatnya, karena nanti koneksinya akan terputus dan kita akan mendapatkan string baru lagi.

flag

7 — PW Crack 1

PW Crack 1

Seperti biasa, kita download 2 filenya, level1.py dan level1.flag.txt.enc. Kita jalankan level1.py.

level1.py

Dia minta password. Oke, kita gatau. Jadi, kita coba inspeksi level1.py.

level1.py source code

Ada 2 fungsi, str_xor() adalah fungsi untuk men-decode string XOR, dan level1_1_pw_check() adalah gunsgi untuk mengecek apakah inputan password yang diminta, kalau benar, kita dapat flag.

Dan, di if statement-nya jelas terpampang, kalau password yang benar adalah 8713. Jadi, let’s go!

flag

8 — PW Crack 2

PW Crack 2

Download kedua file di direktori yang sama. Masih sama dengan soal sebelumnya, minta password.

Inspeksi source code.

source code level2.py

Seperti biasa, kalau kita bisa memasukkan ascii dari 4 karakter hex itu dengan benar sebagai password, kita bisa dapet flagnya. Easyy.

flag

9 — PW Crack 3

PW Crack 3

Oke, kita dapet 3 file: file password checker (level3.py), flag (level3.flag.txt.enc), dan hash (level3.hash.bin). Download filenya, coba jalankan, dan masih sama, minta password. Jadi, langsung inspeksi source code.

level_3_pw_check()

Di fungsi level_3_pw_check() ini kita bisa liat alur dapet flag-nya. Pertama, kita perlu input password, kemudian nanti inputan kita akan dihash dengan fungsi hash_pw dan disimpan ke variabel user_pw_hash. Kemudian, variabel user_pw_hash akan dibandingkan dengan correct_pw_hash, kalau sesuai kita akan dapet flag. Flag-nya adalah dekripsi dari XOR yang kunci dekripsinya adalah inputan password kita tadi yang tersimpan di variabel user_pw.

Tapi, kita tidak perlu menebak-nebak apa password yang benar, karena dia bagian akhir source code level3.py, kita dikasih list 7 string yang mana salah satunya adalah password yang benar.

lisf of 7 strings

Jadi, karena hanya ada 7 string, kita coba masukkan satu persatu aja ke inputan passwordnya.

flag

10 — PW Crack 4

PW Crack 4

Download ketiga filenya dan masih mirip seperti soal PW Crack 3. Bedanya, sekarang kita disuru nebak mana password yang benar dari 100 list kemungkinannya :”.

list of password possibilities

So, supaya tidak capek nebak satu-satu manual, kita tambahkan aja looping di source code-nya untuk nebak otomatis alias bruteforce, hehe..

Pertama, kita pindahin list string-nya itu ke bagian awal.

pos_pw_list

Kemudian, kita tambahkan “for loop” di fungsi level_4_pw_check(). Kira-kira sepert ini:

def level_4_pw_check():
a = 0

for i in pos_pw_list:
user_pw = pos_pw_list[a]
user_pw_hash = hash_pw(user_pw)

if( user_pw_hash == correct_pw_hash ):
decryption = str_xor(flag_enc.decode(), user_pw)
print("kuncinya adalah " + pos_pw_list[a] + ", flag: " + decryption)
return

print("Coba kunci " + pos_pw_list[a] + ", salah")
a += 1
level_4_pw_check()
modified level_4_pw_check()

Jalankan..

flag

11 — PW Crack 5

PW Crack 5

Di soal ini, kita mendapat satu file yang membedakannya dengan soal PW Crack 4, yaitu file dictionary.txt. Isinya adalah 65536 string 4 karakter.

dictionary.txt

Karena source code level5.py juga mirip dengan soal PW Crack 4, jadi, kita hanya perlu melakukan brute force dengan dictionary.txt sebagai inputan passwordnya.

Caranya cukup mudah karena kita hanya akan memodifikasi fungsi level_5_pw_check() saja, sebagai berikut:

def level_5_pw_check():

file = open("dictionary.txt")
lines = file.readlines()

for line in lines:

user_pw = line.strip()
user_pw_hash = hash_pw(user_pw)

if( user_pw_hash == correct_pw_hash ):
print("Welcome back... your flag, user:")
decryption = str_xor(flag_enc.decode(), user_pw)
print(decryption)
return
# print("That password is incorrect")

level_5_pw_check()

Dua variabel pertama (file & lines) berfungsi untuk membuka dan membaca file dictionary.txt baris perbaris. Selanjutnya, for loop digunakan untuk menginputkan setiap string tadi untuk di-hash. Oiya, sebelum di-hash, kita perlu menyertakan fungsi strip() pada string yang akan di-hash karena jika tidak, nanti akan ada karakter enter (\n) yang akan ikut ter-hash sehingga bukan 4 karakter yang akan ter-hash, tapi 6 karakter (contoh: 1234 jadi 1234\n). Akibatnya apa? Ya jelas, passwordnya gak akan pernah ketemu.

Lanjut, setelah di-hash, kita akan membandingkan hash dari string 4 karakter tadi dengan hash key-nya. Kalau cocok, berarti string yang diinputkan sudah benar, dan kita bisa mendapatkan hasil dekripsi flagnya. Kalau tidak cocok, maka proses looping akan berlanjut alias string selanjutnya akan di-hash, dibandingkan lagi hash-nya dengan hash key, dan seterusnya sampai cocok.

Berikut flag-nya!

flag

12 — runme.py

runme.py

Download file runme.py. Jalankan, dan kita akan dapet flag-nya.

flag

13 — Serpentine

Serpentine

Kita download dulu source code serpentine.py dan coba jalankan.

source code serpentine.py

Hmm, sepertinya ada yang janggal di sini. Kita sudah memilih opsi “b) print flag”, tapi output-nya malah ngasih tau kalau ada salah penempatn dengan fungsi print_flag(). Oke, kalau gitu, kita cek source code-nya langsung.

fungsi print_flag()

Keliatannya baik-baik aja dengan fungsi print_flag(). Coba kita turun ke bawah.

if statement

Ternyata, fungsi print_flag() tadi gak dipanggil kalau kita pilih jawaban ‘b’ tadi. Jadi, solusinya adalah kita tinggal panggil fungsi print_flag() di statement “elif choice == ‘b’:”.

perbaikan

Jalankan ulang serpentine.py.

flag

Xixixi.

Sekian dulu untuk main picoCTF-nya.

See yaa..

--

--

Alex

A college student. A writer. Cyber security enthusiast.