
Dumpare la memoria di un PPL con un exploit in userland.
⚠️ 2022-07-24 - A partire dall'aggiornamento di luglio 2022 di Windows 10 21H2 10.0.19044.1826, l'exploit implementato in PPLdump non funziona più. Una patch in NTDLL ora impedisce ai PPL di caricare le Known DLLs. Maggiori informazioni qui.
Questo strumento implementa un exploit userland inizialmente discusso da James Forshaw (alias @tiraniddo) - in questo articolo del blog - per dumppare la memoria di qualsiasi PPL come amministratore.
Ho scritto due articoli su questo strumento. La prima parte riguarda i concetti di Protected Processes mentre la seconda discute la tecnica di bypass stessa.
Basta eseguire l'eseguibile senza alcun argomento e si otterrà un aiuto/uso dettagliato.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
Innanzitutto, i PPL sono stati introdotti con Windows 8.1, quindi le versioni precedenti di Windows non sono ovviamente supportate. Questo progetto ha come target principale Windows 10 (e le sue edizioni server) ma l'ho testato anche su versioni precedenti. Troverai una tabella riassuntiva dei test che ho effettuato nella sezione omonima.
Altri strumenti di bypass dei PPL solitamente eseguono codice arbitrario nel Kernel tramite un driver firmato digitalmente. Questo è diverso perché coinvolge solo trucchi in userland ed è (quasi) fileless.
Questo strumento sfrutta un trucco molto intelligente inizialmente discusso da James Forshaw nel 2018 (vedi Crediti). Coinvolge l'uso della funzione API DefineDosDevice per ingannare il sistema facendogli creare una voce arbitraria di Known DLL. Poiché i PPL non verificano la firma digitale delle Known DLL, questo può essere successivamente utilizzato per eseguire un attacco di DLL hijacking ed eseguire codice arbitrario all'interno di un PPL.
Anche se questo strumento esegue un attacco di DLL hijacking come secondo stadio, non crea un nuovo file DLL su disco. Invece, utilizza una transazione NTFS per sostituire virtualmente il contenuto di uno esistente, una tecnica direttamente ispirata al lavoro di @_ForrestOrr (vedi Crediti).
La risposta breve è "no". Innanzitutto, non coinvolge alcun accesso diretto al Kernel, quindi non c'è rischio di causare un BSOD da questo punto di vista. Nello scenario peggiore, lo strumento potrebbe non riuscire a rimuovere la voce di Known DLL creata, ma ciò non causerà un Denial of Service. Rimarrà lì fino al prossimo riavvio della macchina. Poiché la voce creata sarebbe solo un collegamento simbolico che punta a una sezione inesistente, il sistema alla fine ricadrà sulla posizione predefinita (cioè la cartella System32), quindi non avrà impatto sugli altri programmi in esecuzione sulla macchina.
⚠️ L'exploit fallisce su macchine Windows 8.1 / Server 2012 R2 completamente aggiornate. Devo ancora capire quale patch ha causato l'errore.
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ Su Windows 8.1 / Server 2012 R2, potrebbe essere necessario compilare il binario staticamente (vedi "Istruzioni di compilazione" sotto).
Questa soluzione Visual Studio comprende due progetti (l'eseguibile e una DLL payload) che devono essere compilati in un ordine specifico. Tutto è preconfigurato, quindi basta seguire queste semplici istruzioni. La DLL payload compilata viene automaticamente incorporata nell'eseguibile finale.
Release / x64 o Release / x86 a seconda dell'architettura della macchina target.Build > Build Solution.Su Windows 8.1 / Server 2012 R2, potrebbe essere necessario compilare il binario staticamente.
PPLdump.Configuration Properties > C/C++ > Code Generation.Multi-threaded (/MT) come opzione Runtime Library.| Versione di Windows | Build | Edizione | Arch | Admin | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |