Hacking Hessen: Mit Zero Days ins Schulportal Hessen

In diesem Beitrag decken wir auf, wie wir Root-Zugang zu dutzenden Servern des Schulportals Hessen bekommen haben: Zero Days, Fehlkonfiguration und SSH-Keys.
Vorweg ist es wichtig zu erwähnen, dass sich alle Ereignisse 2023 abgespielt haben und alle Sicherheitslücken zum jetzigen Zeitpunkt geschlossen sind. Des Weiteren standen wir in Kontakt mit dem Team des Schulportals Hessen und hatten eine zielführende und sachliche Zusammenarbeit. Außerdem wurden in diesem Beitrag gewisse Informationen geschwärzt bzw. anonymisiert.
Moodle und Mahara
Das Schulportal Hessen stellt für fast jede Schule eine Moodle-Instanz bereit. Mit Moodle können Lehrer Lernmaterial mit Schülern teilen, Aufgaben bereitstellen oder Quizze erstellen. Mahara ist ein Portfoliosystem, mit dem Schüler Portfolios mithilfe einer Weboberfläche erstellen und anschließend veröffentlichen können.
Beide Systeme sind Open-Source und basieren auf PHP.
Zero Days
exaport
Die erste relevante Sicherheitslücke wurde in dem Moodle-Plugin exaport entdeckt. Exaport erlaubt Schülern, innerhalb von Moodle Portfolios zu erstellen. Dafür stehen verschiedene Artefakte bereit, zum Beispiel Links, Texte und Bilder, welche zu einem Portfolio hinzugefügt werden können. Dabei gibt es ein Artefakt, dem man einen Link übergibt und welches anschließend das erste Bild von diesem Link herunterlädt und als Thumbnail anzeigt.
Der Source-Code sah wie folgt aus (vereinfacht):
$str = file_get_contents($url);
if (
preg_match(
'/\ >img\s.*src=[\'"]([^\'"]+)[\'"]/im',
$str,
$matches,
)) {
$firstimg = $matches[1];
if (strpos($firstimg, 'http') === false) {
exit;
}
$imgstr = @file_get_contents($firstimg);
if (strlen($imgstr) < 50) {
header('Location: pix/link_tile.png');
break;
}
echo $imgstr;
exit;
}
Als Erstes wird die URL aufgerufen, welche der Benutzer angegeben hat.
$str = file_get_contents($url);
Danach werden alle <img>-Tags herausgesucht.
preg_match(
'/<img\s.*src=[\'"]([^\'"]+)[\'"]/im',
$str,
$matches,
)
Als Nächstes wird überprüft, ob der erste <img>-Tag http beinhaltet. Sollte das nicht der Fall sein, wird der Vorgang abgebrochen.
$firstimg = $matches[1];
if (strpos($firstimg, 'http') === false) {
exit;
}
Sollte der <img>-Tag allerdings http beinhalten, wird der Link gelesen und die Daten zum Benutzer zurückgegeben.
$imgstr = @file_get_contents($firstimg);
if (strlen($imgstr) < 50) {
header('Location: pix/link_tile.png');
break;
}
echo $imgstr;
Das Problem bestand darin, dass nicht ausreichend überprüft wurde, ob der Link aus dem <img>-Tag tatsächlich ein valider Link zu einem Bild ist. Es wurde nämlich ausschließlich überprüft, ob der Link http beinhaltet, allerdings nicht an welcher Stelle.
Dadurch konnte man interne Dateien auslesen, wenn die Webseite folgenden <img>-Tag zurückgegeben hat:
<img src="/http/../../../../etc/passwd" />
Der Pfad wird aufgelöst und am Ende bleibt /etc/passwd übrig.
Nutzt man nun diese Sicherheitslücke auf der Moodle-Instanz aus, erhält man folgendes Ergebnis:
Eine Datei, welche ebenfalls gelesen werden konnte, war die Konfigurationsdatei von LemonLDAP. Das Schulportal Hessen nutzt LemonLDAP, um einen Single Sign-On für alle Dienste zu realisieren. Diese Datei wird später noch relevant.
edu-sharing
Eine weitere Sicherheitslücke wurde in edu-sharing entdeckt. Mit edu-sharing können Lernplattformen miteinander vernetzt werden, um Inhalte und Daten auszutauschen. Edu-sharing basiert auf mehreren Diensten, unter anderem dem edu-connector. Mit diesem können Dateien, wie beispielsweise HTML-Dateien, bearbeitet werden.
Um interne Dateien, wie beispielsweise JavaScript, CSS oder Bilder zu laden, gibt es die Datei redirect.php. Diese erhält einen Pfad als Query-Parameter und gibt die entsprechende Datei zurück. Der Pfad wurde allerdings nicht überprüft, wodurch ebenfalls ein Arbitrary File Read möglich war.
Nun war es auch möglich, diesen Arbitrary File Read in eine Remote Code Execution zu eskalieren. Dafür musste erst die Konfigurationsdatei mit den Anmeldedaten ausgelesen und sich anschließend als Administrator angemeldet werden. Als Administrator war es möglich, PHP-Dateien auf den Server hochzuladen und eine Code-Execution auszulösen.
Diese beiden Sicherheitslücken wurden bereits 2022 gemeldet und behoben.
Fehlkonfiguration
Eine Sicherheitslücke, welche wir zu diesem Zeitpunkt noch nicht entdeckt hatten, war eine Broken-Access-Control. Im sogenannten “Rendering Service” von edu-sharing existiert das Datenbank-Interface Adminer, mit dem man sich an interne Datenbanken anmelden kann. Dieses war ohne Access-Control erreichbar. Eine einfache .htaccess -Datei, hätte dies verhindert.
Jetzt wird die zuvor genannte LemonLDAP-Konfiguration interessant. LemonLDAP speichert die komplette Konfiguration in einer Datenbank. Die Anmeldedaten für diese Datenbank sind wiederum in der LemonLDAP-Konfiguration gespeichert. Danach mussten wir nur die Anmeldedaten auslesen und uns anmelden.
Um einmal festzuhalten, worauf wir Zugriff hatten: Alle Benutzer des Schulportals Hessen sind dort gespeichert. Eltern, Schüler, Lehrer und Administratoren. Inklusive Name, Geschlecht, Schule und somit der ungefähre Wohnort, sowie das Passwort (Hashed).
Man hätte jetzt aufhören und alles melden können, allerdings waren wir daran interessiert, wie tief wir in das System eindringen können.
Als Nächstes haben wir einen alten Administrator-Account gefunden und das Passwort kurzzeitig überschrieben. Dadurch war es möglich, uns als Administrator anzumelden. Wir hatten Zugriff auf alle Dienste, unter anderem: Zabbix, Gitea und Nextcloud.
Auf Gitea fanden wir diverse Dokumentationen über das Schulportal Hessen sowie den Quellcode von Webseiten, welche das Schulportal Hessen betreibt. In der Dokumentation über das Schulportal Hessen stießen wir auf ausschlaggebende Informationen, die allerdings nicht weiter erläutert werden können.
Die Nextcloud-Instanz hatte als Nächstes unser Interesse geweckt. Nach längerer Suche haben wir tatsächlich etwas gefunden: Ein SSH-Master-Key, der uns Zugang zu jedem Server erlaubt.
Das Ergebnis:
Wir hatten nun Root-Zugang auf ~100 Server des Schulportals Hessen und einen Tunnel in das Netzwerk der Hessischen Zentrale für Datenverarbeitung (HZD). Es wäre definitiv möglich gewesen, sehr viel Schaden anzurichten. Besonders wenn man bedenkt, dass sich dieser Zugang potenziell auf die ganze HZD ausweiten könnte.
Fix
Alle Sicherheitslücken wurden den entsprechenden Behörden mitgeteilt und wurden auch recht schnell behoben. Die Kommunikation mit dem Team des Schulportals Hessen war positiv und konstruktiv, trotz anfänglicher Sorge um rechtliche Schritte. Wir hatten definitiv den Eindruck, dass die Sicherheit der Systeme beim Schulportal Hessen eine hohe Priorität hat. Auch die Implementierung von Open-Source-Lösungen sehen wir als einen wichtigen Schritt an, den auch weitere Behörden und Institutionen gehen sollten.