euid, ruid, suid
Reading time: 7 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)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
User Identification Variables
ruid
: kitambulisho halisi cha mtumiaji kinamaanisha mtumiaji aliyeanzisha mchakato.euid
: Inajulikana kama kitambulisho cha mtumiaji kinachofanya kazi, kinawakilisha utambulisho wa mtumiaji unaotumiwa na mfumo kubaini ruhusa za mchakato. Kwa ujumla,euid
inafanana naruid
, isipokuwa katika matukio kama utekelezaji wa binary ya SetUID, ambapoeuid
inachukua utambulisho wa mmiliki wa faili, hivyo kutoa ruhusa maalum za uendeshaji.suid
: Huu kitambulisho kilichohifadhiwa cha mtumiaji ni muhimu wakati mchakato wa kiwango cha juu (kawaida ukifanya kazi kama root) unahitaji kuachana kwa muda na ruhusa zake ili kutekeleza kazi fulani, kisha baadaye kurejesha hadhi yake ya juu ya awali.
Important Note
Mchakato usiokuwa chini ya root unaweza kubadilisha euid
yake ili ifanane na ruid
, euid
, au suid
ya sasa tu.
Understanding set*uid Functions
setuid
: Kinyume na dhana za awali,setuid
hasa inabadilishaeuid
badala yaruid
. Kwa mchakato wenye ruhusa, inalinganisharuid
,euid
, nasuid
na mtumiaji aliyeainishwa, mara nyingi root, kwa ufanisi inaimarisha vitambulisho hivi kutokana nasuid
inayoshinda. Maelezo ya kina yanaweza kupatikana kwenye setuid man page.setreuid
nasetresuid
: Hizi kazi zinaruhusu 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_SETUID
zinaweza 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 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:
execve
inaanzisha programu, inayoamuliwa na hoja ya kwanza. Inachukua hoja mbili za array,argv
kwa ajili ya hoja naenvp
kwa 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.euid
inaweza kuwa na mabadiliko madogo ikiwa programu mpya ina SetUID bit iliyowekwa.suid
inasasishwa kutokaeuid
baada ya utekelezaji.- Documentation: Maelezo ya kina yanaweza kupatikana kwenye
execve
man page.
system
Function
- Functionality: Kinyume na
execve
,system
inaunda mchakato wa mtoto kwa kutumiafork
na inatekeleza amri ndani ya mchakato huo wa mtoto kwa kutumiaexecl
. - Command Execution: Inatekeleza amri kupitia
sh
kwaexecl("/bin/sh", "sh", "-c", command, (char *) NULL);
. - Behavior: Kwa kuwa
execl
ni aina yaexecve
, inafanya kazi kwa njia sawa lakini katika muktadha wa mchakato mpya wa mtoto. - Documentation: Maelezo zaidi yanaweza kupatikana kwenye
system
man page.
Behavior of bash
and sh
with SUID
bash
:- Ina chaguo la
-p
linaloathiri jinsieuid
naruid
zinavyoshughulikiwa. - Bila
-p
,bash
inabadilishaeuid
kuwaruid
ikiwa awali zinatofautiana. - Kwa
-p
,euid
ya awali inahifadhiwa. - Maelezo zaidi yanaweza kupatikana kwenye
bash
man page. sh
:- Haina mekanismu inayofanana na
-p
katikabash
. - Tabia kuhusu vitambulisho vya mtumiaji haijatajwa wazi, isipokuwa chini ya chaguo la
-i
, ikisisitiza uhifadhi wa usawa waeuid
naruid
. - Maelezo ya ziada yanapatikana kwenye
sh
man 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
Mifano imechukuliwa kutoka https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, angalia kwa maelezo zaidi
Case 1: Using setuid
with system
Objective: Kuelewa athari ya setuid
kwa pamoja na system
na bash
kama 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:
ruid
naeuid
huanza kama 99 (nobody) na 1000 (frank) mtawalia.setuid
inawalinganisha wote kuwa 1000.system
inatekeleza/bin/bash -c id
kutokana na symlink kutoka sh hadi bash.bash
, bila-p
, inarekebishaeuid
ili 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
Uchambuzi:
setreuid
inaweka ruid na euid zote mbili kuwa 1000.system
inaita bash, ambayo inashikilia vitambulisho vya mtumiaji kutokana na usawa wao, ikifanya kazi kama frank.
Kesi ya 3: Kutumia setuid na execve
Lengo: 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
Uchambuzi:
ruid
inabaki 99, lakini euid imewekwa kwa 1000, kulingana na athari ya setuid.
Mfano wa Kode ya C 2 (Kuita 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
Uchambuzi:
- Ingawa
euid
imewekwa kuwa 1000 nasetuid
,bash
inarejesha euid kuwaruid
(99) kutokana na ukosefu wa-p
.
Mfano wa Kode ya C 3 (Kutumia 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)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.