flagGiveback 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-02 07:43 PST
Nmap scan report for giveback.htb (10.10.11.94)
Host is up (0.055s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 66:f8:9c:58:f4:b8:59:bd:cd:ec:92:24:c3:97:8e:9e (ECDSA)
|_  256 96:31:8a:82:1a:65:9f:0a:a2:6c:ff:4d:44:7c:d3:94 (ED25519)
80/tcp    open  http    nginx 1.28.0
|_http-title: GIVING BACK IS WHAT MATTERS MOST &#8211; OBVI
|_http-server-header: nginx/1.28.0
| http-robots.txt: 1 disallowed entry 
|_/wp-admin/
|_http-generator: WordPress 6.8.1
30686/tcp open  http    Golang net/http server
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 200 OK
|     Content-Type: application/json
|     X-Content-Type-Options: nosniff
|     X-Load-Balancing-Endpoint-Weight: 1
|     Date: Sun, 02 Nov 2025 09:15:37 GMT
|     Content-Length: 127
|     "service": {
|     "namespace": "default",
|     "name": "wp-nginx-service"
|     "localEndpoints": 1,
|     "serviceProxyHealthy": true
|   GenericLines, Help, LPDString, RTSPRequest, SSLSessionReq: 
|     HTTP/1.1 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|     Connection: close
|     Request
|   GetRequest, HTTPOptions: 
|     HTTP/1.0 200 OK
|     Content-Type: application/json
|     X-Content-Type-Options: nosniff
|     X-Load-Balancing-Endpoint-Weight: 1
|     Date: Sun, 02 Nov 2025 09:15:19 GMT
|     Content-Length: 127
|     "service": {
|     "namespace": "default",
|     "name": "wp-nginx-service"
|     "localEndpoints": 1,
|_    "serviceProxyHealthy": true
|_http-title: Site doesn't have a title (application/json).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at 
https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port30686-TCP:V=7.95%I=7%D=11/2%Time=69077C42%P=x86_64-pc-linux-gnu%r(G
SF:enericLines,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20
SF:text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\
SF:x20Request")%r(GetRequest,132,"HTTP/1\.0\x20200\x20OK\r\nContent-Type:\
SF:x20application/json\r\nX-Content-Type-Options:\x20nosniff\r\nX-Load-Bal
SF:ancing-Endpoint-Weight:\x201\r\nDate:\x20Sun,\x2002\x20Nov\x202025\x200
SF:9:15:19\x20GMT\r\nContent-Length:\x20127\r\n\r\n{\n\t\"service\":\x20{\
SF:n\t\t\"namespace\":\x20\"default\",\n\t\t\"name\":\x20\"wp-nginx-servic
SF:e\"\n\t},\n\t\"localEndpoints\":\x201,\n\t\"serviceProxyHealthy\":\x20t
SF:rue\n}")%r(HTTPOptions,132,"HTTP/1\.0\x20200\x20OK\r\nContent-Type:\x20
SF:application/json\r\nX-Content-Type-Options:\x20nosniff\r\nX-Load-Balanc
SF:ing-Endpoint-Weight:\x201\r\nDate:\x20Sun,\x2002\x20Nov\x202025\x2009:1
SF:5:19\x20GMT\r\nContent-Length:\x20127\r\n\r\n{\n\t\"service\":\x20{\n\t
SF:\t\"namespace\":\x20\"default\",\n\t\t\"name\":\x20\"wp-nginx-service\"
SF:\n\t},\n\t\"localEndpoints\":\x201,\n\t\"serviceProxyHealthy\":\x20true
SF:\n}")%r(RTSPRequest,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-T
SF:ype:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400
SF:\x20Bad\x20Request")%r(Help,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nC
SF:ontent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\
SF:n\r\n400\x20Bad\x20Request")%r(SSLSessionReq,67,"HTTP/1\.1\x20400\x20Ba
SF:d\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnec
SF:tion:\x20close\r\n\r\n400\x20Bad\x20Request")%r(FourOhFourRequest,132,"
SF:HTTP/1\.0\x20200\x20OK\r\nContent-Type:\x20application/json\r\nX-Conten
SF:t-Type-Options:\x20nosniff\r\nX-Load-Balancing-Endpoint-Weight:\x201\r\
SF:nDate:\x20Sun,\x2002\x20Nov\x202025\x2009:15:37\x20GMT\r\nContent-Lengt
SF:h:\x20127\r\n\r\n{\n\t\"service\":\x20{\n\t\t\"namespace\":\x20\"defaul
SF:t\",\n\t\t\"name\":\x20\"wp-nginx-service\"\n\t},\n\t\"localEndpoints\"
SF::\x201,\n\t\"serviceProxyHealthy\":\x20true\n}")%r(LPDString,67,"HTTP/1
SF:\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset
SF:=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request");
Service Info: 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 46.21 seconds

Veremos varios puertos interesantes, entre ellos veremos un puerto 80 que aloja una pagina web y el otro que es 30686 que aloja un golang server por lo que vamos a investigar en el puerto 80 a ver que vemos.

Entrando dentro veremos que es un wordpress, pero si intentamos entrar en el wp-admin nos da un 502 Error por lo que vemos es inaccesible por alguna regla puesta a nivel de servidor.

Si vemos en el reporte de nmap hay un robots.txt que si entramos dentro veremos lo siguiente:

Vemos que expone las rutas de admin pero no nos dejara entrar dando el error de antes dicho anteriormente, por lo que tendremos que seguir investigando.

Investigando un rato veremos a nivel de codigo la siguiente linea:

Vemos que tiene un plugin llamado give que este se corresponde a GiveWP, tambien vemos que tiene la version 3.14.0 si buscamos informacion sobre dicho plugin para ver si tiene una vulnerabilidad en esa version veremos el siguiente repositorio.

CVE-2024-5932 GiveWP

URL = CVE-2024-5932 GiveWP GitHub PoCarrow-up-right

Veremos que hay una vulnerabilidad de las versiones del plugin a partir de la 3.14.1 para abajo, por lo que esta version le afecta, ahora informandonos un poco mejor tendremos que ver que URL tendremos que pasarle como parametro para que el exploit funcione.

Investigando que URL seria veremos el siguiente post en el que pone un link donde pone la palabra portal:

Si le damos ahi, nos llevara a una pagina de donaciones justo esa pagina es la que nos interesa:

Ahora sabiendo esto, vamos a ejecutar el exploit de esta forma para probarlo:

Info:

enviando esto veremos que ha funcionado el exploit pero si nos ponemos a la escucha con un servidor de python3 en nuestra maquina atacante no nos llegara nada, por lo que algo mal estamos haciendo, pero por lo menos sabemos que es vulnerable.

Si probamos directamente a realizar una reverse shell veremos lo siguiente:

Antes de enviar el comando vamos a ponernos a la escucha:

Ahora si enviamos el comando, tardara un rato:

Esto veremos que se quedara pensando y si volvemos a donde tenemos la escucha veremos lo siguiente:

Vemos que ha funcionado, por lo que vamos a sanitizar la shell de esta forma:

Sanitización de shell (TTY)

Escalate Kubernete (Clúster)

Ahora si investigamos un poco veremos que efectivamente estamos en un contenedor (kubernete), por lo que tendremos que escapar de aqui.

Si probamos a bsucar credenciales de wordpress veremos lo siguiente:

Info:

Vemos que funciona, pero recordemos que no podemos entrar al login de wordpress, si empezamos a explorar en la DDBB con estas credenciales, veremos esta informacion:

Info:

Vemos que hay un usuario pero en esta parte nada interesante, ahora vamos a realizar una busqueda un poco mas intensiva para ver posibles logs o credenciales que se hayan utilizado buscando un poco mas a fondo.

Info:

Veremos varias cosas interesantes un email de un admin y un hash MD5 asociado a dicho email.

Si probamos a obtener mas informacion de las DDBBs veremos esto:

De toda la informacion que suelta vemos que el usuario babywyrm realizo multiples donaciones, por lo que podemos suponer que puede ser un usuario a nivel de sistema, pero si probamos con las credenciales que tenemos hasta ahora encontradas por SSH no va a funcionar, por lo que tendremos que seguir buscando.

Si ponemos el comando env para ver las variables...

Veremos mucha informacion, pero entre toda esa informacion, vemos esta otra contraseña:

Vemos que es la contraseña de user aparentemente del wordpress si probamos acceder con el dominio en vez de con la IP veremos que si nos deja entrar en el wp-admin de esta forma:

Info:

Ahora vamos a probar a meter las credenciales del user que encontramos anteriormente:

Pero veremos que no nos deja, son incorrectas, aunque el usuario si esta registrado en la pagina.

Vamos a probar a modificar la contraseña de user desde la DDBB de esta forma:

Info:

Ahora vamos actualizar al usuario user con esa nueva contraseña.

Hecho esto vamos a probar a meter las siguiente credenciales:

Info:

Veremos que ha funcionado, pero si hacemos una reverse shell con el truco de Appearance -> Theme File Editor -> functions.php metiendo un codigo de una reverse shell en PHP si obtendremos acceso, pero al mismo kubernete que antes, por lo que no nos sirve de mucho este acceso.

Dentro de la limitaciones que tenemos en la shell vamos a probar a intentar obtener el LEGACY_INTRANET de iformacion:

Info:

Veremos que funciona pudimos obtener informacion, pero nada interesante, si buscamos algun secreto del propio kubernete...

Info:

Vemos cosas interesantes, entre ellas el archivo:

Info:

Si la probamos en la DDBB funcionara, pero no veremos nada interesante y tampoco se podra reutilizar en ningun sitio.

Vamos a volver donde encontramos en la IP de 10.43.2.241 el puerto 5000 en el que vimos en la informacion que tiene php-cgi por lo que podemos jugar con esto, pero para ello vamos a tunelizar dicho puerto de la IP a nuestra maquina atacante, antes nos tendremos que pasar el binario chisel de esta forma:

Una vez que hayamos declarado esta funcion, vamos a utilizarla para pasarnos nuestro archivo chisel de esta forma:

Ahora desde la maquina victima ejecutaremos lo siguiente:

Info:

Veremos que ha funcionado, por lo que vamos a tunelizar el puerto 5000 de la IP: 10.43.2.241 que hemos encontrado antes el cual era bastante interesante.

En nuestra maquina atacante:

Ahora en la maquina victima:

Hecho esto en la maquina atacante veremos:

Y en la victima:

Por lo que vemos ha funcionado, ahora en la maquina atacante si listamos los puertos:

Info:

Por lo que vemos esta funcionando, ahora vamos a realizar un fuzzing sobre dicho puerto 5000 a ver que conseguimos.

Escalate user babywyrm

Vulnerabilidad PHP-CGI (RCE)

Como sabemos que utiliza el PHP-CGI podemos probar una vulnerabilidad tipica de ello, vamos a probar a realizar lo siguiente:

Info:

Vemos que esta funcionando, por lo que vamos a realizar un poco mas de fuzzing dentro de este entorno, ya que realizar una reverse shell puede ser algo mas complicado.

Investigando un poco veremos que el archivo start.sh revela una ruta dentro de /var/run en la que hay cosas interesantes.

Info:

start.sh

Si listamos /var/run veremos lo siguiente:

Info:

Secrets de kubernetes

Vemos que hay un secrets y si seguimos la ruta de carpetas nos llevara a este ultimo directorio en el que contiene estos archivos:

Info:

Vemos que son archivos muy interesantes...

ca.crt

namespace

token

Teniendo esto podremos utilizar ese token para autenticarnos dentro del clúster y obtener informacion varia, por ejemplo vamos a obtener toda la informacion que haya con dicho token del kubernete de esta forma:

Info:

Secrets encontrados y sus valores en base64:

  1. beta-vino-wp-mariadb:

    • mariadb-password: c1c1c3A0c3BhM3U3Ukx5ZXRyZWtFNG9T

    • mariadb-root-password: c1c1c3A0c3lldHJlMzI4MjgzODNrRTRvUw==

  2. beta-vino-wp-wordpress:

    • wordpress-password: TzhGN0tSNXpHaQ==

  3. User secrets (los más interesantes):

    • user-secret-babywyrm: MASTERPASS = c3RBdnQ1Q3EyRlEyYjVGTzN2N21tc1FmWjFxRFBDZFQ=

    • user-secret-margotrobbie: USER_PASSWORD = akwwRjdLeG5CVzhINk9mZWVzNmMwdExhODRnc2Y3N04=

    • user-secret-sydneysweeney: USER_PASSWORD = U1lCRm5zdGpMR2RaREdLUVVHY1BqZFg5QWlFaEJOcm8=

Ahora si lo decodificamos todo de una:

Credenciales decodificadas:

Usuarios/Passwords:

  • babywyrm : stAvt5Cq2FQ2b5FO3v7mmsQfZ1qDPCdT (MASTERPASS)

  • margotrobbie : jL0F7KxnBW8H6Ofees6c0tLa84gsf77N

  • sydneysweeney : SYBFnstjLGdZDGKQUGcPjdX9AiEhBNro

Base de datos:

  • MySQL root: sW5sp4syetre32828383kE4oS

  • MySQL user: sW5sp4spa3u7RLyetrekE4oS

  • WordPress: O8F7KR5zGi

Vamos a probar las credenciales por SSH a ver cual nos puede servir.

Metemos como contraseña stAvt5Cq2FQ2b5FO3v7mmsQfZ1qDPCdT...

Veremos que estaremos dentro, por lo que leeremos la flag del usuario.

user.txt

Escalate Privileges

Si hacemos sudo -l veremos lo siguiente:

Vemos que podemos ejecutar como el usuario root el binario debug por lo que vamos a investigar que hace dicho binario.

Si lo iniciamos con sudo veremos que nos pide una password administrativa, la cual no sabemos, recordemos antes que enumeramos los secrets de los kubernetes, si probamos las contraseñas de mariadb decodificadas no funcionara, tendremos que meter la contraseña codificada.

mariadb-password (Base64)

Si probamos esa contraseña codificada en Base64...

Metemos como contraseña c1c1c3A0c3BhM3U3Ukx5ZXRyZWtFNG9T...

Veremos que ha funcionado, por lo que con este help vamos a investigar como podremos escalar privilegios con dicho binario.

Explotación binario (root)

Vemos que podremos crear un archivo de configuracion y en el añadir una serie de configuraciones para que nos importe la / directamente y con otro comando poder acceder a dicha particion creada.

Habiendo creado todo esto, vamos a generar el archivo de configuracion necesario.

Metemos como contraseña c1c1c3A0c3BhM3U3Ukx5ZXRyZWtFNG9T...

Hecho esto ya tendremos el archivo de configuracion preparado, ahora vamos a crear lo necesario para montarnos nuestra propia raiz cogiendo binarios y librerias necesarias para que funcione esto.

Ahora vamos a modificar el archivo de configuracion para añadir y modificar secciones que nos interesa para que cargue en la carpeta clonada archivos que nos interesen, en concreto el /root sobre todo.

Ahora vamos a ejecutar el "contenedor" que hemos creado de esta forma:

Metemos como contraseña c1c1c3A0c3BhM3U3Ukx5ZXRyZWtFNG9T...

Con esto veremos que ha funcionado y seremos root dentro de dicho contenedor clonado del original, por lo que leeremos la flag de root.

root.txt

Last updated