Diberikan sebuah tautan soal dan file peserta.zip yang merupakan source code dari soal. Tampilan awalnya adalah seperti berikut ini:
Dari source code yang diberikan tidak ada sesuatu yang aneh dari proses login ini. Tapi di bagian register
Berikut ini adalah tampilannya serta berikut ini adalah function di dalam controller app/Http/Controller/UserController.php.
Di situ terlihat pendaftaran dengan normal, tapi ada satu nilai yang dibuat dengan algoritma tertentu, yaitu variabel $secret_token
, yang akan di-insert di kolom secret_token
. Bagian $array_key
sebagai keys algoritma disimpan di dalam .env
, yang dibaca di bagian ini
Lalu untuk memastikan semua berjalan normal, lakukan pendaftaran seperti biasa, dan setelah masuk akan mendapatkan tampilan seperti ini di dalam Dashboard
Di bagian tabel didapatkan notes dari berbagai user. Lalu di pojok kiri bawah ada tombol logout dan ada tombol change password. Di bagian logout tidak ada yang aneh, namun di bagian change password ada sesuatu yang aneh dalam proses pengecekannya.
Ternyata yang digunakan untuk identifier bukanlah id_user melainkan secret_token yang juga secret_token ditaruh di hidden form field.
Hal ini dapat membuat kita melakukan reset password ke akun orang lain, selama kita dapat melakukan generate secret_tokennya. Tapi ada 2 problemnya, di mana kita dapat mendapatkan username,id serta secret_keys untuk melakukan generate secret_token ? Di bagian awal dashboard di bagian datatables ternyata banyak field yang dikirim ke frontend tapi hanya beberapa yang di-parsing.
Seperti inilah hasil dari endpoint http://sn2.rpw.my.id/api/list-dashboard yang mana banyak field yang bisa kita leak untuk melakukan generate secret_token, problem selanjutnya di mana kita mendapatkan secret_keys di dalam .env kan? Namun saat membukan .env terkena challenge dari Cloudflare seperti berikut ini.
Dan setelah melewati challenge-nya akan tetap terkena blokir dari nginx-nya 🙁 .
Jadi bagaimana untuk mendapatkan .env ? di dalam source code yang diberikan, terdapat file .cicd.yml yang berisi seperti berikut ini
Terlihat di situ ada ip dan port yang kemungkinan adalah ip:port dari aplikasi sebelum dipasang firewall. Saat dibuka di browser dan benar saja.
Dan dari sini kita dapat mendapatkan .env nya, lakukan saja curl
curl http://27.112.79.254:1339/.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:MUg3EgKP2Mjg7+NWAT8ViLAKbt9Q2k0grasjWT79XL8=
APP_DEBUG=false
APP_URL=https://secretnote2.rpyid.asia
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=33061
DB_DATABASE=secretnote2
DB_USERNAME=root
DB_PASSWORD=howdoyouturnthisone?123ha?
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME=”${APP_NAME}”
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY=”${PUSHER_APP_KEY}”
MIX_PUSHER_APP_CLUSTER=”${PUSHER_APP_CLUSTER}”
KEY_SECRET_GEN=YXRMSWWgWpYolaQAiX2Sbh1uOKtSxPqbedJ
KEY_SECRET_PIN=XmR9Vdu81V06HIkYDgrupFtKJgt1LD7HyYx
Di bagian terbawah terdapat KEY_SECRET_GEN dan KEY_SECRET_PIN yang digunakan untuk keperluan sesuatu, dari sini langkah yang harus dilakukan adalah melakukan leak terhadap akun dengan roles “admin” sesuai salah satu Middleware yang ada
Karena field role tidak diberikan, namun saat dilakukan searching di endpoint
Terdapat username dengan nama “adminnikko” yang mana terindikasi mempunyai roles ‘admin’.
Ditemukan username,uid dan keysnya, mari kita buat secret_token-nya saya membuat script seperti berikut ini
Jalankan dan mendapatkan secret_token
Lakukan pergantian di hidden form dan masukan password yang diinginkan
Setelah itu tinggal masuk dengan “adminnikko” dan password yang telah diganti, akan mendapatkan tampilan yang hampir sama dengan menu yang berbeda.
Terdapat menu Activity yang tampilannya sama saja dengan dashboard. Di sini kembali ke deskripsi soal, bahwa yang mempunyai flag adalah 1337 maka dari itu dilakukan pencarian ulang.
Dan ada 2 notes dari akun wony1337 ini
Anneyongz dan bendera, yang mana dari salah satu ini berisi flag. Lalu, bagaimana? Saat membuka notes akan terhenti oleh challenge dari Cloudflare seperti ini:
Hal ini akan membuat tidak mungkin melakukan Brute Force, “tapi kan sudah ada real ip dan port?” Hal ini juga akan membuat lama.Kita baca pembuatan notes di dalam controller.
Terlihat bahwa pin memang tidak disimpan di dalam database, melainkan hasil dari salt dan hasil dari hash saja, fungsi secureHash seperti ini:
Dari sini jika dipikir-pikir memang secure karena dilakukan 3x hashing serta jika tidak tau value dari hashing-nya juga tidak akan bisa melakukan apapun, mari kita lihat bagian untuk pengecekan pin:
Di sini juga tidak terlalu aneh, sesuai dengan algoritma pembuatannya. Jadi harus bagaimana? Kita dapat mendapatkan semua PIN jika secret dan salt_hash. Di bagian Activity milik admin, juga ternyata REST API mengirimkan banyak informasi tapi yang di-parsing hanya beberapa bagian saja.
Di situ terdapat variabel secret yang berisi secret dan salt_hash, dari sini sudah jelas kita tinggal mencari notes milik wony1337 yang bernama bendera dan anneyongz
Tinggal melakukan brute force saja dengan membuat script seperti berikut ini
Di 30 menit Final, ada salah satu tim yang mengerjakan bertanya berapa panjangnya, saya mengatakan bahwa panjangnya kurang dari 7 lalu di 15 menit terakhir bertanya kembali, berapa panjang pin pastinya saya jawab panjangnya adalah 5. Saya melakukan brute force dengan script di atas hanya perlu waktu sekitar 2 menit saja (tergantung hoki memang) tapi berkali-kali tidak lebih dari 3 menit.
Ternyata yang menyimpan sebuah flag bukanlah notes bendera melainkan notes Anneyongz, buka dengan pin tersebut dan dapatkan flagnya.
Flagnya: KKST2021{DreamLike_DreamDay_IZONE_PLEASE_COMEBACK}
Terima kasih telah membaca, dan selamat kepada semua yang telah menjadi juara! Semoga sukses selalu, sehat dan diberi banyak kebaikan oleh Allah.