ITFEST IPB 2025 - Writeup
Writeup for ITFEST CTF Competition 2025 by Micro IPB
β¨ 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:
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;
cSelain 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.
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}")
pythonLangsung jalankan script itu, kita akan dapat flagnya
[gambar ss]
ITFEST25{Try_n0t_tO_forg3t_y0ur_Usern4me_pa55word}sh