zenCipher

Back

ITFEST IPB 2025 - WriteupBlur image

✨ Misc#

GPT Playground#

[gambar desc]

Pada challenge ini, saya diminta untuk meminta flag dari GPT bernama Kriptos. Awalnya, saya sangat mempercayai sampai menjawab pertanyaan dengan dokumentasi satu persatu. ternyata…

[gambar ss]

Alamak geramnye😑. Akhirnya, saya tipu balik si Kriptos ini. Awokawok

[gambar ss]

Full percakapan πŸ—£οΈ: https://chatgpt.com/share/6881e670-156c-8012-a503-bbe6a90b680e β†—

Flag:

ITFEST25{Yhuuu_K4mU_M3n3MuKan_B3nd3r4ny4_346489}
sh

🌐 Web Exploit#

Pasar Sayur#

[gambar des] Ini adalah challenge web exploit dengan vulnerability SSTI pada framework Flask python. Awalnya, saya cek dengan payload {{7*7}} pada search box yang tersedia di website yang diberikan β†—.

[gambar ss]

Dan yap, hasilnya 49, sesuai ekspektasi. Lalu, langsung saja saya coba beberapa payload untuk mencari builtins function di sistem flask nya. Dan akhirnya, saya mendapatkan beberapa function yang bisa digunakan

[gambar ss]

Saya dapat menggunakan payload di bawah untuk mendapat RCE. Payload : {{url_for.__globals__.os.popen(request.headers.hack).read()}} -> ditaruh di body request.

hack akan digunakan untuk command execution. Ditaruh di headers sebagai key dengan value berisi command yang dibutuhkan

[gambar ss]

Nice, udah bisa RCE nni, tinggal cat /flag.txt aja buat dapetin flag nya

[gambar ss]

Flag:

ITFEST25{d0n7_f0rg3t_t0_us3_request_d0t_h34d3r}
sh

πŸ”€ Reverse Engineering#

Login#

Pada challenge kali ini, gw akan reverse sebuah program binary. Saya decompile dengan Ghidra. Dapat dilihat ada beberapa function yang bisa saya eksplor di sini

[gambar ss]

Fungsi-fungsi penting:

  • Melakukan transformasi pada karakter password berdasarkan indeksnya:
decompiled
transform_pass_char(char, int)
param_2 = param_2 % 4;

switch (param_2):
  case 0: local_c = char - 0x26;
  case 1: local_c = (char - 0x30) * 2;
  case 2: local_c = (char - 0x30) ^ 7;
  case 3: local_c = char - 0x1c;

transform_user_char(uint, uint)
c
  • Transformasi dilakukan pada hasil password, tergantung parity (genap/ganjil) dari index:
if (index % 2 == 0):
    val ^= 5;
else:
    val += 10;
c

Selain itu, terdapat data secret_data dan juga pass_matrix di masing2 function verify_user dan verify_pass.

[gambar ss] [gambar ss]

Tinggal buat script berdasarkan array yang didapat dan juga function.

solver.py
secret_data = [76, 94, 67, 79, 86, 94, 55, 63]

pass_matrix = [
    46, 132, 78, 67, 72, 0, 67, 67, 78, 62,
    40, 74, 73, 132, 48, 23, 78, 94, 78, 20,
    79, 132, 40, 57, 77, 106, 69, 82, 14, 122,
    50, 67, 74, 98, 2, 25, 81, 126, 69, 72
]

def reverse_transform_user(val, idx):
    if idx % 2 == 0:
        return val ^ 5
    else:
        return val - 10

def reverse_transform_pass(val, idx):
    mod = idx % 4
    if mod == 0:
        return val + 0x26
    elif mod == 1:
        return (val // 2) + 0x30
    elif mod == 2:
        return (val ^ 7) + 0x30
    elif mod == 3:
        return val + 0x1c

def recover_username(secret_data):
    username_chars = []
    for idx, val in enumerate(secret_data):
        c = reverse_transform_user(val, idx)
        username_chars.append(chr(c))
    return "".join(username_chars)

def recover_password(pass_matrix):
    password_chars = []
    for idx, val in enumerate(pass_matrix):
        c = reverse_transform_pass(val, idx)
        password_chars.append(chr(c))
    return "".join(password_chars)

if __name__ == "__main__":
    username = recover_username(secret_data)
    password = recover_password(pass_matrix)
    print(f"Recovered username: {username}")
    print(f"Recovered password: {password}")
python

Langsung jalankan script itu, kita akan dapat flagnya

[gambar ss]

ITFEST25{Try_n0t_tO_forg3t_y0ur_Usern4me_pa55word}
sh
ITFEST IPB 2025 - Writeup
https://zenc.my.id/blog/itfest-2025
Author Abi Abdillah
Published at July 24, 2025