Page cover image

Bizness

Writeup

  1. Escanear puertos con nmap.

Nmap
  • Se realizó un escaneo inicial que revelo 3 puertos abiertos: 22, 80 y 443.

  • El puerto 22 tiene un servicio SSH.

  • Los puertos 80 y 443 tienen un servicio nginx.

  1. Agregar la IP de la máquina y el host bizness.htb a /etc/hosts.

Se agregó el host para poder visualizar correctamente la web
  • En el puerto 80 se está ejecutando una aplicación web, pero no se puede acceder a ella mediante la IP, es necesario agregar el host para poder acceder mediante bizness.htb.

  1. Búsqueda de directorios con dirsearch.

Se buscaron directorios con la herramienta dirsearch
Parte del resultado de la búsqueda
  • El resultado de la búsqueda mostró el directorio /control/login.

Apache OFBiz
  • Al recorrerlo redirigió a una página de inicio de sesión de Apache OFBiz (versión v18.12).

  1. Investigación de las vulnerabilidades.

  • Se investigó sobre las vulnerabilidades de Apache OFBiz.

  • Se encontró lo siguiente: CVE-2023–51467.

Fuente
  1. CVE-2023–51467: Análisis.

  • Según el informe de análisis de Qualys, apache OFBiz es un conjunto de soluciones empresariales, basado en Java, que permite una gran versatilidad a la hora de mejorar el diseño.

  • La vulnerabilidad se encuentra en el inicio de sesión. Apache eliminó el código XML RPC de la aplicación para parchear la vulnerabilidad.

  • Existen dos formas de explotar la vulnerabilidad.

Mantener vacíos el nombre usuario y contraseña

  • Cuando el nombre de usuario y la contraseña se pasan a la función "iniciar sesión", devuelve requirePasswordChange, pero PasswordChange deberá estar establecido en "Y".

  • Ahora la solicitud se envía a la función "checkLogin", que se omite porque nombre de usuario == nulo y contraseña == nulo.

  • Esto hace que la función checkLogin sea exitosa, lo que permite omitir la autenticación.

Proporcionar nombre de usuario y contraseña aleatorios (no válidos)

  • El nombre de usuario y la contraseña no se mantuvieron vacíos y el parámetro requirePasswordChange=Y se incluye en el URL.

  • La función de inicio de sesión devolvió "requirePasswordChange" gracias a "requirePasswordChange=Y". Este valor se pasa a la función checkLogin.

  • El "error".equals(login(request, response)) se mantuvo como falso debido al valor de retorno proporcionado por la función de inicio de sesión, que era requirePasswordChange.

Fuente

Resultado

El parámetro requirePasswordChange=Y permite omitir la autenticación.

  1. CVE-2023–51467: Explotación.

  • Se utilizó el exploit proporcionado por el siguiente repositorio:

Repositorio con el exploit.py

Consiste en un exploit hecho en python, que envía una solicitud con un nombre de usuario y contraseña vacíos junto con el parámetro requirePasswordChange establecido en 'Y'.

  • En una terminal, se escuchó con ncat en el puerto 1234.

Escuchando en un puerto con ncat
  • En la otra terminal, se ejecutó el exploit.

Se consiguió una Shell reversa

Se consiguió una reverse Shell, lo que permitió entrar al equipo objetivo y revisar sus archivos.

  • Dentro del directorio /home/ofbiz, se encontró la bandera del usuario.

Primer flag capturada
  1. Escalar privilegios.

  • Se enumeraron los archivos en el directorio.

Enumeración de archivos
  • Se encontró un archivo en: /opt/ofbiz/framework/resources/templates/AdminUserLoginData.xml. Este archivo posee la contraseña de los templates que por el momento, no es de mayor interés.

El archivo contiene información
Se puede visualizar un hash SHA256
  • Dentro del archivo c54d0.dat, se encontró un hash para descubrir la contraseña. Estaba dentro del siguiente directorio: /opt/ofbiz/runtime/data/derby/ofbiz/seg0.

Se buscó dentro de los archivos
Este es el archivo "c54d0.dat"
  • Dentro del archivo, se puede visualizar el hash encriptado SHA256.

El contenido del archivo
Se puede ver el hash completo
  • Para desencriptar el hash, se utilizó un script de python.

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"
#insertar el hash SHA256
search = "$SHA1$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I=" 
#ruta del archivo rockyou.txt
wordlist = '/Downloads/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'))
        #imprimir la contraseña en pantalla
        if hashed_password == search:
            print(f'Found Password:{value}, hash:{hashed_password}')
  • Es necesario descargar el archivo rockyou.txt. Este se encuentra haciendo una búsqueda sencilla en Google.

  • Con la contraseña desencriptada, se procede a elevar los permisos e ingresar como usuario root.

Se obtienen todos los privilegios
  • Se extrae la bandera del archivo root.txt.

Se capturó la bandera correctamente

Last updated