[HTB-writeup] Canape

¡Buenas! Hoy venimos con la última máquina retirada de la plataforma Hackthebox: Canape. Para resolverla necesitaremos tener conocimientos básicos de Linux, un poco de coding para explotar una vulnerabilidad PHP, aprovecharnos de una versión vulnerable de base de datos y finalmente, escalar privilegios vía sudo. Así que... ¡Vamos allá!

Scanning

Como siempre, comencemos con un SYN scan para ser rápidos y sigilosos y, después, comprobar versiones de servicios y ejecutar scripts seguros de NSE.

-sS

Un escaneo de los puertos más comunes no arroja toda la información que podemos obtener, y es cuando utilizamos el parámetro -p- (escanear todos los puertos) cuando descubrimos que hay otro puerto abierto.

Ilustración 1. Resultados SYN scan.

-sV

Ilustración 2. Scripts NSE y escaneo de versiones.

Nota: -sS = SYN scan; -sV = version scan; -sC = ejecutar scripts NSE seguros; -n = no resolver nombre; -Pn = no intentar comprobar si el host está vivo; -p = puertos -oA = todos los formatos de salida.

Enum
A primera vista ya encontramos mucha información interesante… un servidor SSH en el puerto 65535, un servidor web con un sitio fan de los Simpsons y… un repositorio GIT!
Usemos Burp para preparar un proxy que nos logee todas las peticiones hacia la web.

Ilustración 3. Árbol inicial en Burpsuite.

Sólo echando un vistazo a la página principal, podemos comprobar que probablemente la máquina esté utilizando CouchDB y, si además inspeccionamos el código, vemos una url escondida (/check).

 Ilustración 4. CouchDB posiblemente se utilice.


Ilustración 5. Funcionalidad /check escondida.


Enviando una petición mediante Burpsuite, podemos comprobar que /check no acepta el método GET, pero sí POST y OPTIONS pero, antes de continuar con esta parte, echemos un ojo al repositorio git.
Ilustración 6. /check permite el método POST.


Ilustración 7. Git repo.


Echando un vistazo al repositorio git, encontramos un archivo de configuración con la información suficiente como para realizar un git clone <repo> correctamente para clonar el repositorio completo.


Ilustración 8. Contenido del archivo "config".

Usando la url encontrada en el archivo de configuración, podemos usar git clone para clonar todo el código, lo cual será muy útil para realizar pruebas localmente antes de lanzarlas en remoto.

Nota: comando utilizado à git clone http://git.canape.htb/simpsons.git

El fichero en el que estamos interesados es __init.py__. Ejecutarlo es muy sencillo, únicamente tenemos que comentar la línea referente a CouchDB (no tenemos la bbdd en nuestro equipo) y ejecutarlo como un script común. Tras esto, tendremos nuestra web replicada en http://127.0.0.1:5000.
Inspeccionando __init.py__ comprobamos que hace /check y, además, que usa una función php vulnerable: cPickle.loads(data).

Ilustración 9. Contenido de /check.


Lo primero será conseguir una ejecución correcta, utilizando por una parte /submit para subir una cita correcta y luego usar /check para ver si funciona correctamente.

Ilustración 10. Ejecución correcta de /submit.

Image 11. /submit section on __init.py__

Por tanto, el script para convertir a “leíble por check” cada cita añadida, sería algo como lo siguiente:


Ilustración 11. Script para convertir cada cita en formato "leíble por check".


Ahora, necesitamos utilizar el hash obtenido, para incluirlo en el parámetro id en la petición POST de /check.

Ilustración 12. Petición POST correcta en /check.


Ha funcionado! Por tanto, nuestro objetivo es explotar la funcionalidad /check para obtener una shell.
 

Exploiting

Intentemos conseguir RCE. Para ello tenemos que pensar en 3 cosas:
  • Es necesario incluir el nombre de algún personaje de los Simpsons en nuestro exploit à por ejemplo, “krusty”.
  • Por alguna razón, tuve algunos problemas para enviar las peticiones vía curl o por el navegador à necesitamos enviar las peticiones post desde dentro del propio script.
  • cPickle tiene una vulnerabilidad de deserialización, permitiendo a objetos aleatorios declarar cómo deben ser “pickled” definiendo un método __reduce__.

En este punto realicé muchas pruebas pero, finalmente, el código del exploit es el siguiente:

Ilustración 13. Código del exploit cPickle.

Nota: El código en b64 es una web_delivery shell, pero es posible utilizar cualquier comando.

Ejecutando este exploit contra la máquina víctima nos dará una shell sin privilegios:

Ilustración 14. Shell en la víctima como www-data.

Pero no podemos conseguir la flag de user… ¿por qué? Bueno, no somos un usuario creado como tal, sólo www-data. Pero… ¿Recordáis que vimos que se utiliza CouchDB en la máquina? Vamos a comprobar si es cierto y si es vulnerable. Para ello vamos a enviar una petición http mediante curl al puerto por defecto de CouchDB (5984/tcp).

 Ilustración 15. Versión de CouchDB.

Como era de esperar, la versión de CouchDB es vulnerable (CVE-2017-12635) así que utilicé un exploit público (https://www.exploit-db.com/exploits/44498/) para crear un usuario con permisos de admin dentro de la bbdd de CouchDB y… funcionó!!


Ilustración 16. Ejecución de CouchDB y creación de usuario con permisos de admin.

Ahora podemos ver todo el contenido de la ddbb. CouchDB es una base de datos no relacional, por lo que todo está estructurado en torno a documentos en lugar de tablas. Lo que debemos hacer es:
  1. Comprobar todas las dbs à curl –x GET http://<user>:<pass>@127.0.0.1:5984/_all_dbs
  2. Seleccionar una bd y comprobar todos los documentos à curl –x GET http://<user>:<pass>@127.0.0.1:5984/passwords/_all_docs
  3. Seleccionar el ID de cada documento y ver qué contiene à curl –x GET http://<user>:<pass>@127.0.0.1:5984/passwords/<id>

 Ilustración 17. Inspección de la BBDD de CouchDB.

Lo tenemos!!

Ilustración 18. Credenciales de homer y "su homer".

Ilustración 19. Flag de user.

Privesc

La elevación de privilegios es muy rápida. Tan sólo tenemos que comprobar los permisos que tiene homer en sudo y veremos el camino claro…
 
Ilustración 20. Privilegios de homer en sudo.

Podemos abusar de pip para instalar lo que queramos como root, así que utilizaremos el script en python fakepip.py para crear una shell reversa hasta nuestro equipo con privilegios de root.
Fakepip se puede encontrar aquí (https://github.com/0x00-0x00/FakePip) y hay que modificar el RHOST para indicar nuestra IP, aunque tan sólo contiene una reverse shell común, por lo que es muy sencillo crear tu propio script.

Ilustración 21. Contenidos de fakepip.py

Ilustración 22. Subida de fakepip.py a la víctima via wget.

Ilustración 23. Ejecución de fakepip.

Ilustración 24. Nueva shell reversa con privilegios de root y root.txt

Pwned!

Y hasta aquí Canape, cualquier duda o sugerencia, no dudes en dejar un comentario o pregunta en el canal de Telegram - HackTheBox Hispano.

Si tienes algún write-up no dudes en decírnoslo para darte acceso al repositorio de write-ups de Hackplayers: https://github.com/Hackplayers/hackthebox-writeups/blob/master/README.md

Saludos!!

Comentarios