// HackTheBox
Help
Per GraphQL geleakte Zugangsdaten + HelpDeskZ Arbitrary File Upload → Kernel-Exploit (CVE-2017-16995) zu Root
Aufklärung
Drei Ports, und der Ausreißer ist der Weg hinein:
| Port | Service |
|---|---|
| 22 | OpenSSH 7.2p2 (Ubuntu 16.04) |
| 80 | Apache 2.4.18 — Standardseite; /support → help.htb (HelpDeskZ) |
| 3000 | Node.js / Express — GraphQL API |
Port 80 liefert die Apache-Standardseite aus, doch /support leitet auf den vhost
help.htb weiter (in /etc/hosts eingetragen), auf dem HelpDeskZ läuft, eine
PHP-Support-Desk-App. Port 3000 antwortet als GraphQL-API. Ein GraphQL-Endpunkt
direkt neben einer als fehleranfällig bekannten PHP-App ist der Faden, an dem man
zuerst zieht.
Erstzugang
1. Unauthentifiziertes GraphQL → geleakte Zugangsdaten
Die API exponiert eine Root-user-Query ganz ohne vorgelagerte Authentifizierung — das
Abfragen des Datensatzes gibt den gespeicherten Benutzernamen und Passwort-Hash zurück:
{user{username password}}
Das liefert helpme@helpme.com und ein ungesalzenes MD5,
5d3c93182bb20f07b994a7f617e99cff. Ungesalzenes MD5 gegen rockyou.txt knackt in
Sekunden: godhelpmeplz.
2. HelpDeskZ Arbitrary File Upload → Webshell
HelpDeskZ 1.0.2 hat einen bekannten Arbitrary-Upload-Bug (EDB-40300). Mit den
helpme-Zugangsdaten im Support-Desk eingeloggt und ein Ticket eingereicht (ein
zweistufiges Formular) mit einer angehängten .php-Datei.
Der Bug ist ein Reihenfolgefehler: Die App ruft move_uploaded_file() nach
uploads/tickets/ auf, bevor sie die Erweiterung prüft. Sie meldet dann den Fehler
“File is not allowed” — aber die PHP-Datei ist bereits auf die Platte geschrieben. Sie
wird unter einem vorhersagbaren Namen gespeichert, md5(originalname + time()), wobei
time() der Upload-Zeitstempel des Servers ist.
Zwei Dinge kontrollieren und lokalisieren sie:
- Captcha — das Speichern geht nur durch, wenn das Captcha des Tickets in derselben
Session gelöst ist, also das
captcha.php-Bild auslesen und mit dem Upload einreichen. - Die Datei finden — der gespeicherte Name ist
md5(originalname + <upload epoch>). Die Upload-Zeit stammt aus demDate-Response-Header des Servers (sekundengenau), also den Hash über ein paar Sekunden darum herum berechnen und jeden anfragen, bis einer trifft.
Das Anfragen von uploads/tickets/<hash>.php ergibt eine Webshell als uid=1000(help)
(php-fpm läuft als der Benutzer help).
Rechteausweitung — Kernel CVE-2017-16995
uname -a meldet Kernel 4.4.0-116-generic auf Ubuntu 16.04.5 — im Bereich für die
eBPF-Verifier-Local-Privilege-Escalation (CVE-2017-16995, EDB-44298), deren PoC
buchstäblich mit “Tested on 4.4.0-116-generic #140.” beschriftet ist. gcc ist auf der
Box vorhanden, also kein Cross-Compiling — direkt vor Ort bauen und ausführen:
$ gcc 44298.c -o e
$ ./e
Wirft eine Shell als uid=0(root) ab — root.txt.