COMPFEST 15
Last updated
Last updated
COMPaste
Web Exploitation
Null Byte
index.php.ts
Web Exploitation
SQLI, NextJS Server Action
napi
Misc
Py Jail
Author: rorre
Obligatory pastebin clone. But people said that Python is slow, so I made the I/O in C! Now it is blazingly fast!
Hint: flag flag.txt
Melakukan bypass extend extension .txt dengan menggunakan nullbyte yaitu %00 untuk membaca file flag dan bukan flag.txt
Challenge website ini memiliki fungsionalitas untuk membuat sebuah note, dimana note ini nanti akan disimpan dan memiliki ID yang unique
Ketika dilihat, ternyata id tersebut dikirimkan lewat query params id, dan disini sempat berasumsi challenge ini vulnerable terhadap LFI, namun ketika dicoba tidak works
Long story short akhirnya ada hint yang menampilkan sebagai berikut
Hint ini memberikan sebuah clue, sebenarnya note tersebut disimpan didalam file dengan extension .txt, namun ketika diread pada query params id, tidak perlu menambahkan extension .txt, yang artinya berarti dari sisi source code sudah otomatis di append extension .txt.
Dan dari hint terlihat sebenarnya ada file flag dan flag.txt, dan sesuai objective disini, sepertinya file flag.txt isinya adalah fake flag dan diharuskan untuk membaca file flag.
Karena pada deskripsi terdapat kata - kata "C I/O", sepertinya extend extension tersebut bisa dibypass dengan menggunakan nullbyte injection, yaitu dengan mengirimkan urlencoded %00, sehingga payload yang dikirim ke query params adalah sebagai berikut
COMPFEST15{NULL_4nD_C_stR1k3S_again_90dea8e9}
Author: rorre
I love Next.js 13! The server actions dan components is very cool! It looks just like back then when I was writing PHP!
Melakukan execute function server actions yang tidak memiliki handler, namun dapat diexec ketika bisa tahu dari Next-Action ID nya, yang dapat dileak melalui builded source codenya, lalu melakukan SQLI untuk mendapatkan flag dari vulnerable server actions tersebut yaitu dengan melakukan leak credentials atau ID dari flag_owner table.
Pada challenge ini menggunakan framework NextJS 13, yang dimana baru saja dikenalkan dengan fitur barunya yaitu server actions.
Pada bagian source code indexnya ada bagian kode berikut
Pada potongan kode diatas terdapat logic dimana flag disimpan dalam environment variable, dan untuk mendapatkannya value dari cookie uid harus available dalam table flag_owner.
Dan uid tersebut sebenarnya sifatnya adalah random, dan akan diset otomatis oleh middleware ketika uid tersebut belum diset ketika melakukan request, berikut kode middlewarenya
Setelah mengetahui bagaimana flag bisa didapatkan lanjut untuk menelusuri fungsionalitas webnya, sebenarnya web ini ditujukan untuk QnA website.
Berikut ada 2 function utama yang digunakan untuk melakukan fungsionalitas QnA tersebut
Yang menarik disitu adalah pada bagian function answerQuestion terdapat exec sql yang vulnerable terhadap sql injection, karena tidak menggunakan bind parameter, namun terlihat input answer akan dimasukkan ke dalam function escapeSql dan juga pada awal awal dicek pada function hasBlacklist dari input answer dan id, berikut functionnya
Dari sini abaikan terlebih dahulu fungsionalitas tersebut, kita akan cari alur dari program tersebut hingga bisa melakukan call function answerQuestion tadi.
Ternyata answerQuestion tadi dicall pada component QuestionBox
Namun, untuk menjalankan fungsionalitas form yang memanggil action answerQuestion maka props isAdmin harus bernilai true, namun jika dilihat pada render component tersebut defaultnya adalah false, bisa dilihat pada bagian berikut
Ini yang mulai membuat challenge ini menjadi menarik, bagaimana seharusnya melakukan call function yang vulnerable tadi.
Oke, faktanya disini adalah kedua function askQuestion dan answerQuestion tadi adalah sebuah server action, dan server action sebenarnya juga dicall melalui http request seperti API biasa, namun dengan mengirimkan beberapa header request lain untuk bisa memanggil function dari server action yang sesuai.
Dan berikut adalah contoh network call dari function askQuestion, dimana secara default bisa untuk digunakan karena tidak ada kondisi apapun dalam source code
Ada network value yang menarik yaitu Next-Action dengan valuenya adalah random hex number, nah disini sebenarnya bisa diketahui bahwa setiap action memiliki unique id nya masing - masing, artinya function answerQuestion tadi dapat dicall juga bisa menemukan unique id nya. Nah sebenarnya unique id ini digenerate melalui file obfuscateActions.js
Dan untuk payload nya bisa dilihat bahwa pengirimannya menggunakan array, dan ini sesuai karena function askQuestion tadi hanya menerima 1 argument saja pada functionnya.
Oke, selanjutnya adalah mencari unique id dari action answerQuestion, yaitu dengan melihat source nya pada websitenya menggunakan inspect element dengan mengecek hasil compile javascriptnya, dan didapatkan hasil sebagai berikut
Berhasil untuk mendapatkan unique id nya yaitu 78a67fd227478c9f84cda58629c8cfd5afd7c002.
Oke selanjutnya adalah melakukan schema callnya, karena function answerQuestion menerima 2 argument, maka pengiriman datanya adalah menggunakan 2 value dalam 1 array, ilustrasi request sebagai berikut
Selanjutnya adalah bagaimana cara mencari question id, coba untuk membuat questionnya terlebih dahulu
Lalu, karena call datanya ada pada server side, seharusnya datanya sudah diembed ke dalam hasil compiled source nya, coba cek pada view raw source
Bisa dilihat terdapat id dari questionnya yaitu ozhvx9Z55N66IGZDNcsUhcMmzMiN6Mk4jX2rsaf30GU4KfzlNg18pLb7XaQBESXR, beserta dengan uid user yang berelasi dengan question tersebut yaitu 8OtLWE4nIgVef07qsuFrRFMlgY5z9vK6.
Setelah ini, mencoba untuk melakukan call answerQuestion dengan schema sebelumnya, untuk memudahkan disini bisa menggunakan script python berikut
Lalu jalankan kode tersebut, dan lihat apakah akan ada answer pada question yang sebelumnya sudah dibuat
So yeah it's works, selanjutnya adalah melakukan sqli untuk melaukan leak uid dari table flag_owner. Flashback kembali dari blacklist tadi, yang sebenarnya bisa dilakukan adalah dengan melakukan inject pada question id nya, karena jika diinject pada bagian answer itu terlalu strict sekali.
Dan disini result yang dihasilkan adalah blind sql injection dengan metode boolean based, jadi untuk melakukannya berikut ada script automation untuk bisa mendapatkan atau melakukan leak uid dari table flag_owner tadi
Dan berikut sedikit screenshot ketika script tersebut dijalankan
Langsung saja ambil 32 karakter pertama sebelum tanda , [koma], karena panjang defaultnya adalah 32 karakter, lalu kemudian ubah cookie nya dengan uid tersebut, dan coba akses kembali halaman websitenya untuk mendapatkan flagnya
Perjalanan yang cukup panjang, but so yeah, we did it.
COMPFEST15{N0t_so_SSR_Alw4yS_cH3ck_f0r_R0le}
Author: k3ng
john is currently planning on escape from jail. Fortunately, he got a snippet of the jail source code from his cellmate. Can you help john to escape?
Melakukan escape dari python jail untuk bisa mendapatkan sebuah file private ssh key, yang nantinya bisa digunakan untuk mengakses ssh dari machine tersebut.
Diawal diberikan sedikit dari snippet source code dari program yang ada diserver, yaitu sebagai berikut
Ada beberapa usable function yang dibanned, namun jika dilhat hanya nama function saja, lalu untuk masuk kepemrosesan eval function value user yang dimasukkan haruslah john.
Dari sini sebenarnya bisa untuk melakukan escape dari banned tersebut, yaitu dengan melakukan call kembali eval dan memasukkan input untuk diexec, namun dapat dibypass terlebih dahulu dengan menggunakan hex string, contoh untuk melakukan recover function eval bisa dilakukan seperti berikut
Disini, sebenarnya ingin memanggilkan builtin module dengan __import__, namun tidak bisa, sehingga selanjutnya coba kita lihat global variablenya yaitu dengan call globals function, yaitu dengan mengirimkan payload seperti berikut
hasilnya seperti berikut
Ternyata nama file yang dijalankan adalah chall.py, selanjutnya untuk memudahkan prosesnya disini agar tidak harus melakukan crafting hex string nya secara manual, berikut automation script yang bisa digunakan
Pertama leak isi dari chall.py, bisa didapatkan hal sebagai berikut yang sangat useable
Ternyata builtins method __import__ dihapus, sehingga tidak dapat melakukan import module dan mendapatkan shell.
Ada bagian menarik lagi pada file chall.py, yaitu sebagai berikut
hmm, disini ada file lagi notice.txt, kita akan coba read file tersebut untuk melihat isinya
Setelah didecode dari base64, hasilnya ada value dari RSA Private Key, asumsi disini ini adalah private ssh key yang dapat digunakan untuk masuk ke ssh, maka setelah itu coba untuk masukkan value tersebut kedalam file private.key, dan mencoba untuk masuk ke sshnya menggunakan username admin
Berhasil!!!
COMPFEST15{clo5e_y0ur_f1LE_0bj3ctS_plZzz___THXx_053fac8f23}