Wir analysieren weiterhin die Schwachstellen industrieller Switches: Wir führen beliebigen Code ohne Passwort aus



In Positive Research 2019 haben wir das Moxa Industrial Switch Management Protocol überprüft. Dieses Mal werden wir dieses Thema fortsetzen und die Sicherheitsanfälligkeit CVE-2018-10731 in den Phoenix Contact-Switches der von unseren Experten identifizierten Modellreihe FL SWITCH 3xxx, FL SWITCH 4xxx und FL SWITCH 48xx detailliert analysieren. Diese Sicherheitsanfälligkeit, die in der Weboberfläche des Geräts erkannt wird, ermöglicht die Ausführung von beliebigem Code ohne Kenntnis der Anmeldeinformationen des Geräts und wird auf der CVSS Version 3-Skala mit 9 von 10 Punkten bewertet.

Erster Blick


Auf den oben genannten Geräten wird Linux ausgeführt, und Sie können sie über die Weboberfläche konfigurieren. Wie bei vielen anderen IoT-Geräten im In- und Ausland besteht die Weboberfläche aus vielen CGI-Anwendungen, die Benutzer-HTTP-Anforderungen verarbeiten. In unserem Fall verwenden CGI-Anwendungen aktiv die cgic-Bibliothek, die die Arbeit mit HTTP-Anforderungen erleichtert. Die Funktionen dieser Bibliothek sind in die gemeinsam genutzte Bibliothek libipinfusionweb.soim Dateisystem des Geräts integriert.

Bei der Verarbeitung einer HTTP-Anforderung übergibt der Webserver die Benutzeranforderungsdaten als Satz von Umgebungsvariablen an die CGI-Anwendung. Ihre anfängliche Verarbeitung wird von der mainBibliotheksfunktion durchgeführt libipinfusionweb. Als nächstes mainruft die Funktion die Funktion der cgiMainCGI-Anwendung auf, in der die Weiterverarbeitung der Anfrage stattfindet.



Abbildung 1. Verarbeiten einer HTTP-Anforderung

Im Verlauf ihrer Arbeit libipinfusionwebruft die Hauptfunktion der Bibliothek eine Funktion auf get_login_user, die bestimmt, ob der Benutzer die Authentifizierung auf dem System anhand der übergebenen Cookie-Werte übergeben hat.



Abbildung 2. Pseudocodefragment der

Hauptfunktion Die Funktion get_login_userempfängt den Wert des Cookie-Parameters c_sessionmithilfe der Funktion cookies_get_valueund speichert ihn in einer Variablen local_e0. Die Variable selbst local_e0ist ein Array von Einzelbyte-Zeichen mit einer Länge von 0x80 und befindet sich in einem Abstand von 0xE0 vom Anfang des Stapels.



Abbildung 3. Fragment des Pseudocodes der Funktion get_login_user

Im Funktionscode cookies_get_valueist jedoch ersichtlich, dass der cgiCookieStringWert des von der Funktion empfangenen Cookie-Parameters eine maximale Länge von 0 x 400 Byte hat.



Abbildung 4. Ein Fragment des Pseudocodes der Funktion cookies_get_value

Wenn Sie also einen Cookie-Parameter übergeben, der länger als 0xE0 (224) Zeichen ist, get_login_userspeichert die Funktion den Wert dieses Parameters auf ihrem Stapel, wodurch alle Informationen auf dem Stapel, der sich hinter der Variablen local_e0befindet, einschließlich der Adresse überschrieben werden Rückgabefunktion.

Hinweis: Wenn eine Funktion eine andere aufruft, wird die Rücksprungadresse auf dem Stapel gespeichert. Die Steuerung wird an diese Adresse übertragen, wenn die aufgerufene Funktion ihre Arbeit beendet hat. Wenn Sie diese Adresse neu schreiben, können Sie dementsprechend die Kontrolle über den Programmausführungsprozess erlangen. Beispielsweise kann ein Angreifer diese Adresse durch die Adresse eines schädlichen Shellcodes ersetzen, der sich im Adressraum des Programms befindet.

Beachten Sie, dass das Umschreiben der Rücksprungadresse erfolgt, bevor die Authentifizierung überprüft wird. Dadurch kann diese Sicherheitsanfälligkeit für einen Angreifer ausgenutzt werden, der die Anmeldeinformationen des Geräts nicht kennt.

Ausbeutung


Wir haben verschiedene Optionen untersucht, um die Möglichkeit zu demonstrieren, diese Sicherheitsanfälligkeit auszunutzen. Am einfachsten ist es, den Nutzdatencode auf den Stapel zu schreiben (0x400 - 0xE0 = 800 Bytes verbleiben dafür, es reicht für den Code) und die Rücksprungadresse mit der Codeadresse neu zu schreiben. Theoretisch war diese Option möglich, da der Prozessor des anfälligen Switch die NX-Bit-Funktion nicht unterstützt (dh die Ausführung von Code ermöglicht, der sich an einer beliebigen Stelle befindet, auch auf dem Stapel), in der Praxis jedoch schwerwiegende Einschränkungen aufwies.

Der anfällige Switch-Prozessor verfügt über eine MIPS-Architektur. Viele der Prozessorbefehle in dieser Architektur sind in Byte-Sequenzen codiert, die null Bytes enthalten. Der Pufferinhalt wird (aufgrund der Verwendung der Funktion) auf das erste Nullbyte niedergeschriebenstrcpy) ist es daher nur erforderlich, Operanden zu verwenden, die kein Null-Byte enthalten, was unmöglich ist, da jede Nutzlast mindestens mehrere dieser Bytes verwenden würde.

Beim Aufbau der ROP-Kette müssten wir uns erneut den Einschränkungen des Null-Bytes stellen: Die Adresse der ROP-Gadgets sollte keine Nullen enthalten, was ihre Suche erheblich erschwert. Im Großen und Ganzen konnten wir nur eine Null verwenden, die von der Funktion strcpy kopiert wurde. Dies führt zu einer Einschränkung der Erstellung einer vollwertigen ROP-Kette, und außerdem waren nur sehr wenige Gadgets erforderlich. Bei der Suche in der libipinfusionweb-Bibliothek wurde jedoch das folgende Codefragment gefunden:



Abbildung 5. Ein Fragment des ausführbaren Codes der libipinfusionweb-Bibliothek

Vorausgesetzt, der Inhalt des Registers $ s0 wird gesteuert, können Sie mit diesem Codefragment einen Betriebssystembefehl mit einer Funktion ausführen mysystem(anfangs hatte diese Funktion keinen Namen, aber wir haben ihn umbenannt, da sie der Systemfunktion unter Linux sehr ähnlich ist).

Da wir die Rücksprungadresse von der Funktion get_login_user neu schreiben, wird diese Funktion bis zum Ende ausgeführt. Im Nachwort der Funktion get_login_user können Sie sehen, dass der Wert des Registers $ s0 aus dem zuvor auf dem Stapel gespeicherten Wert wiederhergestellt wird (mit dem Offset 0xD8 vom oberen Rand des Stapels). Zu diesem Zeitpunkt befindet sich dieser Bereich des Stapels jedoch bereits unter unserer Kontrolle, dh wir können tatsächlich die Kontrolle über den Inhalt des Registers $ s0 erlangen und somit mit der Funktion beliebige Betriebssystembefehle ausführen mysystem.



Abbildung 6. Ein Ausschnitt aus dem ausführbaren Code der Funktion get_login_user.

Um die Ausnutzung dieser Sicherheitsanfälligkeit erfolgreich zu demonstrieren, müssen wir als Parameter eine Cookie c_sessionlange Zeile senden, die Folgendes enthält:

  • OS-Zeichenfolgenbefehl, der anschließend an die mysystem-Funktion übergeben wird;
  • die Adresse dieses Befehls auf dem Stapel;
  • neue Rücksprungadresse (Adresse des in Fig. 5 gezeigten Codefragments).

Die endgültige Nutzlast sollte folgendermaßen aussehen:



Abbildung 7. Nutzlast

Zu diesem Zeitpunkt hatten wir bereits eine Shell auf dem Gerät, die mit einer Sicherheitsanfälligkeit abgerufen wurde, für deren Betrieb Administratorrechte erforderlich waren. Daher konnten wir zusätzliche Informationen erhalten, die uns beim Betrieb halfen:

  • Die ASLR auf dem untersuchten Gerät wurde deaktiviert. Daher sind die Adressen des verwendeten Gadgets und die Betriebssystembefehle immer gleich.



Abbildung 8. ASLR-Status auf dem untersuchten Gerät

  • Der Bereich der Speicheradressen, in denen der Stapel liegen könnte. Um die genaue Adresse zu berechnen, haben wir alle Adressen in diesem Bereich durchgesehen.

Als Nutzlast haben wir das Laden einer Web-Shell implementiert, einer CGI-Anwendung mit folgenden Inhalten:

#!/bin/sh
eval $HTTP_CMD 2>&1

Da gemäß dem CGI-Protokoll der Inhalt der HTTP-Header in Form von Umgebungsvariablen mit den Namen HTTP_ <Headername> an die CGI-Anwendung übertragen wird, führt diese Shell evalden Inhalt des CMD-HTTP-Headers mit dem Befehl aus . Die folgende Abbildung zeigt das Ergebnis der erfolgreichen Operation und Ausführung des Befehls ls unter Verwendung der geladenen Shell.



Abbildung 9. Das Ergebnis der erfolgreichen Operation und Ausführung des Befehls ls

Fazit


Wir haben gezeigt, dass diese Sicherheitsanfälligkeit ausgenutzt werden kann. Wie bereits erwähnt, erfordert der Betrieb keine Kenntnis des Kennworts und kann daher auch von einem nicht authentifizierten Angreifer ausgeführt werden.

Das Hacken eines industriellen Netzwerk-Switches kann die gesamte Produktion gefährden. Eine Verletzung der Netzwerkinteraktion kann den Prozess nachteilig beeinflussen, bis er vollständig gestoppt ist.

Informationen über die Sicherheitsanfälligkeit und den PoC wurden an den Anbieter übertragen, der die aktualisierte Firmware-Version 1.34 veröffentlicht hat, und die ID CVE-2018-10731 wurde der Sicherheitsanfälligkeit selbst zugewiesen.

Auf der Suche nach einer Person


Wenn Sie solche Dinge tun möchten, suchen wir nur einen Spezialisten in unserem Team. Wir beschäftigen uns mit Sicherheitsanalysen von Prozessleitsystemen (große Industrie- / Energie- / Transportanlagen usw.). Bei jedem Projekt suchen wir nach Möglichkeiten, den Betrieb dieser Objekte zu stoppen oder zu stören. Jedes Mal finden wir viele Möglichkeiten, den Herstellungsprozess zu beeinflussen, industrielle Hardware und Software zu erkunden und proprietäre Netzwerkprotokolle zu analysieren. Wir finden und melden viel Zirodey, schreiben Berichte (nicht nach GOST) und tun viel mehr. Wenn Zeit ist, sprechen wir auf der IB und nicht nur auf Konferenzen. Link zur Stelle: hh.ru/vacancy/36371389

Gepostet von Vyacheslav Moskvin, Positive Technologies

All Articles