Entrada

Drive - WriteUp

Drive - WriteUp

🎯 Machine Info

Machine Drive
Platform HTB
OS Linux
Difficulty Hard

Drive


DRIVE

Máquina Linux Dificultad Difícil


NMAP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ nmap -sCV -p 22,80 --stylesheet=https://raw.githubusercontent.com/honze-net/nmap-bootstrap-xsl/stable/nmap-bootstrap.xsl -oN targeted -oX targetedXML 10.129.183.136

Nmap scan report for drive.htb (10.129.183.136)
Host is up (0.043s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 27:5a:9f:db:91:c3:16:e5:7d:a6:0d:6d:cb:6b:bd:4a (RSA)
|   256 9d:07:6b:c8:47:28:0d:f2:9f:81:f2:b8:c3:a6:78:53 (ECDSA)
|_  256 1d:30:34:9f:79:73:69:bd:f6:67:f3:34:3c:1f:f9:4e (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Doodle Grive
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
1
2
3
whatweb http://10.129.183.136
http://10.129.183.136 [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.129.183.136], RedirectLocation[http://drive.htb/], Title[301 Moved Permanently], nginx[1.18.0]
http://drive.htb/ [200 OK] Bootstrap, Cookies[csrftoken], Country[RESERVED][ZZ], Django, Email[customer-support@drive.htb,support@drive.htb], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.129.183.136], JQuery[3.0.0], Script, Title[Doodle Grive], UncommonHeaders[x-content-type-options,referrer-policy,cross-origin-opener-policy], X-Frame-Options[DENY], X-UA-Compatible[IE=edge], nginx[1.18.0]

HTTP

DRIVE

Posibles usuarios:

DRIVE

Panel de registro y login:

DRIVE

DRIVE

Procedemos a registrarnos y hacer login.

Al entrar en nuestra cuenta tenemos dos opciones nuevas:

DRIVE

1
martin:Xk4@KjyrYv8t194L!
1
$ ssh martin@10.129.183.136 -L 3000:127.0.0.1:3000
1
2
http://localhost:3000/
martinCruz:Xk4@KjyrYv8t194L!
1
tom:johnmayer7

WRITEUP COMPLETO:

https://medium.com/@zharsuke/hack-the-box-drive-walkthrough-bd22f1320755

Pruebas

Para las pruebas iniciales, intento borrar el subdominio, si lo hay en la aplicación web. Pero el resultado es nada.

1
$ ffuf -u http://drive.htb/ -H "Host: FUZZ.drive.htb" -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -fl 8

image

Subdominio difuso

Luego intento borrar el directorio y encontrar el punto final que me interese y que sea suscribirme.

1
$ ffuf -u http://drive.htb/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-large-directories.txt - fc 302

image

Entonces, intento acceder al punto final /suscribir pero no puedo, aparece el mensaje de error 500 del servidor. Pero cuando cambio el método de GET a POST, el resultado es 403 Prohibido. Hmm, es como una pantalla de Django. Además, no sé qué tipo de carga útil debería insertarse. Entonces el resultado es el mismo cuando intento probar el punto final /password_reset.

image

image

image

image

Deberíamos encontrar los próximos posibles vectores de ataque.

Luego intento gospider para encontrar el archivo de ruta recursiva. Hay custom.js que me interesa, pero cuando accedo a él, parece que no hay nada allí.

1
$ gospider -s "http://drive.htb/"

image

image

Hmm, está bien si no he encontrado ninguna pista. Lo siguiente es intentar interceptar cada solicitud.

Cuando intercepto una solicitud de registro, hay una cookie que es csrftoken y luego csrfmiddlewaretoken en el parámetro. El siguiente es normalmente el parámetro que ingresamos desde el registro del formulario. Según la documentación de Django , CsrfViewMiddleware envía esta cookie con la respuesta cada vez que se llama a django.middleware.csrf.get_token(). También puede enviarlo en otros casos. Por razones de seguridad, el valor del secreto cambia cada vez que un usuario inicia sesión. Un campo de formulario oculto con el nombre ‘csrfmiddlewaretoken’, presente en todos los formularios POST salientes.

image

Después de iniciar sesión, los usuarios tendrán otra cookie que es sessionid.

image

Luego, intento cargar un archivo que contenga un script que me lleve al shell inverso. Intento configurar el oyente y luego acceder a los detalles del archivo, pero el resultado no es nada. Parece que solo podemos leer los archivos, no podemos escribirlos ni ejecutarlos.

image

Interceptar al cargar el archivo

image

Establecer oyente

image

archivo de detalle

Pero, del experimento anterior, lo que me interesa es que cuando accedemos al archivo de detalles, se dirige a /123/getFileDetail/. Significa el número de llamada de la aplicación web como archivo identificador para obtener el archivo. Mmm. Luego intento invadir la solicitud con la carga útil del número de marca. Luego configure las cargas útiles en números de secuencia del 1 al 1000 y esperemos que podamos encontrar el archivo no autorizado.

image

marcar el número de identificación como carga útil

image

establecer la carga útil del número de secuencias

El resultado es que hay varias identificaciones que tienen el código de estado 200. Después de verificarlas una por una, no hay ninguna que me interese. Pero hay una identificación que tiene el código de estado 401 no autorizado al que no podemos acceder. Hmm, parece que deberíamos encontrar una manera de leer archivos no autorizados.

image

image

Gana Shell como Martin

En la página del archivo de lista, hay una reserva que dirige al punto final /123/block/, que es el nuevo punto final que nunca se prueba.

image

image

Luego, intento bloquear el punto final del intruso nuevamente y espero que pueda acceder al archivo no autorizado. Después, el resultado es que hay varios códigos de estado 200, más que antes.

image

Luego, trato de verificarlos uno por uno y encuentro la credencial ssh de Martin y encontré el directorio de respaldo de la base de datos. ¡¡Finalmente!!

image

image

IDOR

Esta vulnerabilidad es IDOR, que significa Insecure Direct Object. Según PortSwigger , IDOR es un tipo de vulnerabilidad de control de acceso que surge cuando una aplicación utiliza información proporcionada por el usuario para acceder a objetos directamente.

Luego intento iniciar sesión en ssh como martin, ¡y luego funciona! Pero no hay ningún indicador de usuario en el directorio martin. Luego trato de ver la lista de usuarios en el directorio /home, el resultado es que hay cuatro usuarios: martin, cris, git y tom. huftt..

image

Gana Shell como Tom

A continuación, intento descargar el archivo de copia de seguridad de la base de datos local para que podamos analizarlo. Así que creo un servidor Python en forma remota y luego intento iniciar sesión en local.

image

Listar archivos en el directorio de copias de seguridad

martin@drive:/var/www/backups$ python3 -m http.servidor

image

Configurar el servidor Python en remoto

wget http://10.10.11.235:8000/1_Sep_db_backup.sqlite3.7z

image

Descargar archivo con wget

Hay un total de 5 archivos que descargué con cuatro archivos zip y un archivo sqlite db.

image

Luego intento acceder al archivo db con el navegador sqlite db y encontré la tabla de usuarios.

image

Intento almacenar la contraseña hash en un solo archivo.

image

La idea es descifrar la contraseña hash con hashcat o john, pero parece que los hash contienen sal, no solo sha1. Así que intenté buscar un ejemplo de hashcat en modo hash y lo encontré.

image

Luego intento descifrar las contraseñas con hashcat pero parece imposible de descifrar.

image

Después de eso, intento extraer archivos zip, pero debería insertar la contraseña. Intento con la contraseña martin que encontramos anteriormente, pero no funciona.

image

image

Hmm, parece que debemos encontrar la contraseña zip de otra manera. Entonces intento ejecutar linpeas para analizarlo.

image

Después de mirar a mi alrededor, me doy cuenta de que con el escaneo de puertos anterior hay el puerto 3000. Así que busco puertos activos y hay varios puertos activos que son 33060, que es el puerto mysql, 3306 también mysql, 80 http, 53 dns, 22 ssh, y 3000.

image

Entonces, intento reenviar localmente los puertos activos a mi máquina local para poder acceder a ellos. Intento redireccionar el puerto local 3000 y luego acceder a él, ¡hay una página de gitea!

ssh -L 3000:127.0.0.1:3000 martin@drive.htb

image

image

Luego intento iniciar sesión con la credencial de Martin (use el correo electrónico en la base de datos antes, la contraseña en el punto final del bloque), hay un repositorio DoodleGrive.

image

Revisé db_backup.sh y encontré la contraseña zip.

image

Luego intento extraer la contraseña y funciona y la administro. Después de verificarlo uno por uno, hay dos tipos de hash de contraseña: sha1$ y pbkdf2_sha256$.

image

image

image

Después de eso, intenté descifrar hashes nuevamente con hashcat y encontré la contraseña.

hashcat -m 124 hashsha1.txt /usr/share/wordlists/rockyou.txt

image

Después, intento hacer coincidir el hash con el usuario en el navegador db y el resultado es el tom de la contraseña. Intento iniciar sesión en ssh insertando la contraseña arriba una por una, luego funciona. ¡La contraseña es johnmayer7 y obtuve la bandera de usuario!

image

Lea la bandera del usuario:

tom@drive:~$ gato usuario.txt
0cb8**********

Última actualización: 2025-08-16
Autor: A. Lorente
Licencia: Creative Commons BY-NC-SA 4.0

Esta entrada está licenciada bajo CC BY 4.0 por el autor.