Cozyhosting

Publicado: 15 de Mayo de 2025 Autor: Josรฉ Miguel Romero aKa x3m1Sec Dificultad: โญ Easy
๐ Descripciรณn
CozyHosting es una mรกquina Linux que aloja una aplicaciรณn web de un servicio de hosting. La explotaciรณn comienza con la enumeraciรณn de servicios, donde encontramos un servidor web ejecutando una aplicaciรณn Spring Boot.
La mรกquina presenta mรบltiples vectores de ataque que incluyen:
Exposiciรณn de endpoints sensibles en la aplicaciรณn Spring Boot (/actuator)
Uso de sesiones inseguras que pueden ser manipuladas
Inyecciรณn de comandos en una funcionalidad de conexiรณn SSH
Credenciales almacenadas en archivos de configuraciรณn
Escalada de privilegios mediante sudo mal configurado
El objetivo es obtener acceso inicial como usuario app mediante la inyecciรณn de comandos, pivotear al usuario josh usando credenciales encontradas en la base de datos PostgreSQL, y finalmente escalar a root abusando de permisos sudo para el binario SSH.
๐ญ Reconocimiento
Ping para verificaciรณn en base a TTL
๐ก Nota: El TTL cercano a 64 sugiere que probablemente sea una mรกquina Linux.
Escaneo de puertos
Enumeraciรณn de servicios
โ ๏ธ Importante: Detectamos durante la fase de enumeraciรณn con nmap que se estรก realizando virtual hosting. Debemos aรฑadir el siguiente vhost a nuestro fichero /etc/hosts
๐ Enumeraciรณn Web
80 HTTP
http://cozyhosting.htb

Hay un panel de login que nos permite enumerar la tecnologรญa del sitio web junto con la extensiรณn wappalyzer:

๐ท๏ธFuzzing de vhosts
No hallamos resultados.
Revisando el cรณdigo fuente enumeramos el nombre de la template que se estรก usando y la versiรณn de Bootstrap

Aunque no encontramos vulnerabilidades ni exploits para estas versiones
๐ท๏ธFuzzing de directorios
Tras probar a realizar fuzzing de directorios con las herramientas gobuster y feroxbuster
Observamos un recurso /error que estรก devolviendo un error 500


Este error es generado por una aplicaciรณn Spring Boot, cuando ocurre un error no manejado y no hay una ruta /error personalizada definida.
Probamos a realizar fuzzint tambiรฉn con dirsearch y tenemos mรกs suerte:

Ahora que sabemos que la aplicaciรณn estรก usando springboot, existe un endpoint que utiliza spring boot para exponer los endpoints que se llama /actuator:
http://cozyhosting.htb/actuator

En el endponint de sessions vemos lo que parece ser o bien una cookie. De hecho por cada intento de sesiรณn no autenticado vemos como se refleja en el endpoint:

Optamos por la vรญa de pensar que pueda tratarse de una cookie y la seteamos:

Accedemos con รฉxito al panel de admin como usuario kanderson:

Al enumerar el servicio vemos lo que parece ser una utilidad para establecer conexiรณn vรญa ssh:

Interceptamos la peticiรณn con burp y vemos la respuesta:

Aquรญ comenzamos a probar con posibles inyecciones de comandos para ver si el parรกmetro username es vulnerable.
Encontramos este payload que nos permite confirmarlo:
Con el carรกcter ";" permitimos escapar y ejecutar nuestro comando, usamos ${IFS} para que nos indique que el comando no puede contener espacios y finalmente cerramos con otro ";" y un hashtag # para que ignore todo lo que hay a continuaciรณn.
Si iniciamos un listener en nuestro host de ataque en el puerto 80
Y a continuaciรณn lanzamos la peticiรณn con la inyecciรณn de comandos, veremos que hay respuesta:

SI aplicamos esta PoC creando un archivo index.html con el siguiente contenido:
Lo disponibilizamos en un servidor web con python:
Probamos a realizar un curl a nuestra propia mรกquina par verificar que hay respuesta:

Iniciamos un listener en el puerto anteriormente especificado
Lanzamos la peticiรณn aรฑadiendo el pipe "|" con bash para que se ejecute el contenido con bash:
Recibimos la reverse shell:

Foothold
Una vez dentro, vemos que existe un usuario josh en el directorio /home pero no tenemos permisos para enumerar nada aquรญ. Enumeramos la mรกquina en busca de vectores que permitan la escalada
Capabilities
Permisos
Grupos
Revisamos el fichero de configuraciรณn de nginx por si encontrรกsemos alguna credencial, vhost o algรบn recursos de utilidad:
Si revisamos el fichero /etc/passwd vemos que รบnicamente el usuario josh tiene login:
No hallamos nada relevante.
Sรญ encontramos un archivo .jar en el directorio /app que merece la pena analizar:
Lo copiamos al directorio /tmp ya que necesitamos descomprimirlo:
O tambiรฉn podemos transferirlo a nuestro host de ataque de la siguiente forma
Si optamos por esta segunda vรญa, podemos verificar la integridad de la transferencia usando md5sum en el origen y en el destino para ver si coinciden.
Una vez descomprimido el archivo podemos usar el comando tree para ver la estructura de archivos y ver algo interesante.
Tras enumerar el contenido encontramos un fichero application.properties con credenciales de una base de datos postgres:

Si revisamos los puertos /servicios que se estรกn ejecutando localmente en la mรกquina vemos que efectivamente en el 5432 hay un postgres:

Podemos conectarnos con las credenciales encontradas de la siguiente forma
Una vez dentro enumeramos las tablas usando el comando \dt:
Y a continuaciรณn consultamos el contenido de la tabla users:
Procedemos a intentar crackear estos hashes usando hashcat y rockyou y tenemos รฉxito con el hash del usuario admin:

๐ Escalada de privilegios
No hay ningรบn usuario admin en el sistema, recordemos cuando hemos enumerado el directorio /home y el fichero /etc/passwd que รบnicamente habรญa uno llamado josh, veamos si se estรก llevando a cabo la mala prรกctica de reutilizaciรณn de contraseรฑas.

Buscamos ahora la escalada de privilegios a root desde el usuario josh y vemos que este usuario puede ejecutar el siguiente binario como root:
Buscamos informaciรณn sobre este binario en gtfobins: https://gtfobins.github.io/gtfobins/ssh/#sudo
Y usamos el siguiente comando para la escalada y obtenemos la flag:
Last updated