[Imaginary CTF Round 12] – Password Recovery pt. 1

Diberikan sebuah mailbox file dari perusahaan Password Recovery Bernama “twister”, yang dimana di mailbox tersebut diberikan kumpulan password temporary (kurang lebih 315 buah) yang diberikan kepada para pelanggan yang berbentuk base64. Contoh: ‘UDHqGXxirKI=’, ‘Ps50YJ7v2hY=’, ‘dtIRdvmOKps=’, dll.

Pada awal mail juga dicantumkan algoritma pembuatan password yang menggunakan module random dan fungsi getrandbits.

Nah, lalu flagnya di mana? Pada ujung mail diberitahukan bahwa flagnya adalah 5 password setelah password terakhir.

Penyelesaian soal ini terletak pada kelemahan dari module random yang menjadi inti dari fungsi pembuatan setiap password. Di deskripsi soal juga diberikan clue, yaitu “twister”, yang merujuk pada Mersenne Twister, sebuah pseudorandom number generator (PRNG) yang digunakan python dalam module random.

PRNG Mersenne Twister ini memiliki kelemahan dimana jika kita mengetahui 624 angka yang dihasilkan sebelumnya, kita bisa memprediksi angka apa yang akan dihasilkan berikutnya. Atau secara kasarnya kita bisa “menebak” angka-angka apa yang selanjutnya akan muncul berdasarkan “sample” yang ada. Mengapa 624? Karena PRNG ini menggunakan 624 integer 32 bit sebagai internal state yang terbagi secara berurutan sehingga setelah kita mendapatkan 624 bilangan pertama, algoritmanya akan diterapkan ke state yang kini untuk menghitung 624 bilangan berikutnya.

(Referensi dari https://jazzy.id.au/2010/09/22/cracking_random_number_generators_part_3.html)

Karena pada soal terdapat kurang lebih 315 password dan setiap password berasal dari 2 buah hasil random, totalnya kita mempunyai 630 sample sehingga memenuhi syarat untuk melakukan crack. Saya menggunakan module python bernama Randcrack (https://github.com/tna0y/Python-random-module-cracker) untuk mem-predict angka/flagnya.

Skenarionya:

  1. Mengubah tiap password menjadi 2 buah integer hasil random dan disimpan ke dalam array.
  2. “memberi makan” randomcracker dengan sample 624 integer yang sudah ditemukan.
  3. Predict 10 integer selanjutnya setelah sample terakhir, lalu diubah menjadi base64 sesuai fungsi generate_password dari soal, lalu disatukan.
  4. Decode flagnya.

berikut codingan solvenya:

output:

aWN0ZntQcjM=ZDFjdF9NM3I=czNubjNfQnk=X1MzdHQxbmc=X1N0NHQzfQA=

langsung saja decode base64 dengan cyberchef dan hasilnya:

Flag: ictf{Pr3d1ct_M3rs3nn3_By_S3tt1ng_St4t3}

Leave a Reply

Your email address will not be published. Required fields are marked *