Writeup Final KKS TNI AD 2021 – Notes (Web)

Last Update Article: 2021-09-29 07:13:56


Writeup Final KKS TNI AD 2021 – Secretnotes2 (Web)

Untitled

Diberikan sebuah tautan soal dan file peserta.zip yang merupakan source code dari soal. Tampilan awalnya adalah seperti berikut ini:

Untitled

Dari source code yang diberikan tidak ada sesuatu yang aneh dari proses login ini. Tapi di bagian register

Untitled

Berikut ini adalah tampilannya serta berikut ini adalah function di dalam controller app/Http/Controller/UserController.php.

Untitled

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

Untitled

Lalu untuk memastikan semua berjalan normal, lakukan pendaftaran seperti biasa, dan setelah masuk akan mendapatkan tampilan seperti ini di dalam Dashboard

Untitled

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.

Untitled

Ternyata yang digunakan untuk identifier bukanlah id_user melainkan secret_token yang juga secret_token ditaruh di hidden form field.

Untitled

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.

Untitled

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.

Untitled

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

Untitled

Terlihat di situ ada ip dan port yang kemungkinan adalah ip:port dari aplikasi sebelum dipasang firewall. Saat dibuka di browser dan benar saja.

Untitled

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

Untitled

Karena field role tidak diberikan, namun saat dilakukan searching di endpoint

Untitled

Terdapat username dengan nama “adminnikko” yang mana terindikasi mempunyai roles ‘admin’.

Untitled

Ditemukan username,uid dan keysnya, mari kita buat secret_token-nya saya membuat script seperti berikut ini

Untitled

Jalankan dan mendapatkan secret_token

Untitled

Lakukan pergantian di hidden form dan masukan password yang diinginkan

Untitled

Setelah itu tinggal masuk dengan “adminnikko” dan password yang telah diganti, akan mendapatkan tampilan yang hampir sama dengan menu yang berbeda.

Untitled

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.

Untitled

Dan ada 2 notes dari akun wony1337 ini

Untitled

Anneyongz dan bendera, yang mana dari salah satu ini berisi flag. Lalu, bagaimana? Saat membuka notes akan terhenti oleh challenge dari Cloudflare seperti ini:

Untitled

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.

Untitled

Terlihat bahwa pin memang tidak disimpan di dalam database, melainkan hasil dari salt dan hasil dari hash saja, fungsi secureHash seperti ini:

Untitled

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:

Untitled

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.

Untitled

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

Untitled

Tinggal melakukan brute force saja dengan membuat script seperti berikut ini

Untitled

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.

Untitled

Ternyata yang menyimpan sebuah flag bukanlah notes bendera melainkan notes Anneyongz, buka dengan pin tersebut dan dapatkan flagnya.

Untitled

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.