क्या जावास्क्रिप्ट फ़ाइलों का विश्लेषण करने से रिमोट कोड निष्पादन हो सकता है?

May 08 2022
आज के ब्लॉग में, मैं आपको यह दिखाने जा रहा हूं कि कैसे जावास्क्रिप्ट फाइलों का विश्लेषण करने से अप्रतिबंधित अंतिम बिंदुओं तक पहुंच प्राप्त हो सकती है और यह समझने के लिए कि एप्लिकेशन इससे कैसे निपटता है। मैं आपको यह भी दिखाने वाला हूँ कि कैसे मैंने ASP में RCE प्राप्त करने के लिए 2 फ़ाइल अपलोड समापन बिंदुओं को बायपास किया।

आज के ब्लॉग में, मैं आपको यह दिखाने जा रहा हूं कि कैसे जावास्क्रिप्ट फाइलों का विश्लेषण करने से अप्रतिबंधित अंतिम बिंदुओं तक पहुंच प्राप्त हो सकती है और यह समझने के लिए कि एप्लिकेशन इससे कैसे निपटता है। मैं आपको यह भी दिखाऊंगा कि कैसे मैंने ASP.NET एप्लिकेशन में RCE प्राप्त करने के लिए 2 फ़ाइल अपलोड एंडपॉइंट्स को बायपास किया।

सबसे पहले , यह एक निजी कार्यक्रम था, इसलिए मैं इसे target.com के साथ संदर्भित करूंगा।

समापन बिंदु ढूँढना:

एप्लिकेशन के साथ खेलने के कुछ घंटों के बाद, मुझे एक सबडोमेन मिला जो मुझे एक संदेश देता है "एक छोटा ब्रेक लेना" जिसका अर्थ है कि फ़ज़िंग निर्देशिका शुरू करने के लिए यह एक अच्छा संकेत है।

मैंने निर्देशिकाओं को फ़ज़ करना शुरू कर दिया जब तक कि मुझे कुछ समापन बिंदु नहीं मिले जो त्रुटि कोड 403 निषिद्ध पृष्ठ लौटाते हैं, समापन बिंदु को छोड़कर , यह मुझे एक लॉगिन पृष्ठ देता है, और मुझे लगा कि यह केवल व्यवस्थापकों के लिए है, आइए देखें:

मैंने डिफ़ॉल्ट क्रेडेंशियल के साथ साइन इन करने का प्रयास किया लेकिन यह सफल नहीं हुआ।
आम तौर पर, जब मुझे एक लॉगिन पैनल मिलता है जिसमें मैं लॉगिन नहीं कर सकता, तो मैं जावास्क्रिप्ट फाइलों पर एक नज़र डालता हूं क्योंकि क्रेडेंशियल लीक, एपीआई कुंजी, छिपे हुए एंडपॉइंट्स इत्यादि हो सकते हैं।

अधिकांश वेब एप्लिकेशन जावास्क्रिप्ट फ़ाइलों को अस्पष्ट करते हैं, इसलिए यह समझने में समय की बर्बादी होगी कि ये फाइलें कैसे और क्या करती हैं, लेकिन आप कुछ अच्छाइयों की खोज के लिए हमारे ब्राउज़र में खोज सुविधा का लाभ उठा सकते हैं!
मैं , , , , आदि की खोज करने का प्रयास करता हूं, मैं अजाक्स और एक्सएमएल अनुरोधों की खोज करने का भी प्रयास करता हूं।

और मुझे कुछ समापन बिंदु मिले जो पुष्टि करते हैं कि यह लॉगिन पैनल व्यवस्थापकों के लिए है।

मैंने इन सभी समापन बिंदुओं की जाँच की, और सभी ने मुझे एक खाली प्रतिक्रिया दी, इस एक को छोड़कर , यह एक सफेद पृष्ठ और कुछ आयातित सीएसएस और जावास्क्रिप्ट फाइलें लौटाता है, आइए इन फाइलों में और अधिक खुदाई करें, खासकर जब से इन फाइलों के नाम कुछ संबंधित इंगित करते हैं अपलोड करने के लिए।

पहली फ़ाइल का विश्लेषण करें (xproupload.js):

xproupload.js से शुरू करते हुए , मुझे यह गड़बड़ी मिली।

मैंने इसका विश्लेषण करना आसान बनाने के लिए एक ऑनलाइन जावास्क्रिप्ट ब्यूटिफायर का उपयोग करने का निर्णय लिया।

यह फ़ाइल कोड की +550 पंक्तियाँ थी, इसलिए मैं केवल महत्वपूर्ण वस्तुओं और कार्यों पर ध्यान केंद्रित करूँगा।

मैंने इस फ़ाइल का विश्लेषण तब तक किया जब तक कि मैं एक ऐसे फ़ंक्शन तक नहीं पहुँच गया जो बैकएंड अपलोड फ़ंक्शन से संबंधित है, जो लाइन 465 से शुरू होता है , ऑब्जेक्ट " ओ " को घोषित किया गया था और लाइन 473 में शुरू किए गए अजाक्स अनुरोध के अनुरोध निकाय के रूप में तैयार किया गया था , और इसमें निम्नलिखित तत्व शामिल हैं ( पैरामीटर):

  • फ़ोल्डर → वह निर्देशिका जिसे मैं अपलोड करूंगा।
  • thefile → वह पैरामीटर जिसमें हमारी फ़ाइल का नाम और उसकी सामग्री होगी।
  • currentFilter → केवल एक खाली स्ट्रिंग, बाद के विश्लेषणों से भी, इसकी कोई आवश्यकता नहीं है।
  • getRSgetAKrs फ़ंक्शन से लौटाया गया मान, हमें अभी भी नहीं पता था कि यह क्या है, इस फ़ाइल में समान नाम के साथ कोई फ़ंक्शन नहीं है, इसलिए मैं बाद में अन्य जावास्क्रिप्ट फ़ाइलों में खोज करूंगा।
  • akap → जावास्क्रिप्ट में, मान !0 का अर्थ है " सत्य "।

साथ ही, आप देख सकते हैं कि लाइन 379 में , कुछ अपलोड नियम हैं, उनमें से एक अनुमत फ़ाइल एक्सटेंशन था ।

दूसरी फ़ाइल का विश्लेषण करें (xprofile.js):

इस फ़ाइल में कई कार्य हैं, इसलिए मैं केवल महत्वपूर्ण वस्तुओं और कार्यों पर भी ध्यान केंद्रित करूंगा।

वही अपलोड नियम यहां भी घोषित किए गए थे, साथ ही नए हैंडलर गुण जोड़े गए थे, और उन्हें विभिन्न समापन बिंदुओं से बुलाया गया था

  • _fileHandlerfilemgn.ashx
  • _rsHandlerfileUtility.ashx

मैंने इस अनुरोध को बर्प सूट के साथ भेजने की कोशिश की, और परिणाम प्रति अनुरोध एक यादृच्छिक स्ट्रिंग था , मेरा अनुमान है कि यह कोड सर्वर को भेजे गए प्रत्येक अनुरोध को मान्य कर सकता है, एक गतिशील सीएसआरएफ टोकन के समान, हम देखेंगे।

अब फ़ाइल अपलोड करने के लिए सभी आवश्यक पैरामीटर और उनके मान यहां हैं, आइए परीक्षण करने के लिए एक टेक्स्ट फ़ाइल अपलोड करें कि क्या मेरे पास फ़ाइल अपलोड करने की अनुमति है या मुझे व्यवस्थापक के रूप में लॉग इन किया जाना चाहिए, मैंने सर्वर के लिए अनुरोध निकाय के एन्कोडिंग को भी बदल दिया है फ़ाइल प्राप्त करने के लिए तैयार करता है।

अच्छा, यह काम किया! इसके अलावा, प्रतिक्रिया मुझे वह निर्देशिका देती है जहाँ मेरी फ़ाइल अपलोड की गई थी और यह निर्देशिका के अंतर्गत है, आइए इसे देखें!

अच्छा लगता है, अब हमें शेल अपलोड करने के लिए एप्लिकेशन के एक्सटेंशन श्वेतसूची को बायपास करने की आवश्यकता है, ध्यान रखें कि यह एक ASP.NET एप्लिकेशन है।

मैंने इसे सभी ज्ञात तरीकों से बायपास करने की कोशिश की, जैसे डबल एक्सटेंशन, नल बाइट, और इसी तरह, लेकिन यह काम नहीं किया, सभी संभावित कॉन्फ़िगरेशन और निष्पादन योग्य एक्सटेंशन के साथ भी प्रयास किया जो ASP.NET और Microsoft सर्वर अनुप्रयोगों जैसे exe के साथ काम करते हैं। bat , config , आदि, लेकिन कोई भाग्य नहीं।

xprofile.js फ़ाइल पर वापस जाएं , एक्सप्लोर करते हुए, शायद ऐसे अन्य कार्य हैं जो इस अपलोड का लाभ उठा सकते हैं।

इस फ़ाइल में उपयोग किए गए अजाक्स अनुरोधों की संख्या ने मेरा ध्यान खींचा, मैंने देखा कि उनमें से कुछ को किसी प्रकार के फ़ाइल प्रबंधक के साथ इलाज के लिए भेजा गया है, getFiles , deleteFile , createFolder और अधिक जैसे कार्य हैं , इनमें से एक फ़ंक्शन को कहा जाता है नाम बदलें फ़ाइल !, और फ़ाइलों का नाम बदलना बिल्कुल वही है जो मुझे चाहिए!

इस फ़ंक्शन की समीक्षा करके, यह _fileHandler (filemgn.ashx) को भेजा गया एक अजाक्स अनुरोध है और इसे 4 पैरामीटर की आवश्यकता है :

  • fn → और यह " rename_file " स्ट्रिंग मान लेता है।
  • getRSgetAKrs फ़ंक्शन से लौटाया गया मान।
  • akap → जैसा कि ऊपर बताया गया है, यह सिर्फ एक " सत्य " मान है।
  • परम → " t " चर का मान लेता है , जिसे पंक्ति 131 में एक सरणी के रूप में घोषित किया गया था , और पंक्ति 132 में तीन मानों के साथ असाइन किया गया था ।

कुछ मिनट बाद, और चूंकि पैरामीटर परम को 3 तत्वों की एक सरणी के रूप में भेजा जाना था , मैंने अंततः पाया कि:

  • पहला परम [] वह निर्देशिका थी जिसमें वह फ़ाइल थी जिसका हम नाम बदलना चाहते हैं।
  • दूसरा नए नाम के लिए था ।
  • तीसरा वर्तमान फ़ाइल नाम के लिए था ।

बढ़िया!, मैंने फ़ाइल एक्सटेंशन को एएसपीएक्स की तरह अनुमत नहीं में बदलने की भी कोशिश की , और यह भी काम करता है, तो चलिए एक दुर्भावनापूर्ण फ़ाइल अपलोड करते हैं!

मैंने cmd.aspx का उपयोग किया लेकिन इसे cmd.txt में बदल दिया और इसे अपलोड कर दिया, फिर इसका नाम बदलकर testshell.aspx कर दिया , फिर मैंने फ़ाइल पर नेविगेट किया।

मेरा बच्चा सफलतापूर्वक अपलोड हो गया है, और मैं अब सिस्टम पर कमांड चला सकता हूं!

रिपोर्ट समयरेखा:

25 मार्च: प्रस्तुत किया गया।
28 मार्च: ट्राइएज्ड।
29 मार्च: इनाम से नवाजा गया।

अधिक खुदाई:

मुझे यह जानने में दिलचस्पी हुई कि इस कोड के पीछे क्या है, विशेष रूप से फ़ाइल एक्सटेंशन पर लागू किया गया निस्पंदन, इसलिए जैसा कि हमें सर्वर पर कमांड लिखने का विशेषाधिकार है, मैंने कोड के इस हिस्से को fileUtility.aspx फ़ाइल के अंदर पढ़ना शुरू कर दिया, और यहाँ वही है जो मैंने पाया

एप्लिकेशन फ़ाइल एक्सटेंशन को लोअरकेस में परिवर्तित करता है और फिर सभी निष्पादन योग्य फ़ाइलों को फ़िल्टर करता है, और मुझे एहसास हुआ कि यह नाम बदलने के फ़ंक्शन को खोजे बिना शोषक नहीं हो सकता है, लेकिन उसी फ़ाइल में, मुझे एक ज़िप फ़ाइल अपलोड करने से संबंधित कुछ मिला जिसने मेरा ध्यान खींचा!

जैसा कि आप लाइन 126 में देख सकते हैं , यह दो मुख्य चीजों की जांच करता है:

  • यदि फ़ाइल नाम पर अंतिम 4 वर्ण “ .zip ” हैं
  • निकालने के अनुरोध पैरामीटर का मान ।

क्या इसे बिना किसी फिल्ट्रेशन के निकालेंगे?
- हां! चलिए चलते हैं!

मैंने एक ही शेल फ़ाइल का उपयोग किया, लेकिन इस बार मैं इसे एक ज़िप संग्रह में जोड़ता हूं और इसे अपलोड करने के लिए एक साधारण पायथन स्क्रिप्ट बनाता हूं और एक सच्चे मान के साथ एक्स्ट्रेक्ट पैरामीटर जोड़ता हूं

अब इसे ब्राउजर पर चेक करते हैं

मेरा दूसरा बेबी शेल सफलतापूर्वक अपलोड किया गया देखें!

मैं एक नई रिपोर्ट जमा करना चाहता था, लेकिन उन्होंने सर्वर बंद कर दिया, वैसे भी, मुझे आशा है कि आपको पढ़ने में मज़ा आया और यदि आपके पास कोई प्रतिक्रिया है तो मुझे खुशी होगी !

© Copyright 2021 - 2023 | hingogo.com | All Rights Reserved