Dll Hijacking
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Συμβουλή bug bounty: εγγραφείτε στο Intigriti, μια premium πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers! Ελάτε μαζί μας στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε βραβεία έως $100,000!
Το DLL Hijacking περιλαμβάνει την παραποίηση μιας αξιόπιστης εφαρμογής ώστε να φορτώσει ένα κακόβουλο DLL. Αυτός ο όρος περιλαμβάνει πολλές τακτικές όπως DLL Spoofing, Injection, και Side-Loading. Χρησιμοποιείται κυρίως για εκτέλεση κώδικα, επίτευξη επιμονής και, λιγότερο συχνά, κλιμάκωση δικαιωμάτων. Παρά την εστίαση στην κλιμάκωση εδώ, η μέθοδος της παραποίησης παραμένει συνεπής σε όλους τους στόχους.
Διάφορες μέθοδοι χρησιμοποιούνται για το DLL hijacking, καθεμία με την αποτελεσματικότητά της ανάλογα με τη στρατηγική φόρτωσης DLL της εφαρμογής:
Αντικατάσταση DLL: Αντικατάσταση ενός γνήσιου DLL με ένα κακόβουλο, προαιρετικά χρησιμοποιώντας DLL Proxying για να διατηρηθεί η λειτουργικότητα του αρχικού DLL.
Hijacking της Σειράς Αναζήτησης DLL: Τοποθέτηση του κακόβουλου DLL σε μια διαδρομή αναζήτησης πριν από το νόμιμο, εκμεταλλευόμενοι το μοτίβο αναζήτησης της εφαρμογής.
Phantom DLL Hijacking: Δημιουργία ενός κακόβουλου DLL για να φορτωθεί από μια εφαρμογή, νομίζοντας ότι είναι ένα ανύπαρκτο απαιτούμενο DLL.
DLL Redirection: Τροποποίηση παραμέτρων αναζήτησης όπως το %PATH%
ή τα αρχεία .exe.manifest
/ .exe.local
για να κατευθυνθεί η εφαρμογή στο κακόβουλο DLL.
Αντικατάσταση DLL WinSxS: Αντικατάσταση του νόμιμου DLL με ένα κακόβουλο αντίστοιχο στον κατάλογο WinSxS, μια μέθοδος που συχνά σχετίζεται με το DLL side-loading.
Relative Path DLL Hijacking: Τοποθέτηση του κακόβουλου DLL σε έναν κατάλογο που ελέγχεται από τον χρήστη με την αντιγραμμένη εφαρμογή, που μοιάζει με τις τεχνικές Binary Proxy Execution.
Ο πιο κοινός τρόπος για να βρείτε ελλείποντα DLLs σε ένα σύστημα είναι να εκτελέσετε procmon από sysinternals, ορίζοντας τα εξής 2 φίλτρα:
και να δείξετε μόνο τη Δραστηριότητα Συστήματος Αρχείων:
Αν ψάχνετε για ελλείποντα dlls γενικά μπορείτε να αφήσετε αυτό να τρέχει για μερικά δευτερόλεπτα. Αν ψάχνετε για ένα ελλείπον dll μέσα σε μια συγκεκριμένη εκτελέσιμη θα πρέπει να ορίσετε ένα άλλο φίλτρο όπως "Process Name" "contains" "<exec name>", να το εκτελέσετε και να σταματήσετε την καταγραφή γεγονότων.
Για να κλιμακώσουμε δικαιώματα, η καλύτερη ευκαιρία που έχουμε είναι να μπορέσουμε να γράψουμε ένα dll που μια διαδικασία με δικαιώματα θα προσπαθήσει να φορτώσει σε κάποιο μέρος όπου θα αναζητηθεί. Επομένως, θα μπορέσουμε να γράψουμε ένα dll σε έναν φάκελο όπου το dll αναζητείται πριν από τον φάκελο όπου βρίσκεται το αρχικό dll (παράξενος περίπτωση), ή θα μπορέσουμε να γράψουμε σε κάποιο φάκελο όπου το dll θα αναζητηθεί και το αρχικό dll δεν υπάρχει σε κανέναν φάκελο.
Μέσα στην τεκμηρίωση της Microsoft μπορείτε να βρείτε πώς φορτώνονται συγκεκριμένα τα DLLs.
Οι εφαρμογές Windows αναζητούν DLLs ακολουθώντας μια σειρά από προκαθορισμένες διαδρομές αναζήτησης, τηρώντας μια συγκεκριμένη ακολουθία. Το ζήτημα του DLL hijacking προκύπτει όταν ένα επιβλαβές DLL τοποθετείται στρατηγικά σε έναν από αυτούς τους καταλόγους, διασφαλίζοντας ότι θα φορτωθεί πριν από το αυθεντικό DLL. Μια λύση για να αποτραπεί αυτό είναι να διασφαλιστεί ότι η εφαρμογή χρησιμοποιεί απόλυτες διαδρομές όταν αναφέρεται στα DLLs που απαιτεί.
Μπορείτε να δείτε τη σειρά αναζήτησης 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, η αναζήτηση αρχίζει στον κατάλογο του εκτελέσιμου module που φορτώνει το LoadLibraryEx.
Τέλος, σημειώστε ότι ένα dll θα μπορούσε να φορτωθεί υποδεικνύοντας την απόλυτη διαδρομή αντί μόνο το όνομα. Σε αυτή την περίπτωση, το dll θα αναζητηθεί μόνο σε αυτή τη διαδρομή (αν το dll έχει εξαρτήσεις, αυτές θα αναζητηθούν όπως φορτώθηκαν μόνο με το όνομα).
Υπάρχουν άλλοι τρόποι για να τροποποιήσετε τις μεθόδους αναζήτησης, αλλά δεν θα τους εξηγήσω εδώ.
Ορισμένες εξαιρέσεις από τη стандартική σειρά αναζήτησης DLL σημειώνονται στην τεκμηρίωση των Windows:
Όταν συναντηθεί ένα DLL που μοιράζεται το όνομά του με ένα ήδη φορτωμένο στη μνήμη, το σύστημα παρακάμπτει την συνήθη αναζήτηση. Αντίθετα, εκτελεί έναν έλεγχο για ανακατεύθυνση και ένα μανιφέστο πριν επιστρέψει στο DLL που είναι ήδη στη μνήμη. Σε αυτό το σενάριο, το σύστημα δεν διεξάγει αναζήτηση για το DLL.
Σε περιπτώσεις όπου το DLL αναγνωρίζεται ως γνωστό DLL για την τρέχουσα έκδοση των Windows, το σύστημα θα χρησιμοποιήσει την έκδοση του γνωστού DLL, μαζί με οποιαδήποτε από τα εξαρτώμενα DLL του, παρακάμπτοντας τη διαδικασία αναζήτησης. Το κλειδί μητρώου HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs περιέχει μια λίστα με αυτά τα γνωστά DLLs.
Αν ένα DLL έχει εξαρτήσεις, η αναζήτηση για αυτά τα εξαρτώμενα DLLs διεξάγεται σαν να υποδεικνύονταν μόνο με τα ονόματα των modules, ανεξάρτητα από το αν το αρχικό DLL αναγνωρίστηκε μέσω πλήρους διαδρομής.
Απαιτήσεις:
Εντοπίστε μια διαδικασία που λειτουργεί ή θα λειτουργήσει με διαφορετικά δικαιώματα (οριζόντια ή πλευρική κίνηση), η οποία λείπει ένα DLL.
Διασφαλίστε ότι υπάρχει δικαίωμα εγγραφής για οποιονδήποτε κατάλογο στον οποίο θα αναζητηθεί το DLL. Αυτή η τοποθεσία μπορεί να είναι ο κατάλογος του εκτελέσιμου ή ένας κατάλογος εντός της διαδρομής του συστήματος.
Ναι, οι απαιτήσεις είναι δύσκολο να βρεθούν καθώς κατά προεπιλογή είναι κάπως παράξενο να βρείτε ένα εκτελέσιμο με δικαιώματα που να λείπει ένα dll και είναι ακόμη πιο παράξενο να έχετε δικαιώματα εγγραφής σε έναν φάκελο διαδρομής συστήματος (δεν μπορείτε κατά προεπιλογή). Αλλά, σε κακώς ρυθμισμένα περιβάλλοντα αυτό είναι δυνατό. Σε περίπτωση που είστε τυχεροί και πληροίτε τις απαιτήσεις, μπορείτε να ελέγξετε το έργο UACME. Ακόμη και αν ο κύριος στόχος του έργου είναι η παράκαμψη του UAC, μπορεί να βρείτε εκεί μια PoC ενός Dll hijacking για την έκδοση των Windows που μπορείτε να χρησιμοποιήσετε (πιθανώς αλλάζοντας απλώς τη διαδρομή του φακέλου όπου έχετε δικαιώματα εγγραφής).
Σημειώστε ότι μπορείτε να ελέγξετε τα δικαιώματά σας σε έναν φάκελο κάνοντας:
Και έλεγξε τα δικαιώματα όλων των φακέλων μέσα στο PATH:
Μπορείτε επίσης να ελέγξετε τις εισαγωγές ενός εκτελέσιμου και τις εξαγωγές μιας dll με:
Για έναν πλήρη οδηγό σχετικά με το πώς να καταχραστείτε το Dll Hijacking για να κερδίσετε δικαιώματα με άδειες εγγραφής σε έναν φάκελο System Path ελέγξτε:
Writable Sys Path +Dll Hijacking PrivescWinpeas θα ελέγξει αν έχετε άδειες εγγραφής σε οποιονδήποτε φάκελο μέσα στο 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 με μη απαιτούμενες εξαγόμενες λειτουργίες.
Βασικά, μια Dll proxy είναι μια Dll ικανή να εκτελεί τον κακόβουλο κώδικά σας όταν φορτωθεί αλλά και να εκθέτει και να λειτουργεί όπως αναμένεται αναμεταδίδοντας όλες τις κλήσεις στη πραγματική βιβλιοθήκη.
Με το εργαλείο DLLirant ή Spartacus μπορείτε στην πραγματικότητα να υποδείξετε ένα εκτελέσιμο και να επιλέξετε τη βιβλιοθήκη που θέλετε να proxify και να δημιουργήσετε μια proxified dll ή να υποδείξετε τη Dll και να δημιουργήσετε μια proxified dll.
Get rev shell (x64):
Αποκτήστε ένα meterpreter (x86):
Δημιουργήστε έναν χρήστη (x86 δεν είδα μια x64 έκδοση):
Σημειώστε ότι σε πολλές περιπτώσεις η Dll που θα συντάξετε πρέπει να εξάγει πολλές συναρτήσεις που θα φορτωθούν από τη διαδικασία του θύματος, αν αυτές οι συναρτήσεις δεν υπάρχουν, το δυαδικό αρχείο δεν θα μπορέσει να τις φορτώσει και η εκμετάλλευση θα αποτύχει.
Συμβουλή για bug bounty: εγγραφείτε στο Intigriti, μια premium πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers! Ελάτε μαζί μας στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε βραβεία έως $100,000!
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)