Guardian HackTheBox (Hard)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>nmap -sCV -p<PORTS> <IP>Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-27 09:22 EDT
Nmap scan report for 10.10.11.84
Host is up (0.031s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 9c:69:53:e1:38:3b:de💿42:0a:c8:6b:f8:95:b3:62 (ECDSA)
|_ 256 3c:aa:b9:be:17:2d:5e:99:cc:ff:e1:91:90:38:b7:39 (ED25519)
80/tcp open http Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://guardian.htb/
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: _default_; 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 8.15 secondsVeremos que hay varios puertos interesantes, entre ellos un puerto 80 el cual esta redirigiendo a un dominio llamado guardian.htb, el cual vamos añadir a nuestro archivo hosts.
Lo guardamos y entramos en dicho dominio de esta forma:
Veremos una pagina normal de estudiantes, de una especie de universidad, si le damos al boton llamado Student Portal nos llevara a un subdominio llamado portal:
Pero como no lo tenemos en nuestro archivo hosts no nos va a cargar, por lo que vamos añadirlo:
Lo guardamos y si volvemos a la pagina del subdominio veremos lo siguiente:

Escalate user web GU0142023
Cuando cargamos la pagina veremos que hay un link llamado Portal Guide en el que nos lleva a un PDF o en el boton llamado Help de abajo te lleva igual tambien, que te lleva a esta ruta:
Info:

Veremos que la contraseña por defecto de los usuarios es GU1234, es interesante saber eso, pero no tenemos ningun usuario actualmente, antes de probar una fuerza bruta con un listado de usuarios, si volvemos a la pagina principal y bajamos un poco veremos esto:

Vemos que hay 3 usuarios, si probamos directamente con el primero:
Si estas credenciales las metemos en dicho portal veremos que funciona:

Veremos como un dashboard de las cosas de la universidad, pero no veremos nada interesante en general, por lo que vamos a realizar un poco de fuzzing.
Gobuster
Info:
No veremos nada interesante, pero si nos vamos a la parte de Chat y entramos en el primero, veremos algo asi en la URL:
Vemos varios parametros en los cuales tienen unos numeros como por ejemplo en este caso 13 y 14, si empezamos a toquetear esos numeros empezando desde el 0 hasta lo que nos aparezca en la pagina veremos algo interesante con estos numeros de chat de URL.
Info:

Vemos que hemos podido acceder a un chat gracias a ese bypass de numero atraves de la URL cosa que no se deberia de poder hacer, por lo que obtenemos una contraseña DHsNnk3V503 y un nombre de usuario llamado jamil.enockson.
Sabemos que el usuario jamil tiene como id de usuario el 0 por lo que podemos ver en la URL, si nosotros siguiente esa logica formamos el nombre de usuario como estudiante que tendria que tener seria algo asi GU0002023, pero si lo probamos veremos que no nos funciona.
Como nos ha puesto que es un usuario de gitea vamos a probar a realizar un fuzzing a nivel de subdominios para ver si existiera alguno referente a gitea.
Antes nos descargamos un diccionario de subdominios de la siguiente pagina:
Ahora que tenemos el diccionario vamos hacer lo siguiente:
Info:
Veremos que efectivamente hay un subdominio llamado gitea, por lo que vamos añadirlo a nuestro archivo hosts.
Lo guardamos y si entramos en la siguiente URL:
Info:

Veremos que funciona, por lo que vamos a probar a meter las siguiente credenciales que encontramos:
Info:

Veremos que estaremos dentro, si investigamos un poco veremos este archivo de configuracion interesante:
Info:
Si probamos dicha contraseña por SSH o en otros sitios no servira, por lo que vamos a seguir buscando.
Si por ejemplo buscamos mucho en todos los archivos veremos que en esta ruta de archivo...
Info:
Hay una version de PHP por asi decirlo, si buscamos informacion de dicha version veremos que tiene efectivamente una vulnerabilidad asociado a el para poder realizar un XSS.
La vulnerabilidad se llama PhpSpreadsheet has a Cross-Site Scripting (XSS) vulnerability of the hyperlink base in the HTML page header y encontraremos informacion en esta URL.
URL = Exploit CVE-2024-56411 XSS
Vemos que con un payload podremos injectar un comando subiendo un archivo .xlsx de una hoja de calculos a la pagina.
Payload
Si volvemos a la pagina principal en guardians.htb y entramos en el panel del usuario de las credenciales que ya obtuvimos, si empezamos a probar esto, veremos que hay alerts en la parte de assignments.php, pero en el unico que pone upcoming veremos que nos deja entrar y subir un archivo doc o xlsx, por lo que por ahi tendremos que subir dicho exploit de la vulnerabilidad que encontramos.
Para ello utilizaremos una pagina para crear un archivo de XLSX real, pero con nuestro payload implementado en el mismo, para que cuando lo carguemos se ejecute.

URL = Pagina Hoja de calculos Online
Ahora dentro de la pagina si nos vamos a este boton:
Que estara abajo a la izquierda, se nos abrira algo asi:

Le daremos al boton de añadir una seccion y como contenido pondremos el payload anterior que he mostrado, una vez echo esto vamos a guardarlo y exportarlo.

Antes de enviarlo nos pondremos a la escucha con un servidor de python3.
Ahora si lo enviamos y esperamos unos segundos veremos lo siguiente:
Vemos que ha funcionado, con esto lo que hemos echo es enviarnos a nuestro servidor las cookies de dicho usuario que haya abierto el archivo, por lo que vamos a probarlas de esta forma:
Info:
Si nos vamos a nuestro navegador e intercambiamos la cookie actual que tenemos por la que nos han proporcionado en esta parte...

Y recargamos la pagina, veremos que somos el usuario sammy.treat:

Por lo que vemos ha funcionado, somo un usuario con rango lector que es como si fueramos un profesor de universidad dentro de la pagina del portal.
Si nos vamos a Notice Board y le damos al boton de + Create Notice veremos que nos mete como en un panel en el que podemos escribir un mensaje y esto le llega al admin, abajo podremos poner una URL del supuesto archivo, si probamos a meter nuestra URL de primeras con un servidor de python3 abierto para ver que pasa, veremos lo siguiente:
Ahora si enviamos esto:

Esperando un poco en el servidor veremos esto otro:
Veremos que ha realizado una conexion, por lo que sabemos que intenta como descargarse un archivo, vamos aprovechar esto para hacer lo mismo de antes, pero en la parte de URL poner otro payload mejor.
Ahora lo que se nos ocurre es redireccionar al administrador cuando pongamos nuestra IP en un servidor de un script de python3 de que cuando entre el admin a dicho servidor le redireccione a una pagina de exploit, para que cree un usuario con las credenciales que queramos como rol admin, esto lo podremos saber viendo desde gitea el createuser.php de la seccion admin.
admin/createuser.php
Pero necesitamos un TOKEN valido para poder hacer que esto funcione, si investigamos bien el codigo donde creamos la noticia en el panel, veremos lo siguiente:
Vemos que hemos encontrado un TOKEN posiblemente valido, vamos a montarnos un script de python3 para poner un servidor a la escucha y realizar esa redireccion para que cree un usuario (CSRF).
server.py
Ahora vamos a establecer el servidor:
Si enviamos el formulario como hicimos antes metiendo en la URL que vera el admin algo como http://<IP_ATTACKER>/ y le damos a enviar, si esperamos un rato, veremos lo siguiente:
Veremos que ha funcionado la creacion de usuario aparentemente, vamos a probarlas, vamos a cerrar sesion y loguearnos en el panel con dichas credenciales creada, en mi caso:
Si las probamos veremos que ha funcionado:

Veremos que somos rol admin por lo que funciono todo de forma correcta, si vemos el archivo reports.php desde gitea vamos a ver un LFI super claro en esta parte del codigo:
Pero si probamos a intentar explotarlo:
Info:
Vamos a ver que como vimos en el codigo lo bloquea, por lo que tendremos que intentar bypassearlo de esta forma:
LFI / RFI usando wrappers
Vamos a utilizar directamente wrappers de un LFI con el siguiente repositorio en el cual te genera un codigo para pegar en la URL y asi poder realizar un RCE.
URL = Generate Wrapper LFI (RCE)
Info:
Ahora con todo este codigo, vamos a coger lo que empieza por php://... y poner en la URL algo asi:
Info:
Veremos que funciona, tambien es importante ponerle al final un archivo que exista en el sistema para que no te de un error, en mi caso utilice enrollment.php para que funcione.
Ahora vamos a generar una reverse shell, vamos a ponernos a la escucha de esta forma:
En la URL pondremos lo siguiente:
Cuando lo enviemos si volvemos a donde tenemos la escucha veremos lo siguiente:
Veremos que ha funcionado, por lo que vamos a sanitizar la shell.
Sanitización de shell (TTY)
Escalate user jamil
Recordemos que antes encontramos unas credenciales para conectarnos por mysql, vamos a probar a utilizarlas a nivel local.
Info:
Veremos que funciona, vamos a listar las DDBBs que haya:
Info:
Vamos a entrar en la DDBB llamada guardiandb de esta forma:
Ahora vamos a listar las tablas dentro de dicha DDBB:
Info:
La que mas nos atrae es la tabla users, por lo que vamos a ver que contiene de esta forma seleccionando todo.
Info:
Veremos 62 entradas, vamos a limpiar todo esto y dejarlo en un archivo hash para probar a crackear todos los usuarios a ver cuales conseguimos.
hash
Hashcat (Crack hashes)
Tendremos que añadirle el salt al final de cada hash para que funcione el mismo que encontramos en el archivo de configuracion de gitea. (:8Sb)tM1vs1SS)
NOTA: Hay que quitarle los nombres de usuarios a los
hashespara utilizar bienhashcat
Info:
Veremos que ha funcionado y nos saca estas credenciales:
Vamos a probar a entrar por SSH con el usuario jamil.
Metemos como contraseña copperhouse56...
Con esto veremos que estaremos dentro, por lo que leeremos la flag del usuario.
user.txt
Escalate user mark
Si hacemos sudo -l veremos lo siguiente:
Veremos que podemos ejecutar el script /opt/scripts/utilities/utilities.py como el usuario mark, por lo que vamos a investigar que hace dicho script.
Por lo que estamos viendo la unica funcion que no se restringe por el usuario mark es el system-status, si investigamos un poco podremos ver los siguiente permisos:
Viendo esto, tambien sabemos que pertenecemos al grupo admins:
Info:
Por lo que podremos editar el modulo, vamos añadir algo asi:
Lo guardamos y ejecutamos el script de esta forma:
Info:
Veremos que ha funcionado, por lo que ya seremos dicho usuario.
Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Vemos que podemos ejecutar como root el binario safeapache2ctl, vamos a ver como funciona.
Si lo ejecutamos nos pide un archivo de configuracion:
Info:
Si vamos a donde se depositan los archivos, veremos que esta vacia la carpeta y que podemos crear archivos dentro de la misma.
Vamos a pasarnos el binario para analizarlo de esta forma:
En la maquina victima:
Ahora si listamos el binario en nuestra maquina atacante, veremos que nos lo pasamos bien:
Vamos abrirlo con ghidra para decompilarlo y ver el codigo legible en C#.
main.c
is_unsafe_line.c
Veremos que en el codigo se puede cargar una configuracion, para posteriormente cargar un binario que queremos que se ejecute, por lo que vamos a explotarlo de esta forma:
Info:
Nos dara como una especie de error, pero si vamos al /tmp veremos que se ha ejecutado de forma correcta:
Info:
Veremos que ha funcionado, por lo que vamos a ser root directamente haciendo esto:
Info:
Por lo que vemos ya seremos root, por lo que leeremos la flag de root.
root.txt
Last updated