Einführung
In Linux-Systemen ermöglicht der Befehl sudo es Standardbenutzern, Programme mit den Sicherheitsrechten eines anderen Benutzers auszuführen, typischerweise des Root-Administrators. Systemadministratoren konfigurieren die Datei /etc/sudoers häufig so, dass bestimmte Benutzer bestimmte Befehle als Root ausführen können, ohne ein Passwort eingeben zu müssen. Dies geschieht meist aus Gründen der Bequemlichkeit, etwa um einem Entwickler den Neustart eines Webservers oder die systemweite Suche nach Dateien zu ermöglichen.
Die Sicherheitslektion hierbei ist, dass Sudo-Regeln im Grunde delegiertes Vertrauen darstellen. Wenn die delegierte Binärdatei mächtiger ist, als der Administrator vermutet, kann die Regel effektiv den Zugriff auf eine Shell gewähren, anstatt nur eine einzelne, sichere Aktion zu erlauben.
Diese gut gemeinten administrativen Abkürzungen können jedoch schwerwiegende Sicherheitslücken verursachen. Wenn ein Benutzer eine Binärdatei ausführen darf, die in der Lage ist, andere Befehle auszuführen oder eine Shell zu starten (wie find, vim oder awk), kann ein Angreifer diese Berechtigung missbrauchen, um aus dem eingeschränkten Befehl auszubrechen und eine vollständige Root-Shell zu erlangen. Diese Technik wird allgemein als "Shell Escape" oder "GTFOBins"-Exploit bezeichnet.
In diesem Lab schlüpfen Sie in die Rolle eines Sicherheitsprüfers. Sie werden die sudo-Berechtigungen Ihres aktuellen Benutzers auflisten, eine falsch konfigurierte autorisierte Binärdatei identifizieren und diese ausnutzen, um Ihre Privilegien auf Root-Ebene zu erweitern.
Sudo-Berechtigungen prüfen (sudo -l)
In diesem Schritt lernen Sie, wie Sie die sudo-Privilegien auflisten, die Ihrem aktuellen Benutzerkonto zugewiesen sind.
Bei der Überprüfung eines Linux-Systems auf Möglichkeiten zur Privilegienerweiterung ist eine der ersten Maßnahmen zu prüfen, welche Befehle der aktuelle Benutzer als Root ausführen kann. Der Befehl sudo bietet ein eingebautes Flag, -l (list), das die erlaubten und verbotenen Befehle für den aufrufenden Benutzer anzeigt.
Dies ist eine Prüfung mit hoher Priorität, da Sudo-Fehlkonfigurationen eine direkte, unkomplizierte Eskalation mit sehr wenig Rätselraten ermöglichen können.
Um unsere Ergebnisse zu protokollieren, leiten wir die Ausgabe dieses Befehls in eine Textdatei innerhalb unseres Projektverzeichnisses um.
Führen Sie den folgenden Befehl aus, um Ihre Sudo-Privilegien aufzulisten und die Ausgabe in einer Datei namens sudo_privs.txt zu speichern:
sudo -l > /home/labex/project/sudo_privs.txt
Lassen Sie uns nun den Inhalt der soeben erstellten Datei anzeigen, um die Berechtigungen zu analysieren:
cat /home/labex/project/sudo_privs.txt
Sie sollten eine Ausgabe sehen, die der folgenden ähnelt:
Matching Defaults entries for labex on this host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User labex may run the following commands on this host:
(root) NOPASSWD: /usr/bin/find
Einige Umgebungen zeigen möglicherweise zusätzliche sudo-Einträge neben der find-Regel an. Konzentrieren Sie sich für dieses Lab auf die Zeile, die es labex explizit erlaubt, /usr/bin/find als root ohne Passworteingabe (NOPASSWD) auszuführen. Genau diese Konfiguration werden wir in den kommenden Schritten ins Visier nehmen.
Erlaubte Binärdateien auf Shell-Escapes analysieren
In diesem Schritt analysieren Sie die Binärdatei /usr/bin/find, um zu verstehen, wie sie missbraucht werden kann, um beliebige Befehle auszuführen.
Der Befehl find ist ein mächtiges Werkzeug, das zum Suchen von Dateien und Verzeichnissen in einer Verzeichnishierarchie verwendet wird. Er enthält jedoch einen äußerst flexiblen Parameter namens -exec. Das Flag -exec ermöglicht es dem Benutzer, einen angegebenen Befehl für jede Datei auszuführen, die find findet.
Das Problem ist nicht, dass find bösartig ist. Das Problem ist, dass es sehr ausdrucksstark ist. Jede ausdrucksstarke, Root-fähige Binärdatei ist ein Kandidat für einen Shell-Escape, wenn sie nicht streng eingeschränkt ist.
Die kritische Sicherheitslücke entsteht, wenn find mit sudo ausgeführt wird. Wenn find als Root läuft, wird jeder Befehl, der an den -exec-Parameter übergeben wird, ebenfalls als Root ausgeführt.
Lassen Sie uns diese Theorie testen, indem wir den -exec-Parameter verwenden, um den Befehl whoami auszuführen. Der Befehl whoami gibt einfach den effektiven Benutzernamen des aktuellen Benutzers aus. Wir leiten die Ausgabe in eine Datei um, um unseren Ausführungskontext zu überprüfen.
Führen Sie den folgenden Befehl aus:
sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt
Lassen Sie uns diesen Befehl aufschlüsseln. Der Teil sudo find . führt den Befehl find als Root aus und beginnt die Suche im aktuellen Verzeichnis (.). Das Segment -exec whoami \; weist find an, den Befehl whoami auszuführen, wobei \; erforderlich ist, um die -exec-Anweisung zu beenden. Schließlich weist das Flag -quit find an, sofort nach der Verarbeitung des ersten Treffers zu beenden, was verhindert, dass whoami mehrfach für jede Datei im Verzeichnis ausgeführt wird.
Überprüfen Sie nun den Inhalt der Ausgabedatei:
cat /home/labex/project/whoami.txt
Sie sollten die folgende Ausgabe sehen:
root
Dies bestätigt, dass der an -exec übergebene Befehl erfolgreich mit Root-Privilegien ausgeführt wurde.
Binärdatei mit Sudo ausführen
In diesem Schritt nutzen Sie die -exec-Schwachstelle aus, um auf sensible Systemdateien zuzugreifen, die normalerweise auf den Root-Benutzer beschränkt sind.
Eine der sensibelsten Dateien auf einem Linux-System ist /etc/shadow. Diese Datei enthält die verschlüsselten Passwort-Hashes für alle Benutzerkonten auf dem System. Standardbenutzer haben keine Leseberechtigungen für diese Datei. Wenn ein Angreifer diese Datei lesen kann, kann er versuchen, die Passwort-Hashes offline zu knacken.
Da wir bewiesen haben, dass wir beliebige Befehle als Root mit sudo find ausführen können, können wir diese Technik nutzen, um den Inhalt von /etc/shadow zu lesen.
Wir verwenden den Befehl head innerhalb unserer -exec-Anweisung, um nur die erste Zeile der Shadow-Datei zu lesen (die normalerweise den Hash des Root-Benutzers enthält) und diese in unserem Projektverzeichnis zu speichern.
Führen Sie den folgenden Befehl aus:
sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt
In diesem Befehl fungiert {} als Platzhalter, den find durch den Namen der Datei ersetzt, die es gerade verarbeitet (in diesem Fall /etc/shadow).
Überprüfen Sie, ob Sie die sensiblen Informationen erfolgreich extrahiert haben, indem Sie die Ausgabedatei lesen:
cat /home/labex/project/shadow_head.txt
Sie sollten eine Ausgabe sehen, die der folgenden ähnelt und den Eintrag des Root-Benutzers aus der Shadow-Datei anzeigt:
root:*:19711:0:99999:7:::
Sie haben erfolgreich die Dateisystemberechtigungen umgangen, indem Sie den falsch konfigurierten sudo-Eintrag missbraucht haben.
Root-Shell starten
In diesem Schritt führen Sie die letzte Aktion aus, um eine vollständige Systemkompromittierung durch das Starten einer Root-Shell zu erreichen.
Während das Lesen sensibler Dateien gefährlich ist, besteht das ultimative Ziel der Privilegienerweiterung darin, eine interaktive Shell zu erhalten, die als Root läuft. Dies gewährt dem Angreifer uneingeschränkten Zugriff auf das gesamte System.
Um dies zu erreichen, können wir anstelle eines einfachen Befehls wie whoami oder head den Pfad zu einer Shell-Ausführungsdatei, wie /bin/bash, an den -exec-Parameter übergeben.
In einem realen Szenario würde ein Angreifer sudo find . -exec /bin/bash \; -quit ausführen, um direkt in ein interaktives Root-Terminal zu gelangen. Für die Zwecke dieser automatisierten Lab-Umgebung würde das Starten einer interaktiven Shell jedoch die Lab-Ausführung unterbrechen.
Stattdessen starten wir eine Root-Bash-Shell im nicht-interaktiven Modus unter Verwendung des -c-Flags. Dies ermöglicht es uns, einen Befehl direkt an die neue Root-Shell zu übergeben, ihn auszuführen und den Beweis unserer vollständigen Systemkompromittierung zu speichern. Wir verwenden den Befehl id, der detaillierte Informationen über die Identität und die Gruppenzugehörigkeiten des aktuellen Benutzers liefert.
Führen Sie den folgenden Befehl aus, um eine Root-Shell zu starten und Ihre Identität aufzuzeichnen:
sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit
Lesen Sie abschließend die Datei pwned.txt, um Ihre ultimative Privilegienerweiterung zu verifizieren:
cat /home/labex/project/pwned.txt
Die Ausgabe sollte deutlich zeigen, dass die Shell mit Root-Benutzer- und Gruppen-IDs lief:
uid=0(root) gid=0(root) groups=0(root)
Herzlichen Glückwunsch! Sie haben erfolgreich eine falsch konfigurierte sudoers-Datei ausgenutzt, um Ihre Privilegien von einem Standardbenutzer auf Root zu erweitern.
Zusammenfassung
In diesem Lab haben Sie die Sicherheitsrisiken untersucht, die mit falsch konfigurierten sudoers-Dateien in Linux-Umgebungen verbunden sind. Sie begannen mit der Auflistung der sudo-Privilegien Ihres Benutzerkontos und stellten fest, dass die Binärdatei find ohne Passwort als Root ausgeführt werden konnte. Durch das Verständnis der Funktionalität des -exec-Parameters des find-Befehls konnten Sie beliebige Befehle mit Root-Privilegien ausführen. Sie haben die Auswirkungen dieser Schwachstelle demonstriert, indem Sie eingeschränkte Systemdateien gelesen und schließlich eine Root-Shell gestartet haben, um eine vollständige Systemkompromittierung zu erreichen. Diese Übung unterstreicht, wie wichtig es ist, das Prinzip der geringsten Rechte (Principle of Least Privilege) einzuhalten und sudo-Konfigurationen sorgfältig zu prüfen, um unbefugte Privilegienerweiterungen zu verhindern.



