martes, 28 de febrero de 2012

[Hack] Los peligros del phpinfo y como tirar un servidor

¿Cuantos hemos creado un fichero phpinfo? Y quizás es una de las cosas que primero se hacen al terminar de instalar php.

Para los que no saben, "phpinfo" es una pagina de información con datos de configuración de un servidor. Por lo general, cuando se está configurando un servidor, una forma de saber si funciona "php" es creando este archivo. Sencillamente, no es mas que generar un archivo con el contenido
<?php phpinfo(); ?>
y guardarlo como info.php (puede ser cualquier nombre con extensión *.php). De esta forma, basta con entrar a http://(tu pagina o ip)/phpinfo.php Y así ver la información, variables y configuración actual del servidor.

Y ¿Porque esto es peligroso?
Ya sea por olvido, para un posterior uso, o creyendo que nadie se va a dar cuenta de la existencia de este archivo (al no estar linkeado en la pagina). Los administradores, simplemente lo dejan, le cambian el nombre y listo. Tal vez un usuario común jamas se entere de la existencia del mismo, pero puede que un atacante lo descubra y utilice la información para posteriores ataques.
Cuando se va a iniciar un ataque, el primer paso es el Footprinting (Así se denomina a las diferentes técnicas para recabar información) tratando de obtener IPs, dns, información personal, puertos, servicios corriendo, versiones de programas, etc.

El phpinfo le otorga a un extraño por ejemplo:
-Saber algunos programas que están corriendo, mediante la variable PATH.
-Ver la versión del sistema operativo, sin la necesidad de hacer fingerpriting o utilizar un programa (que además deja huellas).
-Saber las versiones de los programas y módulos de apache. A partir de ello ver si existe algún bug, para después explotarlo.
-Ver permisos de algunos archivos.
-Ver la directiva safe_mode.
-En caso de ser vulnerable a LFI (Local File Inclusion donde se puede visualizar archivos del servidor o inyecta código en un fichero para luego ejecutarlo) podría ayudar a la explotación, debido a que la ejecución de un script se almacena de forma temporal. Al archivo con el script mediante un método gets o post, se visualizaría el nombre del archivo temporal generado en el phpinfo y ejecutar el fichero con el LFI.
-Encontrar una vulnerabilidad RFI (Remote File Inclusion donde se puede ejecutar una shell remota y entrar directamente al servidor) si allow_url_fopen está habilitado.
-Explotar un xss, mediante la variable de vector '?a[]=' agregandola a la url.
Entre otras cosas...

Analizando la salida del phpinfo.
Este es un ejemplo real de un phpinfo en un servidor.


-Cuando entramos a la pagina del phpinfo, nos encontramos con algo similar a esto. Fíjense que al comienzo ya nos dice la versión de php. De esta forma se puede saber que vulnerabilidades pueden llegar a explotarse. Y abajo el Sistema en que corre.


-En la parte de "apache2handler", tenemos la versión de apache. Al igual que antes con esto podemos saber que vulnerabilidades se puede explotar. En el apartado "Loaded Modules" los módulos que se están ejecutando. Esto es importante porque Si existe un bug en esa versión que lo genere un modulo este debe estar cargado.


-Esta es la parte que andaba buscando. Se puede ver que cabeceras del protocolo http se utilizan. La parte que me interesa es "HTTP_ACCEPT_ENCODING", fíjense que acepta "gzip, deflate", quiere decir que permite comprimir la respuesta antes de enviarla.

Verán, cuando nuestro explorador (IExplorer, Mozilla, Opera, Chrome etc..) envían una consulta http a un servidor al abrir una pagina, internamente se envía algo similar a esto (puede variar):
 GET /index.html HTTP/1.1
Host: www.pagina.com
User-Agent: nombre-cliente
Y el servidor internamente devuelve algo asi:
HTTP/1.1 200 OK
Date: Fri, 2 Mar 2012 18:39:05 GMT
Content-Type: text/html
Content-Length: 1221

<Cuerpo de la pagina>
...
Como el protocolo http utiliza múltiples cabeceras, uno puede enviar una cabecera modificada
para obtener una respuesta diferente. Un caso particular es el de los servidores de descarga, que utilizan "range", rango de bytes que se necesita para continuar la descarga.
Aprovechando esto, si enviamos múltiples consultas con diferentes rangos y a todas ellas, le decimos que los comprima con gzip, el servidor intentará atender todas estas consultas y finalmente colapsará.
-----------------------------
Para el exploit utilice lenguaje C++ y es bastante sencillo. En primer lugar se pide la url de la pagina, a partir de ella se obtiene la ip. Para cada consulta se crea un "hilo" y utilizando "socket" se envía la cabecera modificada.





Así que ya saben, acuerdense de deshabilitar el phpinfo. Actualizar los programas.
Aclaración: Esto no es un tutorial. Gonzac Studios no se hace responsable por el mal uso de este material.

3 comentarios:

  1. con deshabilitar phpinfo() te refieres a no usarlo ¿verdad? O ¿hay alguna opcion para "desactivar" la funcion?

    ¿Se puede descargar el exploit para echarle un ojo a tu codigo? Parece muy interesante.............

    Gracias por el articulo me fue muy util, saludos:D

    ResponderEliminar
    Respuestas
    1. El phpinfo no es necesario, asi que puede moverse el archivo a una carpeta protegida. o solo eliminarlo.

      El exploit, se me perdio en alguna pc vieja. Si lo encuntro lo adjunto.
      Saludos

      Eliminar
  2. Hola, hice una web para practicar con la vulnerabilidad RFI con el allow_url_fopen habilitado, me gustaria saber como subir la shell poniendome en el lugar de alguien externo a la web.

    Gracias por el articulo, saludos :)

    ResponderEliminar