[HackToday 2019 Qualification] – memepy

Note: Soal ini baru diselesaikan penulis setelah kompetisi selesai dan dapat sentilan clue dari tim lain. (Credits goes to who gave the write clue)

Clue:

Diberikan sebuah web.

Sepertinya web ini meminta input sebuah link. Tapi, dari clue yang diberikan, tidak terlihat bahwa karakter yang di replace merupakan untuk link URL. Dan dari judul soal sepertinya web ini berbasis python. Untuk itu, mari kita coba lakukan vulnerability testing dasar dari website python. Disini agar payload kita berjalan, harus diawali dengan http:// atau https://. Kalau begitu mari kita coba:

https://{{config}}

Yak, website ini lemah terhadap vulnerability yang bernama SSTI (Server-side Template Injection). Walau kita bisa melakukan SSTI, ingat bahwa karakter ‘[‘ dan ‘]’ akan di replace dengan string kosong.

Pertama, kita perlu mengetahui isi dari direktori tempat aplikasi di jalankan. Karena bracket di blacklist, kita bisa menggunakan payload berikut:

https://{{url_for.__globals__.os.__dict__.listdir(‘.’)}}

url_for = membuat dynamic URL

__globals__ = menunjuk ke list dari global variable -> https://punchagan.muse-amuse.in/blog/python-globals/#function-globals-and-the-global-statement

__dict__ = dictionary object bawaan python -> https://codesachin.wordpress.com/2016/06/09/the-magic-behind-attribute-access-in-python/

listdir = directory listing (argument: path)

Okay, terlihat disini ada source code bernama main.py. Lalu bagaimana caranya baca file tersebut jika bracket di blacklist? Terima kasih kepada tim lain yang memberikan penulis clue berupa __getitem__. Atribut ini merupakan pengganti dari [] dan dapat menghasilkan output yang sama. Jadi untuk read file main.py, kita bisa menggunakan payload sebagai berikut:

https://{{”.__class__.__mro__.__getitem__(2).__subclasses__().__getitem__(40)(‘main.py’).read()}}

__class__ = https://stackoverflow.com/questions/20599375/what-is-the-purpose-of-checking-self-class-python

__mro__ = https://stackoverflow.com/questions/2010692/what-does-mro-do

__mro__[2] = panggil type ‘object’

__subclasses__() = https://stackoverflow.com/questions/3862310/how-to-find-all-the-subclasses-of-a-class-given-its-name

__subclasses__()[40] = object ‘file’

Dari source code tersebut sebenarnya tidak mengandung banyak informasi yang berguna karena tidak memberikan lokasi flag. Tapi mengingat hasil listdir tadi tidak ada flag, biasanya flag terdapat di /flag. Mari kita coba listdir di /.

Hmm? Tidak bisa? Sepertinya aplikasi juga melakukan blacklist pada karakter ‘/’. Lalu bagaimana kita mau mengetahui lokasi flag? Dari sini, penulis melakukan googling dan mendapatkan cara untuk bypass blacklist tersebut.

https://fireshellsecurity.team/asisctf-fort-knox/

Didalam link tersebut, disebutkan bahwa jika ada blacklist special character, kita bisa menggunakan hex untuk bypass. Sepertinya disini python (atau flask nya, CMIIW) mempunyai kemampuan untuk interpret hexadecimal menjadi string). Jadi dari sini, kita bisa melakukan listdir dengan payload sebagai berikut:

https://{{url_for.__globals__.os.__dict__.listdir(‘\x2f’)}}

Yak, filter ‘/’ sudah di bypass dan terlihat bahwa ada file flag di direktori ‘/’. Selanjutnya, dengan cara bypass yang sama, kita lakukan read file ke flag dengan payload sebagai berikut:

http://{{”.__class__.__mro__.__getitem__(2).__subclasses__().__getitem__(40)(‘\x2fflag’).read()}}

Flag: hacktoday{woa______circleous_does_web_b496508a}

 

Leave a Reply

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