
Ein Write-up zum TryHackMe-Raum Source & ein Python-Skript zur Ausnutzung der Schwachstelle
Ein Write-up über den TryHackMe-Raum Source & ein Python-Skript zur Ausnutzung der Schwachstelle
Ich nehme keine Anerkennung für die Entdeckung dieser Schwachstelle. Danke an die folgenden Personen, die die Ressourcen bereitgestellt haben, damit Leute wie ich lernen können!
Vulnerability Discovery:
Özkan Mustafa Akkuş
MSF Module:
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/webmin_backdoor.rb
https://www.rapid7.com/db/modules/exploit/linux/http/webmin_backdoor/
MSF Module Author:
wvu
TryHackMe Room:
https://tryhackme.com/room/source
THM Author:
https://tryhackme.com/p/DarkStar7471
Resources:
https://www.webmin.com/exploit.html
https://github.com/webmin/webmin/issues/947
https://www.perlmonks.org/?node_id=301355
Ich bin keineswegs ein erfahrener Sicherheitsexperte. Das bedeutet, dass ich möglicherweise falsche Informationen liefere. Wenn Sie ein erfahrener Profi/Forscher sind und etwas Falsches sehen, informieren Sie mich bitte, damit ich zurückkommen, meine Fehler studieren und die richtigen Informationen liefern kann. Das ist sowohl für mich als auch für andere Anfänger-Forscher, die über dieses Write-up stolpern könnten, hilfreich. Wenn Sie falsche Informationen finden, die ich geschrieben habe, kontaktieren Sie mich bitte unter [email protected], damit ich sie korrigieren kann. Vielen Dank!
1. Geschichte
Webmin ist ein webbasiertes Tool zur Verwaltung von Unix-ähnlichen Systemen. Irgendwann im ersten Quartal 2018 wurde Webmin Opfer einer Supply-Chain-Attacke, bei der ein unbekannter Angreifer bösartigen Code in die Datei password_change.cgi einschleusen konnte. Dadurch entstand eine Hintertür, die auf jedem System mit Webmin Version 1.890 und Standardkonfiguration geöffnet werden konnte. Ich bezeichne dies als Supply-Chain-Angriff, weil der Quellcode des Produkts der Entwickler/Verteiler kompromittiert wurde. Als der Lieferant das kompromittierte Produkt veröffentlichte, lief bei jedem, der die Software aktualisierte, der anfällige Code, sodass der Angreifer jedes System mit diesem Code kompromittieren konnte. Im selben Jahr bemerkten die Webmin-Entwickler den Vorfall und setzten die Datei auf ihren ursprünglichen Zustand zurück, jedoch konnte der Angreifer den Code erneut einschleusen. Diesmal war der Code nur anfällig, wenn die Option zum Ändern abgelaufener Passwörter aktiviert war. Diese Schwachstelle wurde erst im August 2019 entdeckt. Die Schwachstelle wurde in Webmin Version 1.930 behoben.
2. Der Code
Nach einiger Suche konnte ich die Codezeile finden, die Webmin Version 1.890 anfällig für Befehlsinjektion machte. Ich hatte Schwierigkeiten, die richtigen Informationen zu finden, da es tatsächlich zwei verschiedene CVEs zu diesem Problem gibt (CVE-2019-15231/CVE-2019-15107). CVE-2019-15231 betrifft die Schwachstelle der Standardkonfiguration in Version 1.890, und CVE-2019-15107 betrifft die Schwachstelle, bei der die Option zum Ändern abgelaufener Passwörter in Versionen bis 1.920 aktiviert sein muss. Schauen wir uns den Code für Version 1.890 an. In Zeile 12 von password_change.cgi haben wir folgende Codezeile:
$in{'expired'} eq '' || die $text{'password_expired'},qx/$in{'expired'}/;
Zum Zeitpunkt dieses Schreibens habe ich noch nie etwas in Perl geschrieben. Wir werden diese Codezeile mit Hilfe von Suchmaschinen zerlegen, um besser zu verstehen, was der Code tut und warum er anfällig für Ausbeutung ist. Das erste Codestück links vom ||-Operator scheint eine Variable ($in) zu sein, die einen Parameter (expired) nimmt und prüft, ob er gleich (eq) einem leeren String '' ist. In der Mitte haben wir den ||-Operator. Der || ist in Perl eine andere Schreibweise für den logischen Operator or. Bei Verwendung von || in Perl wird die rechte Seite nicht ausgewertet, wenn die linke Seite wahr ist. Ist die linke Seite falsch, wird die rechte Seite ausgewertet. In der ersten Hälfte des Codes rechts vom -Operator sehen wir . In Perl ist eine Funktion, die den Skriptprozess beendet und eine Fehlermeldung ausgibt. Die Meldung wäre vermutlich die -Variable, die besagt, dass das Passwort abgelaufen ist. Der letzte Teil des Codes wird interessant. Wir sehen ein Komma gefolgt von und einem Semikolon , das die Codezeile beendet. Das Komma fungiert als Trennzeichen für den Code; die linke Hälfte wird zuerst ausgewertet, dann die zweite Hälfte. In Perl ist eine Funktion, die Systembefehle auf dem Host ausführt. Die sind Trennzeichen zur Identifikation des Parameters. In diesem Fall haben wir , das den Parameter als Systembefehl ausführt. Ich glaube, die -Variable könnte ähnlich wie in PHP sein, und zwar aus folgendem Grund: In dem Exploit-Skript, das ich geschrieben habe, haben wir einen Parameter namens , der die Payload speichert, bevor sie per POST-Anfrage an den Server gesendet wird. So sieht der Code aus: . Die -Variable muss etwas tun, um den Wert abzurufen, den wir zugewiesen haben, damit die Payload von der -Funktion ausgeführt werden kann. Um diesen Abschnitt abzuschließen: Die anfällige Codezeile stellt fest, dass unser -Parameter in der POST-Anfrage nicht gleich einem leeren String ist, daher wertet der -Operator nun die rechte Hälfte des Codes aus und führt unsere im -Parameter gespeicherte Payload aus. Kommen wir nun zum Write-up für den Source-Raum von TryHackMe.com
Beginnen wir mit einem Port-Scan. Wir verwenden rustscan für einen groben Überblick, da nmap schmerzhaft langsam sein kann.

Es scheinen 2 Ports offen zu sein: 22 und 10000. Wir verwenden jetzt nmap, um herauszufinden, welche Dienste auf jedem Port laufen.

Wir haben also SSH auf dem Standard-Port und einen HTTP-Dienst auf Port 10000. Navigieren wir zur Seite auf Port 10000 und sehen, was dort ist.

Sie müssen HTTPS verwenden und die SSL-Zertifikatswarnung umgehen, um auf diese Seite zuzugreifen. Es sieht nach einer Anmeldeseite für den Webmin-Dienst aus. Als ich diese Box ursprünglich gemacht habe, habe ich einige Verzeichnis-Brute-Force-Versuche unternommen, aber nichts Interessantes ist dabei herausgekommen. Schauen wir, ob es eine Schwachstelle für die Webmin-Version gibt, die wir vom nmap-Scan via searchsploit erhalten haben.

Es scheint, wir haben einige verschiedene Optionen, aber keine entspricht unserer Version. Öffnen wir MSF und sehen, was wir haben.

Wir haben einige verschiedene Optionen zur Auswahl. Suchen wir nach der Webmin-Version, die wir von nmap erhalten haben, und sehen, ob CVEs auftauchen, die uns helfen, dies einzugrenzen.

In der Schwachstellenzusammenfassung sehen wir, dass etwas über die Datei password_change.cgi erwähnt wird. Verwenden wir Nummer 5 aus unserer MSF-Suche, da diese ebenfalls die password_change.cgi-Datei und dasselbe Offenlegungsdatum erwähnt.

Lol, wir werden MSF eigentlich nicht verwenden. MSF ist nett, aber es macht nicht so viel Spaß wie herauszufinden, wie man etwas mit eigenem Code ausnutzt! Ich habe den Ruby-Quellcode als Referenz für diesen Exploit verwendet, um meinen eigenen Exploit-Code in Python zu schreiben. Verwenden wir stattdessen den!

Bada-bing Bada-boom, wir haben eine Root-Shell im Raum! Ich werde die Flags nicht verraten. Ich bin sicher, Sie können sie finden! Danke fürs Lesen und einen schönen Tag noch!
||die $text{'password_expired'}die$text,qx/$in{'expired'}/;qx//qx/$in{'expired'}/$in{'expired'}$in$_GETexpireddata = {'expired':payload,}$inexpiredqxexpired||expired