___ ___                                 .__              
     /   |   \   ____ ___  ___         _______|__| ____   ____  
    /    ~    \_/ __ \\  \/  /  ______ \___   /  |/    \_/ __ \ 
    \    Y    /\  ___/ >    <  /_____/  /    /|  |   |  \  ___/ 
     \___|_  /  \___  >__/\_ \         /_____ \__|___|  /\___  >
           \/       \/      \/               \/       \/     \/ 
    
            Pada chall ritsec2019 ini, saya mencoba untuk menyelesaikan challange Our First Api.
            Challange tersebut terdiri dari 2 halaman yaitu :

            1. http://ctfchallenges.ritsec.club:3000
            2. http://ctfchallenges.ritsec.club:4000

            

            kemudian kita coba check http://ctfchallenges.ritsec.club:3000
            backend nya mengunakan express , cmiiw.

            

            bisa kita pastikan bahwa pada port 3000, hanya di gunakan untuk authentication.
            kemudian kita coba check http://ctfchallenges.ritsec.club:4000


            

            ternyata pada port 4000, hanya menampilkan dokumentasi list api yang bisa kita gunakan
            dan terbagi menjadi 3 yaitu

            1. http://ctfchallenges.ritsec.club:4000/api/admin
            2. http://ctfchallenges.ritsec.club:4000/api/normal
            3. http://ctfchallenges.ritsec.club:3000/auth

            sebelum kita mencoba mengakes endpoint admin dan normal lebih baik kita mencoba melakukan 
            authentication pada halaman http://ctfchallenges.ritsec.club:3000 terlebih dahulu.
            
            mari kita check path `/auth` pada http://ctfchallenges.ritsec.club:3000/auth
            kita coba lakukan curl

            

            setelah kita lakukan hit endpoint http://ctfchallenges.ritsec.club:3000/auth
            balikan response nya adalah 

            {"reason" : "missing name parameter" }

            oleh karena itu coba kita tambahkan 1 parameter name dengan isi kucingliar
            dan coba lakukan curl 

            http://ctfchallenges.ritsec.club:3000/auth?name=kucingliar

            balikan response nya adalah 

            {"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoia3VjaW5nbGlhciIsInR5cGUiOiJ1c2VyIiwiaWF0IjoxNTc0MDUwNDAxfQ.mxZF8jUvaUGJiNN4PBqekimT5BdmU5GEgD5t38QBJdBS2Vk1xZ96t5LjZ_TNbyYS2k9Gd-_Nibi5wFU4GRjLTnOk9lCgc5fUER8AlqvoLFR6y0Vt9Kdn9-GELAyQy0IZJs131Xgl4DGvL5ErLNsVqn7UvcKRKMirnCoi_acff7Y"}


            setelah itu kita mendapatkan token, token ini bisa kita gunakan nanti untuk mengakses endpoint
            seperti 

            1. http://ctfchallenges.ritsec.club:4000/api/admin
            2. http://ctfchallenges.ritsec.club:4000/api/normal

            dan bisa kita pastikan token yang digunakan mengunakan JWT(JSON Web Token)
            JWT terdiri dari 3 bagian yaitu HEADER.PAYLOAD.SIGNATURE dan pada umumnya di bungkus dengan base64 encoding

            

            bisa kita lihat header yang digunakan RS256, jadi tekniknya signature nya mengunakan RSASSA-PKCS1-v1_5 jadi kita memerlukan public key kemudian di hash oleh SHA-256, cmiiw.

            dan untuk payload nya ada 3 atribute yaitu name, type dan iat

            {"name":"kucingliar","type":"user","iat":1574050401}

            setelah menganalisa kita coba lakukan request mengunakan token tadi dan kita set di header

            

            ternyata berhasil namun untuk mendapatkan flag kita butuh meng akses endpoint admin.
            disinilah yang menarik bagaimana kita mencoba memanipulasi type user menjadi admin.

            yang pertama di benak saya adalah bagaimana jika endpoint http://ctfchallenges.ritsec.club:3000/auth
            kita berikan parameter type dengan value admin.

            

            ternyata setelah di decode type nya masih user seperti nya teknik pertama gagal.
            Mau tidak mau kita perlu memanipulasi jwt nya, karena alogritma yang digunakan RS256 maka kita perlu cari tahu dulu public key nya untuk generate payload baru.

            coba kita intip2 http://ctfchallenges.ritsec.club:4000 apakah menemukan sebuah clue,

            

            ternyata kita menemukan sebuah clue yaitu kita mencoba akses robots.txt 
            (robots.txt merupakan file yang berfungsi untuk mengendalikan atau mengkontrol user-agent (seperti: Googlebot) dalam mengcrawling halaman website. 
            Jika anda ingin Google dapat menjelajahi seluruh file yang ada di website, anda tidak perlu membuat file robots.txt sama sekali)

            

            kita coba download file nya signing.pem

            
            
            isi signing.pem nya berupa

            
            -----BEGIN PUBLIC KEY-----
            MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBquzMGkZlJmZm4pYppxeDmsGd
            8+9mOh5S9O7W7Gu5VByfl7i3JdCfGxRJdHscg6l321PeTXsXGZ7goHd4Xjv/FtKQ
            DyoaKql4Kl692KKKN/9xA6tKdOYQbZvPqyRXUVOGdyZ12qFBOQzI7ox22YL3ul/3
            nyiDR+p+JKbdVU6AWQIDAQAB
            -----END PUBLIC KEY-----
            
untuk memanipulasi jwt nya saya memiliki referensi dari https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/JSON%20Web%20Token sangat membantu sekali. yang pertama kali kita lakukan adalah, kita convert kebentuk hexa public key tadi. setelah itu kita coba modify type payload nya menjadi admin, kemudian kita encode menjadi base64 setelah itu kita coba generate lagi header.payload nya mengunakan sha256 lagi dengan mengunakan hex value yang kita dapatkan tadi dari signing.pem dan jangan lupa RS256 kita ubah menjadi HS256 sebelum eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9 {"typ":"JWT","alg":"RS256"} sesudah eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 {"typ":"JWT","alg":"HS256"} setelah itu kita generate signature baru. setelah itu kita gabungkan HEADER.PAYLOAD.SIGNATURE yang sudah kita buat eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoia3VjaW5nbGlhciIsInR5cGUiOiJhZG1pbiIsImlhdCI6MTU3NDA1MDQwMX0K.qig06OoojTj3qrxCptwT-RdS33IVgQdBR1t9mykb9NU kita coba request lagi endpoint 1. http://ctfchallenges.ritsec.club:4000/api/admin 2. http://ctfchallenges.ritsec.club:4000/api/normal dan akhirnya kita menemukan flag nya :D .