euid, ruid, suid
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ruid
: Die echte Benutzer-ID bezeichnet den Benutzer, der den Prozess initiiert hat.
euid
: Bekannt als die effektive Benutzer-ID, repräsentiert sie die Benutzeridentität, die vom System verwendet wird, um die Prozessprivilegien zu bestimmen. Im Allgemeinen spiegelt euid
ruid
wider, mit Ausnahme von Fällen wie der Ausführung einer SetUID-Binärdatei, bei der euid
die Identität des Dateieigentümers annimmt und somit spezifische Betriebsberechtigungen gewährt.
suid
: Diese gespeicherte Benutzer-ID ist entscheidend, wenn ein hochprivilegierter Prozess (typischerweise als root ausgeführt) vorübergehend seine Privilegien aufgeben muss, um bestimmte Aufgaben auszuführen, um später seinen ursprünglichen erhöhten Status wiederzuerlangen.
Ein Prozess, der nicht unter root läuft, kann seine euid
nur so ändern, dass sie mit dem aktuellen ruid
, euid
oder suid
übereinstimmt.
setuid
: Entgegen anfänglicher Annahmen ändert setuid
hauptsächlich euid
und nicht ruid
. Insbesondere für privilegierte Prozesse richtet es ruid
, euid
und suid
auf den angegebenen Benutzer, oft root, aus und festigt diese IDs aufgrund des übergeordneten suid
. Detaillierte Informationen finden Sie auf der setuid-Man-Seite.
setreuid
und setresuid
: Diese Funktionen ermöglichen die nuancierte Anpassung von ruid
, euid
und suid
. Ihre Fähigkeiten hängen jedoch vom Privilegienniveau des Prozesses ab. Für Nicht-Root-Prozesse sind Änderungen auf die aktuellen Werte von ruid
, euid
und suid
beschränkt. Im Gegensatz dazu können Root-Prozesse oder solche mit der CAP_SETUID
-Berechtigung beliebige Werte für diese IDs zuweisen. Weitere Informationen finden Sie auf der setresuid-Man-Seite und der setreuid-Man-Seite.
Diese Funktionen sind nicht als Sicherheitsmechanismus konzipiert, sondern um den beabsichtigten Betriebsablauf zu erleichtern, beispielsweise wenn ein Programm die Identität eines anderen Benutzers annimmt, indem es seine effektive Benutzer-ID ändert.
Es ist bemerkenswert, dass setuid
zwar ein gängiger Ansatz zur Erhöhung der Privilegien auf root sein kann (da es alle IDs auf root ausrichtet), es jedoch entscheidend ist, zwischen diesen Funktionen zu unterscheiden, um das Verhalten der Benutzer-IDs in verschiedenen Szenarien zu verstehen und zu manipulieren.
execve
SystemaufrufFunktionalität: execve
startet ein Programm, das durch das erste Argument bestimmt wird. Es nimmt zwei Array-Argumente, argv
für Argumente und envp
für die Umgebung.
Verhalten: Es behält den Speicherbereich des Aufrufers bei, aktualisiert jedoch den Stack, Heap und die Datensegmente. Der Programmcode wird durch das neue Programm ersetzt.
Benutzer-ID-Erhaltung:
ruid
, euid
und zusätzliche Gruppen-IDs bleiben unverändert.
euid
kann nuancierte Änderungen erfahren, wenn das neue Programm das SetUID-Bit gesetzt hat.
suid
wird nach der Ausführung von euid
aktualisiert.
Dokumentation: Detaillierte Informationen finden Sie auf der execve
-Man-Seite.
system
FunktionFunktionalität: Im Gegensatz zu execve
erstellt system
einen Kindprozess mit fork
und führt einen Befehl innerhalb dieses Kindprozesses mit execl
aus.
Befehlsausführung: Führt den Befehl über sh
mit execl("/bin/sh", "sh", "-c", command, (char *) NULL);
aus.
Verhalten: Da execl
eine Form von execve
ist, funktioniert es ähnlich, jedoch im Kontext eines neuen Kindprozesses.
Dokumentation: Weitere Einblicke können von der system
-Man-Seite erhalten werden.
bash
und sh
mit SUIDbash
:
Hat eine -p
-Option, die beeinflusst, wie euid
und ruid
behandelt werden.
Ohne -p
setzt bash
euid
auf ruid
, wenn sie anfangs unterschiedlich sind.
Mit -p
wird das ursprüngliche euid
beibehalten.
Weitere Details finden Sie auf der bash
-Man-Seite.
sh
:
Besitzt keinen Mechanismus ähnlich wie -p
in bash
.
Das Verhalten bezüglich der Benutzer-IDs wird nicht ausdrücklich erwähnt, außer unter der -i
-Option, die die Erhaltung der Gleichheit von euid
und ruid
betont.
Zusätzliche Informationen sind auf der sh
-Man-Seite verfügbar.
Diese Mechanismen, die sich in ihrem Betrieb unterscheiden, bieten eine vielseitige Palette von Optionen zur Ausführung und zum Übergang zwischen Programmen, mit spezifischen Nuancen in der Verwaltung und Erhaltung von Benutzer-IDs.
Beispiele entnommen von https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, überprüfen Sie es für weitere Informationen
setuid
mit system
Ziel: Verständnis der Auswirkungen von setuid
in Kombination mit system
und bash
als sh
.
C-Code:
Kompilierung und Berechtigungen:
Analyse:
ruid
und euid
beginnen als 99 (nobody) und 1000 (frank) respektive.
setuid
richtet beide auf 1000 aus.
system
führt /bin/bash -c id
aus, aufgrund des Symlinks von sh zu bash.
bash
, ohne -p
, passt euid
an, um mit ruid
übereinzustimmen, was dazu führt, dass beide 99 (nobody) sind.
C Code:
Kompilierung und Berechtigungen:
Ausführung und Ergebnis:
Analyse:
setreuid
setzt sowohl ruid als auch euid auf 1000.
system
ruft bash auf, die die Benutzer-IDs aufgrund ihrer Gleichheit beibehält und effektiv als frank arbeitet.
Ziel: Untersuchung der Interaktion zwischen setuid und execve.
Ausführung und Ergebnis:
Analyse:
ruid
bleibt 99, aber euid wird auf 1000 gesetzt, entsprechend der Wirkung von setuid.
C Code Beispiel 2 (Bash aufrufen):
Ausführung und Ergebnis:
Analyse:
Obwohl euid
durch setuid
auf 1000 gesetzt ist, setzt bash
euid
auf ruid
(99) zurück, da -p
fehlt.
C Code Beispiel 3 (Verwendung von bash -p):
Ausführung und Ergebnis:
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)