euid, ruid, suid
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Benutzeridentifikationsvariablen
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 spiegelteuidruidwider, mit Ausnahme von Fällen wie der Ausführung einer SetUID-Binärdatei, bei dereuiddie 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 abgeben muss, um bestimmte Aufgaben auszuführen, um später seinen ursprünglichen erhöhten Status wiederzuerlangen.
Wichtiger Hinweis
Ein Prozess, der nicht unter root läuft, kann seine euid nur so ändern, dass sie mit der aktuellen ruid, euid oder suid übereinstimmt.
Verständnis der set*uid-Funktionen
setuid: Entgegen anfänglicher Annahmen ändertsetuidhauptsächlicheuidund nichtruid. Insbesondere für privilegierte Prozesse richtet esruid,euidundsuidauf den angegebenen Benutzer, oft root, aus und festigt diese IDs aufgrund des übergeordnetensuid. Detaillierte Informationen sind in der setuid man page zu finden.setreuidundsetresuid: Diese Funktionen ermöglichen die nuancierte Anpassung vonruid,euidundsuid. Ihre Möglichkeiten hängen jedoch vom Privilegienniveau des Prozesses ab. Für Nicht-Root-Prozesse sind Änderungen auf die aktuellen Werte vonruid,euidundsuidbeschränkt. Im Gegensatz dazu können Root-Prozesse oder solche mit derCAP_SETUID-Berechtigung beliebige Werte für diese IDs zuweisen. Weitere Informationen sind in der setresuid man page und der setreuid man page zu finden.
Diese Funktionen sind nicht als Sicherheitsmechanismus konzipiert, sondern um den beabsichtigten Betriebsablauf zu erleichtern, wie 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ängiges Mittel zur Erhöhung der Privilegien auf root sein kann (da es alle IDs auf root ausrichtet), das Unterscheiden zwischen diesen Funktionen entscheidend ist, um das Verhalten der Benutzer-IDs in unterschiedlichen Szenarien zu verstehen und zu manipulieren.
Programmausführungsmechanismen in Linux
execve Systemaufruf
- Funktionalität:
execvestartet ein Programm, das durch das erste Argument bestimmt wird. Es nimmt zwei Array-Argumente,argvfür Argumente undenvpfü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,euidund zusätzliche Gruppen-IDs bleiben unverändert.euidkann nuancierte Änderungen aufweisen, wenn das neue Programm das SetUID-Bit gesetzt hat.suidwird nach der Ausführung voneuidaktualisiert.- Dokumentation: Detaillierte Informationen sind auf der
execveman page zu finden.
system Funktion
- Funktionalität: Im Gegensatz zu
execveerstelltsystemeinen Kindprozess mitforkund führt einen Befehl innerhalb dieses Kindprozesses mitexeclaus. - Befehlsausführung: Führt den Befehl über
shmitexecl("/bin/sh", "sh", "-c", command, (char *) NULL);aus. - Verhalten: Da
execleine Form vonexecveist, funktioniert es ähnlich, jedoch im Kontext eines neuen Kindprozesses. - Dokumentation: Weitere Einblicke sind in der
systemman page zu erhalten.
Verhalten von bash und sh mit SUID
bash:- Hat eine
-p-Option, die beeinflusst, wieeuidundruidbehandelt werden. - Ohne
-psetztbasheuidaufruid, wenn sie anfangs unterschiedlich sind. - Mit
-pwird das ursprünglicheeuidbeibehalten. - Weitere Details sind auf der
bashman page zu finden. sh:- Verfügt nicht über einen Mechanismus ähnlich der
-p-Option inbash. - Das Verhalten bezüglich der Benutzer-IDs wird nicht ausdrücklich erwähnt, außer unter der
-i-Option, die die Erhaltung der Gleichheit voneuidundruidbetont. - Zusätzliche Informationen sind auf der
shman page 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.
Testen des Benutzer-ID-Verhaltens in Ausführungen
Beispiele entnommen von https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, überprüfen Sie es für weitere Informationen
Fall 1: Verwendung von setuid mit system
Ziel: Verständnis der Auswirkungen von setuid in Kombination mit system und bash als sh.
C-Code:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Kompilierung und Berechtigungen:
oxdf@hacky$ gcc a.c -o /mnt/nfsshare/a;
oxdf@hacky$ chmod 4755 /mnt/nfsshare/a
bash-4.2$ $ ./a
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analyse:
ruidundeuidbeginnen als 99 (nobody) und 1000 (frank) respektive.setuidrichtet beide auf 1000 aus.systemführt/bin/bash -c idaus, aufgrund des Symlinks von sh zu bash.bash, ohne-p, passteuidanruidan, was dazu führt, dass beide 99 (nobody) sind.
Fall 2: Verwendung von setreuid mit system
C Code:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Kompilierung und Berechtigungen:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Ausführung und Ergebnis:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analyse:
setreuidsetzt sowohl ruid als auch euid auf 1000.systemruft bash auf, die die Benutzer-IDs aufgrund ihrer Gleichheit beibehält und effektiv als frank fungiert.
Fall 3: Verwendung von setuid mit execve
Ziel: Untersuchung der Interaktion zwischen setuid und execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Ausführung und Ergebnis:
bash-4.2$ $ ./c
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analyse:
ruidbleibt 99, aber euid wird auf 1000 gesetzt, entsprechend der Wirkung von setuid.
C Code Beispiel 2 (Bash aufrufen):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Ausführung und Ergebnis:
bash-4.2$ $ ./d
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analyse:
- Obwohl
euiddurchsetuidauf 1000 gesetzt ist, setztbasheuidaufruid(99) zurück, da-pfehlt.
C Code Beispiel 3 (Verwendung von bash -p):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
char *const paramList[10] = {"/bin/bash", "-p", NULL};
setuid(1000);
execve(paramList[0], paramList, NULL);
return 0;
}
Ausführung und Ergebnis:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Referenzen
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks

