[Cyber Jawara 2020 Qualification] – CaaS

Diberikan sebuah layanan dimana kami dapat memberikan sebuah input, kemudian server akan mengembalikan input kami dalam bentuk yang sudah dienkripsi. Pada deskripsi soal juga diberikan sebuah string Base64 yang adalah flag yang sudah dienkripsi beserta sebuah source code.

Dari source code yang diberikan, diketahui juga bahwa layanan tersebut menggunakan algoritma enkripsi AES dengan mode operasi OFB (Output feedback). Mode tersebut bekerja dengan mengenerate sebuah keystream, dimana keystream tersebut kemudian akan di XOR dengan plaintext yang kami berikan, menghasilkan sebuah ciphertext. Ciphertext tersebut akan di encode dengan Base64 kemudian dikirimkan kembali dalam bentuk Result.

Karena mode OFB merupakan sebuah stream chiper (atau sering disebut juga symetric cipher, karena setiap byte plaintext akan dikombinasikan dengan satu byte keystream pada posisi yang sama untuk menghasilkan satu byte ciphertext yang sesuai), maka dengan melakukan XOR terhadap sebuah plaintext dengan hasil enkripsi (ciphertext nya), akan didapat keystream yang digunakan.

Hal tersebut menjadi berbahaya pada tantangan ini, karena kami diberikan sebuah layanan yang mengembalikan cipher text dari input (plain text) apapun yang kami kirimkan. Arti nya, kami dapat mengetahui keystream yang digunakan dengan melakukan XOR terhadap cipher text yang dihasilkan dengan plain text yang kami input. Keystream tersebut secara teori bisa digunakan untuk mendapatkan plain text dari flag yang sudah terenkripsi.

Untuk itu, pertama-tama kami perlu menemukan berapa panjang dari plain text flag yang dicari. Kami memodifikasi source code yang diberikan untuk menebaknya:

Kami menemukan bahwa kemungkinan panjang dari plain text flag adalah antara 48 karakter sampai 63 karakter. Hal tersebut kami simpulkan karena:

  • Panjang dari cipher text setelah di-decode Base64 adalah 64
  • Karena mode yang digunakan adalah OFB, maka sepengetahuan kami seharusnya panjang dari cipher text pastilah sama dengan panjang dari plain text
  • Oleh karena itu, berdasarkan script diatas, kami akan mendapatkan cipher text dengan panjang 64 hanya ketika plain text kami memiliki panjang 48 karakter sampai 63 karakter

Setelah mengetahui hal tersebut, kami hanya perlu mengirimkan plain text random dengan panjang mulai dari 48 karakter sampai 63 karakter. Kemudian untuk setiap iterasi, setelah server mengembalikan cipher text dari plain text yang sudah kami kirimkan, kami akan melakukan XOR keduanya, menghasilkan keystream yang digunakan oleh server. Keystream tersebut kami XOR dengan flag yang diberikan (setelah di decode), dan harapannya flag nya akan didapatkan.

Untuk mempermudah, berikut solve script yang kami buat:

Setelah script dijalankan, didapatlah flag dengan panjang 58 karakter.

Flag = CJ2020{soal_dasar_kriptografi_biasanya_ini_lagi_ini_lagi}

Lesson learned nya, gunakan random key dan IV untuk mencegah hal seperti ini dapat terjadi.

Leave a Reply

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