Titanic HackTheBox
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>nmap -sCV -p<PORTS> <IP>Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-22 16:39 EST
Nmap scan report for 10.10.11.55
Host is up (0.055s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 73:03:9c:76:eb:04:f1:fe:c9:e9:80:44:9c:7f:13:46 (ECDSA)
|_ 256 d5:bd:1d:5e:9a:86:1c:eb:88:63:4d:5f:88:4b:7e:04 (ED25519)
80/tcp open http Apache httpd 2.4.52
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Did not follow redirect to http://titanic.htb/
Service Info: Host: titanic.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.22 secondsSi entramos en la pagina, vemos que esta intentando acceder a un dominio llamado titanic.htb, por lo que tendremos que meterlo en el archivo hosts.
Lo guardamos y volvemos a recargar la pagina, ahora veremos que carga todo de forma correcta, pero no encontraremos gran cosa, por lo que vamos a ver si contuviera algun subdominio.
FFUF
Info:
Vemos que efectivamente hemos encontrado un subdominio llamado dev, por lo que haremos lo siguiente.
Vamos a meter en el archivo hosts de nuevo el subdominio de la siguiente forma:
Lo guardamos y ahora lo ponemos en la URL:
Veremos esta pagina:

Si nos registramos en la pagina y exploramos un poco encontraremos bastantes cosas interesante en los repositorios del usuario developer, pero entre ellos si nos vamos al siguiente repositorio en esta ruta del codigo de la app.py veremos esto:
Veremos que hay una vulnerabilidad de un Path Traversal en la seccion de /download.
Vulnerabilidad: Directory Traversal en /download
/download¿Qué es Directory Traversal?
Es un tipo de vulnerabilidad que permite a un atacante acceder a archivos fuera del directorio permitido explotando rutas relativas (../).
En este caso, la aplicación Flask permite descargar archivos desde la carpeta tickets/, pero no valida correctamente el nombre del archivo proporcionado por el usuario.
Ubicación de la vulnerabilidad en el código:
📌 Problema:
ticketproviene directamente del usuario sin validación.os.path.join(TICKETS_DIR, ticket)no impide que el usuario use../para salir del directorio.Un atacante puede descargar cualquier archivo del sistema al que el servidor tenga acceso.
¿Cómo se puede explotar?
Ejemplo 1: Obtener el archivo /etc/passwd en Linux
/etc/passwd en LinuxSi el servidor está en Linux, un atacante puede usar curl para intentar descargar el archivo de contraseñas del sistema:
🔍 Explicación:
../../../../etc/passwdhace que la ruta se convierta en:
Si el servidor tiene permisos para leer
/etc/passwd, devolverá el archivo con los nombres de usuario del sistema.
Ejemplo 2: Descargar archivos del código fuente del servidor
Si el servidor está almacenando sus propios archivos en /var/www/app/, un atacante podría intentar descargar el código fuente con:
Si tiene éxito, el atacante obtiene el código completo de la aplicación, lo que le permite buscar más vulnerabilidades.
Ejemplo 3: Leer archivos de configuración sensibles
Si hay un archivo .env con credenciales en el servidor, el atacante podría intentar obtenerlo:
Este archivo suele contener contraseñas de bases de datos y claves API.
Por lo que vamos a realizar lo siguiente para ver que contiene el passwd y comprobar que funciona:
Info:
Como vemos nos esta volcando de forma correcta el passwd, pero si nos vamos a la documentacion de gitea podremos ver lo siguiente:
URL = Info Gitea
Vemos una ruta de configuracion de una aplicacion y con suerte puede que este por defecto como en la documentacion, por lo que vamos a probarlo de la siguiente forma:
Info:
Vemos que nos funciono y vemos una seccion interesante que mirar que seria esta siguiente:
Por lo que vamos a descargarnoslo:
sqlite3
Ahora vamos a utilizar la herramienta sqlite3:
Info:
Veremos que obtenemos los nombres de usuarios con sus hashes por lo que tendremos que crackear del del usuario developer que es el que nos interesa.
Proceso para preparar hashes de contraseñas con salts para usar con Hashcat
Cuando se tiene acceso a una base de datos (como gitea.db), podemos extraer los hashes de contraseñas y sus respectivos salts de los usuarios para crackear las contraseñas con herramientas como Hashcat. Para hacerlo correctamente, es necesario transformar los datos a un formato adecuado. Aquí te explico cómo hacerlo paso a paso.
1. Obtener los datos desde la base de datos
Usamos SQLite para extraer las columnas necesarias (passwd, salt, y name) de la tabla user en la base de datos.
Comando:
Este comando devuelve tres columnas:
passwd: El hash de la contraseña en formato hexadecimal.
salt: El salt utilizado en el proceso de hashing, también en formato hexadecimal.
name: El nombre del usuario.
2. Procesar cada línea de los resultados
Para trabajar con cada fila obtenida, usamos un bucle while que lee cada línea y realiza las transformaciones necesarias.
Comando:
Este comando se asegura de procesar una por una todas las líneas de los resultados obtenidos de la base de datos.
3. Convertir el hash y el salt a formato Base64
Los valores del hash y el salt generalmente están en formato hexadecimal, pero Hashcat espera que estos valores estén en formato Base64. Por lo tanto, necesitamos hacer una conversión.
Comando para el hash:
Comando para el salt:
Explicación:
cut -d'|' -f1: Extrae la primera parte de la línea (el hash), dividiendo por el delimitador|.xxd -r -p: Convierte el valor hexadecimal (hash/salt) a su formato binario.base64: Convierte los datos binarios a formato Base64.
Esto hace que tanto el hash como el salt sean compatibles con el formato que Hashcat necesita para procesarlos correctamente.
4. Extraer el nombre del usuario
También necesitamos obtener el nombre del usuario para asociarlo con su hash de contraseña.
Comando:
Este comando extrae la tercera parte de la línea (el nombre del usuario).
5. Formato para Hashcat
Ahora generamos el formato adecuado que Hashcat puede utilizar para intentar crackear las contraseñas. El formato es:
Comando para generar el formato:
Explicación:
${name}: El nombre del usuario.sha256: El algoritmo de hash que se usó (en este caso, SHA-256).50000: El número de iteraciones utilizadas en el hashing (esto es común en hashes modernos como PBKDF2). Este número puede variar dependiendo de la implementación de la base de datos.${salt}: El salt en formato Base64.${digest}: El hash de la contraseña en formato Base64.
¿Por qué hacer estas conversiones?
Hashcat requiere los hashes y los salts en formato Base64, por lo que es necesario convertirlos desde su formato hexadecimal original a Base64.
El número de iteraciones (50000 en este caso) es importante para hacer el proceso de cracking más realista, ya que muchos algoritmos de hashing modernos incluyen múltiples iteraciones para mejorar la seguridad de las contraseñas.
Este proceso es común para trabajar con hashes y salts de bases de datos que utilizan algoritmos como PBKDF2-SHA256.
Escalate user developer
Hashcat
Info:
Por lo que vemos hemos obtenido la contraseña, por lo que nos meteremos por SSH mediante las credenciales:
SSH
Metemos como contraseña 25282528 y veremos que estamos dentro, por lo que leeremos la flag del usuario.
user.txt
Escalate Privileges
Si nos vamos a la carpeta /opt veremos una carpeta llamada /app que si nos metemos dentro veremos la aplicacion, pero en la carpeta tickets vemos que tenemos permisos para escribir:
Si nos metemos dentro veremos todos los .json de la base de datos, pero si nos volvemos atras, donde la /app nos vamos a static/assets/images, veremos que aqui tambien podemos escribir en esta carpeta.
Por lo que vemos esto es bastante interesante, pero si nos vamos a la siguiente ruta:
Veremos que hay un script en bash que si leemos que contiene, veremos esto:
Vemos que esta utilizando una herramienta llamada magick que es famosa por tener una vulnerabilidad para leer ficheros del sistema, por lo que vamos a ver si funciona.
URL = Exploit magick
Si nos vamos a esta seccion:
Veremos que donde pone id pondremos el comando que queremos que se ejecute a nuestro gusto, en mi caso pondre lo siguiente:
Y solo tendremos que esperar un ratito, una vez esperado haremos lo siguiente para ver si funciono:
Info:
Con esto veremos que ha funcionado, por lo que haremos lo siguiente:
Info:
Y con esto ya seremos root, por lo que leeremos la flag de root.
root.txt
Last updated