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: iscriviti a Intigriti, una premium bug bounty platform creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi, e inizia a guadagnare ricompense fino a $100,000!
DLL Hijacking implica la manipolazione di un'applicazione fidata per caricare un DLL malevolo. Questo termine comprende diverse tattiche come DLL Spoofing, Injection, e Side-Loading. È principalmente utilizzato per l'esecuzione di codice, per ottenere persistenza e, meno comunemente, per l'escalation dei privilegi. Nonostante l'attenzione sull'escalation qui, il metodo di hijacking rimane coerente attraverso gli obiettivi.
Vengono impiegati diversi metodi per il DLL hijacking, ognuno con la propria efficacia a seconda della strategia di caricamento del DLL dell'applicazione:
DLL Replacement: Sostituzione di un DLL genuino con uno malevolo, utilizzando eventualmente il DLL Proxying per preservare la funzionalità del DLL originale.
DLL Search Order Hijacking: Posizionamento del DLL malevolo in un percorso di ricerca davanti a quello legittimo, sfruttando il modello di ricerca dell'applicazione.
Phantom DLL Hijacking: Creazione di un DLL malevolo affinché un'applicazione lo carichi, pensando che sia un DLL richiesto non esistente.
DLL Redirection: Modifica dei parametri di ricerca come %PATH%
o file .exe.manifest
/ .exe.local
per indirizzare l'applicazione al DLL malevolo.
WinSxS DLL Replacement: Sostituzione del DLL legittimo con un corrispondente malevolo nella directory WinSxS, un metodo spesso associato al DLL side-loading.
Relative Path DLL Hijacking: Posizionamento del DLL malevolo in una directory controllata dall'utente con l'applicazione copiata, somigliante alle tecniche di Binary Proxy Execution.
Il modo più comune per trovare DLL mancanti all'interno di un sistema è eseguire procmon da sysinternals, impostando i seguenti 2 filtri:
e mostrare solo l'Attività del File System:
Se stai cercando dll mancanti in generale puoi lasciare questo in esecuzione per alcuni secondi. Se stai cercando un dll mancante all'interno di un eseguibile specifico dovresti impostare un altro filtro come "Process Name" "contains" "<exec name>", eseguirlo e fermare la cattura degli eventi.
Per poter elevare i privilegi, la migliore possibilità che abbiamo è quella di scrivere un dll che un processo privilegiato cercherà di caricare in qualche luogo dove verrà cercato. Pertanto, saremo in grado di scrivere un dll in una cartella dove il dll viene cercato prima della cartella dove si trova il dll originale (caso strano), oppure saremo in grado di scrivere in qualche cartella dove il dll verrà cercato e il dll originale non esiste in nessuna cartella.
All'interno della documentazione Microsoft puoi trovare come i DLL vengono caricati specificamente.
Le applicazioni Windows cercano i DLL seguendo un insieme di percorsi di ricerca predefiniti, aderendo a una particolare sequenza. Il problema del DLL hijacking sorge quando un DLL dannoso è strategicamente posizionato in una di queste directory, assicurando che venga caricato prima del DLL autentico. Una soluzione per prevenire questo è garantire che l'applicazione utilizzi percorsi assoluti quando si riferisce ai DLL di cui ha bisogno.
Puoi vedere l'ordine di ricerca dei DLL su sistemi a 32 bit qui sotto:
La directory da cui l'applicazione è stata caricata.
La directory di sistema. Usa la funzione GetSystemDirectory per ottenere il percorso di questa directory.(C:\Windows\System32)
La directory di sistema a 16 bit. Non esiste una funzione che ottiene il percorso di questa directory, ma viene cercata. (C:\Windows\System)
La directory di Windows. Usa la funzione GetWindowsDirectory per ottenere il percorso di questa directory.
(C:\Windows)
La directory corrente.
Le directory elencate nella variabile di ambiente PATH. Nota che questo non include il percorso per applicazione specificato dalla chiave di registro App Paths. La chiave App Paths non viene utilizzata quando si calcola il percorso di ricerca del DLL.
Questo è l'ordine di ricerca predefinito con SafeDllSearchMode abilitato. Quando è disabilitato, la directory corrente sale al secondo posto. Per disabilitare questa funzione, crea il valore di registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode e impostalo su 0 (il valore predefinito è abilitato).
Se la funzione LoadLibraryEx viene chiamata con LOAD_WITH_ALTERED_SEARCH_PATH, la ricerca inizia nella directory del modulo eseguibile che LoadLibraryEx sta caricando.
Infine, nota che un dll potrebbe essere caricato indicando il percorso assoluto invece del solo nome. In quel caso, quel dll è solo cercato in quel percorso (se il dll ha dipendenze, verranno cercate come se fossero caricate solo per nome).
Ci sono altri modi per alterare i modi di alterare l'ordine di ricerca, ma non li spiegherò qui.
Alcune eccezioni all'ordine di ricerca standard dei DLL sono annotate nella documentazione di Windows:
Quando si incontra un DLL che condivide il proprio nome con uno già caricato in memoria, il sistema salta la ricerca abituale. Invece, esegue un controllo per la reindirizzazione e un manifesto prima di tornare al DLL già in memoria. In questo scenario, il sistema non esegue una ricerca per il DLL.
Nei casi in cui il DLL è riconosciuto come un DLL noto per la versione corrente di Windows, il sistema utilizzerà la sua versione del DLL noto, insieme a qualsiasi DLL dipendente, saltando il processo di ricerca. La chiave di registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs contiene un elenco di questi DLL noti.
Se un DLL ha dipendenze, la ricerca di questi DLL dipendenti viene condotta come se fossero indicati solo dai loro nomi di modulo, indipendentemente dal fatto che il DLL iniziale sia stato identificato tramite un percorso completo.
Requisiti:
Identificare un processo che opera o opererà con privilegi diversi (movimento orizzontale o laterale), che è privo di un DLL.
Assicurarsi che sia disponibile accesso in scrittura per qualsiasi directory in cui il DLL sarà cercato. Questa posizione potrebbe essere la directory dell'eseguibile o una directory all'interno del percorso di sistema.
Sì, i requisiti sono complicati da trovare poiché per impostazione predefinita è piuttosto strano trovare un eseguibile privilegiato privo di un dll ed è ancora più strano avere permessi di scrittura su una cartella di percorso di sistema (non puoi per impostazione predefinita). Ma, in ambienti mal configurati, questo è possibile. Nel caso tu sia fortunato e ti trovi a soddisfare i requisiti, potresti controllare il progetto UACME. Anche se il principale obiettivo del progetto è bypassare UAC, potresti trovare lì un PoC di un Dll hijacking per la versione di Windows che puoi utilizzare (probabilmente cambiando solo il percorso della cartella dove hai permessi di scrittura).
Nota che puoi controllare i tuoi permessi in una cartella facendo:
E controlla i permessi di tutte le cartelle all'interno di PATH:
Puoi anche controllare le importazioni di un eseguibile e le esportazioni di un dll con:
Per una guida completa su come abuse Dll Hijacking per escalare privilegi con permessi di scrittura in una cartella di System Path, controlla:
Writable Sys Path +Dll Hijacking PrivescWinpeas verificherà se hai permessi di scrittura su qualsiasi cartella all'interno del system PATH. Altri strumenti automatizzati interessanti per scoprire questa vulnerabilità sono le funzioni di PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack e Write-HijackDll.
Nel caso tu trovi uno scenario sfruttabile, una delle cose più importanti per sfruttarlo con successo sarebbe creare un dll che esporta almeno tutte le funzioni che l'eseguibile importerà da esso. Comunque, nota che Dll Hijacking è utile per escalare da Medium Integrity level a High (bypassando UAC) o da High Integrity a SYSTEM. Puoi trovare un esempio di come creare un dll valido all'interno di questo studio di dll hijacking focalizzato sul dll hijacking per l'esecuzione: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Inoltre, nella prossima sezione puoi trovare alcuni codici dll di base che potrebbero essere utili come modelli o per creare un dll con funzioni non richieste esportate.
Fondamentalmente un Dll proxy è un Dll capace di eseguire il tuo codice malevolo quando caricato ma anche di esporre e funzionare come previsto inoltrando tutte le chiamate alla vera libreria.
Con lo strumento DLLirant o Spartacus puoi effettivamente indicare un eseguibile e selezionare la libreria che vuoi proxificare e generare un dll proxificato oppure indicare il Dll e generare un dll proxificato.
Get rev shell (x64):
Ottieni un meterpreter (x86):
Crea un utente (x86 non ho visto una versione x64):
Nota che in diversi casi la Dll che compili deve esportare diverse funzioni che verranno caricate dal processo vittima; se queste funzioni non esistono, il binario non sarà in grado di caricarle e l'exploit fallirà.
Suggerimento per il bug bounty: iscriviti a Intigriti, una premium piattaforma di bug bounty creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi, e inizia a guadagnare bounty fino a $100,000!
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)