Gafna Blog

Back

1#

Dikasih file public.pem sama encrypted. Dari script Python yang dikasih, kita bisa liat kalo flag-nya dienkripsi pake RSA, tapi nggak cuma sekali, tapi dua kali. Jadi, kita harus ngebuka gemboknya satu-satu

Lapisan2 Lapisan enkripsi kedua ini pake RSA standar, tapi ada kelemahan fatalnya. Modulus n (yang ada di public.pem) itu hasil perkalian dari dua bilangan prima, p dan q. Nah, masalahnya, si q ini cuma bilangan prima 16-bit.

Artinya, kita bisa dengan gampang nemuin q dengan cara brute-force, yaitu nyobain semua bilangan prima di bawah 2^16 (65536) sampe ketemu satu yang bisa ngebagi n.

Langkah-langkahnya gini:

  1. Ambil n dari public.pem: Kita baca public key-nya buat dapetin nilai n.
  2. Cari q: Kita bikin looping buat nyobain semua bilangan prima dari 2 sampe
  3. Kalo n % q_candidate == 0, berarti itu q-nya.
  4. Hitung p: Kalo q udah ketemu, p tinggal diitung pake p = n / q.
  5. Bikin Private Key Palsu: Dengan p dan q, kita bisa ngitung phi dan d, terus kita bisa bikin ulang private key buat lapisan kedua ini.
  6. Dekripsi File encrypted: Pake private key yang baru kita buat, kita dekripsi file encrypted. Hasilnya bukan flag, tapi ciphertext dari lapisan pertama. Kita sebut aja ini ct_intermediate.

Lapisan1 ini bagian yang sedikit lebih tricky. Ciphertext yang kita dapet dari tahap sebelumnya (ct_intermediate) itu dienkripsi pake kunci RSA yang beda lagi. Kuncinya ini dibikin pake proses yang unik di script aslinya.

Kuncinya ada di sini: bilangan prima p yang kita temuin di lapisan kedua itu ternyata adalah nextprime(n_layer1), di mana n_layer1 adalah modulus yang dipake di lapisan enkripsi pertama.

Jadi, alurnya dibalik:

  1. Cari n_layer1: Karena kita udah tau p, berarti n_layer1 adalah bilangan sebelum p. Kita bisa pake fungsi prevprime() buat nyari kandidat n_layer1 dengan cara mundur dari p.

  2. Verifikasi Kandidat n: Nggak semua bilangan sebelum p itu n_layer1 yang bener. Kita harus verifikasi. Caranya? Kita inget lagi kalo n_layer1 itu hasil perkalian berantai dari beberapa bilangan prima (p_start, nextprime(nextprime(p_start)), dst).

  3. Temukan p_start: Buat verifikasi, kita harus nemuin p_start-nya. Daripada nyari buta, kita bisa bikin aproksimasi/perkiraan p_start dengan cara ngitung akar pangkat sekian (misal pangkat 17) dari n_candidate. Hasilnya bakal deket banget sama p_start yang asli. Kita tinggal cari di sekitar angka itu.

  4. Rekonstruksi & Validasi: Kalo p_start yang pas udah ketemu, kita simulasiin lagi proses perkalian berantainya. Kalo hasil akhirnya sama dengan n_candidate kita, berarti BINGO! Kita nemu n_layer1 dan phi_layer1 yang bener.

  5. Dekripsi Terakhir: Sama kayak sebelumnya, kalo n dan phi udah ada, kita bisa itung d buat lapisan pertama ini. Pake kunci ini, kita dekripsi ct_intermediate dan… dapet deh flag-nya

Berikut solper nya

Flag: Meta4Sec{l0r3m_1p5um_d0l0r_517_4m37_de6e5}
1
https://gafnaa.vercel.app/blog/cyberops/crypto/1
Author Gafna Al Faatiha Prabowo
Published at August 1, 2025