euid, ruid, suid
Reading time: 8 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
User Identification Variables
ruid
: वास्तविक उपयोगकर्ता आईडी उस उपयोगकर्ता को दर्शाता है जिसने प्रक्रिया शुरू की।euid
: प्रभावी उपयोगकर्ता आईडी के रूप में जाना जाता है, यह उस उपयोगकर्ता पहचान का प्रतिनिधित्व करता है जिसका उपयोग प्रणाली प्रक्रिया के विशेषाधिकारों का निर्धारण करने के लिए करती है। सामान्यतः,euid
ruid
के समान होता है, सिवाय उन मामलों के जैसे कि SetUID बाइनरी निष्पादन, जहांeuid
फ़ाइल के मालिक की पहचान ग्रहण करता है, इस प्रकार विशिष्ट संचालन अनुमतियों को प्रदान करता है।suid
: यह सहेजी गई उपयोगकर्ता आईडी महत्वपूर्ण है जब एक उच्च-विशेषाधिकार प्रक्रिया (आमतौर पर रूट के रूप में चल रही) को कुछ कार्य करने के लिए अस्थायी रूप से अपने विशेषाधिकारों को छोड़ने की आवश्यकता होती है, केवल बाद में अपनी प्रारंभिक ऊंची स्थिति को पुनः प्राप्त करने के लिए।
Important Note
एक प्रक्रिया जो रूट के तहत कार्य नहीं कर रही है, केवल अपने euid
को वर्तमान ruid
, euid
, या suid
के साथ मेल करने के लिए संशोधित कर सकती है।
Understanding set*uid Functions
setuid
: प्रारंभिक धारणाओं के विपरीत,setuid
मुख्य रूप सेeuid
को संशोधित करता है न किruid
। विशेष रूप से, विशेषाधिकार प्राप्त प्रक्रियाओं के लिए, यहruid
,euid
, औरsuid
को निर्दिष्ट उपयोगकर्ता, अक्सर रूट, के साथ संरेखित करता है, प्रभावी रूप से इन आईडी कोsuid
द्वारा ओवरराइड करके मजबूत करता है। विस्तृत जानकारी setuid मैन पेज पर मिल सकती है।setreuid
औरsetresuid
: ये कार्यruid
,euid
, औरsuid
के सूक्ष्म समायोजन की अनुमति देते हैं। हालाँकि, उनकी क्षमताएँ प्रक्रिया के विशेषाधिकार स्तर पर निर्भर करती हैं। गैर-रूट प्रक्रियाओं के लिए, संशोधन वर्तमानruid
,euid
, औरsuid
के मानों तक सीमित हैं। इसके विपरीत, रूट प्रक्रियाएँ या वे जिनके पासCAP_SETUID
क्षमता है, इन आईडी को मनमाने मान सौंप सकती हैं। अधिक जानकारी setresuid मैन पेज और setreuid मैन पेज से प्राप्त की जा सकती है।
ये कार्यक्षमताएँ सुरक्षा तंत्र के रूप में नहीं बल्कि अपेक्षित संचालन प्रवाह को सुविधाजनक बनाने के लिए डिज़ाइन की गई हैं, जैसे कि जब एक प्रोग्राम दूसरे उपयोगकर्ता की पहचान को अपने प्रभावी उपयोगकर्ता आईडी को बदलकर अपनाता है।
विशेष रूप से, जबकि setuid
रूट के लिए विशेषाधिकार वृद्धि के लिए एक सामान्य विकल्प हो सकता है (क्योंकि यह सभी आईडी को रूट के साथ संरेखित करता है), इन कार्यों के बीच भेद करना विभिन्न परिदृश्यों में उपयोगकर्ता आईडी व्यवहार को समझने और हेरफेर करने के लिए महत्वपूर्ण है।
Program Execution Mechanisms in Linux
execve
System Call
- Functionality:
execve
एक प्रोग्राम शुरू करता है, जो पहले तर्क द्वारा निर्धारित होता है। यह दो ऐरे तर्क लेता है,argv
तर्कों के लिए औरenvp
वातावरण के लिए। - Behavior: यह कॉलर की मेमोरी स्पेस को बनाए रखता है लेकिन स्टैक, हीप, और डेटा सेगमेंट को ताज़ा करता है। प्रोग्राम का कोड नए प्रोग्राम द्वारा प्रतिस्थापित किया जाता है।
- User ID Preservation:
ruid
,euid
, और अतिरिक्त समूह आईडी अपरिवर्तित रहते हैं।- यदि नए प्रोग्राम में SetUID बिट सेट है तो
euid
में सूक्ष्म परिवर्तन हो सकते हैं। - निष्पादन के बाद
suid
कोeuid
से अपडेट किया जाता है। - Documentation: विस्तृत जानकारी
execve
मैन पेज पर मिल सकती है।
system
Function
- Functionality:
execve
के विपरीत,system
एक बच्चे की प्रक्रिया बनाता है जिसका उपयोगfork
करता है और उस बच्चे की प्रक्रिया के भीतर एक कमांड निष्पादित करता है जिसका उपयोगexecl
करता है। - Command Execution: कमांड को
sh
के माध्यम से निष्पादित करता हैexecl("/bin/sh", "sh", "-c", command, (char *) NULL);
का उपयोग करके। - Behavior: चूंकि
execl
execve
का एक रूप है, यह समान रूप से कार्य करता है लेकिन एक नए बच्चे की प्रक्रिया के संदर्भ में। - Documentation: आगे की जानकारी
system
मैन पेज से प्राप्त की जा सकती है।
Behavior of bash
and sh
with SUID
bash
:- इसका एक
-p
विकल्प है जोeuid
औरruid
के साथ व्यवहार को प्रभावित करता है। - बिना
-p
के,bash
euid
कोruid
पर सेट करता है यदि वे प्रारंभ में भिन्न होते हैं। -p
के साथ, प्रारंभिकeuid
को संरक्षित किया जाता है।- अधिक विवरण
bash
मैन पेज पर मिल सकते हैं। sh
:bash
में-p
के समान कोई तंत्र नहीं है।- उपयोगकर्ता आईडी के संबंध में व्यवहार स्पष्ट रूप से उल्लेखित नहीं है, सिवाय
-i
विकल्प के, जोeuid
औरruid
की समानता को बनाए रखने पर जोर देता है। - अतिरिक्त जानकारी
sh
मैन पेज पर उपलब्ध है।
ये तंत्र, अपने संचालन में भिन्न, प्रोग्रामों को निष्पादित करने और उनके बीच संक्रमण के लिए विकल्पों की एक बहुपरकारी श्रृंखला प्रदान करते हैं, जिसमें उपयोगकर्ता आईडी के प्रबंधन और संरक्षण में विशिष्ट सूक्ष्मताएँ होती हैं।
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;
}
संकलन और अनुमतियाँ:
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
विश्लेषण:
ruid
औरeuid
क्रमशः 99 (कोई नहीं) और 1000 (फ्रैंक) के रूप में शुरू होते हैं।setuid
दोनों को 1000 पर संरेखित करता है।system
/bin/bash -c id
को निष्पादित करता है क्योंकि sh से bash के लिए symlink है।bash
, बिना-p
के,euid
कोruid
के साथ मेल खाने के लिए समायोजित करता है, जिसके परिणामस्वरूप दोनों 99 (कोई नहीं) हो जाते हैं।
मामला 2: सिस्टम के साथ setreuid का उपयोग
C कोड:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
संकलन और अनुमतियाँ:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
निष्पादन और परिणाम:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
विश्लेषण:
setreuid
दोनों ruid और euid को 1000 पर सेट करता है।system
bash को सक्रिय करता है, जो उनकी समानता के कारण उपयोगकर्ता आईडी को बनाए रखता है, प्रभावी रूप से frank के रूप में कार्य करता है।
मामला 3: execve के साथ setuid का उपयोग करना
उद्देश्य: setuid और execve के बीच बातचीत का अन्वेषण करना।
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
निष्पादन और परिणाम:
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
विश्लेषण:
ruid
99 पर बना रहता है, लेकिन euid 1000 पर सेट किया गया है, जो setuid के प्रभाव के अनुरूप है।
C कोड उदाहरण 2 (Bash को कॉल करना):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
निष्पादन और परिणाम:
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
विश्लेषण:
- हालाँकि
euid
कोsetuid
द्वारा 1000 पर सेट किया गया है,bash
-p
की अनुपस्थिति के कारणeuid
कोruid
(99) पर रीसेट कर देता है।
C कोड उदाहरण 3 (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;
}
निष्पादन और परिणाम:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
संदर्भ
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।