
Scanner automatizzato per individuare candidati al dirottamento dell'ordine di ricerca delle DLL negli eseguibili Windows, dotato di analisi della tabella delle importazioni, enumerazione runtime dei moduli e hook delle API tramite Microsoft Detours.
Scanner per DLL Hijack - Uno strumento per generare lead e automatizzare la scoperta di candidati per il DLL Search Order Hijacking
Questo repository contiene il file di progetto Visual Studio per lo strumento (DLLHSC), il file di progetto per la funzionalità di hooking delle API (detour), il file di progetto per il payload e, ultimo ma non meno importante, gli eseguibili compilati per architetture x86 e x64 (nella sezione release di questo repo). Il codice è stato scritto e compilato con Visual Studio Community 2019.
Se scegli di compilare lo strumento dal codice sorgente, dovrai compilare i progetti DLLHSC, detour e payload. DLLHSC implementa la funzionalità principale di questo strumento. Il progetto detour genera una DLL usata per eseguire hook delle API. Il progetto payload genera la DLL usata come prova di concetto per verificare se l'eseguibile testato può caricarla tramite search order hijacking. Il payload generato deve essere posizionato nella stessa directory di DLLHSC e detour, denominato payload32.dll per architettura x86 e payload64.dll per architettura x64.
Lo strumento implementa 3 modalità di funzionamento, spiegate di seguito.
Carica l'immagine eseguibile in memoria, analizza la tabella Import e poi sostituisce qualsiasi DLL menzionata nella tabella Import con una DLL payload.
Lo strumento inserisce nella directory dell'applicazione solo un modulo (DLL) che non è presente nella directory dell'applicazione, non appartiene a WinSxS e non appartiene ai KnownDLLs.
All'esecuzione, la DLL payload crea un file nel percorso seguente:
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp come prova dell'esecuzione.
Lo strumento avvia l'applicazione e segnala se la DLL payload è stata eseguita controllando se il file temporaneo esiste. Poiché alcuni eseguibili importano funzioni dalle DLL che caricano, potrebbero apparire finestre di messaggio di errore quando la DLL fornita non esporta queste funzioni e quindi non soddisfa le dipendenze dell'immagine fornita. Tuttavia, le finestre di messaggio indicano che la DLL potrebbe essere un buon candidato per l'esecuzione del payload se le dipendenze sono soddisfatte. In questo caso è necessaria un'analisi aggiuntiva. Il titolo di queste finestre di messaggio può contenere le stringhe: Ordinal Not Found o Entry Point Not Found. DLLHSC cerca finestre che contengono queste stringhe, le chiude non appena appaiono e riporta i risultati.
Crea un processo con l'immagine eseguibile fornita, enumera i moduli caricati nello spazio degli indirizzi di questo processo e riporta i risultati dopo aver applicato i filtri.
Lo strumento riporta solo i moduli caricati dalla directory di Sistema e che non appartengono ai KnownDLLs. I risultati sono piste che richiedono analisi aggiuntive. L'analista può quindi posizionare i moduli riportati nella directory dell'applicazione e verificare se l'applicazione carica il modulo fornito al posto di quello originale.
Esegue hook delle API LoadLibrary e LoadLibraryEx tramite Microsoft Detours e riporta i moduli caricati in fase di esecuzione.
Ogni volta che l'applicazione scansionata chiama LoadLibrary e LoadLibraryEx, lo strumento intercetta la chiamata e scrive il modulo richiesto nel file C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp. Se LoadLibraryEx viene chiamato specificamente con il flag LOAD_LIBRARY_SEARCH_SYSTEM32, non viene scritto alcun output nel file. Dopo che tutte le intercettazioni sono terminate, lo strumento legge il file e stampa i risultati. Di interesse per ulteriori analisi sono i moduli che non esistono nella chiave di registro KnownDLLs, i moduli che non esistono nella directory di Sistema e i moduli senza percorso completo (per questi moduli il loader applica l'ordine di ricerca normale).
Se scegli di compilare lo strumento dal codice sorgente, si consiglia di farlo su Visual Code Studio 2019. Affinché lo strumento funzioni correttamente, i progetti DLLHSC, detour e payload devono essere compilati per la stessa architettura e poi posizionati nella stessa directory. Si noti che la DLL generata dal progetto payload deve essere rinominata in payload32.dll per architettura a 32 bit o payload64.dll per architettura a 64 bit.
Il menu di aiuto per questa applicazione
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <executable image path> (-l|-lm|-rt) [-t seconds]
DESCRIPTION
DLLHSC scans a given executable image for DLL Hijacking and reports the results
It requires elevated privileges
OPTIONS
-h, --help
display this help menu and exit
-e, --executable-image
executable image to scan
-l, --lightweight
parse the import table, attempt to launch a payload and report the results
-lm, --list-modules
list loaded modules that do not exist in the application's directory
-rt, --runtime-load
display modules loaded in run-time by hooking LoadLibrary and LoadLibraryEx APIs
-t, --timeout
number of seconds to wait for checking any popup error windows - defaults to 10 seconds
Questa sezione fornisce esempi su come eseguire DLLHSC e i risultati che riporta. A questo scopo, è stata utilizzata l'utilità Microsoft legittima OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB). Per risultati migliori, si consiglia di scansionare l'immagine eseguibile fornita all'interno della sua directory di installazione.
La flag -l analizza la tabella Import dell'eseguibile fornito, applica filtri e tenta di armare i moduli importati posizionando una DLL payload nella directory corrente dell'applicazione. L'eseguibile scansionato potrebbe mostrare una finestra di errore quando le dipendenze per la DLL payload (funzioni esportate) non sono soddisfatte. In questo caso, viene visualizzata una finestra di messaggio di errore. Per impostazione predefinita, DLLHSC controlla per 10 secondi se è stata aperta una finestra di messaggio, o per il numero di secondi specificato dall'utente con la flag -t. Una finestra di errore indica che se le dipendenze sono soddisfatte, il modulo può essere armato.
La schermata seguente mostra la finestra di errore generata quando OleView.dll carica la DLL payload:

Lo strumento attende un intervallo massimo di 10 secondi o il numero di secondi specificato con -t per garantire che l'inizializzazione del processo sia terminata e che qualsiasi finestra di messaggio sia stata generata. Quindi rileva la finestra di messaggio, la chiude e riporta il risultato:

La flag -lm avvia l'eseguibile fornito e stampa i moduli che carica e che non appartengono all'elenco KnownDLLs né sono dipendenze WinSxS. Questa modalità ha lo scopo di dare un'idea delle DLL che potrebbero essere usate come payload e serve solo a generare piste per l'analista.

La flag -rt stampa i moduli che l'immagine eseguibile fornita carica nel suo spazio degli indirizzi quando viene avviata come processo. Ciò viene ottenuto tramite hook delle API LoadLibrary e LoadLibraryEx tramite Microsoft Detours.

Per qualsiasi feedback su questo strumento, utilizza la sezione Issues di GitHub.