
Crea un driver ELAM e un servizio che avvia un processo figlio firmato come Anti-Malware Protected Process-Light (PPL) su Windows, per la ricerca sulla sicurezza.
Questo progetto ha lo scopo di consentire l'esecuzione di processi 'arbitrari*' come Anti Malware Protected-Process-Light (PPL), per scopi di ricerca. (* Vedere la sezione Restrizioni per maggiori dettagli)
Vedere questo blog che ho scritto per maggiori dettagli e le motivazioni alla base di questo progetto.
Il processo protetto di sistema è un modello di sicurezza in Windows progettato per proteggere i processi di sistema e antivirus da manomissioni o introspezione, anche da parte di Amministratori/SYSTEM.
I processi avviati come Anti Malware 'Protected Process-Light' (PPL) sono limitati in ciò che possono fare, possono caricare solo codice firmato, ma non possono essere sottoposti a debug, ispezionati o arrestati da processi non protetti. Inoltre, possono
ottenere accesso a dati speciali, come il provider ETW Microsoft-Windows-Threat-Intelligence.
Questo progetto crea un driver Early-Launch Anti Malware (ELAM) e un servizio usermode. Il servizio avvierà un processo figlio configurabile all'avvio, che sarà anch'esso contrassegnato come PPL.
Il binario figlio deve essere firmato con lo stesso certificato del servizio, insieme ad alcune altre restrizioni, ma per il resto può essere qualsiasi binario e argomenti da riga di comando tu scelga.
Onestamente non sto spiegando bene cosa siano ELAM e PPL, invece consiglio di iniziare da qui:
Puoi scaricare una versione pre-compilata e firmata del servizio PPLRunner e del modulo kernel da Releases. La release contiene anche il certificato autogenerato e la chiave privata in un file .pfx,
protetto da password con la password password. Vi avevo detto che è solo per scopi di ricerca, vero?
Per generare e compilare il tuo progetto:
Assicurati di avere installato gli Windows SDK.
Apri generate_cert.ps1 e sign_file.ps1, e cambia la variabile $password con qualcos'altro (devono corrispondersi a vicenda).
Esegui generate_cert.ps1. Questo genererà un file ppl_runner.pfx con un nuovo certificato privato e pubblico.
Verrà utilizzato per firmare tutti i binari usati da PPLRunner.
Compila ppl_runner.sln. Questo produrrà 3 binari:
Il driver kernel ELAM che contiene le informazioni del certificato. Il driver in realtà non fa nulla e non verrà effettivamente caricato, viene usato solo come contenitore per il certificato di firma.
Il programma di installazione del servizio e il binario. Come servizio PPL, all'avvio avvierà un processo figlio, anch'esso come PPL, poi si fermerà e uscirà.
Un eseguibile di esempio che verrà firmato con il certificato corretto da Visual Studio in fase di compilazione. PPLRunner può eseguire quasi qualsiasi binario, questo è solo un esempio che verrà firmato automaticamente.
NOTA Installare solo su una macchina di test, non in produzione/sul tuo PC di casa.
Una volta compilato, copia elam_driver.sys e ppl_runner.exe in una cartella sulla macchina di destinazione.
Abilita la firma di test eseguendo questo da un prompt con privilegi elevati, poi riavvia:
bcdedit /set testsigning on
ppl_runner.exe install
Questo dovrebbe installare un servizio chiamato ppl_runner.
Per firmare un binario da eseguire, firmalo con il certificato ppl_runner.pfx, usando lo script sign_file.ps1,
oppure eseguendo direttamente signtool.exe. Se non hai signtool.exe, è disponibile negli Windows SDK.
Crea la chiave di registro HKLM\SOFTWARE\PPL_RUNNER.
Imposta la chiave predefinita/vuota come REG_SZ, contenente il percorso completo del binario da eseguire,
e qualsiasi argomento della riga di comando. ad es. dalla riga di comando:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Per fare in modo che il servizio avvii l'eseguibile, è sufficiente eseguire da un prompt con privilegi elevati:
net start ppl_runner
Come servizio PPL, all'avvio ppl_runner leggerà la chiave di registro, avvierà il processo figlio,
anch'esso come PPL, quindi si fermerà e uscirà. Un avvio riuscito dirà comunque the service failed to run,
ma se controlli il codice di ritorno con sc query ppl_runner, dovrebbe essere 0, cioè ERROR_SUCCESS.
Il processo figlio non sarà visibile, tuttavia se puoi usare Debug Outputs e DBGView.exe per ottenere
una qualche forma di output (vedi il codice child_example).
Poiché il servizio è anche Anti Malware PPL, può essere fermato ed eliminato solo da un processo di livello altrettanto elevato. Tuttavia, possiamo usare PPLRunner per rimuovere se stesso, impostando semplicemente il comando nella chiave di registro come:
C:\path\to\ppl_runner.exe remove
E avvia il Servizio. cioè esegui:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning.ppl_runner.exe install deve essere eseguito nuovamente dopo ogni riavvioEsegui DBGView di Sysinternals e registra Win32 Global, filtrando su *[PPL_RUNNER]*.
Questo mostrerà tutti i log del servizio e dell'installer.
Da definire - blog di Sealighter
James Forshaw ha creato un fantastico progetto per iniettare codice nei processi PPL esistenti.
Seguire Alex Ionescu è probabilmente il modo migliore per saperne di più su ELAM e PPL. Possibilmente inizia con questo: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Seguire Matt Graeber e James Forshaw è un altro ottimo modo.
Un enorme ringraziamento a Matt per lo script powershell per ottenere l'hash 'To-Be-Signed' da un certificato.