
Inietta DLL nel processo explorer usando le icone
Questa è una tecnica di iniezione DLL in Esplora file di Windows che utilizza la finestra di dialogo per cambiare icona su Windows.
Può indurre gli utenti a caricare una DLL dannosa nel processo di Esplora file:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
Inoltre, può essere utilizzato per iniettare una DLL da un altro processo in Esplora file:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
Oltre a contenere codice, le DLL vengono utilizzate anche per archiviare risorse come le icone. Nella dimostrazione puoi vedere che le icone predefinite sono memorizzate in shell32.dll:

In realtà, nelle versioni moderne di Windows, sono memorizzate in shell32.dll.mui, ma vengono comunque visualizzate come shell32.dll
Affinché il processo di Esplora file possa visualizzare tutte le icone memorizzate nella DLL nella finestra di dialogo, deve caricare la DLL in memoria così che possa essere analizzata.
Inoltre, le DLL in Windows hanno la capacità di definire una funzione opzionale DllMain, che viene chiamata quando la DLL viene caricata o scaricata tramite le funzioni LoadLibrary e FreeLibrary.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
Ciò significa che se una DLL con una funzione DllMain viene caricata da Esplora file, il codice definito nella funzione DllMain verrà eseguito nella memoria di Esplora file.
Ed è esattamente ciò che viene fatto qui. In aggiunta, la DLL viene mascherata da icona:
L'"icona" è in realtà un semplice file DLL con estensione .ico che apre l'app calcolatrice con una risorsa icona aggiunta utilizzando Resource Hacker. (L'icona può essere aggiunta anche in Visual Studio)
Ci sono alcune anomalie per quanto riguarda l'aspetto dell'icona nella visualizzazione delle cartelle. Ho testato questo su due diverse versioni di Windows 10 (la più recente e una più vecchia) e su Windows 11.
In entrambe le versioni di Windows 10, l'icona memorizzata all'interno della DLL non veniva visualizzata quando l'estensione veniva cambiata in .ico

Nella versione più recente di Windows 10, tuttavia, ha funzionato finché non ho provato ad aprire l'"icona" nell'app Foto. Da allora, non sono più riuscito a riprodurlo.

Su Windows 11, la DLL mascherata veniva visualizzata come un'icona normale nella vista di Esplora file. Tuttavia, quando viene aperta nell'app Foto, viene visualizzato un errore.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
Oltre a indurre un utente a caricare manualmente la DLL, un attaccante ha anche la possibilità di utilizzare questa tecnica per iniettare un file DLL nel processo di Esplora file programmaticamente:
Innanzitutto, viene creata una cartella nella directory temporanea e le proprietà della cartella vengono aperte utilizzando SHObjectProperties. Per recuperare l'handle della finestra indipendentemente dalla lingua di sistema, viene utilizzata EnumWindows con una funzione di callback che controlla il nome distinto della cartella in ogni finestra aperta.

Tramite la pagina delle proprietà, viene richiamata la finestra di dialogo per cambiare icona, il cui handle viene anch'esso recuperato con EnumWindows. Infine, il percorso dell'icona viene cambiato in una DLL (che in questo caso ha estensione .ico), il che fa sì che Esplora file carichi la DLL dopo che viene premuto il pulsante OK.
Questo è un modo molto furtivo per iniettare una DLL nel processo di Esplora file perché non usa la solita API di iniezione DLL. Produce due brevi popup, che comunque non sono troppo fastidiosi. Quindi può essere usato come tecnica di evasione AV da un attaccante per eseguire codice tramite il legittimo processo di Esplora file o per caricare un rootkit UMD.
Inoltre, diffondere DLL mascherate da file .ico può essere un vettore di attacco interessante.
Per ottenere gli handle delle finestre giusti, ho usato Spy++, uno strumento che viene installato con Visual Studio.

Molte grazie a Bill G. di Microsoft per la bellissima icona della cartella!
Grazie, tizio a caso su Internet, per la bellissima icona di iniezione!