COMPFEST13 – Secure Channel

You are able to watch the encrypted chat of Alice and Bob. They are talking about the flag right now. Can you get the flag from them?

P.S.: Alice and Bob once have said that they will communicate with some trivial encoding, so people will not notice their message at first glance. Although, people will know it if they search it on the internet! Sure, all of it is printable characters.

Watch the conversation: nc 103.152.242.56 8231

Talk with Alice: nc 103.152.242.56 8230

Talk with Bob: nc 103.152.242.56 8232

Author: prajnapras19

secrets.py

alice-bob.py

talk-with-alice.py

talk-with-bob.py

Summary

Kita diberikan 4 buah file:

  1. Secrets.py yang berisi fungsi-fungsi penyusun public, private key dan penjelasan class dari karakter bernama bob & alice.
  2. Alice-bob.py yang berisi codingan percakapan antara bob & alice tentang flag yang kita cari.
  3. Talk-with-alice.py yang berisi codingan ketika ingin melakukan percakapan dengan alice.
  4. Talk-with-bob.py yang sama seperti Talk-with-Alice.py, namun dengan karakter bob.

Langsung saja ke bagian menariknya, pada file Secrets.py ditunjukkan bahwa masing-masing karakter mempunyai object SECRET yang nilainya statis namun disembunyikan. Dikatakan bahwa nilai SECRET karakter Bob ada di kisaran 2 – 100 sehingga terbilang cukup kecil untuk di-bruteforce. Mari kita coba dapatkan Bob SECRET dengan menelusuri lebih dalam talk-with-bob.py

Mencari nilai SECRET Bob

Pada talk-with-bob.py, kita akan diminta memasukkan SECRET kita (bebas mau diisi apa) dan juga nilai g dalam bentuk base64 encoded dengan syarat nilai g > 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF. Nilai g ini akan “dikalkulasikan” dengan SECRET masing-masing serta nilai p (didapat dari getPrime) dan akan menjadi public part masing-masing yang nantinya akan di-print. Nah dari sini kita bisa melakukan brute-force SECRET kita dari 2 – 100, lalu bandingkan public part kita dan public part Bob karena jika sama, maka kita dapat nilai secretnya. Untuk g nya bebas, yang penting mengikuti syarat lebih dari 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF (saat melakukan bruteforce saya menggunakan nilai g sebesar 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1). Dengan codingan berikut:

Public part kita dan Public part Bob ternyata sama, artinya SECRET yang kita masukkan dan SECRET Bob juga sama, yaitu 73. Dengan informasi ini, kita bisa “membongkar” isi percakapan alice dan bob yang awalnya terkunci.

Mencari nilai KEY Bob & Decrypt Message

Bila kita perhatikan di file Secrets.py, setiap kali karakter ingin mengirimkan pesan, pesan itu akan diencrypt dengan AES_CBC pada fungsi send_message() yang membutuhkan sebuah KEY dari karakter pengirim. KEY ini dibuat oleh fungsi make_private_part() yang membutuhkan SECRET karakter pengirim, PublicPart karakter penerima, dan p yang diberikan di awal (lihat formulanya di file alice-bob.py). Kita sudah memegang SECRET karakter Bob, PublicPart Alice (diberitahu di program, tinggal decode dan ubah ke decimal), dan nilai p yang juga sudah diberitahu. Tinggal susun KEY-nya berdasarkan fungsi make_private_part(), lalu decrypt pesannya berdasarkan fungsi receive_message().

*catatan: Key dari 1 karakter bisa digunakan untuk mendecrypt pesan karakter lain, sehingga message alice juga bisa kita baca

Lah kok hasil outputnya aneh? Itu karena message nya masih dalam keadaan padded (lihat fungsi pad() di file secrets.py). Simplenya, fungsi pad ini akan menambahkan karakter-karakter unprintable string di antara karakter-karakter asli message. Cara menghapusnya? tinggal bikin fungsi unpad() yang isinya looping per karakter message dan mereturn semua karakter yang ada pada string.printable.

Lah kok masih aneh -.- ? Itu karena pesan-pesan yang mereka saling tukarkan masih di-encode suatu encoding (seperti yang deskripsi juga katakan). Setelah mencari beberapa saat, ternyata diketahui bahwa pesannya diencode dengan ascii85, dan bisa kita decode menggunakan base64.a85decode(msg). Tinggal kita sempurnakan codingannya, baca percakapannya, dapatkan flagnya.

Flag = COMPFEST13{4fd29464a28a1b39559f4fc500b41c4b17ec8ad74512394a830b51506AIUEOuh_f8facf99fe}

Leave a Reply

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