Eine Privilege-Escalation-Schwachstelle in WatchGuards Mobile VPN with SSL der Versionen 11.0 bis 12.11.2 erlaubt es einem Benutzer ohne besondere Berechtigungen Befehle als SYSTEM auf dem Client auszuführen. Entdeckt wurde die Sicherheitslücke unsprünglich von Forschern bei AKASEC. Dieser Artikel liefert eine praktische Anleitung zur Prüfung und Verifizierung dieser Schwachstelle.
Die Schwachstelle
Unter der Haube nutzt WatchGuard OpenVPN, welches eine Funktion zur Ausführung von Skripten beim Verbindungsaufbau besitzt. Da diese Funktion in den betroffenen Versionen von Mobile VPN with SSL nicht deaktiviert ist, ist es möglich, beliebige Befehle mit SYSTEM-Rechten auszuführen.
Beim Versuch, eine Verbindung zu einem WatchGuard-VPN herzustellen, sendet der Server dem Client nach der Authentifizierung eine client.wgssl-Datei. Diese .wgssl-Datei ist im Wesentlichen ein .tar-Archiv, das Verbindungsinformationen einschließlich einer OpenVPN-Konfigurationsdatei (.ovpn) enthält.
Innerhalb einer OpenVPN-Konfigurationsdatei lässt sich ein Skript definieren, welches auf dem Client ausgeführt wird, sobald eine Verbindung hergestellt wurde. Um dies auszunutzen kann eine manipulierte client.wgssl-Datei erstellt werden und die folgenden zwei Zeilen in die Konfiguration eingefügt werden:
script-security 2
up run.bat
Hierbei aktiviert die erste Zeile die Skriptausführung, während die zweite festlegt, welches Skript beim Verbindungsaufbau ausgeführt werden soll. In unserem Fall handelt es sich um das Skript run.bat, das in der manipulierten client.wgssl-Datei enthalten ist. Die praktischen Details zur Erstellung und Auslieferung einer solchen Datei werden wir im nächsten Abschnitt näher beleuchten.
Proof-of-Concept
Zur Ausnutzung dieser Sicherheitslücke muss zuerst ein Webserver gestartet werden, der das manipulierte .wgssl-Archiv inklusive Angreifer-Skript ausliefert. Zusätzlich ist ein OpenVPN-Server erforderlich, mit dem sich der Client verbinden kann. Sobald die Verbindung hergestellt wurde, wird das Skript als SYSTEM ausgeführt.
Neben diesem Artikel haben wir ein GitHub Repository mit dem Proof-of-Concept veröffentlicht, damit Sicherheitsexperten die Schwachstelle nachvollziehen können.
Angriffsvorbereitung
Zunächst benötigen wir einen VPN-Server, zu dem eine Verbindung hergestellt werden kann. Da WatchGuard OpenVPN verwendet, verwenden wir es ebenfalls. Um es uns leicht zu machen, starten wir einen OpenVPN-Server, der einfach alle eingehenden Verbindungen akzeptiert. Alle erforderlichen Dateien, wie die im untenstehenden Befehl verwendete server.conf-Datei, befinden sich in unserem GitHub Repository. Um einen solchen OpenVPN-Server zu starten, kann der folgende Befehl ausgeführt werden:
sudo openvpn --config server.conf

Starten eines OpenVPN-Servers, welcher beliebige Verbindungen akzeptiert.
Als Nächstes muss die remote-Option in der Datei ./client/client.ovpn aus dem Repository so angepasst werden, dass sie auf den soeben gestarteten OpenVPN-Server verweist. Hier kann entweder die IP-Adresse oder ein Domainnamen eingetragen werden. Des Weiteren kann die Datei run.bat, welche mit SYSTEM-Rechten ausgeführt wird, nach Belieben modifiziert werden. Standardmäßig wird durch das Skript ein neuer Administrator-Benutzer namens shinyNewAdmin angelegt.
Sind beide Dateien vorbereitet, lässt sich die manipulierte client.wgssl-Datei mit den folgenden Befehlen generieren:
cd client/
# Erstellen der Check-Summe
md5sum client.ovpn run.bat > MD5SUM
# Packen der Dateien in eine .wgssl Datei
tar -czf ../client_exploit.wgssl client.ovpn MD5SUM run.bat
cd ..
Nachdem die .wgssl-Datei erstellt wurde, können wir einen Flask Webserver starten, welcher verwendet wird, um dem Client die manipulierte Datei bereitzustellen:
# Starten des Flask HTTPS-Servers
sudo python3 srv.py

Starten des Flask Webservers welcher die manipulierte client.wgssl-Datei bereitstellt.
Optional kann ein eigenes Zertifikat für den HTTPS-Server verwendet werden, um Zertifikatswarnungen zu vermeiden. Alternativ kann mittels openssl ein eigenes Zertifikat erstellt werden:
# Erzeugen eines Zertifikats/Schlüssels für die HTTPS Verbindung
openssl req -x509 -newkey rsa:4096 -nodes -out server.crt -keyout server.key -days 365 -subj "/CN=firebox"
Ausnutzung der Schwachstelle
Nach Abschluss der Vorbereitungen kann der Hostname oder die IP-Adresse des Flask-Webservers im Server-Feld des VPN-Clients eingegeben werden. Die Logindaten spielen keine Rolle, da unser Server keine Authentifizierung benötigt:

Beim Klicken auf Connect erscheint eine Sicherheitswarnung, die darauf hinweist, dass dem Zertifikat nicht vertraut wird. Dies kann mit einem Klick auf Yes ignoriert werden, um die Verbindung trotzdem herzustellen:

Eine Sicherheitswarnung weist den Benutzer darauf hin, dass dem Zertifikat des Servers nicht vertraut wird.
Nachdem die Verbindung erfolgreich hergestellt wurde, wird die Datei run.bat ausgeführt und der Benutzer shinyNewAdmin angelegt.

