euid, ruid, suid
Reading time: 9 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:
HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
User Identification Variables
ruid: वास्तविक उपयोगकर्ता आईडी उस उपयोगकर्ता को दर्शाता है जिसने प्रक्रिया शुरू की।euid: प्रभावी उपयोगकर्ता आईडी के रूप में जाना जाता है, यह उस उपयोगकर्ता पहचान का प्रतिनिधित्व करता है जिसका उपयोग प्रणाली प्रक्रिया के विशेषाधिकारों का निर्धारण करने के लिए करती है। सामान्यतः,euidruidके समान होता है, सिवाय उन मामलों के जैसे कि 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: चूंकि
execlexecveका एक रूप है, यह समान रूप से कार्य करता है लेकिन एक नए बच्चे की प्रक्रिया के संदर्भ में। - Documentation: आगे की जानकारी
systemमैन पेज से प्राप्त की जा सकती है।
Behavior of bash and sh with SUID
bash:- इसका एक
-pविकल्प है जोeuidऔरruidके साथ व्यवहार को प्रभावित करता है। - बिना
-pके,basheuidको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 पर सेट करता है।systembash को सक्रिय करता है, जो उनकी समानता के कारण उपयोगकर्ता आईडी को बनाए रखता है, प्रभावी रूप से 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
विश्लेषण:
ruid99 पर बना रहता है, लेकिन 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)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
HackTricks