
Simula il loader PE di Windows per identificare le vulnerabilità di DLL hijacking, genera DLL armate con payload shellcode e rileva i bypass dell'auto-elevazione UAC.
Siofra è uno strumento progettato per identificare e sfruttare le vulnerabilità di DLL hijacking nei programmi Windows. È in grado di simulare il loader di Windows per fornire visibilità su tutte le dipendenze (e le corrispondenti vulnerabilità) di un PE su disco, oppure in alternativa su un'immagine file in memoria corrispondente a un processo attivo. In modo più significativo, lo strumento ha la capacità di generare facilmente DLL per sfruttare questi tipi di vulnerabilità tramite infezione PE con creazione dinamica di shellcode. Queste DLL infette conservano il codice (DllMain, funzioni esportate) e le risorse di una DLL per preservare senza soluzione di continuità la funzionalità dell'applicazione che le carica, consentendo al contempo al ricercatore di specificare un payload eseguibile da eseguire come processo separato oppure da caricare nel target come modulo. Inoltre, lo strumento contiene metodi automatizzati per combinare i criteri di auto-elevazione UAC con la funzionalità sopra menzionata al fine di cercare vulnerabilità di bypass UAC.
Attualmente, esiste un numero molto elevato di vulnerabilità che questo strumento espone. Durante il test di questo strumento ho incontrato solo alcune applicazioni che non erano vulnerabili tra le centinaia che ho testato. Si noti che queste vulnerabilità possono essere sfruttate nonostante SafeDllSearchMode. Un equivoco comune deriva dal confondere la "directory corrente" (corretta con SafeDllSearchMode) con la "directory dell'applicazione" (la cartella che contiene il file .exe stesso). La stragrande maggioranza delle vulnerabilità di DLL hijacking attualmente presenti nei programmi Windows deriva dalla directory dell'applicazione (che viene prima nell'ordine di ricerca di Windows). Alcuni punti salienti sono elencati di seguito nell'output prodotto dallo scanner dello strumento. L'ultima volta che queste vulnerabilità sono state testate è stato a metà luglio 2017.
Siofra64.exe --mode file-scan -f "c:\Program Files\Internet Explorer\iexplore.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Internet Explorer\iexplore.exe [64-bit PE] ======== iexplore.exe USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-core-privateprofile-l1-1-1.dll [API set] kernel32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] msvcrt.dll [KnownDLL] api-ms-win-downlevel-shell32-l1-1-0.dll [API set] shcore.dll [KnownDLL] RPCRT4.dll [KnownDLL] combase.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] iertutil.dll [!]
[!] Module iertutil.dll vulnerable at c:\Program Files\Internet Explorer\iertutil.dll (real path: C:\WINDOWS\system32\iertutil.dll)
Siofra64.exe --mode file-scan -f "c:\Program Files\Windows Defender\MpCmdRun.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Windows Defender\MpCmdRun.exe [64-bit PE] ======== MpCmdRun.exe msvcrt.dll [KnownDLL] KERNEL32.dll [KnownDLL] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] OLE32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] SspiCli.dll [!] mpclient.dll [!] CRYPT32.dll [Base] MSASN1.dll [Base] WINTRUST.dll [Base]
[!] Module SspiCli.dll vulnerable at c:\Program Files\Windows Defender\SspiCli.dll (real path: C:\WINDOWS\system32\SspiCli.dll)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\wbem\wmiprvse.exe" --enum-dependency --dll-hijack
======== c:\WINDOWS\System32\wbem\wmiprvse.exe [64-bit PE] ======== wmiprvse.exe msvcrt.dll [KnownDLL] FastProx.dll [!] wbemcomn.dll [!] bcrypt.dll [!] WS2_32.dll [KnownDLL] api-ms-win-eventing-obsolete-l1-1-0.dll [API set] sechost.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] NCObjAPI.DLL [!]
[!] Module wbemcomn.dll vulnerable at c:\WINDOWS\System32\wbem\wbemcomn.dll (real path: C:\WINDOWS\system32\wbemcomn.dll) [!] Module bcrypt.dll vulnerable at c:\WINDOWS\System32\wbem\bcrypt.dll (real path: C:\WINDOWS\system32\bcrypt.dll) [!] Module NCObjAPI.DLL vulnerable at c:\WINDOWS\System32\wbem\NCObjAPI.DLL (real path: C:\WINDOWS\system32\NCObjAPI.DLL)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\SearchProtocolHost.exe" --enum-dependency --dll-hijack --explicit-loadlibrary
======== c:\WINDOWS\System32\SearchProtocolHost.exe [64-bit PE] ======== SearchProtocolHost.exe msvcrt.dll [KnownDLL] TQUERY.DLL [!] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] bcryptPrimitives.dll [Base] cryptdll.dll [!] api-ms-win-security-lsalookup-l2-1-1.dll [API set] advapi32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] api-ms-win-shell-namespace-l1-1-0.dll [API set] windows.storage.dll [Base] api-ms-win-shlwapi-winrt-storage-l1-1-1.dll [API set] shlwapi.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-appmodel-state-l1-2-0.dll [API set] kernel.appcore.dll [Base] api-ms-win-shcore-path-l1-1-0.dll [API set] shcore.dll [KnownDLL] api-ms-win-power-base-l1-1-0.dll [API set] powrprof.dll [Base] profapi.dll [Base] msfte.dll [Potential explicit Unicode] [!] msTracer.dll [Potential explicit Unicode] [!] Msidle.dll [Potential explicit Unicode] [!] winhttp.dll [Potential explicit Unicode] [!]
[!] Module msfte.dll vulnerable at C:\WINDOWS\system32\msfte.dll (real path: Unknown) [!] Module msTracer.dll vulnerable at C:\WINDOWS\system32\msTracer.dll (real path: Unknown)
Le funzionalità di questo strumento possono essere suddivise in 3 categorie separate, ciascuna corrispondente a una delle modalità di esecuzione di questo strumento.
Quando è in modalità di infezione, lo strumento è in grado di generare copie infette di file DLL sia a 32 che a 64 bit. Questi file infetti sono in grado di dirottare il flusso di esecuzione di un'applicazione target quando vengono caricati durante l'inizializzazione del processo, causando il caricamento di una DLL payload o l'avvio di un eseguibile payload prima dell'esecuzione del punto di ingresso dell'applicazione target.
Quando è in modalità di scansione file, allo strumento può essere fornito o un percorso di un file eseguibile o una cartella (che verrà cercata per file eseguibili, opzionalmente in modo ricorsivo) di cui verranno enumerati ed elaborati ricorsivamente gli import PE, gli import di caricamento ritardato, gli API set, le dipendenze degli assembly e le librerie caricate esplicitamente, per determinare il percorso in cui ciascuno di essi verrà caricato durante l'inizializzazione del processo a runtime. Con queste informazioni, lo strumento è in grado di identificare i moduli vulnerabili all'hijacking. Durante l'elaborazione del PE e la simulazione del loader, lo strumento è in grado di gestire: 1. Moduli importati tramite la sezione principale degli import del PE. 2. Moduli importati tramite caricamento ritardato. 3. Risoluzione delle dipendenze degli assembly WinSxS (la risorsa manifest del PE viene analizzata, gli ID delle dipendenze degli assembly vengono estratti e il percorso del modulo WinSxS viene identificato utilizzando un'implementazione personalizzata). 4. Moduli caricati esplicitamente, importati tramite LoadLibrary a runtime. 5. Risoluzione degli API set per tutti i tipi di import di cui sopra. Ciò è ottenuto tramite un'implementazione personalizzata di un parser per le strutture dati non documentate presenti in ApiSetSchema.dll (si noti che sono state testate solo le versioni 2, 4 e 6). 6. Ricerca di moduli importati specifici per nome. 7. Identificazione dei componenti Windows che possono essere sfruttati per attacchi di bypass UAC (i criteri di auto-elevazione UAC vengono applicati a un PE target specificato in modo automatizzato, quindi usati in combinazione con un attacco di hijacking se presente). 8. Rilevamento e filtraggio automatici delle dipendenze dei moduli che non sono vulnerabili sulla base di: * KnownDLL * Stato DLL esente ("Base"). Kernelbase.dll, ntdll.dll, ecc. * Meccanismo di sicurezza di override del manifest (utilizzato da Microsoft in sysprep.exe)
Quando è in modalità di scansione memoria, lo strumento può enumerare i nomi/ID dei processi locali oppure può ricevere un ID di processo da scansionare. Invece di analizzare il file immagine corrispondente al PID indicato su disco, lo strumento enumera i moduli attualmente caricati nel processo e identifica quali di essi potrebbero essere vulnerabili all'hijacking. Ciò è utile nei casi in cui un eseguibile su disco è packed/offuscato e i suoi import non possono essere identificati tramite l'analisi dell'intestazione PE.
Per visualizzare le informazioni sull'utilizzo dello strumento, è sufficiente eseguirlo senza parametri (output mostrato di seguito). È molto importante utilizzare la compilazione appropriata dello strumento (32 o 64 bit) per il target desiderato, a seconda che si tratti di un file PE a 32 bit o a 64 bit. Allo stesso modo, la versione a 32 bit dello strumento può enumerare e/o prendere di mira solo processi a 32 bit (Wow64 su un OS x64) e la versione a 64 bit può enumerare e/o prendere di mira solo processi a 64 bit. Questo principio si applica sia alla scansione (Siofra64.exe ignorerà i PE a 32 bit e Siofra32.exe ignorerà i PE a 64 bit) sia all'infezione PE. Siofra32.exe dovrebbe essere usato per infettare DLL a 32 bit e Siofra64.exe dovrebbe essere usato per infettare DLL a 64 bit.
Quando la versione a 32 bit dello strumento viene eseguita su sistemi x64, il reindirizzamento del percorso Wow64 viene disabilitato esplicitamente dallo strumento, il che significa che se si volesse prendere di mira \Windows\System32\notepad.exe sarebbe un PE a 64 bit (e quindi si dovrebbe usare \Windows\Syswow64\notepad.exe). Allo stesso modo, se si volesse prendere di mira \Program Files\Common Files\microsoft shared\MSInfo\msinfo32.exe sarebbe un PE a 64 bit, e quindi si dovrebbe usare \Program Files (x86)\Common Files\microsoft shared\MSInfo\msinfo32.exe.
Siofra versione 1.13 utilizzo: Siofra32.exe --mode [Modalità supportate: "file-scan", "mem-scan" e "infect"] -v [Opzionale. Livello di verbosità dell'output] Livelli di verbosità: 0 - Nessun output 1 - Solo stato di successo/errore critico (predefinito) 2 - Dettagli aggiuntivi sullo stato di successo/errore, inclusi i PE scartati 3 - Tutto Modalità di scansione file: -f [File o directory da scansionare] -r [Opzionale. Scansione ricorsiva] --signed [Opzionale. Elabora solo i binari firmati] --delayload [Opzionale. Include gli import di caricamento ritardato nell'elenco delle dipendenze] --explicit-loadlibrary [Opzionale. Include gli import potenzialmente espliciti nell'elenco delle dipendenze (sono stringhe *.dll che potrebbero essere state chiamate tramite LoadLibrary(Ex)A/W] --auto-elevate [Opzionale. Scansiona solo i binari ad auto-elevazione] Modalità di scansione memoria: --pid [ID del processo target da scansionare. Quando non specificato, viene enumerato un elenco di nomi/PID di processi a 32 o 64 bit (corrispondenti rispettivamente alla versione a 32 o 64 bit di questo strumento)] Qualsiasi modalità di scansione: --enum-dependency [Enumera le dipendenze] --show-unmapped-apiset [Opzionale. Include gli API set che non sono riusciti a mappare un modulo dall'output (ignorati per impostazione predefinita)] --dll-hijack [Enumera le vulnerabilità di DLL hijacking] --find-module [Opzionale. Scansiona le dipendenze per un modulo specifico. Nota che questo esclude i KnownDLL] Modalità di infezione: -f [File DLL da infettare] -o [File di output] --payload-path [Percorso della DLL da caricare nella DLL infetta a runtime, oppure percorso dell'eseguibile da avviare a runtime] --payload-type [Il tipo di payload specificato nel percorso del payload parassita. Può essere "process" (che generalmente indica un exe) o "library" (che generalmente indica una DLL)]
Scansione dell'intera unità home per programmi a 32 bit vulnerabili al DLL hijacking utilizzando import standard o di caricamento ritardato tramite le loro intestazioni PE.
Siofra32.exe --mode file-scan -f "C:/" -r --enum-dependency --dll-hijack --delayload
Scansione della cartella dell'applicazione Windows Defender su una versione x64 di Windows per moduli vulnerabili caricati tramite la tabella degli import standard nella loro intestazione PE.
Siofra64.exe --mode file-scan -f "C:\Program Files\Windows Defender" -r --enum-dependency --dll-hijack
Scansione del programma Java Update Scheduler a 32 bit su una versione x64 di Windows per moduli vulnerabili caricati tramite qualsiasi canale noto (import standard o di caricamento ritardato, WinSxS, LoadLibrary).
Siofra32.exe --mode file-scan -f "C:\Program Files (x86)\Common Files\Java\Java Update\jusched.exe" --enum-dependency --dll-hijack --delayload --explicit-loadlibrary
Scansione della cartella di Windows (e di tutte le sue sottocartelle) per moduli vulnerabili (importati tramite la tabella degli import standard nell'intestazione PE) in programmi a 64 bit che potrebbero essere utilizzati per un attacco di bypass UAC (firmati da Microsoft con un manifest di auto-elevazione).
Siofra64.exe --mode file-scan -f "C:\Windows" -r --enum-dependency --dll-hijack --auto-elevate --signed
Infezione di una copia a 32 bit di WININET.dll (copiata da \Windows\SysWOW64\WININET.dll in .\WININET_original.dll) con un implant che avvierà un nuovo processo notepad quando caricato durante l'inizializzazione del processo da un programma vulnerabile. È importante notare che il semplice caricamento di una copia infetta di questa DLL (ad esempio tramite LoadLibrary) non attiverà il payload. Le DLL infette sono pensate per funzionare solo nel contesto di un modulo vulnerabile caricato tramite la sezione degli import standard del suo processo host.
Siofra32.exe --mode infect -f WININET_original.dll -o WININET.dll --payload-type process --payload-path c:\windows\system32\notepad.exe
Infezione di una copia a 64 bit di USERENV.dll (copiata da \Windows\System32\USERENV.dll in .\USERENV_original.dll) con un implant che caricherà un'ipotetica DLL payload salvata in C:\Payload.dll. È importante notare che tutte le DLL caricate da un processo a 64 bit devono essere DLL a 64 bit e tutte le DLL caricate da un processo a 32 bit devono essere DLL a 32 bit. Pertanto, in questo scenario ipotetico, Payload.dll dovrebbe essere un file PE a 64 bit per essere caricato correttamente dall'implant in USERENV.dll.
Siofra64.exe --mode infect -f USERENV_original.dll -o USERENV.dll --payload-type library --payload-path "C:\Payload.dll"
Ho deciso di rendere open source parte di questo strumento per aiutare altri ricercatori di sicurezza a comprendere i dettagli tecnici di questo progetto. In particolare, ho fornito il codice sorgente assembler per uno degli shellcode implant a 64 bit (per l'infezione di DLL PE a 64 bit quando si specifica un tipo di payload "process").
I dettagli relativi ad altri aspetti tecnici dello strumento e i dettagli del sistema operativo riguardanti il loader/ordine di ricerca di Windows, UAC, WinSxS, ecc. sono disponibili nel PDF di questo progetto.
Siofra è concesso in licenza sotto la licenza GPL 3. Vedere LICENSE.MD per i dettagli.
Forrest Williams - [email protected] / [email protected]