Skip to content

[Bug Bounty Playground] Writeup CTF: Criticalops

Criticalops
Criticalops

Pendahuluan

Criticalops adalah tantangan CTF kategori Web dengan tingkat kesulitan very easy dari Bug Bounty CTF Playground.

Berikut adalah deskripsi dari tantangan ini:

Criticalops is a web application designed to monitor several critical infrastructure of XYZ region. Users usualy use this website to report for unusual behavioral, or we also called it ticket. They’ve asked you to hunt for any potential security issues in their application and retrieve the flag stored in their site.

📝 Related Bug Bounty Reports

Bug Report #1 - JWT client-side

Analisa Awal

Dari deskripsi tantangan, diketahui bahwa fokus utama adalah kerentanan JWT yang di-generate di sisi klien.

Sebagai seorang penetration tester, saya memulai dengan melakukan pemeriksaan cepat untuk memahami gambaran umum dari aplikasi target.

1. Melihat Aplikasi

Tampilan Aplikasi Criticalops
Tampilan Aplikasi Criticalops

Aplikasi ini merupakan platform Critical Infrastructure Monitoring & Control dengan beberapa fitur utama seperti:

2. Registrasi Akun

Karena tersedia fitur pendaftaran, saya langsung mendaftarkan akun dengan username nairpaa, dan berhasil mendapatkan userId:

7acc1990-0afa-4422-9981-b973fe2343fa
Request dan Respons Pendaftaran Akun
Request dan Respons Pendaftaran Akun

3. Login

Akun tersebut kemudian saya gunakan untuk login ke dalam aplikasi.

Request dan Respons Login
Request dan Respons Login

Respons login memuat id, username, dan role dengan nilai user.

Saat mengakses fitur dalam aplikasi, saya menemukan session JWT yang menggunakan algoritma HS256.

Terdapat JWT Session di Request
Terdapat JWT Session di Request
Isi dari JWT
Isi dari JWT

Namun ada yang janggal — JWT ini tidak pernah dikirim dari server, yang mengindikasikan bahwa token tersebut di-generate langsung di sisi klien menggunakan JavaScript.

Tidak Ditemukan JWT Session dari Respons Server
Tidak Ditemukan JWT Session dari Respons Server

Eksploitasi JWT

1. Analisis JavaScript

Karena token JWT tidak pernah dikirim oleh server, besar kemungkinan token ini di-generate langsung melalui JavaScript di sisi klien.

Saat menelusuri file JavaScript /_next/static/chunks/176-eb986a17f94086c9.js, saya menemukan adanya secret key yang digunakan untuk menandatangani JWT dengan algoritma HS256:

SecretKey-CriticalOps-2025
Ditemukan Secret Key JWT di JavaScript
Ditemukan Secret Key JWT di JavaScript

HS256 merupakan algoritma symmetric signing, artinya jika kita mengetahui secret key, kita dapat:

Baca lebih lanjut tentang JWT attacks di sini.

Saya memverifikasi secret key ini menggunakan jwt.io, dan hasilnya signature berhasil diverifikasi, yang artinya key tersebut valid.

Secret Key Valid
Secret Key Valid

2. Memodifikasi JWT

Karena akun saya hanya memiliki role user, saya mencoba menggantinya menjadi admin untuk mendapatkan akses ke data yang lebih sensitif.

Saya menggunakan Burp Suite dengan plugin JWT Editor untuk memodifikasi token.

Langkah pertama, saya menambahkan symmetric key ke dalam tab JWT Editor.

Menambahkan Symmetric Key (Secret Key)
Menambahkan Symmetric Key (Secret Key)

Selanjutnya, pada tab Repeater, saya mengubah nilai role menjadi admin, lalu menandatangani ulang (sign) JWT menggunakan secret key yang ditemukan sebelumnya.

Modifikasi Nilai Role Pada JWT
Modifikasi Nilai Role Pada JWT

Setelah token dimodifikasi, saya menggunakannya untuk mengakses daftar tiket. Hasilnya, saya berhasil melihat data milik akun admin — dan di sana terdapat flag:

HTB{Wh0_Put_JWT_1n_Cl13nt_S1d3_lm4o}
Mendapatkan Flag pada Tiket Admin
Mendapatkan Flag pada Tiket Admin

Penutup

Itulah cara menyelesaikan tantangan Criticalops dari Bug Bounty CTF Playground.

Dari sini kita bisa belajar pentingnya menganalisis bagaimana session dibuat, serta bagaimana JWT yang menggunakan algoritma seperti HS256 dapat dimodifikasi ketika secret key-nya terekspos.

Semoga bermanfaat!


[Bug Bounty Playground] Writeup CTF: NovaEnergy
[HTB Challenges] Writeup CTF: You Cant You C Me