
Ein Write-up über die Steel Mountain-Box von TryHackMe.com und den Exploit für CVE-2014-6287
Ein Write-up zur Steel Mountain Box von TryHackMe.com und Exploit für CVE-2014-6287
Ich maße mir nicht an, die ursprüngliche Entdeckung und Ausnutzung dieser Schwachstelle selbst gemacht zu haben. Vielen Dank an die folgenden Personen!
Entdeckung:
Daniele Linguaglossa
Metasploit-Modul-Autor:
Muhamad Fadzil Ramli
TryHackMe-Raum & Autor:
https://tryhackme.com/room/steelmountain
https://tryhackme.com/p/tryhackme
Referenzen:
https://nvd.nist.gov/vuln/detail/CVE-2014-6287
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb
https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287
https://www.tutorialspoint.com/pascal/pascal_functions.htm
Ich bin keineswegs ein erfahrener Sicherheitsexperte. Das bedeutet, dass ich möglicherweise falsche Informationen bereitstelle. Wenn du ein erfahrener Profi/Forscher bist und etwas Falsches siehst, informiere mich bitte, damit ich zurückkommen, mich über das informieren kann, was ich falsch gemacht habe, und die richtigen Informationen bereitstellen kann. Das ist sowohl für mich als auch für andere Anfängerforscher, die auf dieses Write-up stoßen könnten, vorteilhaft. Wenn du falsche Informationen findest, die ich geschrieben habe, kontaktiere mich bitte unter [email protected], damit ich sie korrigieren kann. Vielen Dank!
Rejetto File Server (auch bekannt als HFS) ist ein Dateifreigabeprogramm, das zum Veröffentlichen und Teilen von Dateien in einem Netzwerk verwendet wird. In Version 2.3 gab es eine Schwachstelle, die es einem Angreifer ermöglichte, Systembefehle auszuführen, indem ein Nullbyte in den Suchparameter eingegeben wurde, wie in CVE-2014-6287 beschrieben. Der Code verarbeitet ein Nullbyte mit seiner Regex-Konfiguration (Regular Expression) nicht ordnungsgemäß und führt daher zu einer Schwachstelle für die Ausführung von Remote-Code.
Die Schwachstelle befindet sich in der Funktion findMacroMarker, die aus der Datei parserLib.pas stammt. .pas ist die Dateierweiterung für die Programmiersprache Pascal. Zum Zeitpunkt dieses Schreibens habe ich noch nichts in Pascal programmiert. Schauen wir uns das Code-Snippet an und analysieren, was es tut!
function findMacroMarker(s:string; ofs:integer=1):integer;
begin result:=reMatch(s, '{[.:]|[.:]}||', 'm!', ofs) end;
Die erste Codezeile ist eine Deklaration einer Funktion namens findMacroMarker, die zwei Parameter entgegennimmt. In Pascal muss der Datentyp der Parameter deklariert werden, daher bedeutet s:string, dass die Variable s ein string ist. Dies gilt auch für die Variable ofs mit einem Datentyp integer. Rechts von den Parametern sehen wir ein Doppelpunktzeichen, gefolgt von integer. Dies wird als Funktionstyp bezeichnet. Das Semikolon markiert das Ende dieser Codezeile. Das erste Wort in der nächsten Codezeile ist begin. Dies teilt dem Compiler mit, wo die Funktion beginnt. Weiter unten sehen wir eine Variable namens result, gefolgt vom Zuweisungsoperator :=. Die Variable result wird der Funktion reMatch zugewiesen. Ich konnte im Internet nichts über reMatch finden, also gehe ich davon aus, dass es sich um eine benutzerdefinierte Funktion handelt, die irgendwo anders in HFS geschrieben wurde. Glücklicherweise ist die Funktion selbsterklärend. ist eindeutig die Abkürzung für Regular Expression Match, gefolgt von dem Regex-Muster, nach dem gesucht wird, das sowohl in den Parametern der -Funktion als auch in den anfänglichen Variablenparametern, die in der ersten Codezeile definiert sind, berücksichtigt wird. Am Ende der zweiten Zeile wird das Wort verwendet, um das Ende der Funktion für den Compiler zu definieren.
Die Schwachstelle befindet sich in dem Regex-Muster, wie oben in der reMatch-Funktion beschrieben. Der reguläre Ausdruck verarbeitet ein Nullbyte %00 nicht richtig. Wenn wir einen Systembefehl mit einem vorangestellten Nullbyte übergeben, stößt die Funktion auf den Fehler und führt den Befehl auf dem Host-Computer aus. Um diese Schwachstelle auszunutzen, müssen wir lediglich das Nullbyte in den Suchparameter einer GET-Anfrage einfügen, gefolgt von {.exec|code.} (code ist der auszuführende Befehl) über die URL wie folgt:
http://(IP-Address/DomainName)/?search==%00{.exec|CommandGoesHere.}.
Beginnen wir mit einem Port-Scan über rustscan. Ich bevorzuge rustscan, um schnell einen Überblick über die Angriffsfläche zu erhalten.

Wir haben hier eine große Anzahl offener Ports. Jetzt gehen wir mit nmap tiefer ins Detail und finden heraus, welche Dienste auf dieser Port-Palette lauschen, um unseren ausnutzbaren Dienst zu finden.

Wir haben einen Dienst namens Microsoft Windows RPC, der auf den höheren Ports läuft. RPC steht für Remote Procedure Call. Dies ermöglicht es Windows-Prozessen, über ein Netzwerk oder intern innerhalb des Computers selbst zu kommunizieren. Weiter haben wir einige verschiedene Webserver, die auf den Ports 80 und 8080 laufen. Auf den Ports 5985 und 47001 ist Microsoft Httpapi Httpd vorhanden, der es Anwendungen ermöglicht, über HTTP zu kommunizieren, ohne dass Microsoft IIS (Internet Information Server) erforderlich ist. Nmap erkennt einen möglichen Webserver, der auf Port 3389 läuft, jedoch konnte ich keine Verbindung über HTTP oder SSL herstellen. Stellen wir eine Verbindung zum Webserver auf Port 80 her, da dies der Standardport für das HTTP-Protokoll ist.

Auf Port 80 wird uns eine Webseite präsentiert, die das Firmenlogo von Steel Mountain und ein Foto mit der Bezeichnung „Mitarbeiter des Monats“ zeigt. Wenn wir die Webentwickler-Tools öffnen, sehen wir, dass das Foto BillHarper.png heißt, was uns die Antwort auf unsere erste Frage liefert. Stellen wir eine Verbindung zu den anderen lauschenden Diensten her und sehen, was wir finden können.

Wenn wir uns mit dem Dienst auf Port 5985 verbinden, erhalten wir den HTTP-Fehlercode 404. Der Fehlercode 404 bedeutet, dass der Server die angeforderte Ressource nicht finden kann. Hier gibt es nichts Interessantes. Gehen wir zum nächsten über.

JA! Das sieht interessant aus. Auf Port 8080 haben wir eine Art Dateifreigabedienst. Schauen wir uns um, ob wir weitere Informationen über diesen Dienst finden können. Wenn wir in die untere linke Ecke schauen, sehen wir einen Namen und eine Versionsnummer wie folgt: HttpFileServer 2.3. Lassen Sie uns weiter enumerieren.

Wenn wir auf den Link mit der Bezeichnung HttpFileServer 2.3 klicken, werden wir auf eine Webseite mit dem Namen der Software weitergeleitet, die auf Port 8080 läuft. In diesem Fall haben wir Rejetto HFS HTTP File Server. Überprüfen wir den anderen Port 47001, um alle Basis abzudecken. Wenn wir nichts Nützliches finden, können wir zu Rejetto zurückkehren und nach bekannten CVEs suchen.

Es sieht so aus, als hätten wir einen weiteren 404 auf Port 47001. Beginnen wir mit der Suche nach CVEs für Rejetto HFS 2.3.

Eine schnelle Suche ergibt, dass wir einen bekannten CVE-Eintrag für HFS 2.3 haben. Wir werden jetzt vom THM-Leitfaden abweichen und auf das vorgeschriebene Metasploit verzichten. Ich habe einen Exploit programmiert, der uns eine Shell gibt. Um ihn zu verwenden, müssen Sie zu revshells.com gehen, die richtigen Netzwerkinformationen eingeben und PowerShell #3 (Base 64) auswählen. Wenn Sie den Payload haben, kopieren und fügen Sie ihn in die Payload-Variable in Zeile 13 ein und führen Sie den Exploit aus. Ein Listener wird automatisch geöffnet und Sie sollten Zugriff auf das System haben. Hinweis: Möglicherweise müssen Sie den Exploit mehrmals ausführen, um die Shell zu erhalten.

Boom! Wir sind im System und als Bonus haben wir eine PowerShell-Shell. Das bedeutet, dass wir Zugriff auf die .NET-Cmdlets haben. Damit können wir deutlich gefährlicher sein als mit der standardmäßigen Eingabeaufforderung. Fahren wir mit der Privilegieneskalation fort. Der THM-Leitfaden stellt uns ein nützliches Tool namens PowerSploit zur Verfügung, das ein Tool zur Enumerierung der Maschine auf potenzielle Privilegieneskalationsvektoren enthält. Wir werden PowerUp.ps1 auf die Maschine werfen und es nutzen, um uns die Kontrolle über die Maschine zu verschaffen.

Zuerst starten wir einen einfachen HTTP-Server in dem Verzeichnis, das unsere PowerUp.ps1-Datei auf unserem System enthält. Als nächstes verwenden wir auf unserem Zielsystem das Cmdlet Invoke-Webrequest, um die Datei von unserem Server auf das Zielsystem zu holen. Wir werden nun eines der mit PowerUp gelieferten Cmdlets installieren und ausführen.

Um PowerUp.ps1 zu installieren, führen Sie diesen Befehl aus: . .\PowerUp.ps1. Als nächstes müssen wir unser neues Cmdlet Invoke-AllChecks verwenden. Nachdem wir das ausgeführt haben, erhalten wir eine Fülle von Ausgaben. Ich habe es auf das wichtige reduziert, das wir wollen. Wir sehen, dass PowerUp uns mitgeteilt hat, dass wir Berechtigungen zum Ändern der Datei haben. Überprüfen wir die laufenden Dienste, damit wir ihn herunterfahren können, falls er läuft. Dies müssen wir tun, weil wir nichts mit der Datei anfangen können, wenn sie von einem Dienst verwendet wird.

Durch die Verwendung des Cmdlets Get-Service erhalten wir eine Liste der Dienste, die auf der Maschine vorhanden sind. Da unser Zieldienst läuft, müssen wir ihn herunterfahren, damit wir die Binärdatei ändern und überschreiben können.

Um den Dienst zu stoppen, verwenden wir das Cmdlet Stop-Service gefolgt vom Namen des Dienstes. Jetzt müssen wir mit dem Cmdlet Get-Service überprüfen, ob der Dienst gestoppt ist. Wie oben gezeigt, können wir bestätigen, dass der Dienst tatsächlich gestoppt ist. Gehen wir in das Verzeichnis, das unsere Ziel-Binärdatei enthält. Das Verzeichnis ist C:\Program Files (x86)\IObit\Advanced SystemCare.

Beachten Sie die Dateigröße der Binärdatei, die sich links neben dem Binärnamen in der äußersten rechten Spalte befindet.

Erstellen Sie einen Meterpreter-Payload und hosten Sie ihn mit dem Python-Webserver-Modul wie zuvor.

Starten Sie einen Meterpreter-Listener mit denselben Netzwerkinformationen, die Sie zum Erstellen des Payloads verwendet haben.

Verwenden Sie das Cmdlet Invoke-Webrequest, um unseren Meterpreter-Payload von unserer Maschine auf das Zielsystem zu holen. Stellen Sie sicher, dass Sie ihn ASCService.exe nennen, damit wir die schwachen Dateiberechtigungen ausnutzen und die normale Binärdatei mit unserer schädlichen Binärdatei überschreiben können.

Bestätigen Sie, dass die Binärdatei überschrieben wurde, indem Sie das Verzeichnis auflisten und prüfen, ob sich die Dateigröße geändert hat. In diesem Fall hat sie sich von einer 6-stelligen Zahl in eine 5-stellige Zahl geändert, was bestätigt, dass wir unsere schädliche Binärdatei erfolgreich hochgeladen haben!

Wenn die schädliche Binärdatei die normale ersetzt hat, müssen wir nur noch den Dienst mit dem Cmdlet Start-Service neu starten. Wenn wir das tun, führt die Maschine unseren Payload aus und gibt uns eine Meterpreter-Shell! Wir können in Meterpreter getuid ausführen, um zu prüfen, ob wir NT AUTHORITY/SYSTEM haben. Wenn wir getuid ausführen, sehen wir tatsächlich, dass wir diese Maschine übernommen haben! Haben Sie einen großartigen Tag!
reMatchreMatchend