Sunday, April 13, 2014

PlaidCTF2014 Write Up: MtPox (Web150)

Ini adalah soal kategori web application tapi juga menggunakan teknik kriptanalisis.

Berikut adalah deskripsi soalnya:

The Plague has traveled back in time to create a cryptocurrency before Satoshi does in an attempt to quickly gain the resources required for his empire. As you step out of your time machine, you learn his exchange has stopped trades, due to some sort of bug. However, if you could break into the database and show a different story of where the coins went, we might be able to stop The Plague.

Oke skenarionya sepertinya disetting supaya mirip dengan bitcoin dan MtGox. Berikut adalah tampilan web aplikasi PlaidCoin exchange.



Setelah melihat-lihat dan mencoba web tersebut vulnerable terhadap Local File Inclusion pada file "index.php". Kita bisa melihat source code admin.php dengan membuka url "index.php?page=admin.php". Berikut adalah source code dari admin.php.

Perhatikan bahwa ketika belum terotentikasi kita diberi 2 cookie: 

  • auth berisi serialize(false), yaitu "b:0;"
  • hsh berisi sha256(SECRET + ";0:b")
Apa itu SECRET ? Kita tidak tahu isi dari SECRET, tapi kita diberitahu bahwa SECRET adalah 8 byte dan sangat kecil peluang untuk dibrute force.

Perhatikan lagi source code di atas baris 5-8, kita ingin membuat $auth bernilai true sekaligus ingin agar cookie hsh yang kita kirimkan diterima sebagai cookie yang valid.

Oke kalau begitu kita harus mengirim cookie auth yang bila di-unserialize menjadi true dan sekaligus hasil dari sha256(SECRET + strrev(cookie auth)) sama dengan cookie hsh yang kita kirimkan. 

Kita hanya punya hsh berisi sha256(SECRET + ";0:b"), bagaimana caranya kita bisa membuat sha256(SECRET + ";1:b") padahal kita tidak tahu SECRET ?

Jawabannya adalah dengan hash length extension attack, silakan baca di ilmuhacking tentang lebih detil bagaimana attack ini bekerja.

Jadi kondisinya sekarang:

  • Dari hsh cookie diketahui bahwa sha256(SECRET + ";0:b") = ef16c2bffbcf0b75672...
  • Jika kita ingin unserialize(str) bernilai true, maka str tersebut harus diawali dengan "b:1;" (sisanya boleh berisi string apapun, tidak akan mengubah hasil unserializenya).
Dengan hash extension attack, bila diketahui sha256(SECRET + ";0:b") = X, kita bisa mencari sha256(SECRET + ";0:b" + padding + append) tanpa mengetahui SECRET.

Perhatikan bahwa kita bisa menyelesaikan soal ini bila append berisi ";1:b" :
  1. cookie auth yang kita kirim adalah append + pending + "b:0;" (dibalik karena ada strrev di baris ke-7) yaitu cookie auth = "b:1;" + append + "b:0;"
  2. unserialize("b:1;"+padding+"b:0;") adalah true karena diawali dengan "b:1;"
  3. sha256(SECRET + strrev(cookie auth)) adalah sha256(SECRET+";0:b"+padding+";1:b")
Tugas kita sekarang tinggal mencari tahu berapa nilai sha256(SECRET+";0:b"+padding+";1:b") tanpa tahu SECRET.

Dengan tools hash_extender kita bisa dengan mudah mendapatkan nilai sha256(SECRET+";0:b"+padding+";1:b") tanpa perlu tahu SECRET. Output dari tools tersebut tinggal kita balik kemudian diubah menjadi bentul url encoded sehingga hasilnya menjadi 2 cookie berikut:

Dengan dua cookie tersebut kita akan menembus otentikasi dan masuk ke halaman admin.


Selanjutnya dari source code jelas terlihat ada SQL injection pada parameter query. Selanjutnya saya serahkan saja pada sqlmap untuk melakukan eksploitasi sql injection.



No comments:

Post a Comment