Dll Hijacking
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
DLL Hijacking में एक विश्वसनीय एप्लिकेशन को एक दुर्भावनापूर्ण DLL लोड करने के लिए हेरफेर करना शामिल है। यह शब्द कई रणनीतियों को शामिल करता है जैसे DLL Spoofing, Injection, और Side-Loading। इसका मुख्य उपयोग कोड निष्पादन, स्थिरता प्राप्त करने, और, कम सामान्यतः, विशेषाधिकार वृद्धि के लिए किया जाता है। यहाँ वृद्धि पर ध्यान केंद्रित करने के बावजूद, हाइजैकिंग की विधि उद्देश्यों के बीच समान रहती है।
DLL हाइजैकिंग के लिए कई विधियों का उपयोग किया जाता है, प्रत्येक की प्रभावशीलता एप्लिकेशन के DLL लोडिंग रणनीति पर निर्भर करती है:
DLL Replacement: एक असली DLL को एक दुर्भावनापूर्ण DLL के साथ बदलना, वैकल्पिक रूप से DLL Proxying का उपयोग करके मूल DLL की कार्यक्षमता को बनाए रखना।
DLL Search Order Hijacking: दुर्भावनापूर्ण DLL को एक खोज पथ में वैध DLL से पहले रखना, एप्लिकेशन के खोज पैटर्न का लाभ उठाना।
Phantom DLL Hijacking: एक दुर्भावनापूर्ण DLL बनाना जिसे एक एप्लिकेशन लोड करेगा, यह सोचकर कि यह एक गैर-मौजूद आवश्यक DLL है।
DLL Redirection: खोज पैरामीटर जैसे %PATH%
या .exe.manifest
/ .exe.local
फ़ाइलों को संशोधित करना ताकि एप्लिकेशन को दुर्भावनापूर्ण DLL की ओर निर्देशित किया जा सके।
WinSxS DLL Replacement: WinSxS निर्देशिका में वैध DLL को एक दुर्भावनापूर्ण समकक्ष के साथ प्रतिस्थापित करना, यह विधि अक्सर DLL साइड-लोडिंग से जुड़ी होती है।
Relative Path DLL Hijacking: उपयोगकर्ता-नियंत्रित निर्देशिका में दुर्भावनापूर्ण DLL रखना जिसमें कॉपी की गई एप्लिकेशन होती है, जो Binary Proxy Execution तकनीकों के समान होती है।
सिस्टम के अंदर गायब DLLs खोजने का सबसे सामान्य तरीका procmon को sysinternals से चलाना है, निम्नलिखित 2 फ़िल्टर सेट करना:
और केवल File System Activity दिखाना:
यदि आप सामान्य रूप से गायब dlls की तलाश कर रहे हैं तो आप इसे कुछ सेकंड के लिए चलने दें। यदि आप एक विशिष्ट निष्पादन योग्य के अंदर गायब dll की तलाश कर रहे हैं तो आपको "Process Name" "contains" "<exec name>" जैसे दूसरे फ़िल्टर को सेट करना चाहिए, इसे निष्पादित करें, और घटनाओं को कैप्चर करना बंद करें।
विशेषाधिकार बढ़ाने के लिए, हमारे पास सबसे अच्छा मौका है कि हम एक dll लिख सकें जिसे एक विशेषाधिकार प्राप्त प्रक्रिया लोड करने की कोशिश करेगी किसी स्थान पर जहां इसे खोजा जाएगा। इसलिए, हम एक फ़ोल्डर में dll लिखने में सक्षम होंगे जहां dll पहले खोजा जाता है उस फ़ोल्डर से पहले जहां मूल dll है (अजीब मामला), या हम किसी फ़ोल्डर में लिखने में सक्षम होंगे जहां dll खोजा जाएगा और मूल dll किसी फ़ोल्डर में मौजूद नहीं है।
Microsoft दस्तावेज़ के अंदर आप देख सकते हैं कि DLLs को विशेष रूप से कैसे लोड किया जाता है।
Windows एप्लिकेशन DLLs की खोज एक सेट के अनुसार करते हैं पूर्व-निर्धारित खोज पथ, एक विशेष अनुक्रम का पालन करते हुए। DLL हाइजैकिंग की समस्या तब उत्पन्न होती है जब एक हानिकारक DLL इन निर्देशिकाओं में से एक में रणनीतिक रूप से रखा जाता है, यह सुनिश्चित करते हुए कि इसे प्रामाणिक DLL से पहले लोड किया जाए। इसे रोकने के लिए एक समाधान यह है कि एप्लिकेशन को आवश्यक DLLs का संदर्भ देते समय पूर्ण पथ का उपयोग करना चाहिए।
आप 32-बिट सिस्टम पर DLL खोज क्रम नीचे देख सकते हैं:
वह निर्देशिका जिससे एप्लिकेशन लोड हुआ।
सिस्टम निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए GetSystemDirectory फ़ंक्शन का उपयोग करें।(C:\Windows\System32)
16-बिट सिस्टम निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए कोई फ़ंक्शन नहीं है, लेकिन इसे खोजा जाता है। (C:\Windows\System)
Windows निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए GetWindowsDirectory फ़ंक्शन का उपयोग करें।
(C:\Windows)
वर्तमान निर्देशिका।
PATH पर्यावरण चर में सूचीबद्ध निर्देशिकाएँ। ध्यान दें कि इसमें App Paths रजिस्ट्री कुंजी द्वारा निर्दिष्ट प्रति-एप्लिकेशन पथ शामिल नहीं है। DLL खोज पथ की गणना करते समय App Paths कुंजी का उपयोग नहीं किया जाता है।
यह डिफ़ॉल्ट खोज क्रम है जब SafeDllSearchMode सक्षम है। जब इसे अक्षम किया जाता है, तो वर्तमान निर्देशिका दूसरे स्थान पर बढ़ जाती है। इस सुविधा को अक्षम करने के लिए, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode रजिस्ट्री मान बनाएं और इसे 0 पर सेट करें (डिफ़ॉल्ट सक्षम है)।
यदि LoadLibraryEx फ़ंक्शन को LOAD_WITH_ALTERED_SEARCH_PATH के साथ कॉल किया जाता है तो खोज उस निर्देशिका में शुरू होती है जिसमें निष्पादन योग्य मॉड्यूल है जिसे LoadLibraryEx लोड कर रहा है।
अंत में, ध्यान दें कि एक dll को केवल नाम के बजाय पूर्ण पथ निर्दिष्ट करते हुए लोड किया जा सकता है। उस मामले में वह dll केवल उस पथ में खोजा जाएगा (यदि dll की कोई निर्भरताएँ हैं, तो उन्हें केवल नाम से लोड किया गया माना जाएगा)।
खोज क्रम को बदलने के अन्य तरीके हैं लेकिन मैं उन्हें यहाँ समझाने नहीं जा रहा हूँ।
Windows दस्तावेज़ में मानक DLL खोज क्रम के लिए कुछ अपवाद नोट किए गए हैं:
जब एक DLL जिसका नाम पहले से मेमोरी में लोड की गई एक DLL के साथ साझा होता है का सामना किया जाता है, तो सिस्टम सामान्य खोज को बायपास करता है। इसके बजाय, यह पहले पुनर्निर्देशन और एक मैनिफेस्ट के लिए जांच करता है, फिर मेमोरी में पहले से मौजूद DLL पर लौटता है। इस परिदृश्य में, सिस्टम DLL के लिए खोज नहीं करता है।
यदि DLL को वर्तमान Windows संस्करण के लिए ज्ञात DLL के रूप में पहचाना जाता है, तो सिस्टम ज्ञात DLL के अपने संस्करण का उपयोग करेगा, साथ ही इसकी किसी भी निर्भर DLLs का, खोज प्रक्रिया को छोड़कर। रजिस्ट्री कुंजी HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs इन ज्ञात DLLs की एक सूची रखती है।
यदि एक DLL में निर्भरताएँ हैं, तो इन निर्भर DLLs की खोज इस तरह की जाती है जैसे कि उन्हें केवल उनके मॉड्यूल नामों द्वारा निर्दिष्ट किया गया हो, चाहे प्रारंभिक DLL को पूर्ण पथ के माध्यम से पहचाना गया हो या नहीं।
Requirements:
एक प्रक्रिया की पहचान करें जो विभिन्न विशेषाधिकारों (क्षैतिज या पार्श्व आंदोलन) के तहत कार्य करती है या करेगी, जो एक DLL की कमी है।
सुनिश्चित करें कि किसी भी निर्देशिका के लिए लेखन पहुंच उपलब्ध है जिसमें DLL के लिए खोज की जाएगी। यह स्थान निष्पादन योग्य का निर्देशिका या सिस्टम पथ के भीतर एक निर्देशिका हो सकता है।
हाँ, आवश्यकताएँ खोजना जटिल हैं क्योंकि डिफ़ॉल्ट रूप से यह थोड़ा अजीब है कि एक विशेषाधिकार प्राप्त निष्पादन योग्य में एक dll की कमी हो और यह और भी अजीब है कि एक सिस्टम पथ फ़ोल्डर पर लेखन अनुमतियाँ हों (आप डिफ़ॉल्ट रूप से नहीं कर सकते)। लेकिन, गलत कॉन्फ़िगर किए गए वातावरण में यह संभव है। यदि आप भाग्यशाली हैं और आप आवश्यकताओं को पूरा करते हैं, तो आप UACME प्रोजेक्ट की जांच कर सकते हैं। भले ही प्रोजेक्ट का मुख्य लक्ष्य UAC को बायपास करना है, आप वहां एक PoC पा सकते हैं जो Windows संस्करण के लिए DLL हाइजैकिंग के लिए है जिसे आप उपयोग कर सकते हैं (संभवतः केवल उस फ़ोल्डर के पथ को बदलकर जहां आपके पास लेखन अनुमतियाँ हैं)।
ध्यान दें कि आप एक फ़ोल्डर में अपनी अनुमतियों की जांच कर सकते हैं:
और PATH के अंदर सभी फ़ोल्डरों की अनुमतियों की जांच करें:
आप एक निष्पादन योग्य फ़ाइल के आयात और एक dll के निर्यात को भी जांच सकते हैं:
For a full guide on how to abuse Dll Hijacking to escalate privileges with permissions to write in a System Path folder check:
Winpeas यह जांचेगा कि क्या आपके पास सिस्टम PATH के अंदर किसी भी फ़ोल्डर पर लिखने की अनुमति है। इस भेद्यता का पता लगाने के लिए अन्य दिलचस्प स्वचालित उपकरण हैं PowerSploit functions: Find-ProcessDLLHijack, Find-PathDLLHijack और Write-HijackDll.
यदि आप एक exploitable परिदृश्य पाते हैं, तो इसे सफलतापूर्वक शोषण करने के लिए सबसे महत्वपूर्ण चीजों में से एक होगा एक dll बनाना जो कम से कम सभी कार्यों को निर्यात करता है जो executable इससे आयात करेगा। किसी भी तरह, ध्यान दें कि Dll Hijacking उपयोगी है ताकि मध्यम इंटीग्रिटी स्तर से उच्च (UAC को बायपास करते हुए) या उच्च इंटीग्रिटी से SYSTEM। आप इस dll hijacking अध्ययन में एक मान्य dll कैसे बनाएं का उदाहरण पा सकते हैं जो निष्पादन के लिए dll hijacking पर केंद्रित है: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows। इसके अलावा, अगले अनुभाग में आप कुछ बुनियादी dll कोड पा सकते हैं जो टेम्पलेट के रूप में या निष्क्रिय कार्यों के साथ एक dll बनाने के लिए उपयोगी हो सकते हैं।
बुनियादी रूप से एक Dll proxy एक Dll है जो लोड होने पर आपके दुर्भावनापूर्ण कोड को निष्पादित करने में सक्षम है लेकिन साथ ही प्रदर्शित और काम करने के लिए सभी कॉल को असली पुस्तकालय में रिले करके।
उपकरण DLLirant या Spartacus के साथ आप वास्तव में एक executable निर्दिष्ट कर सकते हैं और उस पुस्तकालय का चयन कर सकते हैं जिसे आप proxify करना चाहते हैं और एक proxified dll उत्पन्न कर सकते हैं या Dll निर्दिष्ट कर सकते हैं और एक proxified dll उत्पन्न कर सकते हैं।
Get rev shell (x64):
एक मीटरप्रेटर प्राप्त करें (x86):
एक उपयोगकर्ता बनाएं (x86 मैंने x64 संस्करण नहीं देखा):
ध्यान दें कि कई मामलों में, Dll जिसे आप संकलित करते हैं, को कई फ़ंक्शन निर्यात करने चाहिए जो पीड़ित प्रक्रिया द्वारा लोड किए जाएंगे, यदि ये फ़ंक्शन मौजूद नहीं हैं तो बाइनरी उन्हें लोड नहीं कर पाएगी और शोषण विफल हो जाएगा।
बग बाउंटी टिप: साइन अप करें Intigriti के लिए, एक प्रीमियम बग बाउंटी प्लेटफार्म जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! आज ही https://go.intigriti.com/hacktricks पर हमारे साथ जुड़ें, और $100,000 तक की बाउंटी कमाना शुरू करें!
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)