Gavel HackTheBox (Intermediate)
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-11-30 17:26 CET
Nmap scan report for 10.10.11.97
Host is up (0.18s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 1f:de:9d:84:bf:a1:64:be:1f:36:4f:ac:3c:52:15:92 (ECDSA)
|_ 256 70:a5:1a:53:df:d1:d0:73:3e:9d:90:ad:c1:aa:b4:19 (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://gavel.htb/
Service Info: Host: gavel.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.47 secondsVeremos que hay un puerto 80 que aloja una pagina web la cual nos lleva a un dominio llamado gavel.htb el cual vamos añadir a nuestro archivo hosts.
Lo guardamos y entraremos directamente desde dicho dominio.
Veremos una pagina normal y corriente, en la cual podremos registrar una cuenta y despues iniciar sesion, vamos a registrar una cuenta para ver que vemos con un usuario autenticado.
Una vez iniciado sesion veremos lo siguiente:

Si investigamos un poco, veremos que hay una seccion llamada Inventory, si inspeccionamos el codigo del mismo veremos este bloque de aqui.
Tiene indicios de que puede haber un IDOR por el user_id o un posible SQLi con el tema de ordenar por Nombre o Cantidad, por lo que vamos abrir BurpSuite y capturar la peticion seleccionando ordenar por quantity y veremos lo siguiente:
Veremos una peticion muy interesante, si probamos a poner en el user_id en vez de nuestro ID el 1 a ver que vemos...
Info:

Veremos que nos esta cargando la pagina del usuario con ID numero 1 por el contenido mas que nada, por lo que es muy interesante esto, vamos a seguir investigando por esta via.
Nuclei
Si investigamos con la herramienta de nuclei veremos informacion interesante.
Info:
De toda esta informacion veremos esta ruta interesante:
Vemos que tiene un .git y esto nos recuerda a varias vulnerabilidades asociado al mismo, si entramos dentro veremos esto:
Vemos ya de primeras un nombre de usuario llamado sado que es interesante, vamos a realizar un pequeño fuzzing por esta via.
Git-dumper Tool
Vamos a descargarnos una herramienta que sirve para clonarnos un repositorio entero de un .git que esta en este caso expuesto en la pagina web, para poderlo investigar mucho mejor:
URL = GitHub git-dumper
Info:
Cuando haya terminado veremos nuestra carpeta gavel_repo creada con todo este contenido:
Si exploramos un poco todo el .git veremos que no hay gran cosa, pero como confirmamos anteriormente en el archivo inventory.php existe una vulnerabilidad de un SQLi por lo que vamos a intentar explotarla de esta forma.
SQLi (mysql)
Si investigamos bastante y buscamos en internet, en esta pagina da practicamente la clave de como hacerlo adaptado a nuestra maquina.
URL = SQLi Payload Page
Si nos vamos a la parte de este ejemplo:
Y lo adaptamos a nuestros parametros...
Info:

Veremos que esta funcionando, nos muestra directamente la informacion de la DDBB, es importante añadir el comentario al final del sort (--).
Ahora que sabemos que funciona, vamos a ver como podemos obtener la tabla de usuarios desde la URL directamente, despues de prueba y error podemos obtener la tabla de usuarios de esta forma:
Info:

Vemos que de esta forma sacamos los id de los usuarios de la tabla, por lo que si probamos a poner password o username podremos obtener dichos datos, vamos a limpiar todo y concatenar de mejor forma esta informacion con un curl desde nuestra terminal.
Info:
Vemos que funciona por lo que obtenemos la informacion completa de la tabla users, si probamos a crackear el primer usuario el cual creemos que puede ser el que viene por defecto en la DDBB veremos lo siguiente:
Crack password (john)
Info:
Vemos que ha funcionado, por lo que vamos a probar dichas credenciales en el login de la pagina.
Si entramos dentro con dichas credenciales veremos que hay un apartado de admin:

Ahora recordemos que desde el .git pudimos obtener el admin.php, si lo analizamos veremos esta linea de codigo:
Y luego en el formulario:
La vulnerabilidad:
El campo rule se guarda en la base de datos y luego se muestra dentro de una etiqueta <code lang="php">. Si un administrador (auctioneer) puede editar este campo, podría inyectar código PHP que se ejecutaría.
Pero hay algo más importante: ¿cómo se usa este campo rule en otra parte del código?
Busquemos la función get_item_by_name() y cómo se usa $auction['rule']:
Esto nos dara informacion respecto a como aprovechar la vulnerabilidad.
Por lo que vemos el archivo /includes/bid_handler.php es vulnerable:
Escalate user auctioneer
VULNERABILIDAD DE RCE (Remote Code Execution)
El campo rule se pasa directamente a runkit_function_add(), que crea una función PHP dinámica con el contenido de $rule.
runkit_function_add() permite crear nuevas funciones PHP en tiempo de ejecución. Si controlamos $rule, podemos inyectar código PHP arbitrario.
Vamos a probar a meter un codigo en rule:
Y en el message pondremos lo que queremos que se muestre por ejemplo Sample test.

Ahora nos iremos a Bidding, pujaremos en el recuadro que lleva el message Simple test con el precio mayor al inicial para que funcione y si todo sale bien, cuando le demos a Place Bid se ejecutar el codigo PHP y nos mostrara el mensaje de message.

Vemos que al pujar se ejecuta el codigo de PHP que hemos injectado en la regla.
Por lo que vamos a obtener directamente una reverse shell, vamos a meter el siguiente codigo en la parte de rule.
En el message pondremos lo que queramos, por ejemplo Shell y le daremos a guardar cambios, ahora nos iremos a Bidding y nos vamos a la puja la cual tiene el mensaje Shell, antes de darle a Place Bind vamos a ponernos a la escucha:
Ahora si volvemos a la pagina y ponemos una cantidad de monedas superior al precio inicial, le damos al boton de Place Bind y volvemos a donde tenemos la escucha, veremos lo siguiente:
Vemos que ha funcionado, por lo que vamos a sanitizar la shell.
Sanitización de shell (TTY)
Hecho esto veremos en la maquina que hay un usuario llamado auctioneer, vamos a probar a reutilizar la contraseña que encontramos en la DDBBde esta forma:
Metemos como contraseña midnight1...
Y veremos que seremos dicho usuario, por lo que leeremos la flag del usuario.
user.txt
Escalate Privileges
Si listamos los grupos que tenemos asociados veremos lo siguiente:
Info:
Si realizamos un find para ver que archivos estan sujetos al grupo...
Info:
Veremos que estara ese binario, si investigamos que hacer veremos lo siguiente:
Vemos bastante interesante el echo de que podamos pasarle con submit u narchivo de configuracion YAML para que lo ejecute y todo esto se hace como root por lo que vemos, por lo que si probamos algo basico como esto:
Nos dara un error de la sandbox que bloquea las funciones peligrosas, esto se debe a que el archivo de configuracion de php.ini esta filtrando todo esto, por lo que se nos ocurre sobreescribir el archivo con las funciones que tenemos habilitadas para deslimitar la misma y poder ejecutar cualquier comando desde el binario.
Ruta del archivo:
/opt/gavel/.config/php/php.ini
Info:
Viendo este mensaje veremos que ha funcionado de forma correcta la sobreescritura, por lo que vamos a probar ahora a ejecutar el anterior comando que nos estaba bloqueando la sandbox de la funcion system().
Info:
Ahora vemos que ha funcionado de forma correcta, si probamos a ver el archivo que deberia de haber creado...
Info:
Veremos que si lo esta haciendo bien, por lo que ahora vamos a establecer una shell directamente autenticada como el usuario root, para ello nos pondremos a la escucha en nuestra maquina atacante.
Ahora desde la maquina victima vamos a crear este archivo de YAML para que nos de la shell y directamente ejecutarlo.
Si volvemos donde tenemos la escucha veremos lo siguiente:
Vemos que ha funcionado, seremos el usuario root directamente, por lo que leeremos la flag de root.
root.txt
Last updated