euid, ruid, suid
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Zmienne identyfikacji użytkownika
ruid: rzeczywisty identyfikator użytkownika oznacza użytkownika, który zainicjował proces.euid: Znany jako efektywny identyfikator użytkownika, reprezentuje tożsamość użytkownika wykorzystywaną przez system do ustalania uprawnień procesu. Zazwyczajeuidodzwierciedlaruid, z wyjątkiem przypadków takich jak wykonanie binarnego pliku SetUID, gdzieeuidprzyjmuje tożsamość właściciela pliku, co przyznaje określone uprawnienia operacyjne.suid: Ten zapisany identyfikator użytkownika jest kluczowy, gdy proces o wysokich uprawnieniach (zwykle działający jako root) musi tymczasowo zrezygnować ze swoich uprawnień, aby wykonać określone zadania, a następnie odzyskać swoje początkowe podwyższone status.
Ważna uwaga
Proces, który nie działa jako root, może zmodyfikować swój euid tylko tak, aby odpowiadał bieżącemu ruid, euid lub suid.
Zrozumienie funkcji set*uid
setuid: W przeciwieństwie do początkowych założeń,setuidprzede wszystkim modyfikujeeuid, a nieruid. Konkretnie, dla procesów z uprawnieniami, synchronizujeruid,euidisuidz określonym użytkownikiem, często root, skutecznie utrwalając te identyfikatory dzięki dominującemusuid. Szczegółowe informacje można znaleźć w stronie podręcznika setuid.setreuidisetresuid: Te funkcje pozwalają na subtelną regulacjęruid,euidisuid. Jednak ich możliwości są uzależnione od poziomu uprawnień procesu. Dla procesów niebędących root, modyfikacje są ograniczone do bieżących wartościruid,euidisuid. W przeciwieństwie do tego, procesy root lub te z uprawnieniemCAP_SETUIDmogą przypisywać dowolne wartości tym identyfikatorom. Więcej informacji można znaleźć na stronie podręcznika setresuid oraz stronie podręcznika setreuid.
Funkcjonalności te nie są zaprojektowane jako mechanizm zabezpieczający, lecz mają na celu ułatwienie zamierzonego przepływu operacyjnego, na przykład, gdy program przyjmuje tożsamość innego użytkownika, zmieniając swój efektywny identyfikator użytkownika.
Warto zauważyć, że chociaż setuid może być powszechnie stosowane do podnoszenia uprawnień do roota (ponieważ synchronizuje wszystkie identyfikatory z root), rozróżnienie między tymi funkcjami jest kluczowe dla zrozumienia i manipulowania zachowaniami identyfikatorów użytkowników w różnych scenariuszach.
Mechanizmy wykonywania programów w Linuxie
Wywołanie systemowe execve
- Funkcjonalność:
execveinicjuje program, określony przez pierwszy argument. Przyjmuje dwa argumenty tablicowe,argvdla argumentów ienvpdla środowiska. - Zachowanie: Zachowuje przestrzeń pamięci wywołującego, ale odświeża stos, stertę i segmenty danych. Kod programu jest zastępowany przez nowy program.
- Zachowanie identyfikatora użytkownika:
ruid,euidi dodatkowe identyfikatory grupowe pozostają niezmienione.euidmoże mieć subtelne zmiany, jeśli nowy program ma ustawiony bit SetUID.suidjest aktualizowany zeuidpo wykonaniu.- Dokumentacja: Szczegółowe informacje można znaleźć na stronie podręcznika
execve.
Funkcja system
- Funkcjonalność: W przeciwieństwie do
execve,systemtworzy proces potomny za pomocąforki wykonuje polecenie w tym procesie potomnym za pomocąexecl. - Wykonanie polecenia: Wykonuje polecenie za pośrednictwem
shzexecl("/bin/sh", "sh", "-c", command, (char *) NULL);. - Zachowanie: Ponieważ
execljest formąexecve, działa podobnie, ale w kontekście nowego procesu potomnego. - Dokumentacja: Dalsze informacje można uzyskać z strony podręcznika
system.
Zachowanie bash i sh z SUID
bash:- Ma opcję
-p, która wpływa na to, jak traktowane sąeuidiruid. - Bez
-p,bashustawiaeuidnaruid, jeśli początkowo się różnią. - Z
-p, początkowyeuidjest zachowywany. - Więcej szczegółów można znaleźć na stronie podręcznika
bash. sh:- Nie posiada mechanizmu podobnego do
-pwbash. - Zachowanie dotyczące identyfikatorów użytkowników nie jest wyraźnie wspomniane, z wyjątkiem opcji
-i, podkreślającej zachowanie równościeuidiruid. - Dodatkowe informacje są dostępne na stronie podręcznika
sh.
Te mechanizmy, różniące się w swoim działaniu, oferują wszechstronny zakres opcji do wykonywania i przechodzenia między programami, z określonymi niuansami w zarządzaniu i zachowywaniu identyfikatorów użytkowników.
Testowanie zachowań identyfikatorów użytkowników w wykonaniach
Przykłady zaczerpnięte z https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, sprawdź to dla dalszych informacji
Przypadek 1: Użycie setuid z system
Cel: Zrozumienie wpływu setuid w połączeniu z system i bash jako sh.
Kod C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Kompilacja i uprawnienia:
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
Analiza:
ruidieuidzaczynają jako 99 (nikt) i 1000 (frank) odpowiednio.setuidustawia oba na 1000.systemwykonuje/bin/bash -c idz powodu symlink z sh do bash.bash, bez-p, dostosowujeeuiddoruid, co skutkuje tym, że oba są 99 (nikt).
Przypadek 2: Użycie setreuid z system
Kod C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Kompilacja i uprawnienia:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Wykonanie i wynik:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analiza:
setreuidustawia zarówno ruid, jak i euid na 1000.systemwywołuje bash, który utrzymuje identyfikatory użytkowników z powodu ich równości, skutecznie działając jako frank.
Przypadek 3: Użycie setuid z execve
Cel: Badanie interakcji między setuid a execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Wykonanie i wynik:
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
Analiza:
ruidpozostaje 99, ale euid jest ustawiony na 1000, zgodnie z efektem setuid.
Przykład kodu C 2 (Wywołanie Bash):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Wykonanie i wynik:
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
Analiza:
- Chociaż
euidjest ustawione na 1000 przezsetuid,bashresetuje euid doruid(99) z powodu braku-p.
Przykład kodu C 3 (Używając 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;
}
Wykonanie i wynik:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Odniesienia
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

