euid, ruid, suid

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Gebruikersidentifikasie Veranderlikes

  • ruid: Die werklike gebruikers-ID dui die gebruiker aan wat die proses geïnisieer het.

  • euid: Bekend as die effektiewe gebruikers-ID, verteenwoordig dit die gebruikersidentiteit wat deur die stelsel gebruik word om prosesbevoegdhede te bepaal. Gewoonlik weerspieël euid ruid, behalwe in gevalle soos 'n SetUID-binêre uitvoering, waar euid die identiteit van die lêereienaar aanneem en dus spesifieke bedryfsbevoegdhede verleen.

  • suid: Hierdie gebergde gebruikers-ID is van kardinale belang wanneer 'n hoë-bevoegdheidsproses (gewoonlik as root uitgevoer) tydelik sy bevoegdhede moet opgee om sekere take uit te voer, slegs om later sy oorspronklike verhoogde status te herwin.

Belangrike Nota

'n Proses wat nie as root werk nie, kan slegs sy euid wysig om ooreen te stem met die huidige ruid, euid of suid.

Begrip van set*uid Funksies

  • setuid: In teenstelling met aanvanklike aannames, wysig setuid hoofsaaklik euid eerder as ruid. Spesifiek vir bevoorregte prosesse stem dit ruid, euid en suid af op die gespesifiseerde gebruiker, dikwels root, en versterk sodoende hierdie ID's as gevolg van die oorskrywing van suid. Gedetailleerde insigte is beskikbaar in die setuid man-bladsy.

  • setreuid en setresuid: Hierdie funksies maak die fynafstelling van ruid, euid en suid moontlik. Hul vermoëns is egter afhanklik van die bevoorregtingsvlak van die proses. Vir nie-root prosesse is wysigings beperk tot die huidige waardes van ruid, euid en suid. Daarenteen kan rootprosesse of dié met die CAP_SETUID-vermoë arbitêre waardes aan hierdie ID's toewys. Meer inligting is beskikbaar in die setresuid man-bladsy en die setreuid man-bladsy.

Hierdie funksionaliteite is nie ontwerp as 'n sekuriteitsmeganisme nie, maar om die bedoelde bedryfsvloei te fasiliteer, soos wanneer 'n program 'n ander gebruiker se identiteit aanneem deur sy effektiewe gebruikers-ID te verander.

Dit is veral belangrik om te onderskei tussen hierdie funksies om gebruikers-ID-gedrag in verskillende scenario's te verstaan en te manipuleer, alhoewel setuid dikwels gebruik word vir bevoorregte verhoging na root (aangesien dit alle ID's op root afstem).

Programuitvoeringsmeganismes in Linux

execve-Stelseloproep

  • Funksionaliteit: execve inisieer 'n program wat bepaal word deur die eerste argument. Dit neem twee reeksargumente, argv vir argumente en envp vir die omgewing.

  • Gedrag: Dit behou die geheue van die oproeper, maar verfris die stapel, heap en data-segmente. Die kode van die program word vervang deur die nuwe program.

  • Behoud van Gebruikers-ID:

  • ruid, euid en aanvullende groep-ID's bly onveranderd.

  • euid kan subtiel verander as die nuwe program die SetUID-bit ingestel het.

  • suid word na uitvoering van euid opgedateer.

  • Dokumentasie: Gedetailleerde inligting is beskikbaar op die execve man-bladsy.

system-Funksie

  • Funksionaliteit: In teenstelling met execve skep system 'n kinderproses deur fork te gebruik en voer 'n opdrag binne daardie kinderproses uit met behulp van execl.

  • Opdraguitvoering: Voer die opdrag uit via sh met execl("/bin/sh", "sh", "-c", opdrag, (char *) NULL);.

  • Gedrag: Aangesien execl 'n vorm van execve is, werk dit op 'n soortgelyke manier, maar in die konteks van 'n nuwe kinderproses.

  • Dokumentasie: Verdere insigte kan verkry word uit die system man-bladsy.

Gedrag van bash en sh met SUID

  • bash:

  • Het 'n -p-opsie wat beïnvloed hoe euid en ruid hanteer word.

  • Sonder -p stel bash euid in op ruid as hulle aanvanklik verskil.

  • Met -p word die aanvanklike euid behou.

  • Meer besonderhede is beskikbaar op die bash man-bladsy.

  • sh:

  • Besit nie 'n meganisme soortgelyk aan -p in bash nie.

  • Die gedrag met betrekking tot gebruikers-ID's word nie uitdruklik genoem nie, behalwe onder die -i-opsie, wat beklemtoon dat euid en ruid gelyk bly.

  • Addisionele inligting is beskikbaar op die sh man-bladsy.

Hierdie meganismes, wat verskil in hul werking, bied 'n veelsydige reeks opsies vir die uitvoering en oorgang tussen programme, met spesifieke subtiliteite in hoe gebruikers-ID's bestuur en behou word.

Toetsing van Gebruikers-ID-Gedrag in Uitvoerings

Voorbeelde geneem vanaf https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, kyk dit vir verdere inligting

Geval 1: Gebruik van setuid met system

Doel: Begrip van die effek van setuid in kombinasie met system en bash as sh.

C-kode:

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>

int main(void) {
setuid(1000);
system("id");
return 0;
}

Samelewing en Toestemmings:

Wanneer jy 'n program op Linux samestel, word 'n uitvoerbare lêer geskep wat die program se kode bevat. Hierdie uitvoerbare lêer het spesifieke toestemmings wat bepaal wie die program kan uitvoer, wysig of lees.

Die toestemmings van 'n lêer kan gesien word deur die ls -l opdrag uit te voer. Die uitset sal iets soos die volgende wees:

-rwxr-xr-x 1 user group 12345 Jan 1 00:00 program

Die eerste karakter in die uitset (- in hierdie geval) dui aan dat dit 'n lêer is. As dit 'n d was, sou dit 'n gids wees. Die volgende drie karakters (rwx) dui die toestemmings van die eienaar van die lêer aan, die volgende drie karakters (r-x) dui die toestemmings van die groep aan, en die laaste drie karakters (r-x) dui die toestemmings van ander gebruikers aan.

Elke karakter in die toestemmingsreeks verteenwoordig 'n spesifieke toestemming:

  • r dui aan dat die lêer gelees kan word.

  • w dui aan dat die lêer gewysig kan word.

  • x dui aan dat die lêer uitgevoer kan word.

Om die toestemmings van 'n lêer te verander, kan die chmod opdrag gebruik word. Byvoorbeeld, chmod +x program sal die uitvoerbare toestemming aan die lêer toevoeg.

Dit is belangrik om die toestemmings van jou lêers korrek te konfigureer om die veiligheid van jou Linux-stelsel te verseker.

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

Ontleding:

  • ruid en euid begin as 99 (niemand) en 1000 (frank) onderskeidelik.

  • setuid pas beide aan na 1000.

  • system voer /bin/bash -c id uit as gevolg van die simboliese skakel van sh na bash.

  • bash, sonder -p, pas euid aan om ooreen te stem met ruid, wat beteken dat beide 99 (niemand) is.

Geval 2: Gebruik van setreuid met system

C-kode:

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>

int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}

Samelewing en Toestemmings:

Wanneer jy 'n program op Linux samestel, word 'n uitvoerbare lêer geskep wat die program se kode bevat. Hierdie uitvoerbare lêer het spesifieke toestemmings wat bepaal wie die program kan uitvoer, wysig of lees.

Die toestemmings van 'n lêer kan gesien word deur die ls -l opdrag uit te voer. Die uitset sal iets soos die volgende wees:

-rwxr-xr-x 1 user group 12345 Jan 1 00:00 program

Die eerste karakter in die uitset (- in hierdie geval) dui aan dat dit 'n lêer is. As dit 'n d was, sou dit 'n gids wees. Die volgende drie karakters (rwx) dui die toestemmings van die eienaar van die lêer aan, die volgende drie karakters (r-x) dui die toestemmings van die groep aan, en die laaste drie karakters (r-x) dui die toestemmings van ander gebruikers aan.

Elke karakter in die toestemmingsreeks verteenwoordig 'n spesifieke toestemming:

  • r dui aan dat die lêer gelees kan word.

  • w dui aan dat die lêer gewysig kan word.

  • x dui aan dat die lêer uitgevoer kan word.

Om die toestemmings van 'n lêer te verander, kan die chmod opdrag gebruik word. Byvoorbeeld, chmod +x program sal die uitvoerbare toestemming aan die lêer toevoeg.

Dit is belangrik om die toestemmings van jou lêers korrek te konfigureer om die veiligheid van jou Linux-stelsel te verseker.

oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b

Uitvoering en Resultaat:

bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0

Ontleding:

  • setreuid stel beide ruid en euid in op 1000.

  • system roep bash aan, wat de gebruikers-ID's behoudt vanwege hun gelijkheid, waardoor het effectief werkt als frank.

Geval 3: Gebruik van setuid met execve

Doel: Verkenning van de interactie tussen setuid en execve.

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>

int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}

Uitvoering en Resultaat:

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

Ontleding:

  • ruid bly 99, maar euid word ingestel op 1000, in lyn met die effek van setuid.

C-kode-voorbeeld 2 (Bash aanroep):

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>

int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}

Uitvoering en Resultaat:

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

Ontleding:

  • Alhoewel euid deur setuid na 1000 ingestel word, stel bash euid terug na ruid (99) as gevolg van die afwesigheid van -p.

C-kode-voorbeeld 3 (Met behulp van 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;
}

Uitvoering en Resultaat:

bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Last updated