
PoC per l'Escalation dei Privilegi in Windows 10 Diagnostics Hub Standard Collector Service
PoC per l'Escalation dei Privilegi in Windows 10 Diagnostics Hub Standard Collector Service
La libreria Diagnostics Hub Packaging, utilizzata da Windows Standard Collector Service, può essere forzata a copiare un file arbitrario in una posizione arbitraria a causa della mancanza di impersonificazione del client in DiagnosticsHub.StandardCollector.Runtime.dll.
Ecco un rapporto dettagliato su come questa vulnerabilità è stata trovata e sfruttata: Vulnerabilità di Escalation dei Privilegi in Windows Standard Collector Service.
Il Standard Collector Service permette di definire diversi valori durante la configurazione di una sessione di diagnostica, inclusi la directory scratch e l'ID di sessione. L'ID di sessione può essere qualsiasi GUID e la directory scratch può essere qualsiasi posizione in cui l'utente ha permessi di scrittura. Se la sessione di raccolta viene configurata con un ID di c13851b2-b1e1-438f-bf73-949df897f1bf e un percorso scratch di C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\, si verificano i seguenti eventi quando si chiama il metodo GetCurrentResult dell'oggetto ICollectionSession:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65Queste cartelle e file ETL vengono creati dal servizio collector per il pacchetto .diagsession che normalmente viene creato quando una sessione termina. Chiamare il metodo Stop sull'oggetto ICollectionSession farà sì che il servizio collector esegua il commit del pacchetto di diagnostica chiamando Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage. La funzione CommitPackage copierà o sposterà il file originale {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl nella cartella con GUID casuale: {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
L'operazione di copia/spostamento attivata dalla funzione CommitPackagingResult in DiagnosticsHub.StandardCollector.Runtime.dll, viene eseguita senza impersonificare l'utente (a differenza della creazione iniziale di file/cartella), portando a un possibile problema TOCTOU se la cartella di destinazione viene sostituita con un punto di mount che reindirizza la copia in una posizione arbitraria. Per sfruttare questo problema in modo utile, un attaccante dovrebbe scambiare il contenuto del file ETL prima che venga copiato. Questo può essere fatto vincendo la condizione di competizione (race condition) con un OpLock dopo che il gestore del file è stato rilasciato dal servizio.
Sebbene non controlliamo completamente il nome del file .etl che viene copiato, possiamo usare il trucco del symlink della directory oggetto per controllarlo. La configurazione punto di mount + symlink sarebbe simile a questa:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllAvere il controllo del contenuto del file, della posizione di copia e del nome del file offre a un attaccante numerose possibilità di caricamento di DLL. Tuttavia, il PoC incluso dimostra come il controllo del nome del file non sia necessario poiché il servizio collector carica volentieri una DLL con qualsiasi nome, purché sia nella directory C:\Windows\System32 o C:\Windows\System32\DiagSvcs. Questo viene fatto avviando una nuova sessione del collector con un agente che ha un nome assembly corrispondente al nome della DLL copiata c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl.
Il PoC incluso è una soluzione VS con un progetto DLL C++ per il payload che fa saltare notepad.exe e un progetto C# per interagire con il servizio e sfruttare la vulnerabilità con la libreria NtApiDotNet.
Passaggi per riprodurre:
Risultato atteso:
L'operazione di commit del pacchetto impersonifica l'utente e fallisce quando tenta di copiare il file.
Risultato osservato:
Il file viene copiato nella cartella di destinazione del punto di mount C:\Windows\System32, quindi caricato come agente del collector e, infine, notepad.exe viene avviato con privilegi SYSTEM.