* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी कंपनी को **HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की आवश्यकता है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* खोजें [**The PEASS Family**](https://opensea.io/collection/the-peass-family), हमारा विशेष संग्रह [**NFTs**](https://opensea.io/collection/the-peass-family)
* प्राप्त करें [**आधिकारिक PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में या मुझे **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)** का** **अनुसरण** करें।**
* **अपने हैकिंग ट्रिक्स को [hacktricks रेपो](https://github.com/carlospolop/hacktricks) और [hacktricks-cloud रेपो](https://github.com/carlospolop/hacktricks-cloud) में पीआर जमा करके साझा करें।**
**यह पोस्ट** [**https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail**](https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail) **से कॉपी की गई है**
* **`ruid`**: यह प्रक्रिया का **वास्तविक उपयोगकर्ता आईडी** है जो प्रक्रिया को शुरू करता है।
* **`euid`**: यह **प्रभावी उपयोगकर्ता आईडी** है, जिसे प्रक्रिया के **प्रिविलेज का निर्धारण करने के लिए सिस्टम देखता है**। अधिकांश मामलों में, `euid``ruid` के समान होगा, लेकिन SetUID बाइनरी इसका उदाहरण है जहां वे अलग होते हैं। जब एक **SetUID** बाइनरी शुरू होता है, तो **`euid` फ़ाइल के मालिक के लिए सेट होता है**, जिससे इन बाइनरी को कार्य करने की अनुमति मिलती है।
*`suid`: यह **सहेजी गई उपयोगकर्ता आईडी** है, जब एक विशेषाधिकारी प्रक्रिया (अधिकांश मामलों में रूट के रूप में चल रही होती है) को **प्रिविलेज को कम करने** के लिए चाहिए, लेकिन फिर **प्रिविलेज स्थिति में वापस आने** की आवश्यकता होती है।
अगर एक **गैर-रूट प्रक्रिया** अपना **`euid` बदलना चाहती है**, तो वह केवल इसे **वर्तमान मानों** के रूप में **`ruid`**, **`euid`**, या **`suid`** में **सेट** कर सकती है।
पहली नजर में, यह आसान है कि सिस्टम कॉल **`setuid`** `ruid` को सेट करेगा। वास्तव में, एक विशेषाधिकारी प्रक्रिया के लिए, यह करता है। लेकिन सामान्य मामले में, यह वास्तव में **`euid` को सेट करता है**। [मैन पेज](https://man7.org/linux/man-pages/man2/setuid.2.html) से:
> setuid() **कॉल करने वाली प्रक्रिया की प्रभावी उपयोगकर्ता आईडी सेट करता है**। यदि कॉल करने वाली प्रक्रिया विशेषाधिकारी है (अधिक निश्चित रूप से: यदि प्रक्रिया में CAP\_SETUID क्षमता है उसके उपयोगकर्ता नेमस्पेस में), तो वास्तविक UID और सहेजी गई सेट-उपयोगकर्ता-आईडी भी सेट हो जाती हैं।
`सिस्टम` एक [पूरी तरह से अलग तरीके](https://man7.org/linux/man-pages/man3/system.3.html) से एक नया प्रक्रिया शुरू करने के लिए है। जहां `execve` एक ही प्रक्रिया के स्तर पर काम करता है, **`सिस्टम``fork` का उपयोग करके एक बच्चा प्रक्रिया बनाता है** और फिर उस बच्चा प्रक्रिया में `execl` का उपयोग करके निष्पादित करता है:
`execl` केवल `execve` के चारों ओर एक लपेट है जो स्ट्रिंग तर्कों को `argv` एरे में रूपांतरित करता है और `execve` को बुलाता है। यह महत्वपूर्ण है कि **`सिस्टम` कमांड को बुलाने के लिए `श` का उपयोग करता है**।
> _विशेषाधिकारित_ मोड को सक्षम करें। इस मोड में, **$ENV** और **$BASH\_ENV** फ़ाइलें प्रोसेस की स्थिति में नहीं होती हैं, शेल फ़ंक्शन वातानुकूलन से प्राप्त नहीं होती हैं, और यदि वे पर्याप्तता में हों, तो **SHELLOPTS**, **BASHOPTS**, **CDPATH**, और **GLOBIGNORE** चरित्रित करने वाले चरित्रों को अनदेखा कर दिया जाता है। यदि शेल वास्तविक उपयोगकर्ता (समूह) आईडी के समान नहीं होती है और **-p विकल्प नहीं दिया गया हो**, तो ये कार्रवाई ली जाती है और **प्रभावी उपयोगकर्ता आईडी को वास्तविक उपयोगकर्ता आईडी पर सेट किया जाता है**। यदि **-p** विकल्प **प्रारंभ में दिया जाता है**, तो **प्रभावी उपयोगकर्ता आईडी रीसेट नहीं होती है**। इस विकल्प को बंद करने से प्रभावी उपयोगकर्ता और समूह आईडी वास्तविक उपयोगकर्ता और समूह आईडी पर सेट किए जाते हैं।
**`श`** शेल **इस तरह की कोई सुविधा नहीं है**। [मैन पेज](https://man7.org/linux/man-pages/man1/sh.1p.html) में "उपयोगकर्ता आईडी" के बारे में उल्लेख नहीं है, केवल `-i` विकल्प के साथ, जो कहता है:
> \-i यह निर्दिष्ट करें कि शेल इंटरैक्टिव है; नीचे देखें। यदि वास्तविक प्रक्रिया की वास्तविक उपयोगकर्ता आईडी वास्तविक उपयोगकर्ता आईडी के बराबर नहीं होती है या यदि वास्तविक समूह आईडी वास्तविक समूह आईडी के बराबर नहीं होती है, तो कॉल करने वाले प्रक्रिया के लिए -i विकल्प निर्दिष्ट करने को एक त्रुटि मान सकता है।
यह प्रोग्राम `ruid` के साथ शुरू होता है जिसका मान 99 (कोई नहीं) है और `euid` के साथ जिसका मान 1000 (फ्रैंक) है। जब यह `setuid` कॉल तक पहुंचता है, तो उनी ही मानों को सेट किया जाता है।
फिर `system` कॉल होता है, और मैं 99 के `uid` को देखने की उम्मीद करूंगा, लेकिन एक `euid` के साथ भी 1000 को देखने की उम्मीद होगी। फिर एक नहीं होता है? समस्या यह है कि इस वितरण में **`sh` को `bash` से संकेतित किया जाता है**:
इसलिए `system``/bin/sh sh -c id` को कॉल करता है, जो कि वास्तव में `/bin/bash bash -c id` है। जब `bash` को बिना `-p` के कॉल किया जाता है, तो यह 99 का `ruid` और 1000 का `euid` देखता है, और `euid` को 99 पर सेट कर देता है।
यदि मेरा उपरोक्त समझ सही है, तो मुझे uids को गलत करने की चिंता नहीं करनी चाहिए, बल्कि `execve` को कॉल करना चाहिए, क्योंकि यह मौजूदा IDs को ले जाएगा। यह काम करेगा, लेकिन यहां छाप हैं। उदाहरण के लिए, सामान्य कोड इस तरह दिख सकता है:
यदि मैं पर्यावरण को छोड़ दूँ (सरलता के लिए मैं NULL पास कर रहा हूँ), तो मुझे `id` पर पूरा पथ चाहिए होगा। यह काम करता है, और मुझे वही मिलता है जो मैं उम्मीद कर रहा हूँ:
यदि यह `setuid(0)` होता, तो यह ठीक काम करता (मान लें कि प्रक्रिया को उसे करने की अनुमति होती है), क्योंकि फिर यह तीनों आईडी को 0 पर बदल देता है। लेकिन एक गैर-रूट उपयोगकर्ता के रूप में, यह केवल `euid` को 1000 (जो पहले से ही था) सेट करता है, और फिर `sh` को कॉल करता है। लेकिन जेल पर `bash``sh` होता है। और जब `bash``ruid` 99 और `euid` 1000 के साथ शुरू होता है, तो यह `euid` को फिर से 99 पर छोड़ देगा।
* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी कंपनी को **HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की इच्छा है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* खोजें [**The PEASS Family**](https://opensea.io/collection/the-peass-family), हमारा विशेष [**NFT**](https://opensea.io/collection/the-peass-family) संग्रह।
* प्राप्त करें [**आधिकारिक PEASS और HackTricks swag**](https://peass.creator-spring.com)
* **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या मुझे **ट्विटर** पर **फ़ॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **अपने हैकिंग ट्रिक्स साझा करें, [hacktricks रेपो](https://github.com/carlospolop/hacktricks) और [hacktricks-cloud रेपो](https://github.com/carlospolop/hacktricks-cloud) में पीआर जमा करके।**