Und ein weiterer Steam Windows Client Local Privilege Escalation 0day

In der vorherigen Serie


Vor nicht allzu langer Zeit habe ich eine Beschreibung der Sicherheitslücke für Steam veröffentlicht. Ich habe viele Rückmeldungen von Lesern erhalten. Valve sagte kein Wort und HackerOne schickte einen großen tränenreichen Brief und schwieg im Grunde. Infolgedessen wurde ich von Valve in H1 gesperrt. Ich kann nicht an ihrem Programm zur Ablehnung von Sicherheitslücken teilnehmen (der Rest von H1 steht mir zur Verfügung).



Weitere Informationen zur Geschichte finden Sie in einer früheren Veröffentlichung. Hier möchte ich einige Worte zum aktuellen Status sagen.

Aber es ist einfach und traurig - Valve fällt immer noch aus. Das neueste Update, mit dem das Problem behoben werden soll, kann leicht umgangen werden, und die Sicherheitsanfälligkeit ist weiterhin relevant. Ja, ich habe es überprüft - es funktioniert großartig.

In diesem Artikel geht es jedoch nicht um die Tatsache, dass die alte Sicherheitsanfälligkeit noch vorhanden ist, sondern um die neue. Da Valve erneut den Wunsch geäußert hat, einen öffentlichen Bericht anstelle eines privaten zu lesen, werden wir ihnen dieses Vergnügen nicht vorenthalten.

Kurze Beschreibung der Sicherheitsanfälligkeit


Eine allgemeine Beschreibung der Ausnutzung einer Sicherheitsanfälligkeit ist recht einfach und besteht aus drei Schritten:

  1. Wir bereiten die Umgebung für den Betrieb vor (bis zu zwei Auswahlmöglichkeiten mit unterschiedlichen Sicherheitslücken).
  2. Holen Sie sich Steam zum Kopieren und Ausführen unserer DLL.
  3. DLL sollte kleine Anforderungen erfüllen.

Alle diese Aktionen können von jedem Benutzer des Betriebssystems oder genauer von jedem Programm auf dem Computer ausgeführt werden. Infolgedessen können Sie jeden Code mit maximalen Berechtigungen ausführen. Diese Klasse von Sicherheitsanfälligkeiten wird als Eskalation von Berechtigungen (eop) oder Eskalation lokaler Berechtigungen (lpe) bezeichnet. Trotz der Tatsache, dass jede Anwendung selbst Schaden anrichten kann, führt die Erlangung maximaler Rechte zu wesentlich schwerwiegenderen Konsequenzen. Das Ausschalten von Antivirus und Firewall, das Installieren eines Rootkits, das Ausblenden des Miner-Prozesses und das Stehlen der persönlichen Daten aller PC-Benutzer ist nur ein kleiner Teil dessen, was Sie sich vorstellen können.

Theoretisches Minimum


Es war sehr lustig, die Kommentare zum vorherigen Artikel zu sehen, in dem Leute geschrieben haben: "Der Benutzer kann keine Registrierungsschlüssel in HKLM schreiben" oder "Administratorrechte sind erforderlich, um einen Symlink zu erstellen". Interessanterweise wird die Überprüfung dieser Anschuldigungen kaum länger dauern als das Schreiben eines solchen Kommentars. Und ja, nur für den Fall: Beide Aussagen sind falsch. Daher habe ich mich in diesem Artikel dazu entschlossen, einen kleinen Abschnitt zu erstellen, in dem ich einige schwierige Momente aus dem Betrieb heraus beschrieb.

"Sie können nicht in den HKLM-Registrierungsschlüssel schreiben."


Es gibt keine solche allgemeine Regel. Es gibt bestimmte Sicherheitsregeln für bestimmte Registrierungsschlüssel. Valve hat für alle Benutzer die vollständigen Zugriffsrechte für den Zweig HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam festgelegt. Daher kann jeder Benutzer in diesem Zweig tun, was er will.

"Sie können einen Dienst ohne Administratorrechte nicht starten oder stoppen."


Es gibt keine solche allgemeine Regel. Es gibt bestimmte Sicherheitsregeln für bestimmte Dienste. Valve hat die Rechte so festgelegt, dass der Steam Client Service von jedem Benutzer gestartet und gestoppt werden kann.

"Um einen Symlink zu erstellen, benötigen Sie Administratorrechte."


Dies ist eine lustige Frage an sich, da von den 5 Haupttypen von Links in Windows nur eineinhalb diese Rechte benötigen. Treffen Sie also: Dateisymbolverknüpfung, Objektverzeichnissymbolverknüpfung, Hardlink, NTFS-Analysepunkt und reg_link. Administratorrechte werden nur benötigt, um einen symbolischen Dateilink und einen symbolischen Link für ein permanentes Objektverzeichnis zu erstellen (der temporäre Link lebt genau so lange, wie die Sitzung, in der er erstellt wurde, im Allgemeinen vor dem Neustart lebt und keine besonderen Rechte erfordert).

Simlink von Ordner zu Ordner


Dies wird als NTFS-Analysepunkt oder NTFS-Einhängepunkt bezeichnet. Der Name ist nicht besonders wichtig, die Tatsache ist, dass Sie mit dieser Sache einen Ordner als Zeiger auf einen anderen verwenden können. Es kann von einem normalen Benutzer aus einem leeren Ordner erstellt werden, wenn er Schreibrechte dafür hat. Für die Erstellung verwenden wir das Dienstprogramm CreateMountPoint.exe aus einer Reihe von Dienstprogrammen zum Testen der Arbeit mit Links .

Schloss verlassen


Das ausgehende Blockieren ( OpLock oder Opportunistic Lock ) ist ein spezieller Mechanismus, bei dem eine Anwendung vorübergehend jeden daran hindern kann, auf eine bestimmte Dateiressource zuzugreifen. Hier können Sie viele Details, Funktionen zum Arbeiten mit Ordnern und verschiedene Zugriffe schreiben. Das Fazit lautet: Das Programm kann das Ereignis des Zugriffs auf eine bestimmte Datei "abfangen" und für eine Weile halten. Sie können oplocks mit dem Dienstprogramm SetOpLock.exe aus derselben Testsuite installieren, um mit Links zu arbeiten . Durch Ausführen des Dienstprogramms wird die erforderliche Entsperrung installiert. Wenn der Zugriff erfolgt, schreibt das Dienstprogramm eine Nachricht. Durch Drücken der Eingabetaste wird die Entsperrung entfernt.

Baitandndswitch


Dies ist der Name der Technik, die die Erstellung von Links und die Installation von Oplos kombiniert, um TOCTOU (Zeitpunkt der Überprüfung \ Zeitpunkt der Verwendung) zu gewinnen. Das Wesentliche lässt sich anhand eines Beispiels leichter erklären.

Stellen Sie sich vor, es gibt ein Programm, das so etwas hintereinander macht:

ReadContentFromFile(“C:\test\myfile.txt”); ReadContentFromFile(“C:\test\myfile.txt”); 

Es wird nur zweimal hintereinander dieselbe Datei gelesen. Wird das immer immer gelesen? Nein, nicht unbedingt.

Erstellen Sie zunächst zwei Ordner mit den Dateien C: \ test1 \ myfile.txt und C: \ test2 \ myfile.txt. Im Allgemeinen löschen wir den Ordner C: \ test und erstellen einen Analysepunkt für C: \ test1. Wir setzen die Entsperrung in die Datei aus dem ersten Verzeichnis und führen das Programm aus. Sobald sie die Datei öffnet, funktioniert das Entsperren. Wir werden den Analysepunkt ändern und C: \ test wird auf C: \ test2 zeigen. Nachdem das Entsperren entfernt wurde, liest das Programm die Datei ein zweites Mal aus einer anderen Datei.

Warum wird das benötigt? Sehr einfach - eine ziemlich typische Situation, in der die Datei zuerst überprüft (erstes Lesen) und dann gestartet (zweites Lesen) wird. Auf diese Weise senden wir eine Datei zur Überprüfung und eine andere zur Ausführung.

Jetzt ist alles betriebsbereit.

Bedienung 1. Vorbereitung der Umgebung


Es ist notwendig, das Arbeitsumfeld ein wenig vorzubereiten. Zunächst müssen Sie die ausführbaren Dateien CreateMountPoint.exe und SetOpLock.exe verwenden.

Jetzt müssen wir kleine Änderungen an der Dateistruktur von Steam vornehmen. Unsere Aufgabe ist es, einen Ordner mit zwei Dateien Steam.exe und steamclient.dll und dem obligatorischen Fehlen des Ordners bin zu erhalten. Es gibt zwei Möglichkeiten, dies zu tun.

Methode 1


Benennen Sie den Ordner bin um und löschen Sie ihn aus dem Steam-Hauptordner. Das ist alles, du bist großartig (Steam während der Installation gibt jedem Benutzer die Rechte für alles in seinem Ordner).

Methode 2


Ändern Sie im Registrierungsschlüssel HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam den Parameter InstallPath in einen Teil unseres Ordners. Löschen Sie in diesem Ordner Steam.exe und steamclient.dll aus dem Hauptordner von Steam.

Angenommen, wir haben mit einer der Methoden den Ordner C: \ Steam vorbereitet (der Pfad kann ein beliebiger sein, aber in den Beispielen werde ich diesen verwenden). Erstellen Sie nun weitere Ordner b1, b2, b3 und b4 darin. In den ersten drei werden wir die Datei steamservice.dll hochladen (aus dem Steam-Kit, im Original im Ordner bin) und im Ordner b4 die speziell gebildete Bibliothek mit demselben Namen löschen - steamservice.dll. Einzelheiten zur Vorbereitung der Bibliothek finden Sie in Absatz 3.

Wir öffnen zwei Fenster der Konsole. Damit ist die Vorbereitung der Umgebung abgeschlossen.

Vorgang 2. Ersetzen der Datei


Ich denke, aus den Vorbereitungen ist bereits klar geworden, dass es so etwas wie den oben beschriebenen BaitAndSwitch geben wird.

Screenshot von ProcMon:



Dies ist Teil des typischen Starts des Steam Client Service. Beachten Sie den Teil, in dem die DLL zuerst nach C: \ Programme (x86) \ Common Files \ Steam kopiert und dann geladen wird. Wir werden sicherstellen, dass unsere Bibliothek von C: \ Steam \ b4 kopiert wird. Leider werden zuerst Überprüfungen durchgeführt, einschließlich der Unterschrift der Bibliothek, damit diese nicht ersetzt werden kann (oh, Ironie).

Also werde ich mich in Schritten anmelden. Schritte werden zu Gruppen derselben Aktionen zusammengefasst. Für jeden Schritt wird angezeigt, wo was zu starten ist und was passiert (ich habe die verschiedenen Konsolenfenster cmd1 und cmd2 genannt).

  1. Erstellen Sie den Ordner C: \ Steam \ bin und führen Sie in cmd1 Folgendes aus:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b1
  2. In cmd1 setzen wir den oplock:
    SetOpLock.exe C: \ Steam \ b1 \ steamservice.dll
  3. Wir starten den Steam Client Service. In cmd1 sehen wir, dass wir Zugriff auf die Datei erhalten haben.

    ***.
  4. Löschen Sie C: \ Steam \ bin, erstellen Sie den Ordner C: \ Steam \ bin an seiner Stelle und führen Sie in cmd2 Folgendes aus:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  5. In cmd2 setzen wir den oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  6. In cmd1 geben wir die Entsperrung frei. Wir sehen, dass cmd2 Zugriff auf die Datei hat.

    ***.
  7. Löschen Sie C: \ Steam \ bin, erstellen Sie den Ordner C: \ Steam \ bin an seiner Stelle und führen Sie cmd1: aus.
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  8. In cmd1 setzen wir den oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  9. In cmd2 geben wir die Entsperrung frei. Wir sehen, dass cmd1 Zugriff auf die Datei erhalten hat.

    ***.
  10. Löschen Sie C: \ Steam \ bin, erstellen Sie den Ordner C: \ Steam \ bin an seiner Stelle und führen Sie cmd2: aus.
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  11. In cmd2 setzen wir den oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  12. In cmd1 geben wir die Entsperrung frei. Wir sehen, dass cmd2 Zugriff auf die Datei hat.

    ***.
  13. Löschen Sie C: \ Steam \ bin, erstellen Sie den Ordner C: \ Steam \ bin an seiner Stelle und führen Sie cmd1: aus.
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  14. In cmd1 setzen wir den oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  15. In cmd2 geben wir die Entsperrung frei. Wir sehen, dass cmd1 Zugriff auf die Datei erhalten hat.

    ***.
  16. Löschen Sie C: \ Steam \ bin, erstellen Sie den Ordner C: \ Steam \ bin an seiner Stelle und führen Sie cmd2: aus.
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b4
  17. In cmd1 geben wir die Freischaltung frei

Obwohl es kompliziert aussieht, ist die Idee einfach: Von 6 Zugriffen auf die Datei C: \ Steam \ bin \ steamservice.dll wurden die ersten 5 Mal die Originaldateien aus verschiedenen Ordnern angegeben (in der Reihenfolge des Zugriffs: b1, b2, b3, b2, b3), und zum sechsten Mal wurde eine Datei mit einer Nutzlast zum Kopieren gegeben.

Schematisch habe ich es so dargestellt:


Links ist normales Verhalten, rechts ist Exploit-Verhalten.

Operation 3. Implementierte Bibliothek


Für die Nutzdaten habe ich zuerst meine typischste DLL verwendet, die in DllEntry eine interaktive Konsole erstellt. Da der Code aus der DLL im Kontext des Steam-Client-Dienstes ausgeführt wird, wird er mit denselben Rechten wie der Dienst selbst ausgeführt - NT AUTHORITY \ SYSTEM. Aufgrund des Betriebs wurde die Konsole jedoch nicht angezeigt.

Nach dem Download versteht der Steam-Dienst immer noch, dass sie eine Linde darauf geschoben haben und die Arbeit beendet haben, sodass die Nutzdaten von meiner DLL nicht ausgeführt werden konnten.

Ich musste mich ein wenig umdrehen und es stellte sich heraus, dass der Dienst nach dem Laden der DLL die Existenz von Funktionen überprüft

 int WINAPI SteamService_RunMainLoop() void WINAPI SteamService_Stop() 

in der Bibliothek. Darüber hinaus ruft der Dienst die erste Funktion auf, bei der ich beschlossen habe, die Nutzdaten zu speichern (Starten einer interaktiven Konsole mit den Rechten des Dienstes - NT AUTHORITY \ SYSTEM). Das ist alles - wir wiederholen alle Schritte und erhalten eine Konsole mit maximalen Berechtigungen.

Fazit


Sie können dies alles in eine Exe-Datei packen, aber ehrlich gesagt möchte ich mich nicht wirklich darum kümmern. Ich denke, dass ein Video mit einer Demonstration ausreichen wird ( Option mit der Registrierung , Option mit dem Dateisystem ).
Ich werde hier nicht den Abschnitt "Spekulation" aus einem früheren Artikel kopieren. Nur die Fakten: Die alte Sicherheitslücke ist aktuell, Sie haben gerade über die neue gelesen, Valve möchte immer noch nichts über die Probleme hören.

Update (22.08.2019)


Im Moment gibt es zwei Neuigkeiten:

  1. Beta-Client erhielt Patch-Fix . Ich werde sehen, wann das Update den Hauptclient erreicht.
  2. Valve hat die LPE-Richtlinie geändert. Und das sind großartige Neuigkeiten!


Update (27.08.2019)


Gute Neuigkeiten.

  1. Der Hauptclient hat das Patch-Update erhalten .
  2. Ich wurde im ersten Halbjahr gesperrt und erhielt eine Belohnung


Dieser Artikel in Englisch.

Source: https://habr.com/ru/post/de464367/


All Articles