Inzwischen habe ich einen Faible für Hosting-Sites entwickelt. Immer wieder treffe ich dort auf diverse Lücken. Heute hatte noez.de das Vergnügen.
Was ist WHMCS?
WHMCS ist ein Hosting-Management-System. Hiermit können Hoster automatisiert Produkte wie bspw. Webspace und vServer verkaufen. Es bietet ein Webinterface, womit Kunden ihre Produkte verwalten können.
WHMCS bietet von Haus aus ein sehr umfangreiches Angebot an Funktionen. Allerdings muss man selbst Hand anlegen, wenn man etwas Hoster-spezifisches tun möchte. Ein Punkt ist da z.B. die rDNS-Verwaltung.
Was ist rDNS / PTR
Reverse DNS Lookup (rDNS) bezeichnet eine DNS-Anfrage, bei der zu einer IP-Adresse der Name ermittelt werden soll.
https://de.wikipedia.org/wiki/Reverse_DNS
Kurz gesagt:
DNS = Domain zu IP
rDNS = IP zu Domain
Und wofür braucht man rDNS-Einträge?
Manche Mailserver lehnen Mails von Servern ab, die keine korrekte Reverse-Auflösung haben. Daher ist bei Betrieb eines Mail-Dienstes ein stimmiger rDNS-Eintrag wichtig.
Let’s inspect
Auch noez.de verwendet ein eigenes rDNS-Management-System. Werfen wir einen Blick auf die Funktionsweise.
Das Plugin selbst bietet zunächst eine Übersichtsseite mit allen im Besitz des Users befindlichen Servern.
In der Textbox “rDNS Entry” lässt sich ein neuer rDNS Hostname eintragen und mit Klick auf “submit” setzen. Dabei wird nicht wie zunächst erwartet ein POST-Request abgesetzt, sondern ein GET-Request ohne zusätzliche Header.
GET /index.php?m=ptrmanager&ip=5.230.69.66&ptr=vpsnz.zerody.one
Was wir nun wissen, ist die Tatsache, dass in dem Plugin keine Schutzmaßnahmen gegen Cross-Site-Request-Forgery (CSRF) implementiert wurden. Und damit nicht genug. Beim Setzen des rDNS-Eintrags über die oben genannte URL, wird nicht mal geprüft, ob die übergebene IP-Adresse im Besitz des ausführenden Benutzers ist.
Eine klassische Insecure Direct Object Reference
Diese IDOR ermöglicht es den rDNS-Eintrag jeder IP-Adresse zu ändern, welche sich im Besitz des Hosters befindet. Völlig egal, ob man im Besitz des Servers ist oder nicht.
Um einen aussagekräftigen Proof of Concept herstellen zu können, habe ich mir einen zweiten Account angelegt, mit welchem ich den rDNS-Eintrag auf dem anderen Account verändern konnte.
Eingeschränkte Kommunikation
Nachdem ich den Hoster über die Lücke in Kenntnis gesetzt habe, wurde zunächst die Existenz der Lücke angezweifelt. Durch das nachlegen des oben gezeigten Videos, konnte ein Entwickler die Lücke bestätigen und fixen. Weitere Hinweise zur CSRF-Anfälligkeit blieben zunächst unbeantwortet, konnten aber im weiteren Verlauf durch die Implementierung eines Anti-CSRF-Tokens behoben werden.
Bounty: 25€ Guthaben