// HackTheBox

Help

Per GraphQL geleakte Zugangsdaten + HelpDeskZ Arbitrary File Upload → Kernel-Exploit (CVE-2017-16995) zu Root

HackTheBoxLeichtLinux 21. Juli 2026 2 Min. Lesezeit

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; /supporthelp.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 dem Date-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.

← Alle Writeups