euid, ruid, suid
Reading time: 8 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
User Identification Variables
ruid: kitambulisho halisi cha mtumiaji kinamaanisha mtumiaji ambaye alianza mchakato.euid: Inajulikana kama kitambulisho cha mtumiaji kinachofanya kazi, inawakilisha utambulisho wa mtumiaji unaotumiwa na mfumo kubaini ruhusa za mchakato. Kwa ujumla,euidinafanana naruid, isipokuwa katika matukio kama utekelezaji wa binary ya SetUID, ambapoeuidinachukua utambulisho wa mmiliki wa faili, hivyo kutoa ruhusa maalum za uendeshaji.suid: Hii ni kitambulisho kilichohifadhiwa cha mtumiaji na ni muhimu wakati mchakato wa juu wa ruhusa (kwa kawaida unafanya kazi kama root) unahitaji kuachilia ruhusa zake kwa muda ili kutekeleza kazi fulani, kisha baadaye kurejesha hadhi yake ya juu ya awali.
Important Note
Mchakato usiokuwa chini ya root unaweza kubadilisha euid yake tu ili ifanane na ruid, euid, au suid ya sasa.
Understanding set*uid Functions
setuid: Kinyume na dhana za awali,setuidkwa msingi hubadilishaeuidbadala yaruid. Kwa hakika, kwa michakato yenye ruhusa, inalinganisharuid,euid, nasuidna mtumiaji aliyeainishwa, mara nyingi root, kwa ufanisi ikimarisha vitambulisho hivi kutokana nasuidinayoshinda. Maelezo ya kina yanaweza kupatikana kwenye setuid man page.setreuidnasetresuid: Hizi ni kazi zinazoruhusu marekebisho ya kina yaruid,euid, nasuid. Hata hivyo, uwezo wao unategemea kiwango cha ruhusa za mchakato. Kwa michakato isiyo ya root, marekebisho yanakabiliwa na thamani za sasa zaruid,euid, nasuid. Kinyume chake, michakato ya root au zile zenye uwezo waCAP_SETUIDzinaweza kupewa thamani zisizo za kawaida kwa vitambulisho hivi. Maelezo zaidi yanaweza kupatikana kwenye setresuid man page na setreuid man page.
Hizi kazi zimeundwa si kama mekanismu ya usalama bali kusaidia mtiririko wa uendeshaji unaokusudiwa, kama vile wakati programu inachukua utambulisho wa mtumiaji mwingine kwa kubadilisha kitambulisho chake cha mtumiaji kinachofanya kazi.
Kwa kuzingatia, ingawa setuid inaweza kuwa chaguo la kawaida kwa ajili ya kuinua ruhusa hadi root (kwa kuwa inalinganisha vitambulisho vyote na root), kutofautisha kati ya hizi kazi ni muhimu kwa kuelewa na kudhibiti tabia za kitambulisho cha mtumiaji katika hali tofauti.
Program Execution Mechanisms in Linux
execve System Call
- Functionality:
execveinaanzisha programu, inayoamuliwa na hoja ya kwanza. Inachukua hoja mbili za array,argvkwa ajili ya hoja naenvpkwa ajili ya mazingira. - Behavior: Inahifadhi nafasi ya kumbukumbu ya mwitikiaji lakini inasasisha stack, heap, na sehemu za data. Msimbo wa programu unabadilishwa na programu mpya.
- User ID Preservation:
ruid,euid, na vitambulisho vya makundi ya ziada vinabaki bila kubadilika.euidinaweza kuwa na mabadiliko madogo ikiwa programu mpya ina SetUID bit iliyowekwa.suidinasasishwa kutokaeuidbaada ya utekelezaji.- Documentation: Maelezo ya kina yanaweza kupatikana kwenye
execveman page.
system Function
- Functionality: Kinyume na
execve,systeminaunda mchakato wa mtoto kwa kutumiaforkna inatekeleza amri ndani ya mchakato huo wa mtoto kwa kutumiaexecl. - Command Execution: Inatekeleza amri kupitia
shkwa kutumiaexecl("/bin/sh", "sh", "-c", command, (char *) NULL);. - Behavior: Kwa kuwa
execlni aina yaexecve, inafanya kazi kwa njia sawa lakini katika muktadha wa mchakato mpya wa mtoto. - Documentation: Maelezo zaidi yanaweza kupatikana kwenye
systemman page.
Behavior of bash and sh with SUID
bash:- Ina chaguo la
-plinaloathiri jinsieuidnaruidzinavyoshughulikiwa. - Bila
-p,bashinawekaeuidkuwaruidikiwa awali zinatofautiana. - Kwa
-p,euidya awali inahifadhiwa. - Maelezo zaidi yanaweza kupatikana kwenye
bashman page. sh:- Haina mekanismu inayofanana na
-pkatikabash. - Tabia inayohusiana na vitambulisho vya mtumiaji haijatajwa wazi, isipokuwa chini ya chaguo la
-i, ikisisitiza uhifadhi wa usawa waeuidnaruid. - Maelezo ya ziada yanapatikana kwenye
shman page.
Mekanismu hizi, tofauti katika uendeshaji wao, zinatoa anuwai ya chaguzi za kutekeleza na kubadilisha kati ya programu, huku zikiwa na tofauti maalum katika jinsi vitambulisho vya mtumiaji vinavyoshughulikiwa na kuhifadhiwa.
Testing User ID Behaviors in Executions
Examples taken from https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, check it for further information
Case 1: Using setuid with system
Objective: Understanding the effect of setuid in combination with system and bash as sh.
C Code:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Uundaji na Ruhusa:
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
Analysis:
ruidnaeuidhuanza kama 99 (nobody) na 1000 (frank) mtawalia.setuidinawalinganisha wote wawili kuwa 1000.systeminatekeleza/bin/bash -c idkutokana na symlink kutoka sh hadi bash.bash, bila-p, inarekebishaeuidili ifanane naruid, na kusababisha wote kuwa 99 (nobody).
Case 2: Using setreuid with system
C Code:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Uundaji na Ruhusa:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Utekelezaji na Matokeo:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analysis:
setreuidinafanya ruid na euid kuwa 1000.systeminaita bash, ambayo inahifadhi vitambulisho vya mtumiaji kutokana na usawa wao, ikifanya kazi kama frank.
Case 3: Using setuid with execve
Objective: Kuchunguza mwingiliano kati ya setuid na execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Utekelezaji na Matokeo:
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
Analysis:
ruidinabaki 99, lakini euid imewekwa kwa 1000, kulingana na athari ya setuid.
C Code Example 2 (Calling Bash):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Utekelezaji na Matokeo:
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
Analysis:
- Ingawa
euidimewekwa kuwa 1000 nasetuid,bashinarejesha euid kuwaruid(99) kutokana na ukosefu wa-p.
C Code Example 3 (Using 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;
}
Utekelezaji na Matokeo:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Marejeleo
tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
HackTricks